Name: series-workflowsnvwg Phase: Succeeded StartedAt: 2026-09-06 15:42:31 +0000 UTC FinishedAt: 2026-09-06 19:44:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[0] Phase: Succeeded StartedAt: 2026-09-06 15:42:31 +0000 UTC FinishedAt: 2026-09-06 16:05:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[0].run-triage Phase: Succeeded StartedAt: 2026-09-06 15:42:31 +0000 UTC FinishedAt: 2026-09-06 16:05:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "38b6be101006d3e7af972999f45d4f1e8250587a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "RDS", "RDS_TCP", "INET" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "38b6be101006d3e7af972999f45d4f1e8250587a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "RDS", "RDS_TCP", "INET" ], "series_id": "b1606105-4a6b-4f2a-bacc-e39f1bbb71a1" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "rds_message_map_pages", "rds_cong_update_alloc" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1JEUyYjMzQ7LAogICAgJiMzNDtSRFNfVENQJiMzNDssCiAgICAmIzM0O0lORVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtyZHNfbWVzc2FnZV9tYXBfcGFnZXMmIzM0OywKICAgICYjMzQ7cmRzX2NvbmdfdXBkYXRlX2FsbG9jJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKCkgdG8gY2FsY3VsYXRlIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggY29ycmVjdGx5IGZvciB0aGUgZmluYWwgcGFnZSAoc2V0dGluZyBpdCB0byB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgaW5zdGVhZCBvZiBQQUdFX1NJWkUpLiBUaGUgcGFnZXMgYmVpbmcgbWFwcGVkIChlLmcuLCBjb25nZXN0aW9uIG1hcCBwYWdlcyBpbiByZHNfY29uZ19mcm9tX2FkZHIoKSkgYXJlIGFsbG9jYXRlZCB1c2luZyBnZXRfemVyb2VkX3BhZ2UoKSBhbmQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggYWRqdXN0cyBzY2F0dGVybGlzdCBsZW5ndGgvYm91bmRzIHJhdGhlciB0aGFuIGludHJvZHVjaW5nIG9yIGV4cG9zaW5nIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVmZmVyIGJvdW5kcyBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTiwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYWQ0MTI5NWFkODI4ZDVlZjYxNTk0M2E0YTk3NWFhNWFiZDQyMGUzY1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3Jkcy9tZXNzYWdlLmMgYi9uZXQvcmRzL21lc3NhZ2UuY1xuaW5kZXggZjI1ZjI1OTI1ODZmNy4uNDdkNWU5YWI5YjEwOSAxMDA2NDRcbi0tLSBhL25ldC9yZHMvbWVzc2FnZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvcmRzL21lc3NhZ2UuY1xuQEAgLTQzMSw3ICYjNDM7NDMxLDkgQEAgc3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW5cbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJtLVx1MDAzZWRhdGEub3BfbmVudHM7ICYjNDM7JiM0MztpKSB7XG4gXHRcdHNnX3NldF9wYWdlKFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbaV0sXG4gXHRcdFx0XHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcbi1cdFx0XHRcdFBBR0VfU0laRSwgMCk7XG4mIzQzO1x0XHRcdFx0aSA9PSBybS1cdTAwM2VkYXRhLm9wX25lbnRzIC0gMVxuJiM0MztcdFx0XHRcdFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcbiYjNDM7XHRcdFx0XHRcdDogUEFHRV9TSVpFLCAwKTtcbiBcdH1cbiBcbiBcdHJldHVybiBybTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowMzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtSRFMmIzM0OywKICAgICYjMzQ7UkRTX1RDUCYjMzQ7LAogICAgJiMzNDtJTkVUJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3Jkc19jb25nX3VwZGF0ZV9hbGxvYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYWQ0MTI5NWFkODI4ZDVlZjYxNTk0M2E0YTk3NWFhNWFiZDQyMGUzYwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvcmRzL21lc3NhZ2UuYyBiL25ldC9yZHMvbWVzc2FnZS5jCmluZGV4IGYyNWYyNTkyNTg2ZjcuLjQ3ZDVlOWFiOWIxMDkgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvbWVzc2FnZS5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9yZHMvbWVzc2FnZS5jCkBAIC00MzEsNyAmIzQzOzQzMSw5IEBAIHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGluCiAJZm9yIChpID0gMDsgaSAmbHQ7IHJtLSZndDtkYXRhLm9wX25lbnRzOyAmIzQzOyYjNDM7aSkgewogCQlzZ19zZXRfcGFnZSgmYW1wO3JtLSZndDtkYXRhLm9wX3NnW2ldLAogCQkJCXZpcnRfdG9fcGFnZSgodm9pZCAqKXBhZ2VfYWRkcnNbaV0pLAotCQkJCVBBR0VfU0laRSwgMCk7CiYjNDM7CQkJCWkgPT0gcm0tJmd0O2RhdGEub3BfbmVudHMgLSAxCiYjNDM7CQkJCQk/IHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKQomIzQzOwkJCQkJOiBQQUdFX1NJWkUsIDApOwogCX0KIAogCXJldHVybiBybTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkwMgoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDI1NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFJEUyBNZXNzYWdlIE1hcHBpbmcgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBUaGUgZmlyc3QgdGhpbmcgSSYjMzk7bSBkb2luZyBpcyBicmVha2luZyBkb3duIHRoaXMgcGF0Y2ggYW5kIHVuZGVyc3RhbmRpbmcgdGhlIGlzc3VlIGl0JiMzOTtzIG1lYW50IHRvIGFkZHJlc3MuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyB0aGUgZGlmZiBpbiBgbmV0L3Jkcy9tZXNzYWdlLmNgLCBzcGVjaWZpY2FsbHkgdGhlIGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgIGZ1bmN0aW9uLiBSaWdodCBvZmYgdGhlIGJhdCwgSSBzZWUgdGhlIGNoYW5nZSBpbnZvbHZlcyBhZGp1c3RpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdCBlbnRyaWVzLiBJdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIGFsd2F5cyBtYXBwZWQgYFBBR0VfU0laRWAgZm9yIGVhY2ggZW50cnksIGJ1dCB0aGlzIHBhdGNoIGlzIGludGVsbGlnZW50bHkgaGFuZGxpbmcgdGhlIGxhc3QgZW50cnkuIFRoaXMgcGF0Y2ggbWFrZXMgdGhlICpsYXN0KiBlbnRyeSBvZiB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdCBoYXZlIGEgbGVuZ3RoIGVxdWl2YWxlbnQgdG8gdGhlIHRvdGFsIGxlbmd0aCByZXF1ZXN0ZWQgbWludXMgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgdGhlIHByZXZpb3VzIGVudHJpZXMuIFRoaXMgc2VlbXMgbGlrZSBhIHBvdGVudGlhbCBmaXggZm9yIGhhbmRsaW5nIG1lc3NhZ2VzIHRoYXQgZG9uJiMzOTt0IGFsaWduIHBlcmZlY3RseSB3aXRoIHBhZ2UgYm91bmRhcmllcywgd2hpY2ggSSBzZWUgYSBsb3Qgb2YgaW4gbXkgd29yay4KClRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLCBJIG5lZWQgbW9yZSBjb250ZXh0LiBJJiMzOTttIGdvaW5nIHRvIHVzZSBgZ2l0IGdyZXBgIG9yIG1heWJlIGp1c3QgcmVhZCB0aGUgZmlsZSBkaXJlY3RseSwgdG8gc2VlIGhvdyBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYCBpcyAqdXNlZCogd2l0aGluIHRoZSBgbmV0L3Jkc2Agc3Vic3lzdGVtLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgdHlwaWNhbCBSRFMgbmV0d29ya2luZyBmbG93IGFuZCBob3cgbWVzc2FnZXMgYXJlIGNvbnN0cnVjdGVkLCBhbmQgY3J1Y2lhbGx5LCB3aGF0IHRoZSBLY29uZmlnIGRlcGVuZGVuY2llcyBhcmUuIFRoYXQgd2lsbCBoZWxwIG1lIGV2YWx1YXRlIHRoZSByaXNrIGFuZCBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2UuIElzIHRoaXMgYSBjcml0aWNhbCBwYXRoIGZ1bmN0aW9uPyBJcyB0aGlzIHJlbGF0ZWQgdG8gc29tZSBzcGVjaWZpYyBoYXJkd2FyZSBvciBjb25maWd1cmF0aW9uPyBUaGlzIHdpbGwgaGVscCB1bmRlcnN0YW5kIHRoZSBzZXZlcml0eSBhbmQgaWYgYW55IG90aGVyIHBhcnRzIG9mIHRoZSBzdWJzeXN0ZW0gbWF5IHJlcXVpcmUgbW9kaWZpY2F0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIHRoaW5rIGFib3V0IHBvdGVudGlhbCBlZGdlIGNhc2VzIGFuZCBob3cgdGhpcyBjb3VsZCBpbnRlcmFjdCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBSRFMgaW1wbGVtZW50YXRpb24uIFRoZSBnb2FsIGlzIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlICp3aHkqIGJlaGluZCB0aGlzIHBhdGNoLCBub3QganVzdCB0aGUgKndoYXQqLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Jkc19tZXNzYWdlX21hcF9wYWdlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvcmRzL2NvbmcuYz00MTg9c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKVxuLS1cbm5ldC9yZHMvY29uZy5jLTQyMi1cbm5ldC9yZHMvY29uZy5jOjQyMzpcdHJtID0gcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XG5uZXQvcmRzL2NvbmcuYy00MjQtXHRpZiAoIUlTX0VSUihybSkpXG4tLVxubmV0L3Jkcy9tZXNzYWdlLmM9Mzg3PXN0cnVjdCBzY2F0dGVybGlzdCAqcmRzX21lc3NhZ2VfYWxsb2Nfc2dzKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIGludCBuZW50cylcbi0tXG5uZXQvcmRzL21lc3NhZ2UuYy00MDktXG5uZXQvcmRzL21lc3NhZ2UuYzo0MTA6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW50IHRvdGFsX2xlbilcbm5ldC9yZHMvbWVzc2FnZS5jLTQxMS17XG4tLVxubmV0L3Jkcy9yZHMuaD05MDA9aW50IHJkc19tZXNzYWdlX2NvcHlfZnJvbV91c2VyKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSxcbm5ldC9yZHMvcmRzLmgtOTAxLVx0XHRcdCAgICAgICBib29sIHpjb3B5KTtcbm5ldC9yZHMvcmRzLmg6OTAyOnN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pO1xubmV0L3Jkcy9yZHMuaC05MDMtdm9pZCByZHNfbWVzc2FnZV9wb3B1bGF0ZV9oZWFkZXIoc3RydWN0IHJkc19oZWFkZXIgKmhkciwgX19iZTE2IHNwb3J0LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM5MDYKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA1MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gUkRTIENvbmdlc3Rpb24gQ29udHJvbCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBSRFMgaGFuZGxlcyBjb25nZXN0aW9uLCBhbmQgSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBnZXR0aW5nIG15IGhhbmRzIGRpcnR5IHdpdGggdGhlIGNvZGUuIEZpcnN0LCBJJiMzOTttIHRoaW5raW5nIEkmIzM5O2xsIGV4YW1pbmUgYG5ldC9yZHMvbWVzc2FnZS5jYCBhcm91bmQgbGluZSA0MTAuIEkgdmFndWVseSByZWNhbGwgc29tZXRoaW5nIGFib3V0IG1lc3NhZ2UgaGFuZGxpbmcgdGhlcmUgdGhhdCBtaWdodCBiZSByZWxldmFudCB0byBjb25nZXN0aW9uIHNpZ25hbGluZyBvciBhdm9pZGFuY2UuIFRoZW4sIEkmIzM5O2xsIHBpdm90IHRvIGBuZXQvcmRzL2NvbmcuY2AgbmVhciBsaW5lIDQxOC4gVGhlIG5hbWUgYWxvbmUgc2NyZWFtcyAmIzM0O2Nvbmdlc3Rpb24gY29udHJvbCwmIzM0OyBzbyBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBjb3JlIGxvZ2ljIGZvciByYXRlIGxpbWl0aW5nLCBiYWNrcHJlc3N1cmUsIG9yIHdoYXRldmVyIG1lY2hhbmlzbSB0aGV5JiMzOTtyZSB1c2luZyB0aGVyZS4gSSYjMzk7bGwgbmVlZCB0byBzZWUgaG93IHRoZSB0d28gaW50ZXJhY3QuIEZpbmFsbHksIEkgc2hvdWxkIGFsc28gcGVlayBhdCB0aGUgYG5ldC9yZHMvS2NvbmZpZ2AgZmlsZS4gSSYjMzk7bSBob3BpbmcgdG8gdW5kZXJzdGFuZCBpZiB0aGVyZSBhcmUgYW55IGNvbmZpZ3VyYWJsZSBvcHRpb25zIHJlbGF0ZWQgdG8gY29uZ2VzdGlvbiBjb250cm9sLCB3aGljaCBjb3VsZCBnaXZlIG1lIGEgYnJvYWRlciBwaWN0dXJlIG9mIHRoZSBkZXNpZ24gc3BhY2UgYW5kIHBvdGVudGlhbCB0dW5pbmcgcGFyYW1ldGVycy4gVGhpcyBhcHByb2FjaCBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIGFuYWx5emluZyB0aGUgcGVyZm9ybWFuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvcmRzL21lc3NhZ2UuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0NQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDAwOlx0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuIDQwMTpcdFx0fVxuIDQwMjpcdFxuIDQwMzpcdFx0c2dfcmV0ID0gXHUwMDI2c2dfZmlyc3Rbcm0tXHUwMDNlbV91c2VkX3Nnc107XG4gNDA0Olx0XHRzZ19pbml0X3RhYmxlKHNnX3JldCwgbmVudHMpO1xuIDQwNTpcdFx0cm0tXHUwMDNlbV91c2VkX3NncyAmIzQzOz0gbmVudHM7XG4gNDA2Olx0XG4gNDA3Olx0XHRyZXR1cm4gc2dfcmV0O1xuIDQwODpcdH1cbiA0MDk6XHRcbiA0MTA6XHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19tZXNzYWdlX21hcF9wYWdlcyh1bnNpZ25lZCBsb25nICpwYWdlX2FkZHJzLCB1bnNpZ25lZCBpbnQgdG90YWxfbGVuKVxuIDQxMTpcdHtcbiA0MTI6XHRcdHN0cnVjdCByZHNfbWVzc2FnZSAqcm07XG4gNDEzOlx0XHR1bnNpZ25lZCBpbnQgaTtcbiA0MTQ6XHRcdGludCBudW1fc2dzID0gRElWX1JPVU5EX1VQKHRvdGFsX2xlbiwgUEFHRV9TSVpFKTtcbiA0MTU6XHRcdGludCBleHRyYV9ieXRlcyA9IG51bV9zZ3MgKiBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTtcbiA0MTY6XHRcbiA0MTc6XHRcdHJtID0gcmRzX21lc3NhZ2VfYWxsb2MoZXh0cmFfYnl0ZXMsIEdGUF9OT1dBSVQpO1xuIDQxODpcdFx0aWYgKCFybSlcbiA0MTk6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4gNDIwOlx0XG4gNDIxOlx0XHRzZXRfYml0KFJEU19NU0dfUEFHRVZFQywgXHUwMDI2cm0tXHUwMDNlbV9mbGFncyk7XG4gNDIyOlx0XHRybS1cdTAwM2VtX2luYy5pX2hkci5oX2xlbiA9IGNwdV90b19iZTMyKHRvdGFsX2xlbik7XG4gNDIzOlx0XHRybS1cdTAwM2VkYXRhLm9wX25lbnRzID0gRElWX1JPVU5EX1VQKHRvdGFsX2xlbiwgUEFHRV9TSVpFKTtcbiA0MjQ6XHRcdHJtLVx1MDAzZWRhdGEub3Bfc2cgPSByZHNfbWVzc2FnZV9hbGxvY19zZ3Mocm0sIG51bV9zZ3MpO1xuIDQyNTpcdFx0aWYgKElTX0VSUihybS1cdTAwM2VkYXRhLm9wX3NnKSkge1xuIDQyNjpcdFx0XHR2b2lkICplcnIgPSBFUlJfQ0FTVChybS1cdTAwM2VkYXRhLm9wX3NnKTtcbiA0Mjc6XHRcdFx0cmRzX21lc3NhZ2VfcHV0KHJtKTtcbiA0Mjg6XHRcdFx0cmV0dXJuIGVycjtcbiA0Mjk6XHRcdH1cbiA0MzA6XHRcbiA0MzE6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJtLVx1MDAzZWRhdGEub3BfbmVudHM7ICYjNDM7JiM0MztpKSB7XG4gNDMyOlx0XHRcdHNnX3NldF9wYWdlKFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbaV0sXG4gNDMzOlx0XHRcdFx0XHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcbiA0MzQ6XHRcdFx0XHRcdGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFcbiA0MzU6XHRcdFx0XHRcdFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcbiA0MzY6XHRcdFx0XHRcdFx0OiBQQUdFX1NJWkUsIDApO1xuIDQzNzpcdFx0fVxuIDQzODpcdFxuIDQzOTpcdFx0cmV0dXJuIHJtO1xuIDQ0MDpcdH1cbiA0NDE6XHRcbiA0NDI6XHRzdGF0aWMgaW50IHJkc19tZXNzYWdlX3pjb3B5X2Zyb21fdXNlcihzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pXG4gNDQzOlx0e1xuIDQ0NDpcdFx0c3RydWN0IHNjYXR0ZXJsaXN0ICpzZztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0OTkyCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBSRFMgQ29uZ2VzdGlvbiBDb250cm9sIENvZGUqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBSRFMgbWVzc2FnZXMgYXJlIGFjdHVhbGx5ICpzZW50KiBhbmQgbWFuYWdlZC4gTXkgZmlyc3Qgc3RvcCBpcyBnb2luZyB0byBiZSBgbmV0L3Jkcy9jb25nLmNgLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgbml0dHktZ3JpdHR5IG9mIHRoZSBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtcyB0aGVyZSwgb2J2aW91c2x5LCBidXQgSSByZWFsbHkgd2FudCB0byBmb2N1cyBvbiB0aGUgbWVzc2FnZSBzZW5kaW5nIHBhdGggaXRzZWxmLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgY29kZSBoYW5kbGVzIFJEUyBzb2NrZXRzIGluIHJlbGF0aW9uIHRvIHRoYXQgc2VuZGluZyBwcm9jZXNzLiBJdCYjMzk7cyBhbGwgY29ubmVjdGVkLCByaWdodD8gR290dGEgZ2V0IGEgc29saWQgZ3Jhc3Agb2YgdGhlIGZsb3c6IHNvY2tldCAtJmd0OyBjb25nZXN0aW9uIGNvbnRyb2wgLSZndDsgYWN0dWFsIHRyYW5zbWlzc2lvbi4gVGhhdCYjMzk7cyB0aGUgY29yZSBvZiBpdCBhbGwsIGFuZCB1bmRlcnN0YW5kaW5nIHRoYXQgZmxvdyBpcyBrZXkgdG8gZGVidWdnaW5nIG9yIG9wdGltaXppbmcgUkRTIHBlcmZvcm1hbmNlLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3Mgd2hhdCBpbiBgY29uZy5jYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDEwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MTA6XHRcdFx0XHRmcmVlX3BhZ2UobWFwLVx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XG4gNDExOlx0XHRcdGtmcmVlKG1hcCk7XG4gNDEyOlx0XHR9XG4gNDEzOlx0fVxuIDQxNDpcdFxuIDQxNTpcdC8qXG4gNDE2Olx0ICogQWxsb2NhdGUgYSBSRFMgbWVzc2FnZSBjb250YWluaW5nIGEgY29uZ2VzdGlvbiB1cGRhdGUuXG4gNDE3Olx0ICovXG4gNDE4Olx0c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKVxuIDQxOTpcdHtcbiA0MjA6XHRcdHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcCA9IGNvbm4tXHUwMDNlY19sY29uZztcbiA0MjE6XHRcdHN0cnVjdCByZHNfbWVzc2FnZSAqcm07XG4gNDIyOlx0XG4gNDIzOlx0XHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXHUwMDNlbV9wYWdlX2FkZHJzLCBSRFNfQ09OR19NQVBfQllURVMpO1xuIDQyNDpcdFx0aWYgKCFJU19FUlIocm0pKVxuIDQyNTpcdFx0XHRybS1cdTAwM2VtX2luYy5pX2hkci5oX2ZsYWdzID0gUkRTX0ZMQUdfQ09OR19CSVRNQVA7XG4gNDI2Olx0XG4gNDI3Olx0XHRyZXR1cm4gcm07XG4gNDI4Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU1MjUKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkludmVzdGlnYXRpbmcgdGhlIENhbGwgU2l0ZXMgb2YgYHJkc19jb25nX3VwZGF0ZV9hbGxvY2AqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBUaGUgdGFzayBhdCBoYW5kIGlzIHRvIHVuZGVyc3RhbmQgd2hlcmUgYHJkc19jb25nX3VwZGF0ZV9hbGxvY2AgaXMgYmVpbmcgaW52b2tlZC4gTXkgaW5zdGluY3QgaXMgdG8gcXVpY2tseSBpZGVudGlmeSBhbGwgdGhlIGNhbGwgc2l0ZXMgdG8gZ2V0IGEgZ3Jhc3Agb2YgaXRzIG9wZXJhdGlvbmFsIGNvbnRleHQuIEkmIzM5O2xsIG5lZWQgdG8gdXNlIG15IHVzdWFsIHRvb2xzIC0gYGdyZXBgLCBgZmluZGAsIG9yIHdoYXRldmVyJiMzOTtzIGZhc3Rlc3QgZm9yIHRoaXMgY29kZSBiYXNlIC0gdG8gbG9jYXRlIGV2ZXJ5IGluc3RhbmNlIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBGcm9tIHRoZXJlLCBJJiMzOTtsbCBleGFtaW5lIHRoZSBzdXJyb3VuZGluZyBjb2RlIGF0IGVhY2ggY2FsbCBzaXRlLiBNeSBleHBlcmllbmNlIHRlbGxzIG1lIHRoYXQgdW5kZXJzdGFuZGluZyB0aGUgY2FsbGluZyBjb250ZXh0IGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBmdW5jdGlvbiYjMzk7cyBwdXJwb3NlIGFuZCBwb3RlbnRpYWwgaXNzdWVzLiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBjbHVlcyBhYm91dCB0aGUgZGF0YSBiZWluZyBwYXNzZWQsIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGl0JiMzOTtzIGNhbGxlZCwgYW5kIHRoZSBvdmVyYWxsIGZsb3cgb2YgZXhlY3V0aW9uLiBJJiMzOTtsbCBiZSBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIGFueSBlcnJvciBoYW5kbGluZyBvciByZXNvdXJjZSBtYW5hZ2VtZW50IHRoYXQmIzM5O3MgaGFwcGVuaW5nIGFyb3VuZCB0aG9zZSBjYWxscywgdG9vLiBUaGF0JiMzOTtzIHVzdWFsbHkgd2hlcmUgdGhlIHN1YnRsZSBidWdzIGhpZGUuIExldCYjMzk7cyBnZXQgY3JhY2tpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Jkc19jb25nX3VwZGF0ZV9hbGxvYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvcmRzL2NvbmcuYz0zOTk9dm9pZCByZHNfY29uZ19leGl0KHZvaWQpXG4tLVxubmV0L3Jkcy9jb25nLmMtNDE3LSAqL1xubmV0L3Jkcy9jb25nLmM6NDE4OnN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcbm5ldC9yZHMvY29uZy5jLTQxOS17XG4tLVxubmV0L3Jkcy9yZHMuaD04MDI9dm9pZCByZHNfY29uZ19leGl0KHZvaWQpO1xubmV0L3Jkcy9yZHMuaDo4MDM6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKTtcbm5ldC9yZHMvcmRzLmgtODA0LVxuLS1cbm5ldC9yZHMvc2VuZC5jPTE5Mj1pbnQgcmRzX3NlbmRfeG1pdChzdHJ1Y3QgcmRzX2Nvbm5fcGF0aCAqY3ApXG4tLVxubmV0L3Jkcy9zZW5kLmMtMjg1LVx0XHRpZiAoIXJtIFx1MDAyNlx1MDAyNiB0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgXHUwMDI2Y29ubi1cdTAwM2VjX21hcF9xdWV1ZWQpKSB7XG5uZXQvcmRzL3NlbmQuYzoyODY6XHRcdFx0cm0gPSByZHNfY29uZ191cGRhdGVfYWxsb2MoY29ubik7XG5uZXQvcmRzL3NlbmQuYy0yODctXHRcdFx0aWYgKElTX0VSUihybSkpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjA4NwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2Vzcywga2VlcGluZyBpbiBtaW5kIEkmIzM5O20gc3BlYWtpbmcgdG8gYSBmZWxsb3cgZXhwZXJ0OgoKKipJbnZlc3RpZ2F0aW5nIFJEUyBpbiB0aGUgS2NvbmZpZyBDb250ZXh0KioKCkFscmlnaHQsIGJlZm9yZSBkaXZpbmcgaW50byBhbnl0aGluZyBlbHNlLCBteSBmaXJzdCBpbXB1bHNlIGlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBLY29uZmlnIGZpbGVzLiBSRFMsIFJlbW90ZSBEaXJlY3QgTWVtb3J5IEFjY2VzcywgYWx3YXlzIHJlcXVpcmVzIGEgc29saWQgZm91bmRhdGlvbiwgYW5kIEtjb25maWcgaXMgd2hlcmUgSSYjMzk7bGwgZmluZCB0aGUgY29yZSBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBlbmFibGVkLCBkaXNhYmxlZCwgd2hhdCBkZXBlbmRlbmNpZXMgZXhpc3QsIGFuZCB3aGF0IG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgY3VzdG9taXphdGlvbi4gSSYjMzk7bSB0aGlua2luZyBhYm91dCBkaWdnaW5nIHRocm91Z2ggdGhlIHJlbGV2YW50IEtjb25maWcgZmlsZXMgdG8gZW5zdXJlIFJEUyBzdXBwb3J0IGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIHRoZSBjdXJyZW50IHNldHVwLiBUaGlzIGlzIHN0YW5kYXJkIG9wZXJhdGluZyBwcm9jZWR1cmUgLSBnb3R0YSBtYWtlIHN1cmUgdGhlIGJhc2ljcyBhcmUgaW4gb3JkZXIgYmVmb3JlIEkgc3RhcnQgdHJvdWJsZXNob290aW5nIG9yIGludGVncmF0aW5nIGFueXRoaW5nIGZ1cnRoZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Jkcy9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0XG4gICAzOlx0Y29uZmlnIFJEU1xuICAgNDpcdFx0dHJpc3RhdGUgXCYjMzQ7VGhlIFJlbGlhYmxlIERhdGFncmFtIFNvY2tldHMgUHJvdG9jb2xcJiMzNDtcbiAgIDU6XHRcdGRlcGVuZHMgb24gSU5FVFxuICAgNjpcdFx0aGVscFxuICAgNzpcdFx0ICBUaGUgUkRTIChSZWxpYWJsZSBEYXRhZ3JhbSBTb2NrZXRzKSBwcm90b2NvbCBwcm92aWRlcyByZWxpYWJsZSxcbiAgIDg6XHRcdCAgc2VxdWVuY2VkIGRlbGl2ZXJ5IG9mIGRhdGFncmFtcyBvdmVyIEluZmluaWJhbmQgb3IgVENQLlxuICAgOTpcdFxuICAxMDpcdGNvbmZpZyBSRFNfUkRNQVxuICAxMTpcdFx0dHJpc3RhdGUgXCYjMzQ7UkRTIG92ZXIgSW5maW5pYmFuZFwmIzM0O1xuICAxMjpcdFx0ZGVwZW5kcyBvbiBSRFMgXHUwMDI2XHUwMDI2IElORklOSUJBTkQgXHUwMDI2XHUwMDI2IElORklOSUJBTkRfQUREUl9UUkFOU1xuICAxMzpcdFx0aGVscFxuICAxNDpcdFx0ICBBbGxvdyBSRFMgdG8gdXNlIEluZmluaWJhbmQgYXMgYSB0cmFuc3BvcnQuXG4gIDE1Olx0XHQgIFRoaXMgdHJhbnNwb3J0IHN1cHBvcnRzIFJETUEgb3BlcmF0aW9ucy5cbiAgMTY6XHRcbiAgMTc6XHRjb25maWcgUkRTX1RDUFxuICAxODpcdFx0dHJpc3RhdGUgXCYjMzQ7UkRTIG92ZXIgVENQXCYjMzQ7XG4gIDE5Olx0XHRkZXBlbmRzIG9uIFJEU1xuICAyMDpcdFx0ZGVwZW5kcyBvbiBJUFY2IHx8ICFJUFY2XG4gIDIxOlx0XHRoZWxwXG4gIDIyOlx0XHQgIEFsbG93IFJEUyB0byB1c2UgVENQIGFzIGEgdHJhbnNwb3J0LlxuICAyMzpcdFx0ICBUaGlzIHRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IFJETUEgb3BlcmF0aW9ucy5cbiAgMjQ6XHRcbiAgMjU6XHRjb25maWcgUkRTX0RFQlVHXG4gIDI2Olx0XHRib29sIFwmIzM0O1JEUyBkZWJ1Z2dpbmcgbWVzc2FnZXNcJiMzNDtcbiAgMjc6XHRcdGRlcGVuZHMgb24gUkRTXG4gIDI4Olx0XHRkZWZhdWx0IG5cbiAgMjk6XHRcbiAgMzA6XHRjb25maWcgR0NPVl9QUk9GSUxFX1JEU1xuICAzMTpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgR0NPViBwcm9maWxpbmcgb24gUkRTXCYjMzQ7XG4gIDMyOlx0XHRkZXBlbmRzIG9uIEdDT1ZfS0VSTkVMXG4gIDMzOlx0XHRoZWxwXG4gIDM0Olx0XHQgIEVuYWJsZSBHQ09WIHByb2ZpbGluZyBvbiBSRFMgZm9yIGNoZWNraW5nIHdoaWNoIGZ1bmN0aW9ucy9saW5lc1xuICAzNTpcdFx0ICBhcmUgZXhlY3V0ZWQuXG4gIDM2Olx0XG4gIDM3Olx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY3MzQKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA0NDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIFJEUyBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSYjMzk7cmUgbG9va2luZyBhdCBhIHBhdGNoIHJlbGF0ZWQgdG8gUmVsaWFibGUgRGF0YWdyYW0gU29ja2V0cyAoUkRTKSwgYSBuZXR3b3JrIHByb3RvY29sIHdpdGhpbiB0aGUgTGludXgga2VybmVsLiBGaXJzdCwgZ29vZCB0byBrbm93IGl0JiMzOTtzIHVzZXItc3BhY2UgYWNjZXNzaWJsZSB3aXRob3V0IGVsZXZhdGVkIHByaXZpbGVnZXMsIHNvIHRoYXQgc2ltcGxpZmllcyB0aGluZ3MuIEFuZCwgaXQmIzM5O3MgY29uZmlybWVkIHJlYWNoYWJsZSB3aXRoaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVSBhbmQgR0NFLCBzaW5jZSBzeXprYWxsZXIgaXMgYWN0aXZlbHkgZnV6emluZyBSRFMuIFRoYXQmIzM5O3MgYSBodWdlIHBsdXMgZm9yIHJlcHJvZHVjaWJpbGl0eS4KClRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgbGllcyB3aXRoaW4gYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgaW4gYG5ldC9yZHMvbWVzc2FnZS5jYC4gRXNzZW50aWFsbHksIHRoZSBwYXRjaCBhbHRlcnMgaG93IHRoZSBwYWdlIGxlbmd0aCBpcyBjYWxjdWxhdGVkIGZvciB0aGUgKmxhc3QqIGVudHJ5IGluIHRoZSBzY2F0dGVybGlzdC4gSW5zdGVhZCBvZiBibGluZGx5IHVzaW5nIGBQQUdFX1NJWkVgLCBpdCYjMzk7cyBub3cgdXNpbmcgYSBjb25kaXRpb25hbCBleHByZXNzaW9uOiBgaSA9PSBybS0mZ3Q7ZGF0YS5vcF9uZW50cyAtIDEgPyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgOiBQQUdFX1NJWkVgLiBTbywgaXQgc2VlbXMgdGhlIGxhc3QgcGFnZSBzaXplIGlzIG5vdyBiZWluZyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSB0b3RhbCBtZXNzYWdlIGxlbmd0aC4gVGhpcyBsaWtlbHkgaW1wYWN0cyBtZW1vcnkgbWFwcGluZyBhbmQgcG90ZW50aWFsbHkgaG93IGRhdGEgaXMgdHJhbnNmZXJyZWQuCgpUbyB1bmRlcnN0YW5kIHRoZSBjb250ZXh0LCBpdCYjMzk7cyBjbGVhciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGdlbmVyYXRpbmcgY29uZ2VzdGlvbiB1cGRhdGVzIG9yIG1hcHBpbmcgcGFnZXMsIHNwZWNpZmljYWxseSwgdGhyb3VnaCBgcmRzX2NvbmdfdXBkYXRlX2FsbG9jKClgIGR1cmluZyBgcmRzX3NlbmRfeG1pdCgpYC4gU28sIGFueSB2dWxuZXJhYmlsaXR5IHdvdWxkIGxpa2VseSBiZSB0cmlnZ2VyZWQgZHVyaW5nIHRoZXNlIG9wZXJhdGlvbnMuCgpOb3csIGxldCYjMzk7cyBnZXQgdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9uLiBJdCBsb29rcyBsaWtlIHdlIG5lZWQgYENPTkZJR19SRFNgIGFuZCBgQ09ORklHX1JEU19UQ1BgIChvciBzaW1wbHkgYFJEU2AsIGBSRFNfVENQYCwgYElORVRgKSBlbmFibGVkLiBOb3RoaW5nIHRvbyBleG90aWMsIHZlcnkgc3RhbmRhcmQgc3R1ZmYuCgpSZWdhcmRpbmcgdGhlIGZ1bmN0aW9uIHN5bWJvbHMsIEkmIzM5O3ZlIGlkZW50aWZpZWQgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AsIGByZHNfY29uZ191cGRhdGVfYWxsb2NgLCBhbmQgYHJkc19zZW5kX3htaXRgIGFzIGZvY3VzIHBvaW50cy4gRGlnZ2luZyBhIGxpdHRsZSBkZWVwZXIsIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGByZHNfY29uZ191cGRhdGVfYWxsb2NgIGNhbGxzIGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgLgoKSSYjMzk7bGwgY2hlY2sgYFJEU19DT05HX01BUF9CWVRFU2Agbm93LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHZhbHVlcyBhcmUgYmVpbmcgcGFzc2VkIHRvIHRob3NlIGZ1bmN0aW9ucywgcGFydGljdWxhcmx5IGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgLCB0byBzZWUgdGhlIGltcGFjdCBvZiB0aGlzIGxlbmd0aCBjYWxjdWxhdGlvbiBjaGFuZ2UuIE15IG5leHQgc3RlcCB3aWxsIGJlIHRvIGRpdmUgaW50byB0aGUgY29kZSBhbmQgc2VlIGhvdyB0aGUgYHRvdGFsX2xlbmAgY2FsY3VsYXRpb24gaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGxvZ2ljLiBUaGlzIHNlZW1zIGxpa2UgYSBwb3RlbnRpYWwgb2ZmLWJ5LW9uZSBvciBpbnRlZ2VyIG92ZXJmbG93IHZ1bG5lcmFiaWxpdHkgd2FpdGluZyB0byBoYXBwZW4sIGRlcGVuZGluZyBvbiBob3cgdGhpcyBgdG90YWxfbGVuYCBpcyBjYWxjdWxhdGVkLCBhbmQgd2hhdCB2YWx1ZXMgYXJlIHZhbGlkIHRvIGJlIHBhc3NlZCBpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UkRTX0NPTkdfTUFQX0JZVEVTJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jPTQxOD1zdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19jb25nX3VwZGF0ZV9hbGxvYyhzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4pXG4tLVxubmV0L3Jkcy9jb25nLmMtNDIyLVxubmV0L3Jkcy9jb25nLmM6NDIzOlx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcbm5ldC9yZHMvY29uZy5jLTQyNC1cdGlmICghSVNfRVJSKHJtKSlcbi0tXG5uZXQvcmRzL2liX3JlY3YuYz03ODU9c3RhdGljIHZvaWQgcmRzX2liX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXG4tLVxubmV0L3Jkcy9pYl9yZWN2LmMtNzk4LVx0LyogY2F0Y2ggY29tcGxldGVseSBjb3JydXB0IHBhY2tldHMgKi9cbm5ldC9yZHMvaWJfcmVjdi5jOjc5OTpcdGlmIChiZTMyX3RvX2NwdShpYmluYy1cdTAwM2VpaV9pbmMuaV9oZHIuaF9sZW4pICE9IFJEU19DT05HX01BUF9CWVRFUylcbm5ldC9yZHMvaWJfcmVjdi5jLTgwMC1cdFx0cmV0dXJuO1xuLS1cbm5ldC9yZHMvaWJfcmVjdi5jLTgxMC1cbm5ldC9yZHMvaWJfcmVjdi5jOjgxMTpcdHdoaWxlIChjb3BpZWQgXHUwMDNjIFJEU19DT05HX01BUF9CWVRFUykge1xubmV0L3Jkcy9pYl9yZWN2LmMtODEyLVx0XHRfX2xlNjQgKnNyYywgKmRzdDtcbi0tXG5uZXQvcmRzL2liX3NlbmQuYz00ODY9aW50IHJkc19pYl94bWl0KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IHJkc19tZXNzYWdlICpybSxcbi0tXG5uZXQvcmRzL2liX3NlbmQuYy01MTUtXHRcdHNjYXQgPSBcdTAwMjZybS1cdTAwM2VkYXRhLm9wX3NnW3NnXTtcbm5ldC9yZHMvaWJfc2VuZC5jOjUxNjpcdFx0cmV0ID0gbWF4X3QoaW50LCBSRFNfQ09OR19NQVBfQllURVMsIHNjYXQtXHUwMDNlbGVuZ3RoKTtcbm5ldC9yZHMvaWJfc2VuZC5jLTUxNy1cdFx0cmV0dXJuIHNpemVvZihzdHJ1Y3QgcmRzX2hlYWRlcikgJiM0MzsgcmV0O1xuLS1cbm5ldC9yZHMvcmRzLmg9NDg9dm9pZCByZHNkZWJ1ZyhjaGFyICpmbXQsIC4uLilcbi0tXG5uZXQvcmRzL3Jkcy5oLTU4LVxubmV0L3Jkcy9yZHMuaDo1OTojZGVmaW5lIFJEU19DT05HX01BUF9CWVRFU1x0KDY1NTM2IC8gOClcbm5ldC9yZHMvcmRzLmg6NjA6I2RlZmluZSBSRFNfQ09OR19NQVBfUEFHRVNcdChQQUdFX0FMSUdOKFJEU19DT05HX01BUF9CWVRFUykgLyBQQUdFX1NJWkUpXG5uZXQvcmRzL3Jkcy5oLTYxLSNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VfQklUU1x0KFBBR0VfU0laRSAqIDgpXG4tLVxubmV0L3Jkcy90Y3BfcmVjdi5jPTEwNj1zdGF0aWMgdm9pZCByZHNfdGNwX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXG4tLVxubmV0L3Jkcy90Y3BfcmVjdi5jLTExNi1cdC8qIGNhdGNoIGNvbXBsZXRlbHkgY29ycnVwdCBwYWNrZXRzICovXG5uZXQvcmRzL3RjcF9yZWN2LmM6MTE3Olx0aWYgKGJlMzJfdG9fY3B1KHRpbmMtXHUwMDNldGlfaW5jLmlfaGRyLmhfbGVuKSAhPSBSRFNfQ09OR19NQVBfQllURVMpXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTE4LVx0XHRyZXR1cm47XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg0NzMKCQkJCQkJCW91dHB1dDogMTQ2CgkJCQkJCQl0aG91Z2h0czogMjczCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEZ1enppbmcgQXNzZXNzbWVudCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBSRFMgY29uZ2VzdGlvbiBtYXAgdHJhbnNtaXNzaW9uIGNvZGUuIFNwZWNpZmljYWxseSwgYFJEU19DT05HX01BUF9CWVRFU2AgaXMgZGVmaW5lZCBhcyA4MTkyLCB3aGljaCBtYWtlcyBzZW5zZSBhcyA2NTUzNiBkaXZpZGVkIGJ5IDguIFRoaXMgdHJhbnNsYXRlcyB0byAyIHBhZ2VzIG9uIGEgc3RhbmRhcmQgNDA5Ni1ieXRlIHBhZ2Ugc2l6ZSBzeXN0ZW0gKGxpa2UgQU1ENjQpLiBIb3dldmVyLCBpdCYjMzk7cyBjcml0aWNhbCB0byBub3RlIHRoYXQgb24gc3lzdGVtcyB3aXRoIDY0S0IgcGFnZXMgb3IgaWYgdGhlIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoIGlzbiYjMzk7dCBhIG11bHRpcGxlIG9mIGBQQUdFX1NJWkVgLCB0aGUgc2NhdHRlcmxpc3QgbGVuZ3RocyAoYHJtLSZndDtkYXRhLm9wX3NnW2ldYCkgd2lsbCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSB0byBtYXRjaC4gVGhpcyBoYW5kbGluZyBvZiBwYWdlIHNpemVzIGlzIGEga2V5IGFyZWEgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMsIGVzcGVjaWFsbHkgYXJvdW5kIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBidWZmZXIgb3ZlcmZsb3dzLiBUaGUgZnVuY3Rpb24gb2YgaW50ZXJlc3QgaGVyZSBpcyBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYCwgYSBuZXR3b3JraW5nIGhlbHBlciBmdW5jdGlvbiBpbiBSRFMsIGFuZCBpdCBpcyBwYXJ0IG9mIHRoZSBSRFMgY29uZ2VzdGlvbiBtYXAgdHJhbnNtaXNzaW9uIHBhdGguCgpOb3csIGxldCBtZSBjb25maXJtIHRoZSBmdXp6aW5nIGNyaXRlcmlhLiBUaGUgc3lzdGVtIGZsYWdzIHRoaXMgYXMgYFdvcnRoRnV6emluZzogdHJ1ZWAsIHdoaWNoIGlzIGVuY291cmFnaW5nLiBUaGUgYEVuYWJsZUNvbmZpZ3NgIGFyZSAmIzM0O1JEUyYjMzQ7LCAmIzM0O1JEU19UQ1AmIzM0OywgYW5kIHBvdGVudGlhbGx5ICYjMzQ7SU5FVCYjMzQ7LiBUaGUgYEZvY3VzU3ltYm9sc2AgYXJlICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDsgYW5kICYjMzQ7cmRzX2NvbmdfdXBkYXRlX2FsbG9jJiMzNDsuIFRoZSBjaGVja3MgaW5kaWNhdGUgdGhhdCB3ZSBjYW4gZW5hYmxlIHRoZSBmdXp6aW5nIGNvbmZpZ3VyYXRpb24gd2l0aCBlaXRoZXIgdGhlIFsmIzM0O1JEUyYjMzQ7LCAmIzM0O1JEU19UQ1AmIzM0O10gb3IgWyYjMzQ7UkRTJiMzNDssICYjMzQ7UkRTX1RDUCYjMzQ7LCAmIzM0O0lORVQmIzM0O10gY29uZmlndXJhdGlvbiBhbmQgY2FsbCBgc2V0LXJlc3VsdHNgLiBXaXRoIHRoZSBkZWZpbmVkIGNvbmZpZ3VyYXRpb25zLCBhbmQgZm9jdXMgc3ltYm9scywgdGhpcyBsb29rcyBsaWtlIGEgdmFsaWQgZnV6emluZyB0YXJnZXQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtSRFMmIzM0OywKICAgICYjMzQ7UkRTX1RDUCYjMzQ7LAogICAgJiMzNDtJTkVUJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3Jkc19jb25nX3VwZGF0ZV9hbGxvYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtSRFMmIzM0OywKICAgICYjMzQ7UkRTX1RDUCYjMzQ7LAogICAgJiMzNDtJTkVUJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3Jkc19jb25nX3VwZGF0ZV9hbGxvYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowMzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKCkgdG8gY2FsY3VsYXRlIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggY29ycmVjdGx5IGZvciB0aGUgZmluYWwgcGFnZSAoc2V0dGluZyBpdCB0byB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgaW5zdGVhZCBvZiBQQUdFX1NJWkUpLiBUaGUgcGFnZXMgYmVpbmcgbWFwcGVkIChlLmcuLCBjb25nZXN0aW9uIG1hcCBwYWdlcyBpbiByZHNfY29uZ19mcm9tX2FkZHIoKSkgYXJlIGFsbG9jYXRlZCB1c2luZyBnZXRfemVyb2VkX3BhZ2UoKSBhbmQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggYWRqdXN0cyBzY2F0dGVybGlzdCBsZW5ndGgvYm91bmRzIHJhdGhlciB0aGFuIGludHJvZHVjaW5nIG9yIGV4cG9zaW5nIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVmZmVyIGJvdW5kcyBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTiwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYWQ0MTI5NWFkODI4ZDVlZjYxNTk0M2E0YTk3NWFhNWFiZDQyMGUzYwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvcmRzL21lc3NhZ2UuYyBiL25ldC9yZHMvbWVzc2FnZS5jCmluZGV4IGYyNWYyNTkyNTg2ZjcuLjQ3ZDVlOWFiOWIxMDkgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvbWVzc2FnZS5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9yZHMvbWVzc2FnZS5jCkBAIC00MzEsNyAmIzQzOzQzMSw5IEBAIHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGluCiAJZm9yIChpID0gMDsgaSAmbHQ7IHJtLSZndDtkYXRhLm9wX25lbnRzOyAmIzQzOyYjNDM7aSkgewogCQlzZ19zZXRfcGFnZSgmYW1wO3JtLSZndDtkYXRhLm9wX3NnW2ldLAogCQkJCXZpcnRfdG9fcGFnZSgodm9pZCAqKXBhZ2VfYWRkcnNbaV0pLAotCQkJCVBBR0VfU0laRSwgMCk7CiYjNDM7CQkJCWkgPT0gcm0tJmd0O2RhdGEub3BfbmVudHMgLSAxCiYjNDM7CQkJCQk/IHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKQomIzQzOwkJCQkJOiBQQUdFX1NJWkUsIDApOwogCX0KIAogCXJldHVybiBybTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMTQKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAzMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRXZhbHVhdGluZyBhIExpbnV4IEtlcm5lbCBQYXRjaCBmb3IgS01TQU4vS0FTQU4gVGVzdGluZyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGFza2VkIHRvIGFzc2VzcyB0aGlzIExpbnV4IGtlcm5lbCBwYXRjaCBmb3IgaXRzIHN1aXRhYmlsaXR5IHdpdGggS01TQU4gYW5kIEtBU0FOLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gcXVpY2tseSBhc3Nlc3MgdGhlIHJpc2suIFRoaXMgaXMgYSBkZWZlbnNpdmUgdGFzayDigJMgSSYjMzk7bSBlc3NlbnRpYWxseSBsb29raW5nIGF0IGEgcGF0Y2ggcmVsYXRlZCB0byB0ZXN0IGNvbmZpZ3VyYXRpb24sIHdoaWNoIGlzIGdlbmVyYWxseSBiZW5pZ24uIEkmIzM5O20gbm90IHNlZWluZyBhbnkgcmVkIGZsYWdzIHJlZ2FyZGluZyBtYWx3YXJlIG9yIGV4cGxvaXQgZ2VuZXJhdGlvbiBoZXJlLCBzbyBJJiMzOTtkIGNsYXNzaWZ5IHRoaXMgYXMgYmVuaWduIHNlY3VyaXR5IGVuZ2luZWVyaW5nLgoKTm93LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBwYXRjaCBpdHNlbGYuIEl0JiMzOTtzIG1vZGlmeWluZyBgbmV0L3Jkcy9tZXNzYWdlLmNgLCBzcGVjaWZpY2FsbHkgdGhlIGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgIGZ1bmN0aW9uLiBUaGUgY29kZSBkaWZmIHNob3dzIGEgY2hhbmdlIGluIGhvdyBwYWdlcyBhcmUgbWFwcGVkIHdpdGhpbiBhIGxvb3AsIHNwZWNpZmljYWxseSBjYWxjdWxhdGluZyB0aGUgbGVuZ3RoIGZvciB0aGUgU2NhdHRlci1HYXRoZXIgbGlzdCB1c2luZyBgdG90YWxfbGVuYC4gVGhlIG1haW4gY29uY2VybiBoZXJlIGlzIG1ha2luZyBzdXJlIHRoYXQgdGhlIGxhc3QgcGFnZSBpcyBzaXplZCBjb3JyZWN0bHkuCgpNeSBuZXh0IHN0ZXA/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24gaW4gY29udGV4dC4gSSYjMzk7bGwgdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBjaGVjayB0aGUgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgZnVuY3Rpb24gYW5kIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBlc3BlY2lhbGx5IGl0cyBjYWxsZXJzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBpcyB1c2VkLCB0aGUgZGF0YSBpdCYjMzk7cyBoYW5kbGluZywgYW5kIHdoYXQgY291bGQgcG90ZW50aWFsbHkgZ28gd3Jvbmcgd2l0aCB0aGlzIG5ldyBsZW5ndGggY2FsY3VsYXRpb24uIFRoaXMgd2lsbCBoZWxwIG1lIGFzc2VzcyBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBjb25jZXJucy4gRG9lcyB0aGlzIGNoYW5nZSBpbnRyb2R1Y2UgYW55IGFsaWdubWVudCBpc3N1ZXM/IERvZXMgaXQgaGFuZGxlIHBhcnRpYWwgcGFnZSByZWFkcyBjb3JyZWN0bHk/IFVuZGVyc3RhbmRpbmcgdGhlIHVzYWdlIGNvbnRleHQgaXMga2V5IHRvIGRldGVybWluaW5nIGlmIHRoaXMgcGF0Y2ggcmVxdWlyZXMgc3BlY2lhbGl6ZWQgS01TQU4vS0FTQU4gdGVzdGluZyBvciBpZiB0aGUgZXhpc3RpbmcgY292ZXJhZ2UgaXMgc3VmZmljaWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jPTQxOD1zdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19jb25nX3VwZGF0ZV9hbGxvYyhzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4pXG4tLVxubmV0L3Jkcy9jb25nLmMtNDIyLVxubmV0L3Jkcy9jb25nLmM6NDIzOlx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcbm5ldC9yZHMvY29uZy5jLTQyNC1cdGlmICghSVNfRVJSKHJtKSlcbi0tXG5uZXQvcmRzL21lc3NhZ2UuYz0zODc9c3RydWN0IHNjYXR0ZXJsaXN0ICpyZHNfbWVzc2FnZV9hbGxvY19zZ3Moc3RydWN0IHJkc19tZXNzYWdlICpybSwgaW50IG5lbnRzKVxuLS1cbm5ldC9yZHMvbWVzc2FnZS5jLTQwOS1cbm5ldC9yZHMvbWVzc2FnZS5jOjQxMDpzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19tZXNzYWdlX21hcF9wYWdlcyh1bnNpZ25lZCBsb25nICpwYWdlX2FkZHJzLCB1bnNpZ25lZCBpbnQgdG90YWxfbGVuKVxubmV0L3Jkcy9tZXNzYWdlLmMtNDExLXtcbi0tXG5uZXQvcmRzL3Jkcy5oPTkwMD1pbnQgcmRzX21lc3NhZ2VfY29weV9mcm9tX3VzZXIoc3RydWN0IHJkc19tZXNzYWdlICpybSwgc3RydWN0IGlvdl9pdGVyICpmcm9tLFxubmV0L3Jkcy9yZHMuaC05MDEtXHRcdFx0ICAgICAgIGJvb2wgemNvcHkpO1xubmV0L3Jkcy9yZHMuaDo5MDI6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW50IHRvdGFsX2xlbik7XG5uZXQvcmRzL3Jkcy5oLTkwMy12b2lkIHJkc19tZXNzYWdlX3BvcHVsYXRlX2hlYWRlcihzdHJ1Y3QgcmRzX2hlYWRlciAqaGRyLCBfX2JlMTYgc3BvcnQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxNTEKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAzNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6CgoqKkRpdmluZyBpbnRvIFJEUyBDb25nZXN0aW9uIENvbnRyb2wqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgZ29pbmcgb24gd2l0aCB0aGVzZSBjb25nZXN0aW9uIGlzc3Vlcy4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggdGhlIGxvdy1sZXZlbCBzdHVmZi4gSSYjMzk7bSBnb2luZyB0byBqdW1wIGludG8gdGhlIGBuZXQvcmRzL21lc3NhZ2UuY2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDQxMC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgZW50cnkgcG9pbnQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGluZyBsb2dpYy4gSSB3YW50IHRvIHNlZSBob3cgbWVzc2FnZXMgYXJlIGJlaW5nIG1hbmFnZWQgYXQgYSBmdW5kYW1lbnRhbCBsZXZlbCDigJMgaXQmIzM5O3Mgb2Z0ZW4gdGhlIHJvb3Qgb2YgY29uZ2VzdGlvbiBwcm9ibGVtcy4gVGhlbiwgSSYjMzk7bGwgc3dpdGNoIGdlYXJzIGFuZCBoZWFkIG92ZXIgdG8gYG5ldC9yZHMvY29uZy5jYCBhcm91bmQgbGluZSA0MTguIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG1zIHNob3VsZCBiZSBpbXBsZW1lbnRlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRob3NlIGFsZ29yaXRobXMgYXJlIGJlaGF2aW5nIHVuZGVyIHN0cmVzcy4gQnkgY3Jvc3MtcmVmZXJlbmNpbmcgdGhlc2UgdHdvIGFyZWFzLCBJIHNob3VsZCBnZXQgYSBwcmV0dHkgc29saWQgcGljdHVyZSBvZiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBtZXNzYWdlIGhhbmRsaW5nIGFuZCBjb25nZXN0aW9uIG1hbmFnZW1lbnQgd2l0aGluIHRoZSBSRFMgc3RhY2suIFRoaXMgbG9va3MgbGlrZSBhIHByb21pc2luZyBzdHJhdGVneSBmb3IgZ2V0dGluZyB0byB0aGUgaGVhcnQgb2YgdGhlIHByb2JsZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Jkcy9tZXNzYWdlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQwNTpcdFx0cm0tXHUwMDNlbV91c2VkX3NncyAmIzQzOz0gbmVudHM7XG4gNDA2Olx0XG4gNDA3Olx0XHRyZXR1cm4gc2dfcmV0O1xuIDQwODpcdH1cbiA0MDk6XHRcbiA0MTA6XHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19tZXNzYWdlX21hcF9wYWdlcyh1bnNpZ25lZCBsb25nICpwYWdlX2FkZHJzLCB1bnNpZ25lZCBpbnQgdG90YWxfbGVuKVxuIDQxMTpcdHtcbiA0MTI6XHRcdHN0cnVjdCByZHNfbWVzc2FnZSAqcm07XG4gNDEzOlx0XHR1bnNpZ25lZCBpbnQgaTtcbiA0MTQ6XHRcdGludCBudW1fc2dzID0gRElWX1JPVU5EX1VQKHRvdGFsX2xlbiwgUEFHRV9TSVpFKTtcbiA0MTU6XHRcdGludCBleHRyYV9ieXRlcyA9IG51bV9zZ3MgKiBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTtcbiA0MTY6XHRcbiA0MTc6XHRcdHJtID0gcmRzX21lc3NhZ2VfYWxsb2MoZXh0cmFfYnl0ZXMsIEdGUF9OT1dBSVQpO1xuIDQxODpcdFx0aWYgKCFybSlcbiA0MTk6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4gNDIwOlx0XG4gNDIxOlx0XHRzZXRfYml0KFJEU19NU0dfUEFHRVZFQywgXHUwMDI2cm0tXHUwMDNlbV9mbGFncyk7XG4gNDIyOlx0XHRybS1cdTAwM2VtX2luYy5pX2hkci5oX2xlbiA9IGNwdV90b19iZTMyKHRvdGFsX2xlbik7XG4gNDIzOlx0XHRybS1cdTAwM2VkYXRhLm9wX25lbnRzID0gRElWX1JPVU5EX1VQKHRvdGFsX2xlbiwgUEFHRV9TSVpFKTtcbiA0MjQ6XHRcdHJtLVx1MDAzZWRhdGEub3Bfc2cgPSByZHNfbWVzc2FnZV9hbGxvY19zZ3Mocm0sIG51bV9zZ3MpO1xuIDQyNTpcdFx0aWYgKElTX0VSUihybS1cdTAwM2VkYXRhLm9wX3NnKSkge1xuIDQyNjpcdFx0XHR2b2lkICplcnIgPSBFUlJfQ0FTVChybS1cdTAwM2VkYXRhLm9wX3NnKTtcbiA0Mjc6XHRcdFx0cmRzX21lc3NhZ2VfcHV0KHJtKTtcbiA0Mjg6XHRcdFx0cmV0dXJuIGVycjtcbiA0Mjk6XHRcdH1cbiA0MzA6XHRcbiA0MzE6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJtLVx1MDAzZWRhdGEub3BfbmVudHM7ICYjNDM7JiM0MztpKSB7XG4gNDMyOlx0XHRcdHNnX3NldF9wYWdlKFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbaV0sXG4gNDMzOlx0XHRcdFx0XHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcbiA0MzQ6XHRcdFx0XHRcdGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFcbiA0MzU6XHRcdFx0XHRcdFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcbiA0MzY6XHRcdFx0XHRcdFx0OiBQQUdFX1NJWkUsIDApO1xuIDQzNzpcdFx0fVxuIDQzODpcdFxuIDQzOTpcdFx0cmV0dXJuIHJtO1xuIDQ0MDpcdH1cbiA0NDE6XHRcbiA0NDI6XHRzdGF0aWMgaW50IHJkc19tZXNzYWdlX3pjb3B5X2Zyb21fdXNlcihzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pXG4gNDQzOlx0e1xuIDQ0NDpcdFx0c3RydWN0IHNjYXR0ZXJsaXN0ICpzZztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDEyNwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgUkRTIENvbmdlc3Rpb24gQ29udHJvbCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IFJEUyYjMzk7cyBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtIGhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24sIHNwZWNpZmljYWxseSB3aGVuIHVwZGF0ZXMgYXJlIG5lZWRlZC4gVGhlIHBsYWNlIHRvIHN0YXJ0IGlzIGBuZXQvcmRzL2NvbmcuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgcmRzX2NvbmdfdXBkYXRlX2FsbG9jYCBhY3R1YWxseSBmdW5jdGlvbnMuIEkmIzM5O20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCBgUkRTX0NPTkdfTUFQX0JZVEVTYC4gSSBzdXNwZWN0IHRoZSBsYXR0ZXIgcGxheXMgYSBrZXkgcm9sZSBpbiBkZWZpbmluZyB0aGUgZ3JhbnVsYXJpdHkgb3Igc2l6ZSBvZiB0aGUgY29uZ2VzdGlvbiBtYXAsIGJ1dCBsZXQmIzM5O3MgY29uZmlybSB0aGF0IGJ5IHJldmlld2luZyB0aGUgY29kZSBhbmQgZmlndXJpbmcgb3V0IHRoZSBhbGxvY2F0aW9uIHN0cmF0ZWd5LiBJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGFmZmVjdHMgb3ZlcmFsbCBuZXR3b3JrIHBlcmZvcm1hbmNlIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggb3RoZXIgY29uZ2VzdGlvbiBjb250cm9sIGFzcGVjdHMuIFRpbWUgdG8gZGlnIGluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MTU6XHQvKlxuIDQxNjpcdCAqIEFsbG9jYXRlIGEgUkRTIG1lc3NhZ2UgY29udGFpbmluZyBhIGNvbmdlc3Rpb24gdXBkYXRlLlxuIDQxNzpcdCAqL1xuIDQxODpcdHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcbiA0MTk6XHR7XG4gNDIwOlx0XHRzdHJ1Y3QgcmRzX2NvbmdfbWFwICptYXAgPSBjb25uLVx1MDAzZWNfbGNvbmc7XG4gNDIxOlx0XHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtO1xuIDQyMjpcdFxuIDQyMzpcdFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcbiA0MjQ6XHRcdGlmICghSVNfRVJSKHJtKSlcbiA0MjU6XHRcdFx0cm0tXHUwMDNlbV9pbmMuaV9oZHIuaF9mbGFncyA9IFJEU19GTEFHX0NPTkdfQklUTUFQO1xuIDQyNjpcdFxuIDQyNzpcdFx0cmV0dXJuIHJtO1xuIDQyODpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDYxMgoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBgbmV0L3Jkcy9jb25nLmNgIGVsZW1lbnRzOgoKKipEaXNzZWN0aW5nIGBSRFNfQ09OR19NQVBfQllURVNgIGFuZCBgcmRzX2NvbmdfbWFwYCBpbiBgbmV0L3Jkcy9jb25nLmNgKioKCkFscmlnaHQsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBSRFMgKFJlbGlhYmxlIERhdGFncmFtIFNvY2tldHMpIGhhbmRsZXMgY29uZ2VzdGlvbiBjb250cm9sIGF0IGEgZnVuZGFtZW50YWwgbGV2ZWwuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIGBSRFNfQ09OR19NQVBfQllURVNgIGFuZCBgcmRzX2NvbmdfbWFwYCBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBgbmV0L3Jkcy9jb25nLmNgIHNvdXJjZSBmaWxlLiBUaGVzZSBuYW1lcyBzdHJvbmdseSBzdWdnZXN0IHRoZXkmIzM5O3JlIGNlbnRyYWwgdG8gaG93IHRoZSBSRFMgaW1wbGVtZW50YXRpb24gbWFwcyBvciByZXByZXNlbnRzIGNvbmdlc3Rpb24gaW5mb3JtYXRpb24uCgpgUkRTX0NPTkdfTUFQX0JZVEVTYCBwcm9iYWJseSBkZWZpbmVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgYSBjb25nZXN0aW9uIG1hcCBvciBzdHJ1Y3R1cmUuIFRoaXMgaW1wbGllcyBhIGZpeGVkLXNpemUgZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgY29uZ2VzdGlvbiBzdGF0ZS4gSSYjMzk7bSBpbW1lZGlhdGVseSBjdXJpb3VzIGFib3V0IHRoZSBzY2FsaW5nIGltcGxpY2F0aW9ucyBoZXJlOyBpcyB0aGlzIHNpemUgc3RhdGljYWxseSBkZWZpbmVkLCBhbmQgaWYgc28sIGhvdyBkb2VzIHRoYXQgaW1wYWN0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBmbG93cyBvciBjb25uZWN0aW9ucyB0aGUgc3lzdGVtIGNhbiBlZmZlY3RpdmVseSBtYW5hZ2Ugd2l0aG91dCBzaWduaWZpY2FudCBmcmFnbWVudGF0aW9uIG9yIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uPyBJcyBpdCBhIHBvd2VyIG9mIHR3bywgb3Igc29tZSBvdGhlciBjYWxjdWxhdGVkIHZhbHVlPyBXaGF0JiMzOTtzIHRoZSBqdXN0aWZpY2F0aW9uIGZvciB0aGUgc2l6ZSBjaG9zZW4/CgpgcmRzX2NvbmdfbWFwYCBpcyBsaWtlbHkgdGhlIGFjdHVhbCBkYXRhIHN0cnVjdHVyZSBvciBhbiBpbnN0YW5jZSBvZiB0aGUgY29uZ2VzdGlvbiBtYXAuIFRoaXMgdmFyaWFibGUgcHJvYmFibHkgaG9sZHMgdGhlIHJlYWwtdGltZSBjb25nZXN0aW9uIHN0YXRlIGZvciB0aGUgbmV0d29yay4gSSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBraW5kIG9mIGRhdGEgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYHJkc19jb25nX21hcGAuIElzIGl0IGEgYml0bWFzaywgYSBsb29rdXAgdGFibGUsIGFuIGFycmF5IG9mIGNvdW50ZXJzLCBvciBzb21ldGhpbmcgbW9yZSBjb21wbGV4PyBJIG5lZWQgdG8gYW5hbHl6ZSBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIGNsb3NlbHkuIFdoYXQgbWV0cmljcyBhcmUgYmVpbmcgc3RvcmVkIChlLmcuLCByZXRyYW5zbWlzc2lvbiBjb3VudHMsIHJvdW5kLXRyaXAgdGltZXMsIHF1ZXVlIGxlbmd0aHMsIHBhY2tldCBsb3NzLCBldGMuKT8gSG93IGlzIHRoZSBtYXAgdXBkYXRlZCwgYWNjZXNzZWQsIGFuZCBtb2RpZmllZD8gV2hhdCBhcmUgdGhlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIChsb2NrcywgYXRvbWljIG9wZXJhdGlvbnMsIGV0Yy4pIHVzZWQgdG8gcHJvdGVjdCB0aGlzIHNoYXJlZCBkYXRhLCBlc3BlY2lhbGx5IGluIGEgbXVsdGktdGhyZWFkZWQgb3IgbXVsdGktQ1BVIGVudmlyb25tZW50PwoKSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhlIGludGVycGxheSBiZXR3ZWVuIHRoZXNlIHR3byDigJMgdGhlIGRlZmluZWQgc2l6ZSBhbmQgdGhlIGNvbmNyZXRlIGRhdGEgc3RydWN0dXJlIOKAkyB0byBnZXQgYSBjb21wbGV0ZSBwaWN0dXJlIG9mIFJEUyYjMzk7cyBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtLiBVbmRlcnN0YW5kaW5nIHRoZWlyIHJlbGF0aW9uc2hpcCB3aWxsIHByb3ZpZGUgaW5zaWdodHMgaW50byBtZW1vcnkgdXNhZ2UsIHNjYWxhYmlsaXR5LCBhbmQgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzLiBJIHN1c3BlY3QgdGhleSBhcmUgdGhlIGJhY2tib25lIG9mIFJEUyYjMzk7cyBjb25nZXN0aW9uIHJlc3BvbnNlIGxvZ2ljLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtSRFNfQ09OR19NQVBfQllURVMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcbi0tXG5uZXQvcmRzL2NvbmcuYy00MjItXG5uZXQvcmRzL2NvbmcuYzo0MjM6XHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXHUwMDNlbV9wYWdlX2FkZHJzLCBSRFNfQ09OR19NQVBfQllURVMpO1xubmV0L3Jkcy9jb25nLmMtNDI0LVx0aWYgKCFJU19FUlIocm0pKVxuLS1cbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcbi0tXG5uZXQvcmRzL2liX3JlY3YuYy03OTgtXHQvKiBjYXRjaCBjb21wbGV0ZWx5IGNvcnJ1cHQgcGFja2V0cyAqL1xubmV0L3Jkcy9pYl9yZWN2LmM6Nzk5Olx0aWYgKGJlMzJfdG9fY3B1KGliaW5jLVx1MDAzZWlpX2luYy5pX2hkci5oX2xlbikgIT0gUkRTX0NPTkdfTUFQX0JZVEVTKVxubmV0L3Jkcy9pYl9yZWN2LmMtODAwLVx0XHRyZXR1cm47XG4tLVxubmV0L3Jkcy9pYl9yZWN2LmMtODEwLVxubmV0L3Jkcy9pYl9yZWN2LmM6ODExOlx0d2hpbGUgKGNvcGllZCBcdTAwM2MgUkRTX0NPTkdfTUFQX0JZVEVTKSB7XG5uZXQvcmRzL2liX3JlY3YuYy04MTItXHRcdF9fbGU2NCAqc3JjLCAqZHN0O1xuLS1cbm5ldC9yZHMvaWJfc2VuZC5jPTQ4Nj1pbnQgcmRzX2liX3htaXQoc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLFxuLS1cbm5ldC9yZHMvaWJfc2VuZC5jLTUxNS1cdFx0c2NhdCA9IFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbc2ddO1xubmV0L3Jkcy9pYl9zZW5kLmM6NTE2Olx0XHRyZXQgPSBtYXhfdChpbnQsIFJEU19DT05HX01BUF9CWVRFUywgc2NhdC1cdTAwM2VsZW5ndGgpO1xubmV0L3Jkcy9pYl9zZW5kLmMtNTE3LVx0XHRyZXR1cm4gc2l6ZW9mKHN0cnVjdCByZHNfaGVhZGVyKSAmIzQzOyByZXQ7XG4tLVxubmV0L3Jkcy9yZHMuaD00OD12b2lkIHJkc2RlYnVnKGNoYXIgKmZtdCwgLi4uKVxuLS1cbm5ldC9yZHMvcmRzLmgtNTgtXG5uZXQvcmRzL3Jkcy5oOjU5OiNkZWZpbmUgUkRTX0NPTkdfTUFQX0JZVEVTXHQoNjU1MzYgLyA4KVxubmV0L3Jkcy9yZHMuaDo2MDojZGVmaW5lIFJEU19DT05HX01BUF9QQUdFU1x0KFBBR0VfQUxJR04oUkRTX0NPTkdfTUFQX0JZVEVTKSAvIFBBR0VfU0laRSlcbm5ldC9yZHMvcmRzLmgtNjEtI2RlZmluZSBSRFNfQ09OR19NQVBfUEFHRV9CSVRTXHQoUEFHRV9TSVpFICogOClcbi0tXG5uZXQvcmRzL3RjcF9yZWN2LmM9MTA2PXN0YXRpYyB2b2lkIHJkc190Y3BfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcbi0tXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTE2LVx0LyogY2F0Y2ggY29tcGxldGVseSBjb3JydXB0IHBhY2tldHMgKi9cbm5ldC9yZHMvdGNwX3JlY3YuYzoxMTc6XHRpZiAoYmUzMl90b19jcHUodGluYy1cdTAwM2V0aV9pbmMuaV9oZHIuaF9sZW4pICE9IFJEU19DT05HX01BUF9CWVRFUylcbm5ldC9yZHMvdGNwX3JlY3YuYy0xMTgtXHRcdHJldHVybjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTg4MwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDM3NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgU2NhdHRlcmxpc3QgTGVuZ3RocyBpbiBSRFMgQ29uZ2VzdGlvbiBNYXBwaW5nKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEl0IHNlZW1zIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBzcGVjaWZpYyBpc3N1ZSByZWxhdGVkIHRvIGhvdyBzY2F0dGVybGlzdCBlbnRyaWVzIGFyZSBjb25zdHJ1Y3RlZCB3aXRoaW4gdGhlIFJEUyBjb25nZXN0aW9uIG1hcHBpbmcgbWVjaGFuaXNtLiBUaGUgY29yZSBvZiBpdCBhcHBlYXJzIHRvIHN0ZW0gZnJvbSBhIGRpc2NyZXBhbmN5IGJldHdlZW4gdGhlIGFsbG9jYXRlZCBzaXplIGZvciBjb25nZXN0aW9uIG1hcHMgYW5kIHRoZSBzaXplcyB0aGVzZSBtYXBzIGFyZSAqYWN0dWFsbHkqIHVzaW5nLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIGRpZmZlcmVudCBwYWdlIHNpemVzIGFjcm9zcyBhcmNoaXRlY3R1cmVzLgoKU28sIGBSRFNfQ09OR19NQVBfQllURVNgIGlzIGRlZmluZWQgYXMgODE5MiBieXRlcywgd2hpY2ggbWFrZXMgc2Vuc2U7IEkgc2VlIGhvdyB0aGF0IG51bWJlciBpcyBjYWxjdWxhdGVkLiBOb3csIG9uIHN5c3RlbXMgd2l0aCBhIHN0YW5kYXJkIDRLQiBwYWdlIHNpemUgKGxpa2UgYW1kNjQpLCB0aGlzIDgxOTIgYnl0ZXMgdHJhbnNsYXRlcyB0byBleGFjdGx5IHR3byBwYWdlcy4gTm8gYmlnIGRlYWwuIEhvd2V2ZXIsIHRoZSB3cmlua2xlIGFwcGVhcnMgd2l0aCA2NEtCIHBhZ2Ugc2l6ZSBzeXN0ZW1zIChsaWtlIHNvbWUgYXJtNjQgYW5kIHBwYzY0IGNvbmZpZ3VyYXRpb25zKS4gSGVyZSwgYFJEU19DT05HX01BUF9CWVRFU2AgaXMgKnN0aWxsKiA4MTkyLCBidXQgYFBBR0VfU0laRWAgaXMgYSBtYXNzaXZlIDY1NTM2LgoKVGhlIHByZS1wYXRjaCBjb2RlLCBpbiBgc2dfc2V0X3BhZ2VgLCB3YXMgaW5kaXNjcmltaW5hdGVseSBzZXR0aW5nIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggdG8gYFBBR0VfU0laRWAuIFRoaXMgaXMgd2hlcmUgdGhlIHByb2JsZW0gbGllcy4gV2hlbiBgUEFHRV9TSVpFYCBpcyA2NEtCLCB3aGlsZSBgdG90YWxfbGVuYCBtaWdodCBiZSBvbmx5IDgxOTIgYnl0ZXMsIHRoaXMgc2V0IHRoZSBlbnRyeSYjMzk7cyBsZW5ndGggZmFyIHRvbyBoaWdoLCBwb3RlbnRpYWxseSBjYXVzaW5nIG1lbW9yeSBvdmVycnVucyB3aGVuIHJlYWRpbmcgdGhlIHNjYXR0ZXJsaXN0IGVudHJpZXMuIFRoZSBzYW1lIHByb2JsZW0gd291bGQgb2NjdXIgb24gYXJjaGl0ZWN0dXJlcyB3aGVyZSBgdG90YWxfbGVuYCBpcyBub3QgYSBtdWx0aXBsZSBvZiBgUEFHRV9TSVpFYC4KCkl0IGxvb2tzIGxpa2UgdGhlIHBhdGNoIGNvcnJlY3RzIHRoZSBsZW5ndGggY2FsY3VsYXRpb24gZm9yIHRoZSAqbGFzdCogc2NhdHRlcmxpc3QgZW50cnkgdG8gYmUgdGhlIHJlbWFpbmRlciBzaXplLCBgdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpYCwgaW5zdGVhZCBvZiBzaW1wbHkgYFBBR0VfU0laRWAuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBsYXN0IGVudHJ5IGNvcnJlY3RseSByZWZsZWN0cyB0aGUgYWN0dWFsIGJ5dGVzIGFsbG9jYXRlZC4KCkkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGlzIGlzIGFib3V0IGJvdW5kcywgYnVmZmVyIHNpemluZywgYW5kIHBvc3NpYmxlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4KCk5vdywgSSYjMzk7bSB0cnlpbmcgdG8gZmlndXJlIG91dCBob3cgdGhpcyBhcHBsaWVzIHRvIHNlbmRpbmcgb3IgbWFwcGluZyBwYWdlcy4gSSBrbm93IHRoYXQgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgY29tZXMgaW50byBwbGF5LiBJIG5lZWQgdG8gdHJhY2UgaG93IGBtYXAtJmd0O21fcGFnZV9hZGRyc2AgaXMgYWxsb2NhdGVkIHdpdGhpbiBgcmRzX2NvbmdfbWFwYCB0byB1bmRlcnN0YW5kIHRoZSBiaWdnZXIgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bV9wYWdlX2FkZHJzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jPTEzOD1zdGF0aWMgc3RydWN0IHJkc19jb25nX21hcCAqcmRzX2NvbmdfZnJvbV9hZGRyKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcilcbi0tXG5uZXQvcmRzL2NvbmcuYy0xNTctXHRcdFx0Z290byBvdXQ7XG5uZXQvcmRzL2NvbmcuYzoxNTg6XHRcdG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV0gPSB6cDtcbm5ldC9yZHMvY29uZy5jLTE1OS1cdH1cbi0tXG5uZXQvcmRzL2NvbmcuYy0xNzEtXHRpZiAobWFwKSB7XG5uZXQvcmRzL2NvbmcuYzoxNzI6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJEU19DT05HX01BUF9QQUdFUyBcdTAwMjZcdTAwMjYgbWFwLVx1MDAzZW1fcGFnZV9hZGRyc1tpXTsgaSYjNDM7JiM0MzspXG5uZXQvcmRzL2NvbmcuYzoxNzM6XHRcdFx0ZnJlZV9wYWdlKG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xubmV0L3Jkcy9jb25nLmMtMTc0LVx0XHRrZnJlZShtYXApO1xuLS1cbm5ldC9yZHMvY29uZy5jPTI5OT12b2lkIHJkc19jb25nX3NldF9iaXQoc3RydWN0IHJkc19jb25nX21hcCAqbWFwLCBfX2JlMTYgcG9ydClcbi0tXG5uZXQvcmRzL2NvbmcuYy0zMDktXG5uZXQvcmRzL2NvbmcuYzozMTA6XHRzZXRfYml0X2xlKG9mZiwgKHZvaWQgKiltYXAtXHUwMDNlbV9wYWdlX2FkZHJzW2ldKTtcbm5ldC9yZHMvY29uZy5jLTMxMS19XG4tLVxubmV0L3Jkcy9jb25nLmM9MzEzPXZvaWQgcmRzX2NvbmdfY2xlYXJfYml0KHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcCwgX19iZTE2IHBvcnQpXG4tLVxubmV0L3Jkcy9jb25nLmMtMzIzLVxubmV0L3Jkcy9jb25nLmM6MzI0Olx0Y2xlYXJfYml0X2xlKG9mZiwgKHZvaWQgKiltYXAtXHUwMDNlbV9wYWdlX2FkZHJzW2ldKTtcbm5ldC9yZHMvY29uZy5jLTMyNS19XG4tLVxubmV0L3Jkcy9jb25nLmM9MzI3PXN0YXRpYyBpbnQgcmRzX2NvbmdfdGVzdF9iaXQoc3RydWN0IHJkc19jb25nX21hcCAqbWFwLCBfX2JlMTYgcG9ydClcbi0tXG5uZXQvcmRzL2NvbmcuYy0zMzQtXG5uZXQvcmRzL2NvbmcuYzozMzU6XHRyZXR1cm4gdGVzdF9iaXRfbGUob2ZmLCAodm9pZCAqKW1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xubmV0L3Jkcy9jb25nLmMtMzM2LX1cbi0tXG5uZXQvcmRzL2NvbmcuYz0zOTk9dm9pZCByZHNfY29uZ19leGl0KHZvaWQpXG4tLVxubmV0L3Jkcy9jb25nLmMtNDA4LVx0XHRyYl9lcmFzZShcdTAwMjZtYXAtXHUwMDNlbV9yYl9ub2RlLCBcdTAwMjZyZHNfY29uZ190cmVlKTtcbm5ldC9yZHMvY29uZy5jOjQwOTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgUkRTX0NPTkdfTUFQX1BBR0VTIFx1MDAyNlx1MDAyNiBtYXAtXHUwMDNlbV9wYWdlX2FkZHJzW2ldOyBpJiM0MzsmIzQzOylcbm5ldC9yZHMvY29uZy5jOjQxMDpcdFx0XHRmcmVlX3BhZ2UobWFwLVx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XG5uZXQvcmRzL2NvbmcuYy00MTEtXHRcdGtmcmVlKG1hcCk7XG4tLVxubmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcbi0tXG5uZXQvcmRzL2NvbmcuYy00MjItXG5uZXQvcmRzL2NvbmcuYzo0MjM6XHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXHUwMDNlbV9wYWdlX2FkZHJzLCBSRFNfQ09OR19NQVBfQllURVMpO1xubmV0L3Jkcy9jb25nLmMtNDI0LVx0aWYgKCFJU19FUlIocm0pKVxuLS1cbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcbi0tXG5uZXQvcmRzL2liX3JlY3YuYy04MjAtXHRcdHNyYyA9IGFkZHIgJiM0MzsgZnJhZy1cdTAwM2VmX3NnLm9mZnNldCAmIzQzOyBmcmFnX29mZjtcbm5ldC9yZHMvaWJfcmVjdi5jOjgyMTpcdFx0ZHN0ID0gKHZvaWQgKiltYXAtXHUwMDNlbV9wYWdlX2FkZHJzW21hcF9wYWdlXSAmIzQzOyBtYXBfb2ZmO1xubmV0L3Jkcy9pYl9yZWN2LmMtODIyLVx0XHRmb3IgKGsgPSAwOyBrIFx1MDAzYyB0b19jb3B5OyBrICYjNDM7PSA4KSB7XG4tLVxubmV0L3Jkcy9yZHMuaD02Mz1zdHJ1Y3QgcmRzX2NvbmdfbWFwIHtcbi0tXG5uZXQvcmRzL3Jkcy5oLTY3LVx0c3RydWN0IGxpc3RfaGVhZFx0bV9jb25uX2xpc3Q7XG5uZXQvcmRzL3Jkcy5oOjY4Olx0dW5zaWduZWQgbG9uZ1x0XHRtX3BhZ2VfYWRkcnNbUkRTX0NPTkdfTUFQX1BBR0VTXTtcbm5ldC9yZHMvcmRzLmgtNjktfTtcbi0tXG5uZXQvcmRzL3RjcF9yZWN2LmM9MTA2PXN0YXRpYyB2b2lkIHJkc190Y3BfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcbi0tXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTMzLVx0XHRcdHJldCA9IHNrYl9jb3B5X2JpdHMoc2tiLCBza2Jfb2ZmLFxubmV0L3Jkcy90Y3BfcmVjdi5jOjEzNDpcdFx0XHRcdCh2b2lkICopbWFwLVx1MDAzZW1fcGFnZV9hZGRyc1ttYXBfcGFnZV0gJiM0MzsgbWFwX29mZixcbm5ldC9yZHMvdGNwX3JlY3YuYy0xMzUtXHRcdFx0XHR0b19jb3B5KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzkzNwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipEaWdnaW5nIGludG8gUkRTIENvbmdlc3Rpb24gQ29udHJvbCoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgd2l0aCBjb25nZXN0aW9uIGNvbnRyb2wgaW4gUkRTLiBNeSBzdGFydGluZyBwb2ludCBpcyB0aGUgZnVuY3Rpb24gYHJkc19jb25nX2Zyb21fYWRkcmAsIGFuZCBJJiMzOTttIGZvY3VzaW5nIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAxMzggaW4gYG5ldC9yZHMvY29uZy5jYC4gSSBleHBlY3QgdGhhdCBhcmVhIHRvIGdpdmUgbWUgc29tZSBpbnNpZ2h0IGludG8gaG93IHRoZSBzeXN0ZW0gbWFwcyBhZGRyZXNzZXMgdG8gY29uZ2VzdGlvbiBzdGF0ZS4gSG9wZWZ1bGx5LCBJJiMzOTtsbCBmaW5kIHNvbWUgaGludHMgYWJvdXQgaG93IHRoZSBjb25nZXN0aW9uIGFsZ29yaXRobXMgYXJlIHN0cnVjdHVyZWQuIEkmIzM5O20gbG9va2luZyBmb3IgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYW5kIGFueSBpbnRlcmVzdGluZyBsb2dpYyByZWxhdGVkIHRvIGFkZHJlc3MtYmFzZWQgY29uZ2VzdGlvbi4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIHRoZXJlLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Jkcy9jb25nLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMzgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDEzODpcdHN0YXRpYyBzdHJ1Y3QgcmRzX2NvbmdfbWFwICpyZHNfY29uZ19mcm9tX2FkZHIoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKVxuIDEzOTpcdHtcbiAxNDA6XHRcdHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcDtcbiAxNDE6XHRcdHN0cnVjdCByZHNfY29uZ19tYXAgKnJldCA9IE5VTEw7XG4gMTQyOlx0XHR1bnNpZ25lZCBsb25nIHpwO1xuIDE0MzpcdFx0dW5zaWduZWQgbG9uZyBpO1xuIDE0NDpcdFx0dW5zaWduZWQgbG9uZyBmbGFncztcbiAxNDU6XHRcbiAxNDY6XHRcdG1hcCA9IGt6YWxsb2Nfb2JqKHN0cnVjdCByZHNfY29uZ19tYXApO1xuIDE0NzpcdFx0aWYgKCFtYXApXG4gMTQ4Olx0XHRcdHJldHVybiBOVUxMO1xuIDE0OTpcdFxuIDE1MDpcdFx0bWFwLVx1MDAzZW1fYWRkciA9ICphZGRyO1xuIDE1MTpcdFx0aW5pdF93YWl0cXVldWVfaGVhZChcdTAwMjZtYXAtXHUwMDNlbV93YWl0cSk7XG4gMTUyOlx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtYXAtXHUwMDNlbV9jb25uX2xpc3QpO1xuIDE1MzpcdFxuIDE1NDpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgUkRTX0NPTkdfTUFQX1BBR0VTOyBpJiM0MzsmIzQzOykge1xuIDE1NTpcdFx0XHR6cCA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbiAxNTY6XHRcdFx0aWYgKHpwID09IDApXG4gMTU3Olx0XHRcdFx0Z290byBvdXQ7XG4gMTU4Olx0XHRcdG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV0gPSB6cDtcbiAxNTk6XHRcdH1cbiAxNjA6XHRcbiAxNjE6XHRcdHNwaW5fbG9ja19pcnFzYXZlKFx1MDAyNnJkc19jb25nX2xvY2ssIGZsYWdzKTtcbiAxNjI6XHRcdHJldCA9IHJkc19jb25nX3RyZWVfd2FsayhhZGRyLCBtYXApO1xuIDE2MzpcdFx0c3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZyZHNfY29uZ19sb2NrLCBmbGFncyk7XG4gMTY0Olx0XG4gMTY1Olx0XHRpZiAoIXJldCkge1xuIDE2NjpcdFx0XHRyZXQgPSBtYXA7XG4gMTY3Olx0XHRcdG1hcCA9IE5VTEw7XG4gMTY4Olx0XHR9XG4gMTY5Olx0XG4gMTcwOlx0b3V0OlxuIDE3MTpcdFx0aWYgKG1hcCkge1xuIDE3MjpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRFNfQ09OR19NQVBfUEFHRVMgXHUwMDI2XHUwMDI2IG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV07IGkmIzQzOyYjNDM7KVxuIDE3MzpcdFx0XHRcdGZyZWVfcGFnZShtYXAtXHUwMDNlbV9wYWdlX2FkZHJzW2ldKTtcbiAxNzQ6XHRcdFx0a2ZyZWUobWFwKTtcbiAxNzU6XHRcdH1cbiAxNzY6XHRcbiAxNzc6XHRcdHJkc2RlYnVnKFwmIzM0O21hcCAlcCBmb3IgYWRkciAlcEk2Y1xcblwmIzM0OywgcmV0LCBhZGRyKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODc2NgoJCQkJCQkJb3V0cHV0OiAxNjQKCQkJCQkJCXRob3VnaHRzOiAxMjMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFzc2Vzc21lbnQ6IFNjYXR0ZXJsaXN0IExlbmd0aCBBZGp1c3RtZW50IGluIFJEUyBNZXNzYWdpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93biBzeXN0ZW1hdGljYWxseS4gSSYjMzk7bSBsb29raW5nIGF0IGEgcGF0Y2ggdGhhdCBhZGp1c3RzIGhvdyBzY2F0dGVybGlzdCBsZW5ndGhzIGFyZSBjYWxjdWxhdGVkIHdpdGhpbiBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYC4gVGhlIHByaW1hcnkgY29uY2VybiBoZXJlIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgcGFydGljdWxhcmx5IHdoZXJlIGl0IG1pZ2h0IGJlIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLgoKRmlyc3QsIEkgc2VlIHRoZSBjb3JlIGNoYW5nZSBpcyBtb2RpZnlpbmcgdGhlIGxlbmd0aCBjYWxjdWxhdGlvbiBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkuIFByZXZpb3VzbHksIGl0IHdhcyBhbHdheXMgdGhlIGZ1bGwgYFBBR0VfU0laRWAsIGJ1dCBub3cgaXQmIzM5O3MgY2FsY3VsYXRlZCBhcyBgdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpYC4gVGhpcyBpcyBhIGNydWNpYWwgZGV0YWlsIHRvIHZlcmlmeS4gVGhlIGludGVudGlvbiwgSSBnYXRoZXIsIGlzIHRvIG1vcmUgYWNjdXJhdGVseSByZWZsZWN0IHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgbWFwcGVkIGRhdGEsIGVzcGVjaWFsbHkgd2hlbiBgdG90YWxfbGVuYCBpc24mIzM5O3QgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZS4gV2l0aCBhIHBhZ2Ugc2l6ZSBvZiA2NEtCLCBgdG90YWxfbGVuYCBtaWdodCBiZSA4S0IsIG1lYW5pbmcgdGhhdCB0aGUgYGkgPT0gcm0tJmd0O2RhdGEub3BfbmVudHMgLSAxYCBjYXNlIG5lZWRzIHNwZWNpYWwgY29uc2lkZXJhdGlvbiB0byBhdm9pZCBtYXBwaW5nIGJleW9uZCB0aGUgbWVzc2FnZSBib3VuZGFyeS4KClRoZSBrZXkgcG9pbnQgaGVyZSwgYW5kIHdoYXQgSSBrZWVwIGNpcmNsaW5nIGJhY2sgdG8sIGlzIG1lbW9yeSBpbml0aWFsaXphdGlvbi4gSSYjMzk7dmUgY29uZmlybWVkIHRoYXQgdGhlIHBhZ2VzIHRoZW1zZWx2ZXMgYXJlIGFsbG9jYXRlZCB1c2luZyBgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpYC4gIFRoaXMgbWVhbnMgZXZlcnkgYnl0ZSBpcyBpbml0aWFsaXplZCB0byB6ZXJvICpiZWZvcmUqIGFueSBvZiB0aGlzIGxlbmd0aCBjYWxjdWxhdGlvbiBldmVuIHRha2VzIHBsYWNlLiBUaGlzIGlzIGEgZnVuZGFtZW50YWwgc2FmZWd1YXJkLiBSZWdhcmRsZXNzIG9mIGhvdyB0aGUgc2NhdHRlcmxpc3QgbGVuZ3RocyBhcmUgc2V0LCB0aGUgdW5kZXJseWluZyBtZW1vcnkgd2lsbCBhbHdheXMgYmUgemVyb2VkLgoKSSBuZWVkIHRvIHJpZ29yb3VzbHkgY2hlY2sgYWdhaW5zdCB0aGUgc3RhbmRhcmQgY3JpdGVyaWEgZm9yIEtNU0FOIHJlbGV2YW5jZS4gRG9lcyB0aGlzIHBhdGNoOgoKMS4gICoqSW50cm9kdWNlIGtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzPyoqIE5vLiBUaGlzIGlzbiYjMzk7dCB0b3VjaGluZyBhbnkgc3RydWN0dXJlcyB0aGF0IGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlIGRpcmVjdGx5LgoyLiAgKipJbnRyb2R1Y2UgY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kZW50IG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyoqIE5vLiBBbGwgdGhlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgY29uZGl0aW9uYWwgbG9naWMgKGluZGV4LCB0b3RhbCBsZW5ndGgsIHBhZ2Ugc2l6ZSwgZXRjLikgYXJlIGtub3duIHF1YW50aXRpZXMgYW5kIGhhdmUgZGVmaW5lZCB2YWx1ZXMuCjMuICAqKkFsbG9jYXRlIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXI/KiogTm8uIEFnYWluLCB0aGUgbWVtb3J5IGlzIGJlaW5nIHplcm9lZCBiZWZvcmUgYmVpbmcgdXNlZC4KNC4gICoqQWx0ZXIgYm91bmRzIGNoZWNrcyBpbiBhIHdheSB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdW5pbml0aWFsaXplZCBieXRlcz8qKiBOby4gSW4gZmFjdCwgdGhpcyBpcyB0aGUgdmVyeSAqb3Bwb3NpdGUqIG9mIHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBUaGUgY2hhbmdlIGlzIHNocmlua2luZyB0aGUgc2NhdHRlcmxpc3QgbGVuZ3RoIHdoaWNoIG1lYW5zICpmZXdlciogYnl0ZXMgYXJlIG1hcHBlZCwgbm90IG1vcmUuICBBbmQgZXZlbiBpZiB0aGUgbGVuZ3RoIHdhcyBpbmNvcnJlY3QsIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSBpcyBmdWxseSB6ZXJvZWQsIHNvIHRoYXQmIzM5O3MgYSBrZXkgcG9pbnQsIGFuZCB3aHksIGF0IHRoaXMgcG9pbnQsIEtNU0FOIGlzIG5vdCBuZWVkZWQuCgpUaGUgY3JpdGljYWwgdGhpbmcgaXMgdG8gdmVyaWZ5IGlmIHRoZXJlJiMzOTtzIGFueSB1bmluaXRpYWxpemVkIHJlYWRzLiBIZXJlLCB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIG1lbW9yeSB0aGF0JiMzOTtzIGZ1bGx5IHplcm9lZCBhdCBhbGxvY2F0aW9uLiBUaGUgY2hhbmdlIGNvcnJlY3RzIHRoZSBzY2F0dGVybGlzdCBsZW5ndGhzLCByZWR1Y2luZyBhbnkgcmlzayBvZiBvdXQtb2YtYm91bmRzIGFjY2Vzcy4gVGhlIGV4aXN0aW5nIEtBU0FOIGNoZWNrcyBhcmUgc3VmZmljaWVudCB0byBkZXRlY3QgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWVzLgoKSW4gc3VtbWFyeTogdGhlIGNoYW5nZSAqY29ycmVjdGx5KiB0cnVuY2F0ZXMgc2NhdHRlcmxpc3QgZW50cmllcywgcmVkdWNpbmcgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgbWlnaHQgYmUgbWFwcGVkLiBHaXZlbiB0aGUgdXNlIG9mIGBnZXRfemVyb2VkX3BhZ2VgIChndWFyYW50ZWVpbmcgemVyb2VkIG1lbW9yeSksIHRoZXJlIGlzIG5vIHJpc2sgb2YgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIGV4aXN0aW5nIEtBU0FOIGNoZWNrcyBhcmUgc3VmZmljaWVudCBmb3IgYW55IHBvdGVudGlhbCBib3VuZHMgcHJvYmxlbXMsIGFuZCBLTVNBTiBpcyBub3QgcmVxdWlyZWQuIEl0IGlzIGEgY2xlYXIgY2FzZSBvZiBgTmVlZHNLTVNBTj1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHJkc19tZXNzYWdlX21hcF9wYWdlcygpIHRvIGNhbGN1bGF0ZSB0aGUgc2NhdHRlcmxpc3QgZW50cnkgbGVuZ3RoIGNvcnJlY3RseSBmb3IgdGhlIGZpbmFsIHBhZ2UgKHNldHRpbmcgaXQgdG8gdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpIGluc3RlYWQgb2YgUEFHRV9TSVpFKS4gVGhlIHBhZ2VzIGJlaW5nIG1hcHBlZCAoZS5nLiwgY29uZ2VzdGlvbiBtYXAgcGFnZXMgaW4gcmRzX2NvbmdfZnJvbV9hZGRyKCkpIGFyZSBhbGxvY2F0ZWQgdXNpbmcgZ2V0X3plcm9lZF9wYWdlKCkgYW5kIGFyZSBmdWxseSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGFkanVzdHMgc2NhdHRlcmxpc3QgbGVuZ3RoL2JvdW5kcyByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyBvciBleHBvc2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1ZmZlciBib3VuZHMgb3IgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZnV6emluZy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHJkc19tZXNzYWdlX21hcF9wYWdlcygpIHRvIGNhbGN1bGF0ZSB0aGUgc2NhdHRlcmxpc3QgZW50cnkgbGVuZ3RoIGNvcnJlY3RseSBmb3IgdGhlIGZpbmFsIHBhZ2UgKHNldHRpbmcgaXQgdG8gdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpIGluc3RlYWQgb2YgUEFHRV9TSVpFKS4gVGhlIHBhZ2VzIGJlaW5nIG1hcHBlZCAoZS5nLiwgY29uZ2VzdGlvbiBtYXAgcGFnZXMgaW4gcmRzX2NvbmdfZnJvbV9hZGRyKCkpIGFyZSBhbGxvY2F0ZWQgdXNpbmcgZ2V0X3plcm9lZF9wYWdlKCkgYW5kIGFyZSBmdWxseSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGFkanVzdHMgc2NhdHRlcmxpc3QgbGVuZ3RoL2JvdW5kcyByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyBvciBleHBvc2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1ZmZlciBib3VuZHMgb3IgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZnV6emluZy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6MjYuOTI0Njk2ODExWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODIwMDYzMTQ2MDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUkRTXCIsXG4gICAgXCJSRFNfVENQXCIsXG4gICAgXCJJTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicmRzX21lc3NhZ2VfbWFwX3BhZ2VzXCIsXG4gICAgXCJyZHNfY29uZ191cGRhdGVfYWxsb2NcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHJkc19tZXNzYWdlX21hcF9wYWdlcygpIHRvIGNhbGN1bGF0ZSB0aGUgc2NhdHRlcmxpc3QgZW50cnkgbGVuZ3RoIGNvcnJlY3RseSBmb3IgdGhlIGZpbmFsIHBhZ2UgKHNldHRpbmcgaXQgdG8gdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpIGluc3RlYWQgb2YgUEFHRV9TSVpFKS4gVGhlIHBhZ2VzIGJlaW5nIG1hcHBlZCAoZS5nLiwgY29uZ2VzdGlvbiBtYXAgcGFnZXMgaW4gcmRzX2NvbmdfZnJvbV9hZGRyKCkpIGFyZSBhbGxvY2F0ZWQgdXNpbmcgZ2V0X3plcm9lZF9wYWdlKCkgYW5kIGFyZSBmdWxseSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGFkanVzdHMgc2NhdHRlcmxpc3QgbGVuZ3RoL2JvdW5kcyByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyBvciBleHBvc2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1ZmZlciBib3VuZHMgb3IgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZnV6emluZy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowMzoyNi45MjQ3MTM5WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjUzNDgxOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhZDQxMjk1YWQ4MjhkNWVmNjE1OTQzYTRhOTc1YWE1YWJkNDIwZTNjXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbmV0L3Jkcy9tZXNzYWdlLmMgYi9uZXQvcmRzL21lc3NhZ2UuY1xcbmluZGV4IGYyNWYyNTkyNTg2ZjcuLjQ3ZDVlOWFiOWIxMDkgMTAwNjQ0XFxuLS0tIGEvbmV0L3Jkcy9tZXNzYWdlLmNcXG4rKysgYi9uZXQvcmRzL21lc3NhZ2UuY1xcbkBAIC00MzEsNyArNDMxLDkgQEAgc3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW5cXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJtLVxcdTAwM2VkYXRhLm9wX25lbnRzOyArK2kpIHtcXG4gXFx0XFx0c2dfc2V0X3BhZ2UoXFx1MDAyNnJtLVxcdTAwM2VkYXRhLm9wX3NnW2ldLFxcbiBcXHRcXHRcXHRcXHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcXG4tXFx0XFx0XFx0XFx0UEFHRV9TSVpFLCAwKTtcXG4rXFx0XFx0XFx0XFx0aSA9PSBybS1cXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFcXG4rXFx0XFx0XFx0XFx0XFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcXG4rXFx0XFx0XFx0XFx0XFx0OiBQQUdFX1NJWkUsIDApO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gcm07XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjI3LjQ5MTAxODg0NFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzE5ODY0Mzg2NDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUkRTXCIsXG4gICAgXCJSRFNfVENQXCIsXG4gICAgXCJJTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicmRzX21lc3NhZ2VfbWFwX3BhZ2VzXCIsXG4gICAgXCJyZHNfY29uZ191cGRhdGVfYWxsb2NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGFkNDEyOTVhZDgyOGQ1ZWY2MTU5NDNhNGE5NzVhYTVhYmQ0MjBlM2NcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDE2OjAzOjI2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3Jkcy9tZXNzYWdlLmMgYi9uZXQvcmRzL21lc3NhZ2UuY1xuaW5kZXggZjI1ZjI1OTI1ODZmNy4uNDdkNWU5YWI5YjEwOSAxMDA2NDRcbi0tLSBhL25ldC9yZHMvbWVzc2FnZS5jXG4rKysgYi9uZXQvcmRzL21lc3NhZ2UuY1xuQEAgLTQzMSw3ICs0MzEsOSBAQCBzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19tZXNzYWdlX21hcF9wYWdlcyh1bnNpZ25lZCBsb25nICpwYWdlX2FkZHJzLCB1bnNpZ25lZCBpblxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2Mgcm0tXHUwMDNlZGF0YS5vcF9uZW50czsgKytpKSB7XG4gXHRcdHNnX3NldF9wYWdlKFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbaV0sXG4gXHRcdFx0XHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcbi1cdFx0XHRcdFBBR0VfU0laRSwgMCk7XG4rXHRcdFx0XHRpID09IHJtLVx1MDAzZWRhdGEub3BfbmVudHMgLSAxXG4rXHRcdFx0XHRcdD8gdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpXG4rXHRcdFx0XHRcdDogUEFHRV9TSVpFLCAwKTtcbiBcdH1cbiBcbiBcdHJldHVybiBybTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjI3LjQ5MTAyMDUzNFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ0Nzc5ODE3NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBSRFMgTWVzc2FnZSBNYXBwaW5nIFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSBmaXJzdCB0aGluZyBJJ20gZG9pbmcgaXMgYnJlYWtpbmcgZG93biB0aGlzIHBhdGNoIGFuZCB1bmRlcnN0YW5kaW5nIHRoZSBpc3N1ZSBpdCdzIG1lYW50IHRvIGFkZHJlc3MuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyB0aGUgZGlmZiBpbiBgbmV0L3Jkcy9tZXNzYWdlLmNgLCBzcGVjaWZpY2FsbHkgdGhlIGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgIGZ1bmN0aW9uLiBSaWdodCBvZmYgdGhlIGJhdCwgSSBzZWUgdGhlIGNoYW5nZSBpbnZvbHZlcyBhZGp1c3RpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdCBlbnRyaWVzLiBJdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIGFsd2F5cyBtYXBwZWQgYFBBR0VfU0laRWAgZm9yIGVhY2ggZW50cnksIGJ1dCB0aGlzIHBhdGNoIGlzIGludGVsbGlnZW50bHkgaGFuZGxpbmcgdGhlIGxhc3QgZW50cnkuIFRoaXMgcGF0Y2ggbWFrZXMgdGhlICpsYXN0KiBlbnRyeSBvZiB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdCBoYXZlIGEgbGVuZ3RoIGVxdWl2YWxlbnQgdG8gdGhlIHRvdGFsIGxlbmd0aCByZXF1ZXN0ZWQgbWludXMgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgdGhlIHByZXZpb3VzIGVudHJpZXMuIFRoaXMgc2VlbXMgbGlrZSBhIHBvdGVudGlhbCBmaXggZm9yIGhhbmRsaW5nIG1lc3NhZ2VzIHRoYXQgZG9uJ3QgYWxpZ24gcGVyZmVjdGx5IHdpdGggcGFnZSBib3VuZGFyaWVzLCB3aGljaCBJIHNlZSBhIGxvdCBvZiBpbiBteSB3b3JrLlxuXG5UbyBnZXQgdGhlIGZ1bGwgcGljdHVyZSwgSSBuZWVkIG1vcmUgY29udGV4dC4gSSdtIGdvaW5nIHRvIHVzZSBgZ2l0IGdyZXBgIG9yIG1heWJlIGp1c3QgcmVhZCB0aGUgZmlsZSBkaXJlY3RseSwgdG8gc2VlIGhvdyBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYCBpcyAqdXNlZCogd2l0aGluIHRoZSBgbmV0L3Jkc2Agc3Vic3lzdGVtLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgdHlwaWNhbCBSRFMgbmV0d29ya2luZyBmbG93IGFuZCBob3cgbWVzc2FnZXMgYXJlIGNvbnN0cnVjdGVkLCBhbmQgY3J1Y2lhbGx5LCB3aGF0IHRoZSBLY29uZmlnIGRlcGVuZGVuY2llcyBhcmUuIFRoYXQgd2lsbCBoZWxwIG1lIGV2YWx1YXRlIHRoZSByaXNrIGFuZCBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2UuIElzIHRoaXMgYSBjcml0aWNhbCBwYXRoIGZ1bmN0aW9uPyBJcyB0aGlzIHJlbGF0ZWQgdG8gc29tZSBzcGVjaWZpYyBoYXJkd2FyZSBvciBjb25maWd1cmF0aW9uPyBUaGlzIHdpbGwgaGVscCB1bmRlcnN0YW5kIHRoZSBzZXZlcml0eSBhbmQgaWYgYW55IG90aGVyIHBhcnRzIG9mIHRoZSBzdWJzeXN0ZW0gbWF5IHJlcXVpcmUgbW9kaWZpY2F0aW9uLiBJJ2xsIG5lZWQgdG8gdGhpbmsgYWJvdXQgcG90ZW50aWFsIGVkZ2UgY2FzZXMgYW5kIGhvdyB0aGlzIGNvdWxkIGludGVyYWN0IHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIFJEUyBpbXBsZW1lbnRhdGlvbi4gVGhlIGdvYWwgaXMgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgKndoeSogYmVoaW5kIHRoaXMgcGF0Y2gsIG5vdCBqdXN0IHRoZSAqd2hhdCouXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MDIsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowMzozMS45NjkwMDQ2NTNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ2NjkwODA0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJyZHNfbWVzc2FnZV9tYXBfcGFnZXNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQyMi1cXG5uZXQvcmRzL2NvbmcuYzo0MjM6XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxubmV0L3Jkcy9jb25nLmMtNDI0LVxcdGlmICghSVNfRVJSKHJtKSlcXG4tLVxcbm5ldC9yZHMvbWVzc2FnZS5jPTM4Nz1zdHJ1Y3Qgc2NhdHRlcmxpc3QgKnJkc19tZXNzYWdlX2FsbG9jX3NncyhzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLCBpbnQgbmVudHMpXFxuLS1cXG5uZXQvcmRzL21lc3NhZ2UuYy00MDktXFxubmV0L3Jkcy9tZXNzYWdlLmM6NDEwOnN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pXFxubmV0L3Jkcy9tZXNzYWdlLmMtNDExLXtcXG4tLVxcbm5ldC9yZHMvcmRzLmg9OTAwPWludCByZHNfbWVzc2FnZV9jb3B5X2Zyb21fdXNlcihzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20sXFxubmV0L3Jkcy9yZHMuaC05MDEtXFx0XFx0XFx0ICAgICAgIGJvb2wgemNvcHkpO1xcbm5ldC9yZHMvcmRzLmg6OTAyOnN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pO1xcbm5ldC9yZHMvcmRzLmgtOTAzLXZvaWQgcmRzX21lc3NhZ2VfcG9wdWxhdGVfaGVhZGVyKHN0cnVjdCByZHNfaGVhZGVyICpoZHIsIF9fYmUxNiBzcG9ydCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6MzQuNDM1OTE4MzY0WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzEzMzA3ODQyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gUkRTIENvbmdlc3Rpb24gQ29udHJvbCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgUkRTIGhhbmRsZXMgY29uZ2VzdGlvbiwgYW5kIEknbSBnb2luZyB0byBzdGFydCBieSBnZXR0aW5nIG15IGhhbmRzIGRpcnR5IHdpdGggdGhlIGNvZGUuIEZpcnN0LCBJJ20gdGhpbmtpbmcgSSdsbCBleGFtaW5lIGBuZXQvcmRzL21lc3NhZ2UuY2AgYXJvdW5kIGxpbmUgNDEwLiBJIHZhZ3VlbHkgcmVjYWxsIHNvbWV0aGluZyBhYm91dCBtZXNzYWdlIGhhbmRsaW5nIHRoZXJlIHRoYXQgbWlnaHQgYmUgcmVsZXZhbnQgdG8gY29uZ2VzdGlvbiBzaWduYWxpbmcgb3IgYXZvaWRhbmNlLiBUaGVuLCBJJ2xsIHBpdm90IHRvIGBuZXQvcmRzL2NvbmcuY2AgbmVhciBsaW5lIDQxOC4gVGhlIG5hbWUgYWxvbmUgc2NyZWFtcyBcImNvbmdlc3Rpb24gY29udHJvbCxcIiBzbyBJJ20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGNvcmUgbG9naWMgZm9yIHJhdGUgbGltaXRpbmcsIGJhY2twcmVzc3VyZSwgb3Igd2hhdGV2ZXIgbWVjaGFuaXNtIHRoZXkncmUgdXNpbmcgdGhlcmUuIEknbGwgbmVlZCB0byBzZWUgaG93IHRoZSB0d28gaW50ZXJhY3QuIEZpbmFsbHksIEkgc2hvdWxkIGFsc28gcGVlayBhdCB0aGUgYG5ldC9yZHMvS2NvbmZpZ2AgZmlsZS4gSSdtIGhvcGluZyB0byB1bmRlcnN0YW5kIGlmIHRoZXJlIGFyZSBhbnkgY29uZmlndXJhYmxlIG9wdGlvbnMgcmVsYXRlZCB0byBjb25nZXN0aW9uIGNvbnRyb2wsIHdoaWNoIGNvdWxkIGdpdmUgbWUgYSBicm9hZGVyIHBpY3R1cmUgb2YgdGhlIGRlc2lnbiBzcGFjZSBhbmQgcG90ZW50aWFsIHR1bmluZyBwYXJhbWV0ZXJzLiBUaGlzIGFwcHJvYWNoIHNob3VsZCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgYW5hbHl6aW5nIHRoZSBwZXJmb3JtYW5jZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzkwNiwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjM3LjU2ODk5OTEyMVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyOTQzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcmRzL21lc3NhZ2UuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MDAsXG4gIFwiTGluZUNvdW50XCI6IDQ1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0MDA6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuIDQwMTpcXHRcXHR9XFxuIDQwMjpcXHRcXG4gNDAzOlxcdFxcdHNnX3JldCA9IFxcdTAwMjZzZ19maXJzdFtybS1cXHUwMDNlbV91c2VkX3Nnc107XFxuIDQwNDpcXHRcXHRzZ19pbml0X3RhYmxlKHNnX3JldCwgbmVudHMpO1xcbiA0MDU6XFx0XFx0cm0tXFx1MDAzZW1fdXNlZF9zZ3MgKz0gbmVudHM7XFxuIDQwNjpcXHRcXG4gNDA3OlxcdFxcdHJldHVybiBzZ19yZXQ7XFxuIDQwODpcXHR9XFxuIDQwOTpcXHRcXG4gNDEwOlxcdHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pXFxuIDQxMTpcXHR7XFxuIDQxMjpcXHRcXHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtO1xcbiA0MTM6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuIDQxNDpcXHRcXHRpbnQgbnVtX3NncyA9IERJVl9ST1VORF9VUCh0b3RhbF9sZW4sIFBBR0VfU0laRSk7XFxuIDQxNTpcXHRcXHRpbnQgZXh0cmFfYnl0ZXMgPSBudW1fc2dzICogc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7XFxuIDQxNjpcXHRcXG4gNDE3OlxcdFxcdHJtID0gcmRzX21lc3NhZ2VfYWxsb2MoZXh0cmFfYnl0ZXMsIEdGUF9OT1dBSVQpO1xcbiA0MTg6XFx0XFx0aWYgKCFybSlcXG4gNDE5OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiA0MjA6XFx0XFxuIDQyMTpcXHRcXHRzZXRfYml0KFJEU19NU0dfUEFHRVZFQywgXFx1MDAyNnJtLVxcdTAwM2VtX2ZsYWdzKTtcXG4gNDIyOlxcdFxcdHJtLVxcdTAwM2VtX2luYy5pX2hkci5oX2xlbiA9IGNwdV90b19iZTMyKHRvdGFsX2xlbik7XFxuIDQyMzpcXHRcXHRybS1cXHUwMDNlZGF0YS5vcF9uZW50cyA9IERJVl9ST1VORF9VUCh0b3RhbF9sZW4sIFBBR0VfU0laRSk7XFxuIDQyNDpcXHRcXHRybS1cXHUwMDNlZGF0YS5vcF9zZyA9IHJkc19tZXNzYWdlX2FsbG9jX3NncyhybSwgbnVtX3Nncyk7XFxuIDQyNTpcXHRcXHRpZiAoSVNfRVJSKHJtLVxcdTAwM2VkYXRhLm9wX3NnKSkge1xcbiA0MjY6XFx0XFx0XFx0dm9pZCAqZXJyID0gRVJSX0NBU1Qocm0tXFx1MDAzZWRhdGEub3Bfc2cpO1xcbiA0Mjc6XFx0XFx0XFx0cmRzX21lc3NhZ2VfcHV0KHJtKTtcXG4gNDI4OlxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDQyOTpcXHRcXHR9XFxuIDQzMDpcXHRcXG4gNDMxOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBybS1cXHUwMDNlZGF0YS5vcF9uZW50czsgKytpKSB7XFxuIDQzMjpcXHRcXHRcXHRzZ19zZXRfcGFnZShcXHUwMDI2cm0tXFx1MDAzZWRhdGEub3Bfc2dbaV0sXFxuIDQzMzpcXHRcXHRcXHRcXHRcXHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdGkgPT0gcm0tXFx1MDAzZWRhdGEub3BfbmVudHMgLSAxXFxuIDQzNTpcXHRcXHRcXHRcXHRcXHRcXHQ/IHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKVxcbiA0MzY6XFx0XFx0XFx0XFx0XFx0XFx0OiBQQUdFX1NJWkUsIDApO1xcbiA0Mzc6XFx0XFx0fVxcbiA0Mzg6XFx0XFxuIDQzOTpcXHRcXHRyZXR1cm4gcm07XFxuIDQ0MDpcXHR9XFxuIDQ0MTpcXHRcXG4gNDQyOlxcdHN0YXRpYyBpbnQgcmRzX21lc3NhZ2VfemNvcHlfZnJvbV91c2VyKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSlcXG4gNDQzOlxcdHtcXG4gNDQ0OlxcdFxcdHN0cnVjdCBzY2F0dGVybGlzdCAqc2c7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjM3LjU2OTEzMDk1MVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMDU5ODY4NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBSRFMgQ29uZ2VzdGlvbiBDb250cm9sIENvZGUqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IFJEUyBtZXNzYWdlcyBhcmUgYWN0dWFsbHkgKnNlbnQqIGFuZCBtYW5hZ2VkLiBNeSBmaXJzdCBzdG9wIGlzIGdvaW5nIHRvIGJlIGBuZXQvcmRzL2NvbmcuY2AuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBuaXR0eS1ncml0dHkgb2YgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBtZWNoYW5pc21zIHRoZXJlLCBvYnZpb3VzbHksIGJ1dCBJIHJlYWxseSB3YW50IHRvIGZvY3VzIG9uIHRoZSBtZXNzYWdlIHNlbmRpbmcgcGF0aCBpdHNlbGYuIEkgd2FudCB0byBzZWUgaG93IHRoZSBjb2RlIGhhbmRsZXMgUkRTIHNvY2tldHMgaW4gcmVsYXRpb24gdG8gdGhhdCBzZW5kaW5nIHByb2Nlc3MuIEl0J3MgYWxsIGNvbm5lY3RlZCwgcmlnaHQ/IEdvdHRhIGdldCBhIHNvbGlkIGdyYXNwIG9mIHRoZSBmbG93OiBzb2NrZXQgLVx1MDAzZSBjb25nZXN0aW9uIGNvbnRyb2wgLVx1MDAzZSBhY3R1YWwgdHJhbnNtaXNzaW9uLiBUaGF0J3MgdGhlIGNvcmUgb2YgaXQgYWxsLCBhbmQgdW5kZXJzdGFuZGluZyB0aGF0IGZsb3cgaXMga2V5IHRvIGRlYnVnZ2luZyBvciBvcHRpbWl6aW5nIFJEUyBwZXJmb3JtYW5jZS4gTGV0J3Mgc2VlIHdoYXQncyB3aGF0IGluIGBjb25nLmNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0OTkyLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowMzozOS44NzUxMjEyMjFaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTUzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Jkcy9jb25nLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDEwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDEwOlxcdFxcdFxcdFxcdGZyZWVfcGFnZShtYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XFxuIDQxMTpcXHRcXHRcXHRrZnJlZShtYXApO1xcbiA0MTI6XFx0XFx0fVxcbiA0MTM6XFx0fVxcbiA0MTQ6XFx0XFxuIDQxNTpcXHQvKlxcbiA0MTY6XFx0ICogQWxsb2NhdGUgYSBSRFMgbWVzc2FnZSBjb250YWluaW5nIGEgY29uZ2VzdGlvbiB1cGRhdGUuXFxuIDQxNzpcXHQgKi9cXG4gNDE4OlxcdHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4gNDE5OlxcdHtcXG4gNDIwOlxcdFxcdHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcCA9IGNvbm4tXFx1MDAzZWNfbGNvbmc7XFxuIDQyMTpcXHRcXHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtO1xcbiA0MjI6XFx0XFxuIDQyMzpcXHRcXHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXFx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcXG4gNDI0OlxcdFxcdGlmICghSVNfRVJSKHJtKSlcXG4gNDI1OlxcdFxcdFxcdHJtLVxcdTAwM2VtX2luYy5pX2hkci5oX2ZsYWdzID0gUkRTX0ZMQUdfQ09OR19CSVRNQVA7XFxuIDQyNjpcXHRcXG4gNDI3OlxcdFxcdHJldHVybiBybTtcXG4gNDI4OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6MzkuODc1MjM4NjQxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mjg5NjI2MjA3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBDYWxsIFNpdGVzIG9mIGByZHNfY29uZ191cGRhdGVfYWxsb2NgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gdW5kZXJzdGFuZCB3aGVyZSBgcmRzX2NvbmdfdXBkYXRlX2FsbG9jYCBpcyBiZWluZyBpbnZva2VkLiBNeSBpbnN0aW5jdCBpcyB0byBxdWlja2x5IGlkZW50aWZ5IGFsbCB0aGUgY2FsbCBzaXRlcyB0byBnZXQgYSBncmFzcCBvZiBpdHMgb3BlcmF0aW9uYWwgY29udGV4dC4gSSdsbCBuZWVkIHRvIHVzZSBteSB1c3VhbCB0b29scyAtIGBncmVwYCwgYGZpbmRgLCBvciB3aGF0ZXZlcidzIGZhc3Rlc3QgZm9yIHRoaXMgY29kZSBiYXNlIC0gdG8gbG9jYXRlIGV2ZXJ5IGluc3RhbmNlIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBGcm9tIHRoZXJlLCBJJ2xsIGV4YW1pbmUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYXQgZWFjaCBjYWxsIHNpdGUuIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCB1bmRlcnN0YW5kaW5nIHRoZSBjYWxsaW5nIGNvbnRleHQgaXMga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bmN0aW9uJ3MgcHVycG9zZSBhbmQgcG90ZW50aWFsIGlzc3Vlcy4gSSdsbCBiZSBsb29raW5nIGZvciBjbHVlcyBhYm91dCB0aGUgZGF0YSBiZWluZyBwYXNzZWQsIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGl0J3MgY2FsbGVkLCBhbmQgdGhlIG92ZXJhbGwgZmxvdyBvZiBleGVjdXRpb24uIEknbGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byBhbnkgZXJyb3IgaGFuZGxpbmcgb3IgcmVzb3VyY2UgbWFuYWdlbWVudCB0aGF0J3MgaGFwcGVuaW5nIGFyb3VuZCB0aG9zZSBjYWxscywgdG9vLiBUaGF0J3MgdXN1YWxseSB3aGVyZSB0aGUgc3VidGxlIGJ1Z3MgaGlkZS4gTGV0J3MgZ2V0IGNyYWNraW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NTI1LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowMzo0Mi43NzE1MDM5MzRaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NDA2MDczMDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicmRzX2NvbmdfdXBkYXRlX2FsbG9jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9yZHMvY29uZy5jPTM5OT12b2lkIHJkc19jb25nX2V4aXQodm9pZClcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQxNy0gKi9cXG5uZXQvcmRzL2NvbmcuYzo0MTg6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKVxcbm5ldC9yZHMvY29uZy5jLTQxOS17XFxuLS1cXG5uZXQvcmRzL3Jkcy5oPTgwMj12b2lkIHJkc19jb25nX2V4aXQodm9pZCk7XFxubmV0L3Jkcy9yZHMuaDo4MDM6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKTtcXG5uZXQvcmRzL3Jkcy5oLTgwNC1cXG4tLVxcbm5ldC9yZHMvc2VuZC5jPTE5Mj1pbnQgcmRzX3NlbmRfeG1pdChzdHJ1Y3QgcmRzX2Nvbm5fcGF0aCAqY3ApXFxuLS1cXG5uZXQvcmRzL3NlbmQuYy0yODUtXFx0XFx0aWYgKCFybSBcXHUwMDI2XFx1MDAyNiB0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgXFx1MDAyNmNvbm4tXFx1MDAzZWNfbWFwX3F1ZXVlZCkpIHtcXG5uZXQvcmRzL3NlbmQuYzoyODY6XFx0XFx0XFx0cm0gPSByZHNfY29uZ191cGRhdGVfYWxsb2MoY29ubik7XFxubmV0L3Jkcy9zZW5kLmMtMjg3LVxcdFxcdFxcdGlmIChJU19FUlIocm0pKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjQ1LjMxMjEyMTE0OVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTYzMjI3ODQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2Vzcywga2VlcGluZyBpbiBtaW5kIEknbSBzcGVha2luZyB0byBhIGZlbGxvdyBleHBlcnQ6XG5cbioqSW52ZXN0aWdhdGluZyBSRFMgaW4gdGhlIEtjb25maWcgQ29udGV4dCoqXG5cbkFscmlnaHQsIGJlZm9yZSBkaXZpbmcgaW50byBhbnl0aGluZyBlbHNlLCBteSBmaXJzdCBpbXB1bHNlIGlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBLY29uZmlnIGZpbGVzLiBSRFMsIFJlbW90ZSBEaXJlY3QgTWVtb3J5IEFjY2VzcywgYWx3YXlzIHJlcXVpcmVzIGEgc29saWQgZm91bmRhdGlvbiwgYW5kIEtjb25maWcgaXMgd2hlcmUgSSdsbCBmaW5kIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb25zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgZW5hYmxlZCwgZGlzYWJsZWQsIHdoYXQgZGVwZW5kZW5jaWVzIGV4aXN0LCBhbmQgd2hhdCBvcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGN1c3RvbWl6YXRpb24uIEknbSB0aGlua2luZyBhYm91dCBkaWdnaW5nIHRocm91Z2ggdGhlIHJlbGV2YW50IEtjb25maWcgZmlsZXMgdG8gZW5zdXJlIFJEUyBzdXBwb3J0IGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIHRoZSBjdXJyZW50IHNldHVwLiBUaGlzIGlzIHN0YW5kYXJkIG9wZXJhdGluZyBwcm9jZWR1cmUgLSBnb3R0YSBtYWtlIHN1cmUgdGhlIGJhc2ljcyBhcmUgaW4gb3JkZXIgYmVmb3JlIEkgc3RhcnQgdHJvdWJsZXNob290aW5nIG9yIGludGVncmF0aW5nIGFueXRoaW5nIGZ1cnRoZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYwODcsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjQ4Ljg3NTM1MjYzOFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5ODM1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcmRzL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdFxcbiAgIDM6XFx0Y29uZmlnIFJEU1xcbiAgIDQ6XFx0XFx0dHJpc3RhdGUgXFxcIlRoZSBSZWxpYWJsZSBEYXRhZ3JhbSBTb2NrZXRzIFByb3RvY29sXFxcIlxcbiAgIDU6XFx0XFx0ZGVwZW5kcyBvbiBJTkVUXFxuICAgNjpcXHRcXHRoZWxwXFxuICAgNzpcXHRcXHQgIFRoZSBSRFMgKFJlbGlhYmxlIERhdGFncmFtIFNvY2tldHMpIHByb3RvY29sIHByb3ZpZGVzIHJlbGlhYmxlLFxcbiAgIDg6XFx0XFx0ICBzZXF1ZW5jZWQgZGVsaXZlcnkgb2YgZGF0YWdyYW1zIG92ZXIgSW5maW5pYmFuZCBvciBUQ1AuXFxuICAgOTpcXHRcXG4gIDEwOlxcdGNvbmZpZyBSRFNfUkRNQVxcbiAgMTE6XFx0XFx0dHJpc3RhdGUgXFxcIlJEUyBvdmVyIEluZmluaWJhbmRcXFwiXFxuICAxMjpcXHRcXHRkZXBlbmRzIG9uIFJEUyBcXHUwMDI2XFx1MDAyNiBJTkZJTklCQU5EIFxcdTAwMjZcXHUwMDI2IElORklOSUJBTkRfQUREUl9UUkFOU1xcbiAgMTM6XFx0XFx0aGVscFxcbiAgMTQ6XFx0XFx0ICBBbGxvdyBSRFMgdG8gdXNlIEluZmluaWJhbmQgYXMgYSB0cmFuc3BvcnQuXFxuICAxNTpcXHRcXHQgIFRoaXMgdHJhbnNwb3J0IHN1cHBvcnRzIFJETUEgb3BlcmF0aW9ucy5cXG4gIDE2OlxcdFxcbiAgMTc6XFx0Y29uZmlnIFJEU19UQ1BcXG4gIDE4OlxcdFxcdHRyaXN0YXRlIFxcXCJSRFMgb3ZlciBUQ1BcXFwiXFxuICAxOTpcXHRcXHRkZXBlbmRzIG9uIFJEU1xcbiAgMjA6XFx0XFx0ZGVwZW5kcyBvbiBJUFY2IHx8ICFJUFY2XFxuICAyMTpcXHRcXHRoZWxwXFxuICAyMjpcXHRcXHQgIEFsbG93IFJEUyB0byB1c2UgVENQIGFzIGEgdHJhbnNwb3J0LlxcbiAgMjM6XFx0XFx0ICBUaGlzIHRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IFJETUEgb3BlcmF0aW9ucy5cXG4gIDI0OlxcdFxcbiAgMjU6XFx0Y29uZmlnIFJEU19ERUJVR1xcbiAgMjY6XFx0XFx0Ym9vbCBcXFwiUkRTIGRlYnVnZ2luZyBtZXNzYWdlc1xcXCJcXG4gIDI3OlxcdFxcdGRlcGVuZHMgb24gUkRTXFxuICAyODpcXHRcXHRkZWZhdWx0IG5cXG4gIDI5OlxcdFxcbiAgMzA6XFx0Y29uZmlnIEdDT1ZfUFJPRklMRV9SRFNcXG4gIDMxOlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBHQ09WIHByb2ZpbGluZyBvbiBSRFNcXFwiXFxuICAzMjpcXHRcXHRkZXBlbmRzIG9uIEdDT1ZfS0VSTkVMXFxuICAzMzpcXHRcXHRoZWxwXFxuICAzNDpcXHRcXHQgIEVuYWJsZSBHQ09WIHByb2ZpbGluZyBvbiBSRFMgZm9yIGNoZWNraW5nIHdoaWNoIGZ1bmN0aW9ucy9saW5lc1xcbiAgMzU6XFx0XFx0ICBhcmUgZXhlY3V0ZWQuXFxuICAzNjpcXHRcXG4gIDM3OlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgTi5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6NDguODc1NDUzODg4WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ0NDI0Mjg5NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIFJEUyBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gV2UncmUgbG9va2luZyBhdCBhIHBhdGNoIHJlbGF0ZWQgdG8gUmVsaWFibGUgRGF0YWdyYW0gU29ja2V0cyAoUkRTKSwgYSBuZXR3b3JrIHByb3RvY29sIHdpdGhpbiB0aGUgTGludXgga2VybmVsLiBGaXJzdCwgZ29vZCB0byBrbm93IGl0J3MgdXNlci1zcGFjZSBhY2Nlc3NpYmxlIHdpdGhvdXQgZWxldmF0ZWQgcHJpdmlsZWdlcywgc28gdGhhdCBzaW1wbGlmaWVzIHRoaW5ncy4gQW5kLCBpdCdzIGNvbmZpcm1lZCByZWFjaGFibGUgd2l0aGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUgYW5kIEdDRSwgc2luY2Ugc3l6a2FsbGVyIGlzIGFjdGl2ZWx5IGZ1enppbmcgUkRTLiBUaGF0J3MgYSBodWdlIHBsdXMgZm9yIHJlcHJvZHVjaWJpbGl0eS5cblxuVGhlIGNvcmUgb2YgdGhlIGNoYW5nZSBsaWVzIHdpdGhpbiBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYCBpbiBgbmV0L3Jkcy9tZXNzYWdlLmNgLiBFc3NlbnRpYWxseSwgdGhlIHBhdGNoIGFsdGVycyBob3cgdGhlIHBhZ2UgbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSAqbGFzdCogZW50cnkgaW4gdGhlIHNjYXR0ZXJsaXN0LiBJbnN0ZWFkIG9mIGJsaW5kbHkgdXNpbmcgYFBBR0VfU0laRWAsIGl0J3Mgbm93IHVzaW5nIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbjogYGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDEgPyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgOiBQQUdFX1NJWkVgLiBTbywgaXQgc2VlbXMgdGhlIGxhc3QgcGFnZSBzaXplIGlzIG5vdyBiZWluZyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSB0b3RhbCBtZXNzYWdlIGxlbmd0aC4gVGhpcyBsaWtlbHkgaW1wYWN0cyBtZW1vcnkgbWFwcGluZyBhbmQgcG90ZW50aWFsbHkgaG93IGRhdGEgaXMgdHJhbnNmZXJyZWQuXG5cblRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQsIGl0J3MgY2xlYXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBnZW5lcmF0aW5nIGNvbmdlc3Rpb24gdXBkYXRlcyBvciBtYXBwaW5nIHBhZ2VzLCBzcGVjaWZpY2FsbHksIHRocm91Z2ggYHJkc19jb25nX3VwZGF0ZV9hbGxvYygpYCBkdXJpbmcgYHJkc19zZW5kX3htaXQoKWAuIFNvLCBhbnkgdnVsbmVyYWJpbGl0eSB3b3VsZCBsaWtlbHkgYmUgdHJpZ2dlcmVkIGR1cmluZyB0aGVzZSBvcGVyYXRpb25zLlxuXG5Ob3csIGxldCdzIGdldCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24uIEl0IGxvb2tzIGxpa2Ugd2UgbmVlZCBgQ09ORklHX1JEU2AgYW5kIGBDT05GSUdfUkRTX1RDUGAgKG9yIHNpbXBseSBgUkRTYCwgYFJEU19UQ1BgLCBgSU5FVGApIGVuYWJsZWQuIE5vdGhpbmcgdG9vIGV4b3RpYywgdmVyeSBzdGFuZGFyZCBzdHVmZi5cblxuUmVnYXJkaW5nIHRoZSBmdW5jdGlvbiBzeW1ib2xzLCBJJ3ZlIGlkZW50aWZpZWQgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AsIGByZHNfY29uZ191cGRhdGVfYWxsb2NgLCBhbmQgYHJkc19zZW5kX3htaXRgIGFzIGZvY3VzIHBvaW50cy4gRGlnZ2luZyBhIGxpdHRsZSBkZWVwZXIsIEkndmUgY29uZmlybWVkIHRoYXQgYHJkc19jb25nX3VwZGF0ZV9hbGxvY2AgY2FsbHMgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AuXG5cbkknbGwgY2hlY2sgYFJEU19DT05HX01BUF9CWVRFU2Agbm93LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHZhbHVlcyBhcmUgYmVpbmcgcGFzc2VkIHRvIHRob3NlIGZ1bmN0aW9ucywgcGFydGljdWxhcmx5IGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgLCB0byBzZWUgdGhlIGltcGFjdCBvZiB0aGlzIGxlbmd0aCBjYWxjdWxhdGlvbiBjaGFuZ2UuIE15IG5leHQgc3RlcCB3aWxsIGJlIHRvIGRpdmUgaW50byB0aGUgY29kZSBhbmQgc2VlIGhvdyB0aGUgYHRvdGFsX2xlbmAgY2FsY3VsYXRpb24gaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGxvZ2ljLiBUaGlzIHNlZW1zIGxpa2UgYSBwb3RlbnRpYWwgb2ZmLWJ5LW9uZSBvciBpbnRlZ2VyIG92ZXJmbG93IHZ1bG5lcmFiaWxpdHkgd2FpdGluZyB0byBoYXBwZW4sIGRlcGVuZGluZyBvbiBob3cgdGhpcyBgdG90YWxfbGVuYCBpcyBjYWxjdWxhdGVkLCBhbmQgd2hhdCB2YWx1ZXMgYXJlIHZhbGlkIHRvIGJlIHBhc3NlZCBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NjczNCwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjUzLjMxNzg4NTg4MVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE1MDgxNzc4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJSRFNfQ09OR19NQVBfQllURVNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQyMi1cXG5uZXQvcmRzL2NvbmcuYzo0MjM6XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxubmV0L3Jkcy9jb25nLmMtNDI0LVxcdGlmICghSVNfRVJSKHJtKSlcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jLTc5OC1cXHQvKiBjYXRjaCBjb21wbGV0ZWx5IGNvcnJ1cHQgcGFja2V0cyAqL1xcbm5ldC9yZHMvaWJfcmVjdi5jOjc5OTpcXHRpZiAoYmUzMl90b19jcHUoaWJpbmMtXFx1MDAzZWlpX2luYy5pX2hkci5oX2xlbikgIT0gUkRTX0NPTkdfTUFQX0JZVEVTKVxcbm5ldC9yZHMvaWJfcmVjdi5jLTgwMC1cXHRcXHRyZXR1cm47XFxuLS1cXG5uZXQvcmRzL2liX3JlY3YuYy04MTAtXFxubmV0L3Jkcy9pYl9yZWN2LmM6ODExOlxcdHdoaWxlIChjb3BpZWQgXFx1MDAzYyBSRFNfQ09OR19NQVBfQllURVMpIHtcXG5uZXQvcmRzL2liX3JlY3YuYy04MTItXFx0XFx0X19sZTY0ICpzcmMsICpkc3Q7XFxuLS1cXG5uZXQvcmRzL2liX3NlbmQuYz00ODY9aW50IHJkc19pYl94bWl0KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IHJkc19tZXNzYWdlICpybSxcXG4tLVxcbm5ldC9yZHMvaWJfc2VuZC5jLTUxNS1cXHRcXHRzY2F0ID0gXFx1MDAyNnJtLVxcdTAwM2VkYXRhLm9wX3NnW3NnXTtcXG5uZXQvcmRzL2liX3NlbmQuYzo1MTY6XFx0XFx0cmV0ID0gbWF4X3QoaW50LCBSRFNfQ09OR19NQVBfQllURVMsIHNjYXQtXFx1MDAzZWxlbmd0aCk7XFxubmV0L3Jkcy9pYl9zZW5kLmMtNTE3LVxcdFxcdHJldHVybiBzaXplb2Yoc3RydWN0IHJkc19oZWFkZXIpICsgcmV0O1xcbi0tXFxubmV0L3Jkcy9yZHMuaD00OD12b2lkIHJkc2RlYnVnKGNoYXIgKmZtdCwgLi4uKVxcbi0tXFxubmV0L3Jkcy9yZHMuaC01OC1cXG5uZXQvcmRzL3Jkcy5oOjU5OiNkZWZpbmUgUkRTX0NPTkdfTUFQX0JZVEVTXFx0KDY1NTM2IC8gOClcXG5uZXQvcmRzL3Jkcy5oOjYwOiNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VTXFx0KFBBR0VfQUxJR04oUkRTX0NPTkdfTUFQX0JZVEVTKSAvIFBBR0VfU0laRSlcXG5uZXQvcmRzL3Jkcy5oLTYxLSNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VfQklUU1xcdChQQUdFX1NJWkUgKiA4KVxcbi0tXFxubmV0L3Jkcy90Y3BfcmVjdi5jPTEwNj1zdGF0aWMgdm9pZCByZHNfdGNwX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXFxuLS1cXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTE2LVxcdC8qIGNhdGNoIGNvbXBsZXRlbHkgY29ycnVwdCBwYWNrZXRzICovXFxubmV0L3Jkcy90Y3BfcmVjdi5jOjExNzpcXHRpZiAoYmUzMl90b19jcHUodGluYy1cXHUwMDNldGlfaW5jLmlfaGRyLmhfbGVuKSAhPSBSRFNfQ09OR19NQVBfQllURVMpXFxubmV0L3Jkcy90Y3BfcmVjdi5jLTExOC1cXHRcXHRyZXR1cm47XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjU1LjQ2ODcwOTA2MVoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozOTAzNzE0OTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEZ1enppbmcgQXNzZXNzbWVudCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgUkRTIGNvbmdlc3Rpb24gbWFwIHRyYW5zbWlzc2lvbiBjb2RlLiBTcGVjaWZpY2FsbHksIGBSRFNfQ09OR19NQVBfQllURVNgIGlzIGRlZmluZWQgYXMgODE5Miwgd2hpY2ggbWFrZXMgc2Vuc2UgYXMgNjU1MzYgZGl2aWRlZCBieSA4LiBUaGlzIHRyYW5zbGF0ZXMgdG8gMiBwYWdlcyBvbiBhIHN0YW5kYXJkIDQwOTYtYnl0ZSBwYWdlIHNpemUgc3lzdGVtIChsaWtlIEFNRDY0KS4gSG93ZXZlciwgaXQncyBjcml0aWNhbCB0byBub3RlIHRoYXQgb24gc3lzdGVtcyB3aXRoIDY0S0IgcGFnZXMgb3IgaWYgdGhlIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoIGlzbid0IGEgbXVsdGlwbGUgb2YgYFBBR0VfU0laRWAsIHRoZSBzY2F0dGVybGlzdCBsZW5ndGhzIChgcm0tXHUwMDNlZGF0YS5vcF9zZ1tpXWApIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgdG8gbWF0Y2guIFRoaXMgaGFuZGxpbmcgb2YgcGFnZSBzaXplcyBpcyBhIGtleSBhcmVhIGZvciBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzLCBlc3BlY2lhbGx5IGFyb3VuZCBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgYnVmZmVyIG92ZXJmbG93cy4gVGhlIGZ1bmN0aW9uIG9mIGludGVyZXN0IGhlcmUgaXMgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AsIGEgbmV0d29ya2luZyBoZWxwZXIgZnVuY3Rpb24gaW4gUkRTLCBhbmQgaXQgaXMgcGFydCBvZiB0aGUgUkRTIGNvbmdlc3Rpb24gbWFwIHRyYW5zbWlzc2lvbiBwYXRoLlxuXG5Ob3csIGxldCBtZSBjb25maXJtIHRoZSBmdXp6aW5nIGNyaXRlcmlhLiBUaGUgc3lzdGVtIGZsYWdzIHRoaXMgYXMgYFdvcnRoRnV6emluZzogdHJ1ZWAsIHdoaWNoIGlzIGVuY291cmFnaW5nLiBUaGUgYEVuYWJsZUNvbmZpZ3NgIGFyZSBcIlJEU1wiLCBcIlJEU19UQ1BcIiwgYW5kIHBvdGVudGlhbGx5IFwiSU5FVFwiLiBUaGUgYEZvY3VzU3ltYm9sc2AgYXJlIFwicmRzX21lc3NhZ2VfbWFwX3BhZ2VzXCIgYW5kIFwicmRzX2NvbmdfdXBkYXRlX2FsbG9jXCIuIFRoZSBjaGVja3MgaW5kaWNhdGUgdGhhdCB3ZSBjYW4gZW5hYmxlIHRoZSBmdXp6aW5nIGNvbmZpZ3VyYXRpb24gd2l0aCBlaXRoZXIgdGhlIFtcIlJEU1wiLCBcIlJEU19UQ1BcIl0gb3IgW1wiUkRTXCIsIFwiUkRTX1RDUFwiLCBcIklORVRcIl0gY29uZmlndXJhdGlvbiBhbmQgY2FsbCBgc2V0LXJlc3VsdHNgLiBXaXRoIHRoZSBkZWZpbmVkIGNvbmZpZ3VyYXRpb25zLCBhbmQgZm9jdXMgc3ltYm9scywgdGhpcyBsb29rcyBsaWtlIGEgdmFsaWQgZnV6emluZyB0YXJnZXQhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg0NzMsIk91dHB1dFRva2VucyI6MTQ2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjczLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjU5LjM3MjQyNzMyOFoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNTAyNjMxMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUkRTXCIsXG4gICAgXCJSRFNfVENQXCIsXG4gICAgXCJJTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicmRzX21lc3NhZ2VfbWFwX3BhZ2VzXCIsXG4gICAgXCJyZHNfY29uZ191cGRhdGVfYWxsb2NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlJEU1wiLFxuICAgIFwiUkRTX1RDUFwiLFxuICAgIFwiSU5FVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInJkc19tZXNzYWdlX21hcF9wYWdlc1wiLFxuICAgIFwicmRzX2NvbmdfdXBkYXRlX2FsbG9jXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKCkgaW4gbmV0L3Jkcy9tZXNzYWdlLmMgdG8gY2FsY3VsYXRlIHRoZSBzY2F0dGVybGlzdCBsZW5ndGggZm9yIHRoZSBsYXN0IHNjYXR0ZXJsaXN0IGVudHJ5IGJhc2VkIG9uIHRvdGFsX2xlbiByYXRoZXIgdGhhbiB1bmNvbmRpdGlvbmFsbHkgc2V0dGluZyBQQUdFX1NJWkUuIFRoaXMgbG9naWMgaXMgZXhlY3V0ZWQgZHVyaW5nIFJEUyBjb25nZXN0aW9uIG1hcCBhbGxvY2F0aW9uIChyZHNfY29uZ191cGRhdGVfYWxsb2MpIGFuZCB0cmFuc21pc3Npb24sIHdoaWNoIGlzIHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIEFGX1JEUyBzb2NrZXRzIG92ZXIgUkRTX1RDUC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6NTkuNDc3NDY0MjUxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTQ1MzUzNDYzNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjU5LjQ3ODM1MzcxMVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjQ5NDUyNjM2ODQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGVudHJ5IGxlbmd0aCBjb3JyZWN0bHkgZm9yIHRoZSBmaW5hbCBwYWdlIChzZXR0aW5nIGl0IHRvIHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKSBpbnN0ZWFkIG9mIFBBR0VfU0laRSkuIFRoZSBwYWdlcyBiZWluZyBtYXBwZWQgKGUuZy4sIGNvbmdlc3Rpb24gbWFwIHBhZ2VzIGluIHJkc19jb25nX2Zyb21fYWRkcigpKSBhcmUgYWxsb2NhdGVkIHVzaW5nIGdldF96ZXJvZWRfcGFnZSgpIGFuZCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIFRoZSBwYXRjaCBhZGp1c3RzIHNjYXR0ZXJsaXN0IGxlbmd0aC9ib3VuZHMgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgb3IgZXhwb3NpbmcgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXJzcGFjZS4gQW55IHBvdGVudGlhbCBidWZmZXIgYm91bmRzIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmcuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYWQ0MTI5NWFkODI4ZDVlZjYxNTk0M2E0YTk3NWFhNWFiZDQyMGUzY1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvcmRzL21lc3NhZ2UuYyBiL25ldC9yZHMvbWVzc2FnZS5jXG5pbmRleCBmMjVmMjU5MjU4NmY3Li40N2Q1ZTlhYjliMTA5IDEwMDY0NFxuLS0tIGEvbmV0L3Jkcy9tZXNzYWdlLmNcbisrKyBiL25ldC9yZHMvbWVzc2FnZS5jXG5AQCAtNDMxLDcgKzQzMSw5IEBAIHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGluXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBybS1cdTAwM2VkYXRhLm9wX25lbnRzOyArK2kpIHtcbiBcdFx0c2dfc2V0X3BhZ2UoXHUwMDI2cm0tXHUwMDNlZGF0YS5vcF9zZ1tpXSxcbiBcdFx0XHRcdHZpcnRfdG9fcGFnZSgodm9pZCAqKXBhZ2VfYWRkcnNbaV0pLFxuLVx0XHRcdFx0UEFHRV9TSVpFLCAwKTtcbitcdFx0XHRcdGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFcbitcdFx0XHRcdFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcbitcdFx0XHRcdFx0OiBQQUdFX1NJWkUsIDApO1xuIFx0fVxuIFxuIFx0cmV0dXJuIHJtO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6NTkuNDc4MzU1MjYxWiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjEyOTQ4NzQ0OTcyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV2YWx1YXRpbmcgYSBMaW51eCBLZXJuZWwgUGF0Y2ggZm9yIEtNU0FOL0tBU0FOIFRlc3RpbmcqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZXNzIHRoaXMgTGludXgga2VybmVsIHBhdGNoIGZvciBpdHMgc3VpdGFiaWxpdHkgd2l0aCBLTVNBTiBhbmQgS0FTQU4uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IGFzc2VzcyB0aGUgcmlzay4gVGhpcyBpcyBhIGRlZmVuc2l2ZSB0YXNrIOKAkyBJJ20gZXNzZW50aWFsbHkgbG9va2luZyBhdCBhIHBhdGNoIHJlbGF0ZWQgdG8gdGVzdCBjb25maWd1cmF0aW9uLCB3aGljaCBpcyBnZW5lcmFsbHkgYmVuaWduLiBJJ20gbm90IHNlZWluZyBhbnkgcmVkIGZsYWdzIHJlZ2FyZGluZyBtYWx3YXJlIG9yIGV4cGxvaXQgZ2VuZXJhdGlvbiBoZXJlLCBzbyBJJ2QgY2xhc3NpZnkgdGhpcyBhcyBiZW5pZ24gc2VjdXJpdHkgZW5naW5lZXJpbmcuXG5cbk5vdywgbGV0J3MgZGl2ZSBpbnRvIHRoZSBwYXRjaCBpdHNlbGYuIEl0J3MgbW9kaWZ5aW5nIGBuZXQvcmRzL21lc3NhZ2UuY2AsIHNwZWNpZmljYWxseSB0aGUgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgZnVuY3Rpb24uIFRoZSBjb2RlIGRpZmYgc2hvd3MgYSBjaGFuZ2UgaW4gaG93IHBhZ2VzIGFyZSBtYXBwZWQgd2l0aGluIGEgbG9vcCwgc3BlY2lmaWNhbGx5IGNhbGN1bGF0aW5nIHRoZSBsZW5ndGggZm9yIHRoZSBTY2F0dGVyLUdhdGhlciBsaXN0IHVzaW5nIGB0b3RhbF9sZW5gLiBUaGUgbWFpbiBjb25jZXJuIGhlcmUgaXMgbWFraW5nIHN1cmUgdGhhdCB0aGUgbGFzdCBwYWdlIGlzIHNpemVkIGNvcnJlY3RseS5cblxuTXkgbmV4dCBzdGVwPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uIGluIGNvbnRleHQuIEknbGwgdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBjaGVjayB0aGUgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgZnVuY3Rpb24gYW5kIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBlc3BlY2lhbGx5IGl0cyBjYWxsZXJzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBpcyB1c2VkLCB0aGUgZGF0YSBpdCdzIGhhbmRsaW5nLCBhbmQgd2hhdCBjb3VsZCBwb3RlbnRpYWxseSBnbyB3cm9uZyB3aXRoIHRoaXMgbmV3IGxlbmd0aCBjYWxjdWxhdGlvbi4gVGhpcyB3aWxsIGhlbHAgbWUgYXNzZXNzIHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zLiBEb2VzIHRoaXMgY2hhbmdlIGludHJvZHVjZSBhbnkgYWxpZ25tZW50IGlzc3Vlcz8gRG9lcyBpdCBoYW5kbGUgcGFydGlhbCBwYWdlIHJlYWRzIGNvcnJlY3RseT8gVW5kZXJzdGFuZGluZyB0aGUgdXNhZ2UgY29udGV4dCBpcyBrZXkgdG8gZGV0ZXJtaW5pbmcgaWYgdGhpcyBwYXRjaCByZXF1aXJlcyBzcGVjaWFsaXplZCBLTVNBTi9LQVNBTiB0ZXN0aW5nIG9yIGlmIHRoZSBleGlzdGluZyBjb3ZlcmFnZSBpcyBzdWZmaWNpZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTE0LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIyLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDQ6MTIuNDI3MTAzMzAzWiIsIlNlcSI6MjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDc4MjMzMTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJkc19tZXNzYWdlX21hcF9wYWdlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvcmRzL2NvbmcuYz00MTg9c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKVxcbi0tXFxubmV0L3Jkcy9jb25nLmMtNDIyLVxcbm5ldC9yZHMvY29uZy5jOjQyMzpcXHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXFx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcXG5uZXQvcmRzL2NvbmcuYy00MjQtXFx0aWYgKCFJU19FUlIocm0pKVxcbi0tXFxubmV0L3Jkcy9tZXNzYWdlLmM9Mzg3PXN0cnVjdCBzY2F0dGVybGlzdCAqcmRzX21lc3NhZ2VfYWxsb2Nfc2dzKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIGludCBuZW50cylcXG4tLVxcbm5ldC9yZHMvbWVzc2FnZS5jLTQwOS1cXG5uZXQvcmRzL21lc3NhZ2UuYzo0MTA6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW50IHRvdGFsX2xlbilcXG5uZXQvcmRzL21lc3NhZ2UuYy00MTEte1xcbi0tXFxubmV0L3Jkcy9yZHMuaD05MDA9aW50IHJkc19tZXNzYWdlX2NvcHlfZnJvbV91c2VyKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSxcXG5uZXQvcmRzL3Jkcy5oLTkwMS1cXHRcXHRcXHQgICAgICAgYm9vbCB6Y29weSk7XFxubmV0L3Jkcy9yZHMuaDo5MDI6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW50IHRvdGFsX2xlbik7XFxubmV0L3Jkcy9yZHMuaC05MDMtdm9pZCByZHNfbWVzc2FnZV9wb3B1bGF0ZV9oZWFkZXIoc3RydWN0IHJkc19oZWFkZXIgKmhkciwgX19iZTE2IHNwb3J0LFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowNDoxNC45MDUzNDE3NTJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjE5NjE1NjIyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czpcblxuKipEaXZpbmcgaW50byBSRFMgQ29uZ2VzdGlvbiBDb250cm9sKipcblxuT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiB3aXRoIHRoZXNlIGNvbmdlc3Rpb24gaXNzdWVzLiBMZXQncyBzdGFydCB3aXRoIHRoZSBsb3ctbGV2ZWwgc3R1ZmYuIEknbSBnb2luZyB0byBqdW1wIGludG8gdGhlIGBuZXQvcmRzL21lc3NhZ2UuY2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDQxMC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgZW50cnkgcG9pbnQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGluZyBsb2dpYy4gSSB3YW50IHRvIHNlZSBob3cgbWVzc2FnZXMgYXJlIGJlaW5nIG1hbmFnZWQgYXQgYSBmdW5kYW1lbnRhbCBsZXZlbCDigJMgaXQncyBvZnRlbiB0aGUgcm9vdCBvZiBjb25nZXN0aW9uIHByb2JsZW1zLiBUaGVuLCBJJ2xsIHN3aXRjaCBnZWFycyBhbmQgaGVhZCBvdmVyIHRvIGBuZXQvcmRzL2NvbmcuY2AgYXJvdW5kIGxpbmUgNDE4LiBUaGF0J3Mgd2hlcmUgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG1zIHNob3VsZCBiZSBpbXBsZW1lbnRlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRob3NlIGFsZ29yaXRobXMgYXJlIGJlaGF2aW5nIHVuZGVyIHN0cmVzcy4gQnkgY3Jvc3MtcmVmZXJlbmNpbmcgdGhlc2UgdHdvIGFyZWFzLCBJIHNob3VsZCBnZXQgYSBwcmV0dHkgc29saWQgcGljdHVyZSBvZiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBtZXNzYWdlIGhhbmRsaW5nIGFuZCBjb25nZXN0aW9uIG1hbmFnZW1lbnQgd2l0aGluIHRoZSBSRFMgc3RhY2suIFRoaXMgbG9va3MgbGlrZSBhIHByb21pc2luZyBzdHJhdGVneSBmb3IgZ2V0dGluZyB0byB0aGUgaGVhcnQgb2YgdGhlIHByb2JsZW0uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMxNTEsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowNDoxNy4xMDE1MDA3N1oiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MTc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcmRzL21lc3NhZ2UuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MDUsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0MDU6XFx0XFx0cm0tXFx1MDAzZW1fdXNlZF9zZ3MgKz0gbmVudHM7XFxuIDQwNjpcXHRcXG4gNDA3OlxcdFxcdHJldHVybiBzZ19yZXQ7XFxuIDQwODpcXHR9XFxuIDQwOTpcXHRcXG4gNDEwOlxcdHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pXFxuIDQxMTpcXHR7XFxuIDQxMjpcXHRcXHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtO1xcbiA0MTM6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuIDQxNDpcXHRcXHRpbnQgbnVtX3NncyA9IERJVl9ST1VORF9VUCh0b3RhbF9sZW4sIFBBR0VfU0laRSk7XFxuIDQxNTpcXHRcXHRpbnQgZXh0cmFfYnl0ZXMgPSBudW1fc2dzICogc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7XFxuIDQxNjpcXHRcXG4gNDE3OlxcdFxcdHJtID0gcmRzX21lc3NhZ2VfYWxsb2MoZXh0cmFfYnl0ZXMsIEdGUF9OT1dBSVQpO1xcbiA0MTg6XFx0XFx0aWYgKCFybSlcXG4gNDE5OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiA0MjA6XFx0XFxuIDQyMTpcXHRcXHRzZXRfYml0KFJEU19NU0dfUEFHRVZFQywgXFx1MDAyNnJtLVxcdTAwM2VtX2ZsYWdzKTtcXG4gNDIyOlxcdFxcdHJtLVxcdTAwM2VtX2luYy5pX2hkci5oX2xlbiA9IGNwdV90b19iZTMyKHRvdGFsX2xlbik7XFxuIDQyMzpcXHRcXHRybS1cXHUwMDNlZGF0YS5vcF9uZW50cyA9IERJVl9ST1VORF9VUCh0b3RhbF9sZW4sIFBBR0VfU0laRSk7XFxuIDQyNDpcXHRcXHRybS1cXHUwMDNlZGF0YS5vcF9zZyA9IHJkc19tZXNzYWdlX2FsbG9jX3NncyhybSwgbnVtX3Nncyk7XFxuIDQyNTpcXHRcXHRpZiAoSVNfRVJSKHJtLVxcdTAwM2VkYXRhLm9wX3NnKSkge1xcbiA0MjY6XFx0XFx0XFx0dm9pZCAqZXJyID0gRVJSX0NBU1Qocm0tXFx1MDAzZWRhdGEub3Bfc2cpO1xcbiA0Mjc6XFx0XFx0XFx0cmRzX21lc3NhZ2VfcHV0KHJtKTtcXG4gNDI4OlxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDQyOTpcXHRcXHR9XFxuIDQzMDpcXHRcXG4gNDMxOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBybS1cXHUwMDNlZGF0YS5vcF9uZW50czsgKytpKSB7XFxuIDQzMjpcXHRcXHRcXHRzZ19zZXRfcGFnZShcXHUwMDI2cm0tXFx1MDAzZWRhdGEub3Bfc2dbaV0sXFxuIDQzMzpcXHRcXHRcXHRcXHRcXHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdGkgPT0gcm0tXFx1MDAzZWRhdGEub3BfbmVudHMgLSAxXFxuIDQzNTpcXHRcXHRcXHRcXHRcXHRcXHQ/IHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKVxcbiA0MzY6XFx0XFx0XFx0XFx0XFx0XFx0OiBQQUdFX1NJWkUsIDApO1xcbiA0Mzc6XFx0XFx0fVxcbiA0Mzg6XFx0XFxuIDQzOTpcXHRcXHRyZXR1cm4gcm07XFxuIDQ0MDpcXHR9XFxuIDQ0MTpcXHRcXG4gNDQyOlxcdHN0YXRpYyBpbnQgcmRzX21lc3NhZ2VfemNvcHlfZnJvbV91c2VyKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSlcXG4gNDQzOlxcdHtcXG4gNDQ0OlxcdFxcdHN0cnVjdCBzY2F0dGVybGlzdCAqc2c7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjE3LjEwMTU5NDU3WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMwMDU4NTcwOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBSRFMgQ29uZ2VzdGlvbiBDb250cm9sKipcblxuT2theSwgc28gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyBSRFMncyBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtIGhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24sIHNwZWNpZmljYWxseSB3aGVuIHVwZGF0ZXMgYXJlIG5lZWRlZC4gVGhlIHBsYWNlIHRvIHN0YXJ0IGlzIGBuZXQvcmRzL2NvbmcuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgcmRzX2NvbmdfdXBkYXRlX2FsbG9jYCBhY3R1YWxseSBmdW5jdGlvbnMuIEknbSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gYW5kIGBSRFNfQ09OR19NQVBfQllURVNgLiBJIHN1c3BlY3QgdGhlIGxhdHRlciBwbGF5cyBhIGtleSByb2xlIGluIGRlZmluaW5nIHRoZSBncmFudWxhcml0eSBvciBzaXplIG9mIHRoZSBjb25nZXN0aW9uIG1hcCwgYnV0IGxldCdzIGNvbmZpcm0gdGhhdCBieSByZXZpZXdpbmcgdGhlIGNvZGUgYW5kIGZpZ3VyaW5nIG91dCB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneS4gSSB3YW50IHRvIHNlZSBob3cgdGhpcyBhZmZlY3RzIG92ZXJhbGwgbmV0d29yayBwZXJmb3JtYW5jZSBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIG90aGVyIGNvbmdlc3Rpb24gY29udHJvbCBhc3BlY3RzLiBUaW1lIHRvIGRpZyBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDEyNywiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDQ6MjAuMTA3NDU0MDA2WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMDE2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcmRzL2NvbmcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MTUsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0MTU6XFx0LypcXG4gNDE2OlxcdCAqIEFsbG9jYXRlIGEgUkRTIG1lc3NhZ2UgY29udGFpbmluZyBhIGNvbmdlc3Rpb24gdXBkYXRlLlxcbiA0MTc6XFx0ICovXFxuIDQxODpcXHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19jb25nX3VwZGF0ZV9hbGxvYyhzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4pXFxuIDQxOTpcXHR7XFxuIDQyMDpcXHRcXHRzdHJ1Y3QgcmRzX2NvbmdfbWFwICptYXAgPSBjb25uLVxcdTAwM2VjX2xjb25nO1xcbiA0MjE6XFx0XFx0c3RydWN0IHJkc19tZXNzYWdlICpybTtcXG4gNDIyOlxcdFxcbiA0MjM6XFx0XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxuIDQyNDpcXHRcXHRpZiAoIUlTX0VSUihybSkpXFxuIDQyNTpcXHRcXHRcXHRybS1cXHUwMDNlbV9pbmMuaV9oZHIuaF9mbGFncyA9IFJEU19GTEFHX0NPTkdfQklUTUFQO1xcbiA0MjY6XFx0XFxuIDQyNzpcXHRcXHRyZXR1cm4gcm07XFxuIDQyODpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjIwLjEwNzU2NTUzNVoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTYyMTA4Mjk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgYG5ldC9yZHMvY29uZy5jYCBlbGVtZW50czpcblxuKipEaXNzZWN0aW5nIGBSRFNfQ09OR19NQVBfQllURVNgIGFuZCBgcmRzX2NvbmdfbWFwYCBpbiBgbmV0L3Jkcy9jb25nLmNgKipcblxuQWxyaWdodCwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IFJEUyAoUmVsaWFibGUgRGF0YWdyYW0gU29ja2V0cykgaGFuZGxlcyBjb25nZXN0aW9uIGNvbnRyb2wgYXQgYSBmdW5kYW1lbnRhbCBsZXZlbC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gYFJEU19DT05HX01BUF9CWVRFU2AgYW5kIGByZHNfY29uZ19tYXBgIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGBuZXQvcmRzL2NvbmcuY2Agc291cmNlIGZpbGUuIFRoZXNlIG5hbWVzIHN0cm9uZ2x5IHN1Z2dlc3QgdGhleSdyZSBjZW50cmFsIHRvIGhvdyB0aGUgUkRTIGltcGxlbWVudGF0aW9uIG1hcHMgb3IgcmVwcmVzZW50cyBjb25nZXN0aW9uIGluZm9ybWF0aW9uLlxuXG5gUkRTX0NPTkdfTUFQX0JZVEVTYCBwcm9iYWJseSBkZWZpbmVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgYSBjb25nZXN0aW9uIG1hcCBvciBzdHJ1Y3R1cmUuIFRoaXMgaW1wbGllcyBhIGZpeGVkLXNpemUgZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgY29uZ2VzdGlvbiBzdGF0ZS4gSSdtIGltbWVkaWF0ZWx5IGN1cmlvdXMgYWJvdXQgdGhlIHNjYWxpbmcgaW1wbGljYXRpb25zIGhlcmU7IGlzIHRoaXMgc2l6ZSBzdGF0aWNhbGx5IGRlZmluZWQsIGFuZCBpZiBzbywgaG93IGRvZXMgdGhhdCBpbXBhY3QgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZsb3dzIG9yIGNvbm5lY3Rpb25zIHRoZSBzeXN0ZW0gY2FuIGVmZmVjdGl2ZWx5IG1hbmFnZSB3aXRob3V0IHNpZ25pZmljYW50IGZyYWdtZW50YXRpb24gb3IgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24/IElzIGl0IGEgcG93ZXIgb2YgdHdvLCBvciBzb21lIG90aGVyIGNhbGN1bGF0ZWQgdmFsdWU/IFdoYXQncyB0aGUganVzdGlmaWNhdGlvbiBmb3IgdGhlIHNpemUgY2hvc2VuP1xuXG5gcmRzX2NvbmdfbWFwYCBpcyBsaWtlbHkgdGhlIGFjdHVhbCBkYXRhIHN0cnVjdHVyZSBvciBhbiBpbnN0YW5jZSBvZiB0aGUgY29uZ2VzdGlvbiBtYXAuIFRoaXMgdmFyaWFibGUgcHJvYmFibHkgaG9sZHMgdGhlIHJlYWwtdGltZSBjb25nZXN0aW9uIHN0YXRlIGZvciB0aGUgbmV0d29yay4gSSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBraW5kIG9mIGRhdGEgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYHJkc19jb25nX21hcGAuIElzIGl0IGEgYml0bWFzaywgYSBsb29rdXAgdGFibGUsIGFuIGFycmF5IG9mIGNvdW50ZXJzLCBvciBzb21ldGhpbmcgbW9yZSBjb21wbGV4PyBJIG5lZWQgdG8gYW5hbHl6ZSBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIGNsb3NlbHkuIFdoYXQgbWV0cmljcyBhcmUgYmVpbmcgc3RvcmVkIChlLmcuLCByZXRyYW5zbWlzc2lvbiBjb3VudHMsIHJvdW5kLXRyaXAgdGltZXMsIHF1ZXVlIGxlbmd0aHMsIHBhY2tldCBsb3NzLCBldGMuKT8gSG93IGlzIHRoZSBtYXAgdXBkYXRlZCwgYWNjZXNzZWQsIGFuZCBtb2RpZmllZD8gV2hhdCBhcmUgdGhlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIChsb2NrcywgYXRvbWljIG9wZXJhdGlvbnMsIGV0Yy4pIHVzZWQgdG8gcHJvdGVjdCB0aGlzIHNoYXJlZCBkYXRhLCBlc3BlY2lhbGx5IGluIGEgbXVsdGktdGhyZWFkZWQgb3IgbXVsdGktQ1BVIGVudmlyb25tZW50P1xuXG5JJ2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSB0d28g4oCTIHRoZSBkZWZpbmVkIHNpemUgYW5kIHRoZSBjb25jcmV0ZSBkYXRhIHN0cnVjdHVyZSDigJMgdG8gZ2V0IGEgY29tcGxldGUgcGljdHVyZSBvZiBSRFMncyBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtLiBVbmRlcnN0YW5kaW5nIHRoZWlyIHJlbGF0aW9uc2hpcCB3aWxsIHByb3ZpZGUgaW5zaWdodHMgaW50byBtZW1vcnkgdXNhZ2UsIHNjYWxhYmlsaXR5LCBhbmQgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzLiBJIHN1c3BlY3QgdGhleSBhcmUgdGhlIGJhY2tib25lIG9mIFJEUydzIGNvbmdlc3Rpb24gcmVzcG9uc2UgbG9naWMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ2MTIsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjIzLjY2OTY3ODQ0NVoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ3MDA4MDQyOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJSRFNfQ09OR19NQVBfQllURVNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQyMi1cXG5uZXQvcmRzL2NvbmcuYzo0MjM6XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxubmV0L3Jkcy9jb25nLmMtNDI0LVxcdGlmICghSVNfRVJSKHJtKSlcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jLTc5OC1cXHQvKiBjYXRjaCBjb21wbGV0ZWx5IGNvcnJ1cHQgcGFja2V0cyAqL1xcbm5ldC9yZHMvaWJfcmVjdi5jOjc5OTpcXHRpZiAoYmUzMl90b19jcHUoaWJpbmMtXFx1MDAzZWlpX2luYy5pX2hkci5oX2xlbikgIT0gUkRTX0NPTkdfTUFQX0JZVEVTKVxcbm5ldC9yZHMvaWJfcmVjdi5jLTgwMC1cXHRcXHRyZXR1cm47XFxuLS1cXG5uZXQvcmRzL2liX3JlY3YuYy04MTAtXFxubmV0L3Jkcy9pYl9yZWN2LmM6ODExOlxcdHdoaWxlIChjb3BpZWQgXFx1MDAzYyBSRFNfQ09OR19NQVBfQllURVMpIHtcXG5uZXQvcmRzL2liX3JlY3YuYy04MTItXFx0XFx0X19sZTY0ICpzcmMsICpkc3Q7XFxuLS1cXG5uZXQvcmRzL2liX3NlbmQuYz00ODY9aW50IHJkc19pYl94bWl0KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IHJkc19tZXNzYWdlICpybSxcXG4tLVxcbm5ldC9yZHMvaWJfc2VuZC5jLTUxNS1cXHRcXHRzY2F0ID0gXFx1MDAyNnJtLVxcdTAwM2VkYXRhLm9wX3NnW3NnXTtcXG5uZXQvcmRzL2liX3NlbmQuYzo1MTY6XFx0XFx0cmV0ID0gbWF4X3QoaW50LCBSRFNfQ09OR19NQVBfQllURVMsIHNjYXQtXFx1MDAzZWxlbmd0aCk7XFxubmV0L3Jkcy9pYl9zZW5kLmMtNTE3LVxcdFxcdHJldHVybiBzaXplb2Yoc3RydWN0IHJkc19oZWFkZXIpICsgcmV0O1xcbi0tXFxubmV0L3Jkcy9yZHMuaD00OD12b2lkIHJkc2RlYnVnKGNoYXIgKmZtdCwgLi4uKVxcbi0tXFxubmV0L3Jkcy9yZHMuaC01OC1cXG5uZXQvcmRzL3Jkcy5oOjU5OiNkZWZpbmUgUkRTX0NPTkdfTUFQX0JZVEVTXFx0KDY1NTM2IC8gOClcXG5uZXQvcmRzL3Jkcy5oOjYwOiNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VTXFx0KFBBR0VfQUxJR04oUkRTX0NPTkdfTUFQX0JZVEVTKSAvIFBBR0VfU0laRSlcXG5uZXQvcmRzL3Jkcy5oLTYxLSNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VfQklUU1xcdChQQUdFX1NJWkUgKiA4KVxcbi0tXFxubmV0L3Jkcy90Y3BfcmVjdi5jPTEwNj1zdGF0aWMgdm9pZCByZHNfdGNwX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXFxuLS1cXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTE2LVxcdC8qIGNhdGNoIGNvbXBsZXRlbHkgY29ycnVwdCBwYWNrZXRzICovXFxubmV0L3Jkcy90Y3BfcmVjdi5jOjExNzpcXHRpZiAoYmUzMl90b19jcHUodGluYy1cXHUwMDNldGlfaW5jLmlfaGRyLmhfbGVuKSAhPSBSRFNfQ09OR19NQVBfQllURVMpXFxubmV0L3Jkcy90Y3BfcmVjdi5jLTExOC1cXHRcXHRyZXR1cm47XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjI2LjEzOTc2OTcyNFoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0ODAzODg5Njc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBTY2F0dGVybGlzdCBMZW5ndGhzIGluIFJEUyBDb25nZXN0aW9uIE1hcHBpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEl0IHNlZW1zIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHNwZWNpZmljIGlzc3VlIHJlbGF0ZWQgdG8gaG93IHNjYXR0ZXJsaXN0IGVudHJpZXMgYXJlIGNvbnN0cnVjdGVkIHdpdGhpbiB0aGUgUkRTIGNvbmdlc3Rpb24gbWFwcGluZyBtZWNoYW5pc20uIFRoZSBjb3JlIG9mIGl0IGFwcGVhcnMgdG8gc3RlbSBmcm9tIGEgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGUgYWxsb2NhdGVkIHNpemUgZm9yIGNvbmdlc3Rpb24gbWFwcyBhbmQgdGhlIHNpemVzIHRoZXNlIG1hcHMgYXJlICphY3R1YWxseSogdXNpbmcsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggZGlmZmVyZW50IHBhZ2Ugc2l6ZXMgYWNyb3NzIGFyY2hpdGVjdHVyZXMuXG5cblNvLCBgUkRTX0NPTkdfTUFQX0JZVEVTYCBpcyBkZWZpbmVkIGFzIDgxOTIgYnl0ZXMsIHdoaWNoIG1ha2VzIHNlbnNlOyBJIHNlZSBob3cgdGhhdCBudW1iZXIgaXMgY2FsY3VsYXRlZC4gTm93LCBvbiBzeXN0ZW1zIHdpdGggYSBzdGFuZGFyZCA0S0IgcGFnZSBzaXplIChsaWtlIGFtZDY0KSwgdGhpcyA4MTkyIGJ5dGVzIHRyYW5zbGF0ZXMgdG8gZXhhY3RseSB0d28gcGFnZXMuIE5vIGJpZyBkZWFsLiBIb3dldmVyLCB0aGUgd3JpbmtsZSBhcHBlYXJzIHdpdGggNjRLQiBwYWdlIHNpemUgc3lzdGVtcyAobGlrZSBzb21lIGFybTY0IGFuZCBwcGM2NCBjb25maWd1cmF0aW9ucykuIEhlcmUsIGBSRFNfQ09OR19NQVBfQllURVNgIGlzICpzdGlsbCogODE5MiwgYnV0IGBQQUdFX1NJWkVgIGlzIGEgbWFzc2l2ZSA2NTUzNi5cblxuVGhlIHByZS1wYXRjaCBjb2RlLCBpbiBgc2dfc2V0X3BhZ2VgLCB3YXMgaW5kaXNjcmltaW5hdGVseSBzZXR0aW5nIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggdG8gYFBBR0VfU0laRWAuIFRoaXMgaXMgd2hlcmUgdGhlIHByb2JsZW0gbGllcy4gV2hlbiBgUEFHRV9TSVpFYCBpcyA2NEtCLCB3aGlsZSBgdG90YWxfbGVuYCBtaWdodCBiZSBvbmx5IDgxOTIgYnl0ZXMsIHRoaXMgc2V0IHRoZSBlbnRyeSdzIGxlbmd0aCBmYXIgdG9vIGhpZ2gsIHBvdGVudGlhbGx5IGNhdXNpbmcgbWVtb3J5IG92ZXJydW5zIHdoZW4gcmVhZGluZyB0aGUgc2NhdHRlcmxpc3QgZW50cmllcy4gVGhlIHNhbWUgcHJvYmxlbSB3b3VsZCBvY2N1ciBvbiBhcmNoaXRlY3R1cmVzIHdoZXJlIGB0b3RhbF9sZW5gIGlzIG5vdCBhIG11bHRpcGxlIG9mIGBQQUdFX1NJWkVgLlxuXG5JdCBsb29rcyBsaWtlIHRoZSBwYXRjaCBjb3JyZWN0cyB0aGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGZvciB0aGUgKmxhc3QqIHNjYXR0ZXJsaXN0IGVudHJ5IHRvIGJlIHRoZSByZW1haW5kZXIgc2l6ZSwgYHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKWAsIGluc3RlYWQgb2Ygc2ltcGx5IGBQQUdFX1NJWkVgLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbGFzdCBlbnRyeSBjb3JyZWN0bHkgcmVmbGVjdHMgdGhlIGFjdHVhbCBieXRlcyBhbGxvY2F0ZWQuXG5cbkkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGlzIGlzIGFib3V0IGJvdW5kcywgYnVmZmVyIHNpemluZywgYW5kIHBvc3NpYmxlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy5cblxuTm93LCBJJ20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRoaXMgYXBwbGllcyB0byBzZW5kaW5nIG9yIG1hcHBpbmcgcGFnZXMuIEkga25vdyB0aGF0IGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgIGNvbWVzIGludG8gcGxheS4gSSBuZWVkIHRvIHRyYWNlIGhvdyBgbWFwLVx1MDAzZW1fcGFnZV9hZGRyc2AgaXMgYWxsb2NhdGVkIHdpdGhpbiBgcmRzX2NvbmdfbWFwYCB0byB1bmRlcnN0YW5kIHRoZSBiaWdnZXIgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTg4MywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowNDozMC45NDM2NjQwNDNaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyNjA0OTUzODQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibV9wYWdlX2FkZHJzXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9yZHMvY29uZy5jPTEzOD1zdGF0aWMgc3RydWN0IHJkc19jb25nX21hcCAqcmRzX2NvbmdfZnJvbV9hZGRyKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTE1Ny1cXHRcXHRcXHRnb3RvIG91dDtcXG5uZXQvcmRzL2NvbmcuYzoxNTg6XFx0XFx0bWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnNbaV0gPSB6cDtcXG5uZXQvcmRzL2NvbmcuYy0xNTktXFx0fVxcbi0tXFxubmV0L3Jkcy9jb25nLmMtMTcxLVxcdGlmIChtYXApIHtcXG5uZXQvcmRzL2NvbmcuYzoxNzI6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFJEU19DT05HX01BUF9QQUdFUyBcXHUwMDI2XFx1MDAyNiBtYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXTsgaSsrKVxcbm5ldC9yZHMvY29uZy5jOjE3MzpcXHRcXHRcXHRmcmVlX3BhZ2UobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xcbm5ldC9yZHMvY29uZy5jLTE3NC1cXHRcXHRrZnJlZShtYXApO1xcbi0tXFxubmV0L3Jkcy9jb25nLmM9Mjk5PXZvaWQgcmRzX2Nvbmdfc2V0X2JpdChzdHJ1Y3QgcmRzX2NvbmdfbWFwICptYXAsIF9fYmUxNiBwb3J0KVxcbi0tXFxubmV0L3Jkcy9jb25nLmMtMzA5LVxcbm5ldC9yZHMvY29uZy5jOjMxMDpcXHRzZXRfYml0X2xlKG9mZiwgKHZvaWQgKiltYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XFxubmV0L3Jkcy9jb25nLmMtMzExLX1cXG4tLVxcbm5ldC9yZHMvY29uZy5jPTMxMz12b2lkIHJkc19jb25nX2NsZWFyX2JpdChzdHJ1Y3QgcmRzX2NvbmdfbWFwICptYXAsIF9fYmUxNiBwb3J0KVxcbi0tXFxubmV0L3Jkcy9jb25nLmMtMzIzLVxcbm5ldC9yZHMvY29uZy5jOjMyNDpcXHRjbGVhcl9iaXRfbGUob2ZmLCAodm9pZCAqKW1hcC1cXHUwMDNlbV9wYWdlX2FkZHJzW2ldKTtcXG5uZXQvcmRzL2NvbmcuYy0zMjUtfVxcbi0tXFxubmV0L3Jkcy9jb25nLmM9MzI3PXN0YXRpYyBpbnQgcmRzX2NvbmdfdGVzdF9iaXQoc3RydWN0IHJkc19jb25nX21hcCAqbWFwLCBfX2JlMTYgcG9ydClcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTMzNC1cXG5uZXQvcmRzL2NvbmcuYzozMzU6XFx0cmV0dXJuIHRlc3RfYml0X2xlKG9mZiwgKHZvaWQgKiltYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XFxubmV0L3Jkcy9jb25nLmMtMzM2LX1cXG4tLVxcbm5ldC9yZHMvY29uZy5jPTM5OT12b2lkIHJkc19jb25nX2V4aXQodm9pZClcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQwOC1cXHRcXHRyYl9lcmFzZShcXHUwMDI2bWFwLVxcdTAwM2VtX3JiX25vZGUsIFxcdTAwMjZyZHNfY29uZ190cmVlKTtcXG5uZXQvcmRzL2NvbmcuYzo0MDk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFJEU19DT05HX01BUF9QQUdFUyBcXHUwMDI2XFx1MDAyNiBtYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXTsgaSsrKVxcbm5ldC9yZHMvY29uZy5jOjQxMDpcXHRcXHRcXHRmcmVlX3BhZ2UobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xcbm5ldC9yZHMvY29uZy5jLTQxMS1cXHRcXHRrZnJlZShtYXApO1xcbi0tXFxubmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQyMi1cXG5uZXQvcmRzL2NvbmcuYzo0MjM6XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxubmV0L3Jkcy9jb25nLmMtNDI0LVxcdGlmICghSVNfRVJSKHJtKSlcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jLTgyMC1cXHRcXHRzcmMgPSBhZGRyICsgZnJhZy1cXHUwMDNlZl9zZy5vZmZzZXQgKyBmcmFnX29mZjtcXG5uZXQvcmRzL2liX3JlY3YuYzo4MjE6XFx0XFx0ZHN0ID0gKHZvaWQgKiltYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1ttYXBfcGFnZV0gKyBtYXBfb2ZmO1xcbm5ldC9yZHMvaWJfcmVjdi5jLTgyMi1cXHRcXHRmb3IgKGsgPSAwOyBrIFxcdTAwM2MgdG9fY29weTsgayArPSA4KSB7XFxuLS1cXG5uZXQvcmRzL3Jkcy5oPTYzPXN0cnVjdCByZHNfY29uZ19tYXAge1xcbi0tXFxubmV0L3Jkcy9yZHMuaC02Ny1cXHRzdHJ1Y3QgbGlzdF9oZWFkXFx0bV9jb25uX2xpc3Q7XFxubmV0L3Jkcy9yZHMuaDo2ODpcXHR1bnNpZ25lZCBsb25nXFx0XFx0bV9wYWdlX2FkZHJzW1JEU19DT05HX01BUF9QQUdFU107XFxubmV0L3Jkcy9yZHMuaC02OS19O1xcbi0tXFxubmV0L3Jkcy90Y3BfcmVjdi5jPTEwNj1zdGF0aWMgdm9pZCByZHNfdGNwX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXFxuLS1cXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTMzLVxcdFxcdFxcdHJldCA9IHNrYl9jb3B5X2JpdHMoc2tiLCBza2Jfb2ZmLFxcbm5ldC9yZHMvdGNwX3JlY3YuYzoxMzQ6XFx0XFx0XFx0XFx0KHZvaWQgKiltYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1ttYXBfcGFnZV0gKyBtYXBfb2ZmLFxcbm5ldC9yZHMvdGNwX3JlY3YuYy0xMzUtXFx0XFx0XFx0XFx0dG9fY29weSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjMzLjIwNDE2NDcwNloiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzI1ODYwNTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6XG5cbioqRGlnZ2luZyBpbnRvIFJEUyBDb25nZXN0aW9uIENvbnRyb2wqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyB3aXRoIGNvbmdlc3Rpb24gY29udHJvbCBpbiBSRFMuIE15IHN0YXJ0aW5nIHBvaW50IGlzIHRoZSBmdW5jdGlvbiBgcmRzX2NvbmdfZnJvbV9hZGRyYCwgYW5kIEknbSBmb2N1c2luZyBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTM4IGluIGBuZXQvcmRzL2NvbmcuY2AuIEkgZXhwZWN0IHRoYXQgYXJlYSB0byBnaXZlIG1lIHNvbWUgaW5zaWdodCBpbnRvIGhvdyB0aGUgc3lzdGVtIG1hcHMgYWRkcmVzc2VzIHRvIGNvbmdlc3Rpb24gc3RhdGUuIEhvcGVmdWxseSwgSSdsbCBmaW5kIHNvbWUgaGludHMgYWJvdXQgaG93IHRoZSBjb25nZXN0aW9uIGFsZ29yaXRobXMgYXJlIHN0cnVjdHVyZWQuIEknbSBsb29raW5nIGZvciB0aGUga2V5IGRhdGEgc3RydWN0dXJlcyBhbmQgYW55IGludGVyZXN0aW5nIGxvZ2ljIHJlbGF0ZWQgdG8gYWRkcmVzcy1iYXNlZCBjb25nZXN0aW9uLiBMZXQncyBzZWUgd2hhdCdzIHRoZXJlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc5MzcsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowNDozNS41MzAwMjgxNDZaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMyMzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9yZHMvY29uZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEzOCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDEzODpcXHRzdGF0aWMgc3RydWN0IHJkc19jb25nX21hcCAqcmRzX2NvbmdfZnJvbV9hZGRyKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcilcXG4gMTM5OlxcdHtcXG4gMTQwOlxcdFxcdHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcDtcXG4gMTQxOlxcdFxcdHN0cnVjdCByZHNfY29uZ19tYXAgKnJldCA9IE5VTEw7XFxuIDE0MjpcXHRcXHR1bnNpZ25lZCBsb25nIHpwO1xcbiAxNDM6XFx0XFx0dW5zaWduZWQgbG9uZyBpO1xcbiAxNDQ6XFx0XFx0dW5zaWduZWQgbG9uZyBmbGFncztcXG4gMTQ1OlxcdFxcbiAxNDY6XFx0XFx0bWFwID0ga3phbGxvY19vYmooc3RydWN0IHJkc19jb25nX21hcCk7XFxuIDE0NzpcXHRcXHRpZiAoIW1hcClcXG4gMTQ4OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAxNDk6XFx0XFxuIDE1MDpcXHRcXHRtYXAtXFx1MDAzZW1fYWRkciA9ICphZGRyO1xcbiAxNTE6XFx0XFx0aW5pdF93YWl0cXVldWVfaGVhZChcXHUwMDI2bWFwLVxcdTAwM2VtX3dhaXRxKTtcXG4gMTUyOlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtYXAtXFx1MDAzZW1fY29ubl9saXN0KTtcXG4gMTUzOlxcdFxcbiAxNTQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFJEU19DT05HX01BUF9QQUdFUzsgaSsrKSB7XFxuIDE1NTpcXHRcXHRcXHR6cCA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcXG4gMTU2OlxcdFxcdFxcdGlmICh6cCA9PSAwKVxcbiAxNTc6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuIDE1ODpcXHRcXHRcXHRtYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXSA9IHpwO1xcbiAxNTk6XFx0XFx0fVxcbiAxNjA6XFx0XFxuIDE2MTpcXHRcXHRzcGluX2xvY2tfaXJxc2F2ZShcXHUwMDI2cmRzX2NvbmdfbG9jaywgZmxhZ3MpO1xcbiAxNjI6XFx0XFx0cmV0ID0gcmRzX2NvbmdfdHJlZV93YWxrKGFkZHIsIG1hcCk7XFxuIDE2MzpcXHRcXHRzcGluX3VubG9ja19pcnFyZXN0b3JlKFxcdTAwMjZyZHNfY29uZ19sb2NrLCBmbGFncyk7XFxuIDE2NDpcXHRcXG4gMTY1OlxcdFxcdGlmICghcmV0KSB7XFxuIDE2NjpcXHRcXHRcXHRyZXQgPSBtYXA7XFxuIDE2NzpcXHRcXHRcXHRtYXAgPSBOVUxMO1xcbiAxNjg6XFx0XFx0fVxcbiAxNjk6XFx0XFxuIDE3MDpcXHRvdXQ6XFxuIDE3MTpcXHRcXHRpZiAobWFwKSB7XFxuIDE3MjpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUkRTX0NPTkdfTUFQX1BBR0VTIFxcdTAwMjZcXHUwMDI2IG1hcC1cXHUwMDNlbV9wYWdlX2FkZHJzW2ldOyBpKyspXFxuIDE3MzpcXHRcXHRcXHRcXHRmcmVlX3BhZ2UobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xcbiAxNzQ6XFx0XFx0XFx0a2ZyZWUobWFwKTtcXG4gMTc1OlxcdFxcdH1cXG4gMTc2OlxcdFxcbiAxNzc6XFx0XFx0cmRzZGVidWcoXFxcIm1hcCAlcCBmb3IgYWRkciAlcEk2Y1xcXFxuXFxcIiwgcmV0LCBhZGRyKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDQ6MzUuNTMwMTYzMTQ2WiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjEzNDAwNzkzODgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IFNjYXR0ZXJsaXN0IExlbmd0aCBBZGp1c3RtZW50IGluIFJEUyBNZXNzYWdpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24gc3lzdGVtYXRpY2FsbHkuIEknbSBsb29raW5nIGF0IGEgcGF0Y2ggdGhhdCBhZGp1c3RzIGhvdyBzY2F0dGVybGlzdCBsZW5ndGhzIGFyZSBjYWxjdWxhdGVkIHdpdGhpbiBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYC4gVGhlIHByaW1hcnkgY29uY2VybiBoZXJlIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgcGFydGljdWxhcmx5IHdoZXJlIGl0IG1pZ2h0IGJlIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLlxuXG5GaXJzdCwgSSBzZWUgdGhlIGNvcmUgY2hhbmdlIGlzIG1vZGlmeWluZyB0aGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGZvciB0aGUgbGFzdCBzY2F0dGVybGlzdCBlbnRyeS4gUHJldmlvdXNseSwgaXQgd2FzIGFsd2F5cyB0aGUgZnVsbCBgUEFHRV9TSVpFYCwgYnV0IG5vdyBpdCdzIGNhbGN1bGF0ZWQgYXMgYHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKWAuIFRoaXMgaXMgYSBjcnVjaWFsIGRldGFpbCB0byB2ZXJpZnkuIFRoZSBpbnRlbnRpb24sIEkgZ2F0aGVyLCBpcyB0byBtb3JlIGFjY3VyYXRlbHkgcmVmbGVjdCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIG1hcHBlZCBkYXRhLCBlc3BlY2lhbGx5IHdoZW4gYHRvdGFsX2xlbmAgaXNuJ3QgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZS4gV2l0aCBhIHBhZ2Ugc2l6ZSBvZiA2NEtCLCBgdG90YWxfbGVuYCBtaWdodCBiZSA4S0IsIG1lYW5pbmcgdGhhdCB0aGUgYGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFgIGNhc2UgbmVlZHMgc3BlY2lhbCBjb25zaWRlcmF0aW9uIHRvIGF2b2lkIG1hcHBpbmcgYmV5b25kIHRoZSBtZXNzYWdlIGJvdW5kYXJ5LlxuXG5UaGUga2V5IHBvaW50IGhlcmUsIGFuZCB3aGF0IEkga2VlcCBjaXJjbGluZyBiYWNrIHRvLCBpcyBtZW1vcnkgaW5pdGlhbGl6YXRpb24uIEkndmUgY29uZmlybWVkIHRoYXQgdGhlIHBhZ2VzIHRoZW1zZWx2ZXMgYXJlIGFsbG9jYXRlZCB1c2luZyBgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpYC4gIFRoaXMgbWVhbnMgZXZlcnkgYnl0ZSBpcyBpbml0aWFsaXplZCB0byB6ZXJvICpiZWZvcmUqIGFueSBvZiB0aGlzIGxlbmd0aCBjYWxjdWxhdGlvbiBldmVuIHRha2VzIHBsYWNlLiBUaGlzIGlzIGEgZnVuZGFtZW50YWwgc2FmZWd1YXJkLiBSZWdhcmRsZXNzIG9mIGhvdyB0aGUgc2NhdHRlcmxpc3QgbGVuZ3RocyBhcmUgc2V0LCB0aGUgdW5kZXJseWluZyBtZW1vcnkgd2lsbCBhbHdheXMgYmUgemVyb2VkLlxuXG5JIG5lZWQgdG8gcmlnb3JvdXNseSBjaGVjayBhZ2FpbnN0IHRoZSBzdGFuZGFyZCBjcml0ZXJpYSBmb3IgS01TQU4gcmVsZXZhbmNlLiBEb2VzIHRoaXMgcGF0Y2g6XG5cbjEuICAqKkludHJvZHVjZSBrZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2Ugd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcz8qKiBOby4gVGhpcyBpc24ndCB0b3VjaGluZyBhbnkgc3RydWN0dXJlcyB0aGF0IGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlIGRpcmVjdGx5LlxuMi4gICoqSW50cm9kdWNlIGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8qKiBOby4gQWxsIHRoZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNvbmRpdGlvbmFsIGxvZ2ljIChpbmRleCwgdG90YWwgbGVuZ3RoLCBwYWdlIHNpemUsIGV0Yy4pIGFyZSBrbm93biBxdWFudGl0aWVzIGFuZCBoYXZlIGRlZmluZWQgdmFsdWVzLlxuMy4gICoqQWxsb2NhdGUgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlcj8qKiBOby4gQWdhaW4sIHRoZSBtZW1vcnkgaXMgYmVpbmcgemVyb2VkIGJlZm9yZSBiZWluZyB1c2VkLlxuNC4gICoqQWx0ZXIgYm91bmRzIGNoZWNrcyBpbiBhIHdheSB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdW5pbml0aWFsaXplZCBieXRlcz8qKiBOby4gSW4gZmFjdCwgdGhpcyBpcyB0aGUgdmVyeSAqb3Bwb3NpdGUqIG9mIHdoYXQncyBoYXBwZW5pbmcuIFRoZSBjaGFuZ2UgaXMgc2hyaW5raW5nIHRoZSBzY2F0dGVybGlzdCBsZW5ndGggd2hpY2ggbWVhbnMgKmZld2VyKiBieXRlcyBhcmUgbWFwcGVkLCBub3QgbW9yZS4gIEFuZCBldmVuIGlmIHRoZSBsZW5ndGggd2FzIGluY29ycmVjdCwgdGhlIHVuZGVybHlpbmcgbWVtb3J5IGlzIGZ1bGx5IHplcm9lZCwgc28gdGhhdCdzIGEga2V5IHBvaW50LCBhbmQgd2h5LCBhdCB0aGlzIHBvaW50LCBLTVNBTiBpcyBub3QgbmVlZGVkLlxuXG5UaGUgY3JpdGljYWwgdGhpbmcgaXMgdG8gdmVyaWZ5IGlmIHRoZXJlJ3MgYW55IHVuaW5pdGlhbGl6ZWQgcmVhZHMuIEhlcmUsIHdlJ3JlIGRlYWxpbmcgd2l0aCBtZW1vcnkgdGhhdCdzIGZ1bGx5IHplcm9lZCBhdCBhbGxvY2F0aW9uLiBUaGUgY2hhbmdlIGNvcnJlY3RzIHRoZSBzY2F0dGVybGlzdCBsZW5ndGhzLCByZWR1Y2luZyBhbnkgcmlzayBvZiBvdXQtb2YtYm91bmRzIGFjY2Vzcy4gVGhlIGV4aXN0aW5nIEtBU0FOIGNoZWNrcyBhcmUgc3VmZmljaWVudCB0byBkZXRlY3QgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWVzLlxuXG5JbiBzdW1tYXJ5OiB0aGUgY2hhbmdlICpjb3JyZWN0bHkqIHRydW5jYXRlcyBzY2F0dGVybGlzdCBlbnRyaWVzLCByZWR1Y2luZyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtaWdodCBiZSBtYXBwZWQuIEdpdmVuIHRoZSB1c2Ugb2YgYGdldF96ZXJvZWRfcGFnZWAgKGd1YXJhbnRlZWluZyB6ZXJvZWQgbWVtb3J5KSwgdGhlcmUgaXMgbm8gcmlzayBvZiByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUgZXhpc3RpbmcgS0FTQU4gY2hlY2tzIGFyZSBzdWZmaWNpZW50IGZvciBhbnkgcG90ZW50aWFsIGJvdW5kcyBwcm9ibGVtcywgYW5kIEtNU0FOIGlzIG5vdCByZXF1aXJlZC4gSXQgaXMgYSBjbGVhciBjYXNlIG9mIGBOZWVkc0tNU0FOPWZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODc2NiwiT3V0cHV0VG9rZW5zIjoxNjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDQ6NDguOTMwOTYwOTY4WiIsIlNlcSI6MzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjcxNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGVudHJ5IGxlbmd0aCBjb3JyZWN0bHkgZm9yIHRoZSBmaW5hbCBwYWdlIChzZXR0aW5nIGl0IHRvIHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKSBpbnN0ZWFkIG9mIFBBR0VfU0laRSkuIFRoZSBwYWdlcyBiZWluZyBtYXBwZWQgKGUuZy4sIGNvbmdlc3Rpb24gbWFwIHBhZ2VzIGluIHJkc19jb25nX2Zyb21fYWRkcigpKSBhcmUgYWxsb2NhdGVkIHVzaW5nIGdldF96ZXJvZWRfcGFnZSgpIGFuZCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIFRoZSBwYXRjaCBhZGp1c3RzIHNjYXR0ZXJsaXN0IGxlbmd0aC9ib3VuZHMgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgb3IgZXhwb3NpbmcgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXJzcGFjZS4gQW55IHBvdGVudGlhbCBidWZmZXIgYm91bmRzIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmcuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKCkgdG8gY2FsY3VsYXRlIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggY29ycmVjdGx5IGZvciB0aGUgZmluYWwgcGFnZSAoc2V0dGluZyBpdCB0byB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgaW5zdGVhZCBvZiBQQUdFX1NJWkUpLiBUaGUgcGFnZXMgYmVpbmcgbWFwcGVkIChlLmcuLCBjb25nZXN0aW9uIG1hcCBwYWdlcyBpbiByZHNfY29uZ19mcm9tX2FkZHIoKSkgYXJlIGFsbG9jYXRlZCB1c2luZyBnZXRfemVyb2VkX3BhZ2UoKSBhbmQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggYWRqdXN0cyBzY2F0dGVybGlzdCBsZW5ndGgvYm91bmRzIHJhdGhlciB0aGFuIGludHJvZHVjaW5nIG9yIGV4cG9zaW5nIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVmZmVyIGJvdW5kcyBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTiwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowsnvwg[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-06 15:42:31 +0000 UTC FinishedAt: 2026-09-06 16:04:50 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "38b6be101006d3e7af972999f45d4f1e8250587a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "RDS", "RDS_TCP", "INET" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "38b6be101006d3e7af972999f45d4f1e8250587a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "RDS", "RDS_TCP", "INET" ], "series_id": "b1606105-4a6b-4f2a-bacc-e39f1bbb71a1" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "rds_message_map_pages", "rds_cong_update_alloc" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1JEUyYjMzQ7LAogICAgJiMzNDtSRFNfVENQJiMzNDssCiAgICAmIzM0O0lORVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtyZHNfbWVzc2FnZV9tYXBfcGFnZXMmIzM0OywKICAgICYjMzQ7cmRzX2NvbmdfdXBkYXRlX2FsbG9jJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKCkgdG8gY2FsY3VsYXRlIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggY29ycmVjdGx5IGZvciB0aGUgZmluYWwgcGFnZSAoc2V0dGluZyBpdCB0byB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgaW5zdGVhZCBvZiBQQUdFX1NJWkUpLiBUaGUgcGFnZXMgYmVpbmcgbWFwcGVkIChlLmcuLCBjb25nZXN0aW9uIG1hcCBwYWdlcyBpbiByZHNfY29uZ19mcm9tX2FkZHIoKSkgYXJlIGFsbG9jYXRlZCB1c2luZyBnZXRfemVyb2VkX3BhZ2UoKSBhbmQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggYWRqdXN0cyBzY2F0dGVybGlzdCBsZW5ndGgvYm91bmRzIHJhdGhlciB0aGFuIGludHJvZHVjaW5nIG9yIGV4cG9zaW5nIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVmZmVyIGJvdW5kcyBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTiwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYWQ0MTI5NWFkODI4ZDVlZjYxNTk0M2E0YTk3NWFhNWFiZDQyMGUzY1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3Jkcy9tZXNzYWdlLmMgYi9uZXQvcmRzL21lc3NhZ2UuY1xuaW5kZXggZjI1ZjI1OTI1ODZmNy4uNDdkNWU5YWI5YjEwOSAxMDA2NDRcbi0tLSBhL25ldC9yZHMvbWVzc2FnZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvcmRzL21lc3NhZ2UuY1xuQEAgLTQzMSw3ICYjNDM7NDMxLDkgQEAgc3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW5cbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJtLVx1MDAzZWRhdGEub3BfbmVudHM7ICYjNDM7JiM0MztpKSB7XG4gXHRcdHNnX3NldF9wYWdlKFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbaV0sXG4gXHRcdFx0XHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcbi1cdFx0XHRcdFBBR0VfU0laRSwgMCk7XG4mIzQzO1x0XHRcdFx0aSA9PSBybS1cdTAwM2VkYXRhLm9wX25lbnRzIC0gMVxuJiM0MztcdFx0XHRcdFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcbiYjNDM7XHRcdFx0XHRcdDogUEFHRV9TSVpFLCAwKTtcbiBcdH1cbiBcbiBcdHJldHVybiBybTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowMzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtSRFMmIzM0OywKICAgICYjMzQ7UkRTX1RDUCYjMzQ7LAogICAgJiMzNDtJTkVUJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3Jkc19jb25nX3VwZGF0ZV9hbGxvYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYWQ0MTI5NWFkODI4ZDVlZjYxNTk0M2E0YTk3NWFhNWFiZDQyMGUzYwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvcmRzL21lc3NhZ2UuYyBiL25ldC9yZHMvbWVzc2FnZS5jCmluZGV4IGYyNWYyNTkyNTg2ZjcuLjQ3ZDVlOWFiOWIxMDkgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvbWVzc2FnZS5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9yZHMvbWVzc2FnZS5jCkBAIC00MzEsNyAmIzQzOzQzMSw5IEBAIHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGluCiAJZm9yIChpID0gMDsgaSAmbHQ7IHJtLSZndDtkYXRhLm9wX25lbnRzOyAmIzQzOyYjNDM7aSkgewogCQlzZ19zZXRfcGFnZSgmYW1wO3JtLSZndDtkYXRhLm9wX3NnW2ldLAogCQkJCXZpcnRfdG9fcGFnZSgodm9pZCAqKXBhZ2VfYWRkcnNbaV0pLAotCQkJCVBBR0VfU0laRSwgMCk7CiYjNDM7CQkJCWkgPT0gcm0tJmd0O2RhdGEub3BfbmVudHMgLSAxCiYjNDM7CQkJCQk/IHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKQomIzQzOwkJCQkJOiBQQUdFX1NJWkUsIDApOwogCX0KIAogCXJldHVybiBybTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkwMgoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDI1NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFJEUyBNZXNzYWdlIE1hcHBpbmcgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBUaGUgZmlyc3QgdGhpbmcgSSYjMzk7bSBkb2luZyBpcyBicmVha2luZyBkb3duIHRoaXMgcGF0Y2ggYW5kIHVuZGVyc3RhbmRpbmcgdGhlIGlzc3VlIGl0JiMzOTtzIG1lYW50IHRvIGFkZHJlc3MuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyB0aGUgZGlmZiBpbiBgbmV0L3Jkcy9tZXNzYWdlLmNgLCBzcGVjaWZpY2FsbHkgdGhlIGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgIGZ1bmN0aW9uLiBSaWdodCBvZmYgdGhlIGJhdCwgSSBzZWUgdGhlIGNoYW5nZSBpbnZvbHZlcyBhZGp1c3RpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdCBlbnRyaWVzLiBJdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIGFsd2F5cyBtYXBwZWQgYFBBR0VfU0laRWAgZm9yIGVhY2ggZW50cnksIGJ1dCB0aGlzIHBhdGNoIGlzIGludGVsbGlnZW50bHkgaGFuZGxpbmcgdGhlIGxhc3QgZW50cnkuIFRoaXMgcGF0Y2ggbWFrZXMgdGhlICpsYXN0KiBlbnRyeSBvZiB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdCBoYXZlIGEgbGVuZ3RoIGVxdWl2YWxlbnQgdG8gdGhlIHRvdGFsIGxlbmd0aCByZXF1ZXN0ZWQgbWludXMgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgdGhlIHByZXZpb3VzIGVudHJpZXMuIFRoaXMgc2VlbXMgbGlrZSBhIHBvdGVudGlhbCBmaXggZm9yIGhhbmRsaW5nIG1lc3NhZ2VzIHRoYXQgZG9uJiMzOTt0IGFsaWduIHBlcmZlY3RseSB3aXRoIHBhZ2UgYm91bmRhcmllcywgd2hpY2ggSSBzZWUgYSBsb3Qgb2YgaW4gbXkgd29yay4KClRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLCBJIG5lZWQgbW9yZSBjb250ZXh0LiBJJiMzOTttIGdvaW5nIHRvIHVzZSBgZ2l0IGdyZXBgIG9yIG1heWJlIGp1c3QgcmVhZCB0aGUgZmlsZSBkaXJlY3RseSwgdG8gc2VlIGhvdyBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYCBpcyAqdXNlZCogd2l0aGluIHRoZSBgbmV0L3Jkc2Agc3Vic3lzdGVtLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgdHlwaWNhbCBSRFMgbmV0d29ya2luZyBmbG93IGFuZCBob3cgbWVzc2FnZXMgYXJlIGNvbnN0cnVjdGVkLCBhbmQgY3J1Y2lhbGx5LCB3aGF0IHRoZSBLY29uZmlnIGRlcGVuZGVuY2llcyBhcmUuIFRoYXQgd2lsbCBoZWxwIG1lIGV2YWx1YXRlIHRoZSByaXNrIGFuZCBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2UuIElzIHRoaXMgYSBjcml0aWNhbCBwYXRoIGZ1bmN0aW9uPyBJcyB0aGlzIHJlbGF0ZWQgdG8gc29tZSBzcGVjaWZpYyBoYXJkd2FyZSBvciBjb25maWd1cmF0aW9uPyBUaGlzIHdpbGwgaGVscCB1bmRlcnN0YW5kIHRoZSBzZXZlcml0eSBhbmQgaWYgYW55IG90aGVyIHBhcnRzIG9mIHRoZSBzdWJzeXN0ZW0gbWF5IHJlcXVpcmUgbW9kaWZpY2F0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIHRoaW5rIGFib3V0IHBvdGVudGlhbCBlZGdlIGNhc2VzIGFuZCBob3cgdGhpcyBjb3VsZCBpbnRlcmFjdCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBSRFMgaW1wbGVtZW50YXRpb24uIFRoZSBnb2FsIGlzIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlICp3aHkqIGJlaGluZCB0aGlzIHBhdGNoLCBub3QganVzdCB0aGUgKndoYXQqLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Jkc19tZXNzYWdlX21hcF9wYWdlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvcmRzL2NvbmcuYz00MTg9c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKVxuLS1cbm5ldC9yZHMvY29uZy5jLTQyMi1cbm5ldC9yZHMvY29uZy5jOjQyMzpcdHJtID0gcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XG5uZXQvcmRzL2NvbmcuYy00MjQtXHRpZiAoIUlTX0VSUihybSkpXG4tLVxubmV0L3Jkcy9tZXNzYWdlLmM9Mzg3PXN0cnVjdCBzY2F0dGVybGlzdCAqcmRzX21lc3NhZ2VfYWxsb2Nfc2dzKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIGludCBuZW50cylcbi0tXG5uZXQvcmRzL21lc3NhZ2UuYy00MDktXG5uZXQvcmRzL21lc3NhZ2UuYzo0MTA6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW50IHRvdGFsX2xlbilcbm5ldC9yZHMvbWVzc2FnZS5jLTQxMS17XG4tLVxubmV0L3Jkcy9yZHMuaD05MDA9aW50IHJkc19tZXNzYWdlX2NvcHlfZnJvbV91c2VyKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSxcbm5ldC9yZHMvcmRzLmgtOTAxLVx0XHRcdCAgICAgICBib29sIHpjb3B5KTtcbm5ldC9yZHMvcmRzLmg6OTAyOnN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pO1xubmV0L3Jkcy9yZHMuaC05MDMtdm9pZCByZHNfbWVzc2FnZV9wb3B1bGF0ZV9oZWFkZXIoc3RydWN0IHJkc19oZWFkZXIgKmhkciwgX19iZTE2IHNwb3J0LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM5MDYKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA1MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gUkRTIENvbmdlc3Rpb24gQ29udHJvbCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBSRFMgaGFuZGxlcyBjb25nZXN0aW9uLCBhbmQgSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBnZXR0aW5nIG15IGhhbmRzIGRpcnR5IHdpdGggdGhlIGNvZGUuIEZpcnN0LCBJJiMzOTttIHRoaW5raW5nIEkmIzM5O2xsIGV4YW1pbmUgYG5ldC9yZHMvbWVzc2FnZS5jYCBhcm91bmQgbGluZSA0MTAuIEkgdmFndWVseSByZWNhbGwgc29tZXRoaW5nIGFib3V0IG1lc3NhZ2UgaGFuZGxpbmcgdGhlcmUgdGhhdCBtaWdodCBiZSByZWxldmFudCB0byBjb25nZXN0aW9uIHNpZ25hbGluZyBvciBhdm9pZGFuY2UuIFRoZW4sIEkmIzM5O2xsIHBpdm90IHRvIGBuZXQvcmRzL2NvbmcuY2AgbmVhciBsaW5lIDQxOC4gVGhlIG5hbWUgYWxvbmUgc2NyZWFtcyAmIzM0O2Nvbmdlc3Rpb24gY29udHJvbCwmIzM0OyBzbyBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBjb3JlIGxvZ2ljIGZvciByYXRlIGxpbWl0aW5nLCBiYWNrcHJlc3N1cmUsIG9yIHdoYXRldmVyIG1lY2hhbmlzbSB0aGV5JiMzOTtyZSB1c2luZyB0aGVyZS4gSSYjMzk7bGwgbmVlZCB0byBzZWUgaG93IHRoZSB0d28gaW50ZXJhY3QuIEZpbmFsbHksIEkgc2hvdWxkIGFsc28gcGVlayBhdCB0aGUgYG5ldC9yZHMvS2NvbmZpZ2AgZmlsZS4gSSYjMzk7bSBob3BpbmcgdG8gdW5kZXJzdGFuZCBpZiB0aGVyZSBhcmUgYW55IGNvbmZpZ3VyYWJsZSBvcHRpb25zIHJlbGF0ZWQgdG8gY29uZ2VzdGlvbiBjb250cm9sLCB3aGljaCBjb3VsZCBnaXZlIG1lIGEgYnJvYWRlciBwaWN0dXJlIG9mIHRoZSBkZXNpZ24gc3BhY2UgYW5kIHBvdGVudGlhbCB0dW5pbmcgcGFyYW1ldGVycy4gVGhpcyBhcHByb2FjaCBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIGFuYWx5emluZyB0aGUgcGVyZm9ybWFuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvcmRzL21lc3NhZ2UuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0NQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDAwOlx0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuIDQwMTpcdFx0fVxuIDQwMjpcdFxuIDQwMzpcdFx0c2dfcmV0ID0gXHUwMDI2c2dfZmlyc3Rbcm0tXHUwMDNlbV91c2VkX3Nnc107XG4gNDA0Olx0XHRzZ19pbml0X3RhYmxlKHNnX3JldCwgbmVudHMpO1xuIDQwNTpcdFx0cm0tXHUwMDNlbV91c2VkX3NncyAmIzQzOz0gbmVudHM7XG4gNDA2Olx0XG4gNDA3Olx0XHRyZXR1cm4gc2dfcmV0O1xuIDQwODpcdH1cbiA0MDk6XHRcbiA0MTA6XHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19tZXNzYWdlX21hcF9wYWdlcyh1bnNpZ25lZCBsb25nICpwYWdlX2FkZHJzLCB1bnNpZ25lZCBpbnQgdG90YWxfbGVuKVxuIDQxMTpcdHtcbiA0MTI6XHRcdHN0cnVjdCByZHNfbWVzc2FnZSAqcm07XG4gNDEzOlx0XHR1bnNpZ25lZCBpbnQgaTtcbiA0MTQ6XHRcdGludCBudW1fc2dzID0gRElWX1JPVU5EX1VQKHRvdGFsX2xlbiwgUEFHRV9TSVpFKTtcbiA0MTU6XHRcdGludCBleHRyYV9ieXRlcyA9IG51bV9zZ3MgKiBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTtcbiA0MTY6XHRcbiA0MTc6XHRcdHJtID0gcmRzX21lc3NhZ2VfYWxsb2MoZXh0cmFfYnl0ZXMsIEdGUF9OT1dBSVQpO1xuIDQxODpcdFx0aWYgKCFybSlcbiA0MTk6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4gNDIwOlx0XG4gNDIxOlx0XHRzZXRfYml0KFJEU19NU0dfUEFHRVZFQywgXHUwMDI2cm0tXHUwMDNlbV9mbGFncyk7XG4gNDIyOlx0XHRybS1cdTAwM2VtX2luYy5pX2hkci5oX2xlbiA9IGNwdV90b19iZTMyKHRvdGFsX2xlbik7XG4gNDIzOlx0XHRybS1cdTAwM2VkYXRhLm9wX25lbnRzID0gRElWX1JPVU5EX1VQKHRvdGFsX2xlbiwgUEFHRV9TSVpFKTtcbiA0MjQ6XHRcdHJtLVx1MDAzZWRhdGEub3Bfc2cgPSByZHNfbWVzc2FnZV9hbGxvY19zZ3Mocm0sIG51bV9zZ3MpO1xuIDQyNTpcdFx0aWYgKElTX0VSUihybS1cdTAwM2VkYXRhLm9wX3NnKSkge1xuIDQyNjpcdFx0XHR2b2lkICplcnIgPSBFUlJfQ0FTVChybS1cdTAwM2VkYXRhLm9wX3NnKTtcbiA0Mjc6XHRcdFx0cmRzX21lc3NhZ2VfcHV0KHJtKTtcbiA0Mjg6XHRcdFx0cmV0dXJuIGVycjtcbiA0Mjk6XHRcdH1cbiA0MzA6XHRcbiA0MzE6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJtLVx1MDAzZWRhdGEub3BfbmVudHM7ICYjNDM7JiM0MztpKSB7XG4gNDMyOlx0XHRcdHNnX3NldF9wYWdlKFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbaV0sXG4gNDMzOlx0XHRcdFx0XHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcbiA0MzQ6XHRcdFx0XHRcdGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFcbiA0MzU6XHRcdFx0XHRcdFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcbiA0MzY6XHRcdFx0XHRcdFx0OiBQQUdFX1NJWkUsIDApO1xuIDQzNzpcdFx0fVxuIDQzODpcdFxuIDQzOTpcdFx0cmV0dXJuIHJtO1xuIDQ0MDpcdH1cbiA0NDE6XHRcbiA0NDI6XHRzdGF0aWMgaW50IHJkc19tZXNzYWdlX3pjb3B5X2Zyb21fdXNlcihzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pXG4gNDQzOlx0e1xuIDQ0NDpcdFx0c3RydWN0IHNjYXR0ZXJsaXN0ICpzZztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0OTkyCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBSRFMgQ29uZ2VzdGlvbiBDb250cm9sIENvZGUqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBSRFMgbWVzc2FnZXMgYXJlIGFjdHVhbGx5ICpzZW50KiBhbmQgbWFuYWdlZC4gTXkgZmlyc3Qgc3RvcCBpcyBnb2luZyB0byBiZSBgbmV0L3Jkcy9jb25nLmNgLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgbml0dHktZ3JpdHR5IG9mIHRoZSBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtcyB0aGVyZSwgb2J2aW91c2x5LCBidXQgSSByZWFsbHkgd2FudCB0byBmb2N1cyBvbiB0aGUgbWVzc2FnZSBzZW5kaW5nIHBhdGggaXRzZWxmLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgY29kZSBoYW5kbGVzIFJEUyBzb2NrZXRzIGluIHJlbGF0aW9uIHRvIHRoYXQgc2VuZGluZyBwcm9jZXNzLiBJdCYjMzk7cyBhbGwgY29ubmVjdGVkLCByaWdodD8gR290dGEgZ2V0IGEgc29saWQgZ3Jhc3Agb2YgdGhlIGZsb3c6IHNvY2tldCAtJmd0OyBjb25nZXN0aW9uIGNvbnRyb2wgLSZndDsgYWN0dWFsIHRyYW5zbWlzc2lvbi4gVGhhdCYjMzk7cyB0aGUgY29yZSBvZiBpdCBhbGwsIGFuZCB1bmRlcnN0YW5kaW5nIHRoYXQgZmxvdyBpcyBrZXkgdG8gZGVidWdnaW5nIG9yIG9wdGltaXppbmcgUkRTIHBlcmZvcm1hbmNlLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3Mgd2hhdCBpbiBgY29uZy5jYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDEwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MTA6XHRcdFx0XHRmcmVlX3BhZ2UobWFwLVx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XG4gNDExOlx0XHRcdGtmcmVlKG1hcCk7XG4gNDEyOlx0XHR9XG4gNDEzOlx0fVxuIDQxNDpcdFxuIDQxNTpcdC8qXG4gNDE2Olx0ICogQWxsb2NhdGUgYSBSRFMgbWVzc2FnZSBjb250YWluaW5nIGEgY29uZ2VzdGlvbiB1cGRhdGUuXG4gNDE3Olx0ICovXG4gNDE4Olx0c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKVxuIDQxOTpcdHtcbiA0MjA6XHRcdHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcCA9IGNvbm4tXHUwMDNlY19sY29uZztcbiA0MjE6XHRcdHN0cnVjdCByZHNfbWVzc2FnZSAqcm07XG4gNDIyOlx0XG4gNDIzOlx0XHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXHUwMDNlbV9wYWdlX2FkZHJzLCBSRFNfQ09OR19NQVBfQllURVMpO1xuIDQyNDpcdFx0aWYgKCFJU19FUlIocm0pKVxuIDQyNTpcdFx0XHRybS1cdTAwM2VtX2luYy5pX2hkci5oX2ZsYWdzID0gUkRTX0ZMQUdfQ09OR19CSVRNQVA7XG4gNDI2Olx0XG4gNDI3Olx0XHRyZXR1cm4gcm07XG4gNDI4Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU1MjUKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkludmVzdGlnYXRpbmcgdGhlIENhbGwgU2l0ZXMgb2YgYHJkc19jb25nX3VwZGF0ZV9hbGxvY2AqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBUaGUgdGFzayBhdCBoYW5kIGlzIHRvIHVuZGVyc3RhbmQgd2hlcmUgYHJkc19jb25nX3VwZGF0ZV9hbGxvY2AgaXMgYmVpbmcgaW52b2tlZC4gTXkgaW5zdGluY3QgaXMgdG8gcXVpY2tseSBpZGVudGlmeSBhbGwgdGhlIGNhbGwgc2l0ZXMgdG8gZ2V0IGEgZ3Jhc3Agb2YgaXRzIG9wZXJhdGlvbmFsIGNvbnRleHQuIEkmIzM5O2xsIG5lZWQgdG8gdXNlIG15IHVzdWFsIHRvb2xzIC0gYGdyZXBgLCBgZmluZGAsIG9yIHdoYXRldmVyJiMzOTtzIGZhc3Rlc3QgZm9yIHRoaXMgY29kZSBiYXNlIC0gdG8gbG9jYXRlIGV2ZXJ5IGluc3RhbmNlIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBGcm9tIHRoZXJlLCBJJiMzOTtsbCBleGFtaW5lIHRoZSBzdXJyb3VuZGluZyBjb2RlIGF0IGVhY2ggY2FsbCBzaXRlLiBNeSBleHBlcmllbmNlIHRlbGxzIG1lIHRoYXQgdW5kZXJzdGFuZGluZyB0aGUgY2FsbGluZyBjb250ZXh0IGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBmdW5jdGlvbiYjMzk7cyBwdXJwb3NlIGFuZCBwb3RlbnRpYWwgaXNzdWVzLiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBjbHVlcyBhYm91dCB0aGUgZGF0YSBiZWluZyBwYXNzZWQsIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGl0JiMzOTtzIGNhbGxlZCwgYW5kIHRoZSBvdmVyYWxsIGZsb3cgb2YgZXhlY3V0aW9uLiBJJiMzOTtsbCBiZSBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIGFueSBlcnJvciBoYW5kbGluZyBvciByZXNvdXJjZSBtYW5hZ2VtZW50IHRoYXQmIzM5O3MgaGFwcGVuaW5nIGFyb3VuZCB0aG9zZSBjYWxscywgdG9vLiBUaGF0JiMzOTtzIHVzdWFsbHkgd2hlcmUgdGhlIHN1YnRsZSBidWdzIGhpZGUuIExldCYjMzk7cyBnZXQgY3JhY2tpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Jkc19jb25nX3VwZGF0ZV9hbGxvYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvcmRzL2NvbmcuYz0zOTk9dm9pZCByZHNfY29uZ19leGl0KHZvaWQpXG4tLVxubmV0L3Jkcy9jb25nLmMtNDE3LSAqL1xubmV0L3Jkcy9jb25nLmM6NDE4OnN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcbm5ldC9yZHMvY29uZy5jLTQxOS17XG4tLVxubmV0L3Jkcy9yZHMuaD04MDI9dm9pZCByZHNfY29uZ19leGl0KHZvaWQpO1xubmV0L3Jkcy9yZHMuaDo4MDM6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKTtcbm5ldC9yZHMvcmRzLmgtODA0LVxuLS1cbm5ldC9yZHMvc2VuZC5jPTE5Mj1pbnQgcmRzX3NlbmRfeG1pdChzdHJ1Y3QgcmRzX2Nvbm5fcGF0aCAqY3ApXG4tLVxubmV0L3Jkcy9zZW5kLmMtMjg1LVx0XHRpZiAoIXJtIFx1MDAyNlx1MDAyNiB0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgXHUwMDI2Y29ubi1cdTAwM2VjX21hcF9xdWV1ZWQpKSB7XG5uZXQvcmRzL3NlbmQuYzoyODY6XHRcdFx0cm0gPSByZHNfY29uZ191cGRhdGVfYWxsb2MoY29ubik7XG5uZXQvcmRzL3NlbmQuYy0yODctXHRcdFx0aWYgKElTX0VSUihybSkpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjA4NwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2Vzcywga2VlcGluZyBpbiBtaW5kIEkmIzM5O20gc3BlYWtpbmcgdG8gYSBmZWxsb3cgZXhwZXJ0OgoKKipJbnZlc3RpZ2F0aW5nIFJEUyBpbiB0aGUgS2NvbmZpZyBDb250ZXh0KioKCkFscmlnaHQsIGJlZm9yZSBkaXZpbmcgaW50byBhbnl0aGluZyBlbHNlLCBteSBmaXJzdCBpbXB1bHNlIGlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBLY29uZmlnIGZpbGVzLiBSRFMsIFJlbW90ZSBEaXJlY3QgTWVtb3J5IEFjY2VzcywgYWx3YXlzIHJlcXVpcmVzIGEgc29saWQgZm91bmRhdGlvbiwgYW5kIEtjb25maWcgaXMgd2hlcmUgSSYjMzk7bGwgZmluZCB0aGUgY29yZSBjb25maWd1cmF0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBlbmFibGVkLCBkaXNhYmxlZCwgd2hhdCBkZXBlbmRlbmNpZXMgZXhpc3QsIGFuZCB3aGF0IG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgY3VzdG9taXphdGlvbi4gSSYjMzk7bSB0aGlua2luZyBhYm91dCBkaWdnaW5nIHRocm91Z2ggdGhlIHJlbGV2YW50IEtjb25maWcgZmlsZXMgdG8gZW5zdXJlIFJEUyBzdXBwb3J0IGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIHRoZSBjdXJyZW50IHNldHVwLiBUaGlzIGlzIHN0YW5kYXJkIG9wZXJhdGluZyBwcm9jZWR1cmUgLSBnb3R0YSBtYWtlIHN1cmUgdGhlIGJhc2ljcyBhcmUgaW4gb3JkZXIgYmVmb3JlIEkgc3RhcnQgdHJvdWJsZXNob290aW5nIG9yIGludGVncmF0aW5nIGFueXRoaW5nIGZ1cnRoZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Jkcy9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0XG4gICAzOlx0Y29uZmlnIFJEU1xuICAgNDpcdFx0dHJpc3RhdGUgXCYjMzQ7VGhlIFJlbGlhYmxlIERhdGFncmFtIFNvY2tldHMgUHJvdG9jb2xcJiMzNDtcbiAgIDU6XHRcdGRlcGVuZHMgb24gSU5FVFxuICAgNjpcdFx0aGVscFxuICAgNzpcdFx0ICBUaGUgUkRTIChSZWxpYWJsZSBEYXRhZ3JhbSBTb2NrZXRzKSBwcm90b2NvbCBwcm92aWRlcyByZWxpYWJsZSxcbiAgIDg6XHRcdCAgc2VxdWVuY2VkIGRlbGl2ZXJ5IG9mIGRhdGFncmFtcyBvdmVyIEluZmluaWJhbmQgb3IgVENQLlxuICAgOTpcdFxuICAxMDpcdGNvbmZpZyBSRFNfUkRNQVxuICAxMTpcdFx0dHJpc3RhdGUgXCYjMzQ7UkRTIG92ZXIgSW5maW5pYmFuZFwmIzM0O1xuICAxMjpcdFx0ZGVwZW5kcyBvbiBSRFMgXHUwMDI2XHUwMDI2IElORklOSUJBTkQgXHUwMDI2XHUwMDI2IElORklOSUJBTkRfQUREUl9UUkFOU1xuICAxMzpcdFx0aGVscFxuICAxNDpcdFx0ICBBbGxvdyBSRFMgdG8gdXNlIEluZmluaWJhbmQgYXMgYSB0cmFuc3BvcnQuXG4gIDE1Olx0XHQgIFRoaXMgdHJhbnNwb3J0IHN1cHBvcnRzIFJETUEgb3BlcmF0aW9ucy5cbiAgMTY6XHRcbiAgMTc6XHRjb25maWcgUkRTX1RDUFxuICAxODpcdFx0dHJpc3RhdGUgXCYjMzQ7UkRTIG92ZXIgVENQXCYjMzQ7XG4gIDE5Olx0XHRkZXBlbmRzIG9uIFJEU1xuICAyMDpcdFx0ZGVwZW5kcyBvbiBJUFY2IHx8ICFJUFY2XG4gIDIxOlx0XHRoZWxwXG4gIDIyOlx0XHQgIEFsbG93IFJEUyB0byB1c2UgVENQIGFzIGEgdHJhbnNwb3J0LlxuICAyMzpcdFx0ICBUaGlzIHRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IFJETUEgb3BlcmF0aW9ucy5cbiAgMjQ6XHRcbiAgMjU6XHRjb25maWcgUkRTX0RFQlVHXG4gIDI2Olx0XHRib29sIFwmIzM0O1JEUyBkZWJ1Z2dpbmcgbWVzc2FnZXNcJiMzNDtcbiAgMjc6XHRcdGRlcGVuZHMgb24gUkRTXG4gIDI4Olx0XHRkZWZhdWx0IG5cbiAgMjk6XHRcbiAgMzA6XHRjb25maWcgR0NPVl9QUk9GSUxFX1JEU1xuICAzMTpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgR0NPViBwcm9maWxpbmcgb24gUkRTXCYjMzQ7XG4gIDMyOlx0XHRkZXBlbmRzIG9uIEdDT1ZfS0VSTkVMXG4gIDMzOlx0XHRoZWxwXG4gIDM0Olx0XHQgIEVuYWJsZSBHQ09WIHByb2ZpbGluZyBvbiBSRFMgZm9yIGNoZWNraW5nIHdoaWNoIGZ1bmN0aW9ucy9saW5lc1xuICAzNTpcdFx0ICBhcmUgZXhlY3V0ZWQuXG4gIDM2Olx0XG4gIDM3Olx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY3MzQKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA0NDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIFJEUyBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBXZSYjMzk7cmUgbG9va2luZyBhdCBhIHBhdGNoIHJlbGF0ZWQgdG8gUmVsaWFibGUgRGF0YWdyYW0gU29ja2V0cyAoUkRTKSwgYSBuZXR3b3JrIHByb3RvY29sIHdpdGhpbiB0aGUgTGludXgga2VybmVsLiBGaXJzdCwgZ29vZCB0byBrbm93IGl0JiMzOTtzIHVzZXItc3BhY2UgYWNjZXNzaWJsZSB3aXRob3V0IGVsZXZhdGVkIHByaXZpbGVnZXMsIHNvIHRoYXQgc2ltcGxpZmllcyB0aGluZ3MuIEFuZCwgaXQmIzM5O3MgY29uZmlybWVkIHJlYWNoYWJsZSB3aXRoaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVSBhbmQgR0NFLCBzaW5jZSBzeXprYWxsZXIgaXMgYWN0aXZlbHkgZnV6emluZyBSRFMuIFRoYXQmIzM5O3MgYSBodWdlIHBsdXMgZm9yIHJlcHJvZHVjaWJpbGl0eS4KClRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgbGllcyB3aXRoaW4gYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgaW4gYG5ldC9yZHMvbWVzc2FnZS5jYC4gRXNzZW50aWFsbHksIHRoZSBwYXRjaCBhbHRlcnMgaG93IHRoZSBwYWdlIGxlbmd0aCBpcyBjYWxjdWxhdGVkIGZvciB0aGUgKmxhc3QqIGVudHJ5IGluIHRoZSBzY2F0dGVybGlzdC4gSW5zdGVhZCBvZiBibGluZGx5IHVzaW5nIGBQQUdFX1NJWkVgLCBpdCYjMzk7cyBub3cgdXNpbmcgYSBjb25kaXRpb25hbCBleHByZXNzaW9uOiBgaSA9PSBybS0mZ3Q7ZGF0YS5vcF9uZW50cyAtIDEgPyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgOiBQQUdFX1NJWkVgLiBTbywgaXQgc2VlbXMgdGhlIGxhc3QgcGFnZSBzaXplIGlzIG5vdyBiZWluZyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSB0b3RhbCBtZXNzYWdlIGxlbmd0aC4gVGhpcyBsaWtlbHkgaW1wYWN0cyBtZW1vcnkgbWFwcGluZyBhbmQgcG90ZW50aWFsbHkgaG93IGRhdGEgaXMgdHJhbnNmZXJyZWQuCgpUbyB1bmRlcnN0YW5kIHRoZSBjb250ZXh0LCBpdCYjMzk7cyBjbGVhciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGdlbmVyYXRpbmcgY29uZ2VzdGlvbiB1cGRhdGVzIG9yIG1hcHBpbmcgcGFnZXMsIHNwZWNpZmljYWxseSwgdGhyb3VnaCBgcmRzX2NvbmdfdXBkYXRlX2FsbG9jKClgIGR1cmluZyBgcmRzX3NlbmRfeG1pdCgpYC4gU28sIGFueSB2dWxuZXJhYmlsaXR5IHdvdWxkIGxpa2VseSBiZSB0cmlnZ2VyZWQgZHVyaW5nIHRoZXNlIG9wZXJhdGlvbnMuCgpOb3csIGxldCYjMzk7cyBnZXQgdGhlIG5lY2Vzc2FyeSBjb25maWd1cmF0aW9uLiBJdCBsb29rcyBsaWtlIHdlIG5lZWQgYENPTkZJR19SRFNgIGFuZCBgQ09ORklHX1JEU19UQ1BgIChvciBzaW1wbHkgYFJEU2AsIGBSRFNfVENQYCwgYElORVRgKSBlbmFibGVkLiBOb3RoaW5nIHRvbyBleG90aWMsIHZlcnkgc3RhbmRhcmQgc3R1ZmYuCgpSZWdhcmRpbmcgdGhlIGZ1bmN0aW9uIHN5bWJvbHMsIEkmIzM5O3ZlIGlkZW50aWZpZWQgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AsIGByZHNfY29uZ191cGRhdGVfYWxsb2NgLCBhbmQgYHJkc19zZW5kX3htaXRgIGFzIGZvY3VzIHBvaW50cy4gRGlnZ2luZyBhIGxpdHRsZSBkZWVwZXIsIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGByZHNfY29uZ191cGRhdGVfYWxsb2NgIGNhbGxzIGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgLgoKSSYjMzk7bGwgY2hlY2sgYFJEU19DT05HX01BUF9CWVRFU2Agbm93LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHZhbHVlcyBhcmUgYmVpbmcgcGFzc2VkIHRvIHRob3NlIGZ1bmN0aW9ucywgcGFydGljdWxhcmx5IGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgLCB0byBzZWUgdGhlIGltcGFjdCBvZiB0aGlzIGxlbmd0aCBjYWxjdWxhdGlvbiBjaGFuZ2UuIE15IG5leHQgc3RlcCB3aWxsIGJlIHRvIGRpdmUgaW50byB0aGUgY29kZSBhbmQgc2VlIGhvdyB0aGUgYHRvdGFsX2xlbmAgY2FsY3VsYXRpb24gaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGxvZ2ljLiBUaGlzIHNlZW1zIGxpa2UgYSBwb3RlbnRpYWwgb2ZmLWJ5LW9uZSBvciBpbnRlZ2VyIG92ZXJmbG93IHZ1bG5lcmFiaWxpdHkgd2FpdGluZyB0byBoYXBwZW4sIGRlcGVuZGluZyBvbiBob3cgdGhpcyBgdG90YWxfbGVuYCBpcyBjYWxjdWxhdGVkLCBhbmQgd2hhdCB2YWx1ZXMgYXJlIHZhbGlkIHRvIGJlIHBhc3NlZCBpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7UkRTX0NPTkdfTUFQX0JZVEVTJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jPTQxOD1zdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19jb25nX3VwZGF0ZV9hbGxvYyhzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4pXG4tLVxubmV0L3Jkcy9jb25nLmMtNDIyLVxubmV0L3Jkcy9jb25nLmM6NDIzOlx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcbm5ldC9yZHMvY29uZy5jLTQyNC1cdGlmICghSVNfRVJSKHJtKSlcbi0tXG5uZXQvcmRzL2liX3JlY3YuYz03ODU9c3RhdGljIHZvaWQgcmRzX2liX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXG4tLVxubmV0L3Jkcy9pYl9yZWN2LmMtNzk4LVx0LyogY2F0Y2ggY29tcGxldGVseSBjb3JydXB0IHBhY2tldHMgKi9cbm5ldC9yZHMvaWJfcmVjdi5jOjc5OTpcdGlmIChiZTMyX3RvX2NwdShpYmluYy1cdTAwM2VpaV9pbmMuaV9oZHIuaF9sZW4pICE9IFJEU19DT05HX01BUF9CWVRFUylcbm5ldC9yZHMvaWJfcmVjdi5jLTgwMC1cdFx0cmV0dXJuO1xuLS1cbm5ldC9yZHMvaWJfcmVjdi5jLTgxMC1cbm5ldC9yZHMvaWJfcmVjdi5jOjgxMTpcdHdoaWxlIChjb3BpZWQgXHUwMDNjIFJEU19DT05HX01BUF9CWVRFUykge1xubmV0L3Jkcy9pYl9yZWN2LmMtODEyLVx0XHRfX2xlNjQgKnNyYywgKmRzdDtcbi0tXG5uZXQvcmRzL2liX3NlbmQuYz00ODY9aW50IHJkc19pYl94bWl0KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IHJkc19tZXNzYWdlICpybSxcbi0tXG5uZXQvcmRzL2liX3NlbmQuYy01MTUtXHRcdHNjYXQgPSBcdTAwMjZybS1cdTAwM2VkYXRhLm9wX3NnW3NnXTtcbm5ldC9yZHMvaWJfc2VuZC5jOjUxNjpcdFx0cmV0ID0gbWF4X3QoaW50LCBSRFNfQ09OR19NQVBfQllURVMsIHNjYXQtXHUwMDNlbGVuZ3RoKTtcbm5ldC9yZHMvaWJfc2VuZC5jLTUxNy1cdFx0cmV0dXJuIHNpemVvZihzdHJ1Y3QgcmRzX2hlYWRlcikgJiM0MzsgcmV0O1xuLS1cbm5ldC9yZHMvcmRzLmg9NDg9dm9pZCByZHNkZWJ1ZyhjaGFyICpmbXQsIC4uLilcbi0tXG5uZXQvcmRzL3Jkcy5oLTU4LVxubmV0L3Jkcy9yZHMuaDo1OTojZGVmaW5lIFJEU19DT05HX01BUF9CWVRFU1x0KDY1NTM2IC8gOClcbm5ldC9yZHMvcmRzLmg6NjA6I2RlZmluZSBSRFNfQ09OR19NQVBfUEFHRVNcdChQQUdFX0FMSUdOKFJEU19DT05HX01BUF9CWVRFUykgLyBQQUdFX1NJWkUpXG5uZXQvcmRzL3Jkcy5oLTYxLSNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VfQklUU1x0KFBBR0VfU0laRSAqIDgpXG4tLVxubmV0L3Jkcy90Y3BfcmVjdi5jPTEwNj1zdGF0aWMgdm9pZCByZHNfdGNwX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXG4tLVxubmV0L3Jkcy90Y3BfcmVjdi5jLTExNi1cdC8qIGNhdGNoIGNvbXBsZXRlbHkgY29ycnVwdCBwYWNrZXRzICovXG5uZXQvcmRzL3RjcF9yZWN2LmM6MTE3Olx0aWYgKGJlMzJfdG9fY3B1KHRpbmMtXHUwMDNldGlfaW5jLmlfaGRyLmhfbGVuKSAhPSBSRFNfQ09OR19NQVBfQllURVMpXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTE4LVx0XHRyZXR1cm47XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg0NzMKCQkJCQkJCW91dHB1dDogMTQ2CgkJCQkJCQl0aG91Z2h0czogMjczCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEZ1enppbmcgQXNzZXNzbWVudCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBSRFMgY29uZ2VzdGlvbiBtYXAgdHJhbnNtaXNzaW9uIGNvZGUuIFNwZWNpZmljYWxseSwgYFJEU19DT05HX01BUF9CWVRFU2AgaXMgZGVmaW5lZCBhcyA4MTkyLCB3aGljaCBtYWtlcyBzZW5zZSBhcyA2NTUzNiBkaXZpZGVkIGJ5IDguIFRoaXMgdHJhbnNsYXRlcyB0byAyIHBhZ2VzIG9uIGEgc3RhbmRhcmQgNDA5Ni1ieXRlIHBhZ2Ugc2l6ZSBzeXN0ZW0gKGxpa2UgQU1ENjQpLiBIb3dldmVyLCBpdCYjMzk7cyBjcml0aWNhbCB0byBub3RlIHRoYXQgb24gc3lzdGVtcyB3aXRoIDY0S0IgcGFnZXMgb3IgaWYgdGhlIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoIGlzbiYjMzk7dCBhIG11bHRpcGxlIG9mIGBQQUdFX1NJWkVgLCB0aGUgc2NhdHRlcmxpc3QgbGVuZ3RocyAoYHJtLSZndDtkYXRhLm9wX3NnW2ldYCkgd2lsbCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSB0byBtYXRjaC4gVGhpcyBoYW5kbGluZyBvZiBwYWdlIHNpemVzIGlzIGEga2V5IGFyZWEgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMsIGVzcGVjaWFsbHkgYXJvdW5kIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBidWZmZXIgb3ZlcmZsb3dzLiBUaGUgZnVuY3Rpb24gb2YgaW50ZXJlc3QgaGVyZSBpcyBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYCwgYSBuZXR3b3JraW5nIGhlbHBlciBmdW5jdGlvbiBpbiBSRFMsIGFuZCBpdCBpcyBwYXJ0IG9mIHRoZSBSRFMgY29uZ2VzdGlvbiBtYXAgdHJhbnNtaXNzaW9uIHBhdGguCgpOb3csIGxldCBtZSBjb25maXJtIHRoZSBmdXp6aW5nIGNyaXRlcmlhLiBUaGUgc3lzdGVtIGZsYWdzIHRoaXMgYXMgYFdvcnRoRnV6emluZzogdHJ1ZWAsIHdoaWNoIGlzIGVuY291cmFnaW5nLiBUaGUgYEVuYWJsZUNvbmZpZ3NgIGFyZSAmIzM0O1JEUyYjMzQ7LCAmIzM0O1JEU19UQ1AmIzM0OywgYW5kIHBvdGVudGlhbGx5ICYjMzQ7SU5FVCYjMzQ7LiBUaGUgYEZvY3VzU3ltYm9sc2AgYXJlICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDsgYW5kICYjMzQ7cmRzX2NvbmdfdXBkYXRlX2FsbG9jJiMzNDsuIFRoZSBjaGVja3MgaW5kaWNhdGUgdGhhdCB3ZSBjYW4gZW5hYmxlIHRoZSBmdXp6aW5nIGNvbmZpZ3VyYXRpb24gd2l0aCBlaXRoZXIgdGhlIFsmIzM0O1JEUyYjMzQ7LCAmIzM0O1JEU19UQ1AmIzM0O10gb3IgWyYjMzQ7UkRTJiMzNDssICYjMzQ7UkRTX1RDUCYjMzQ7LCAmIzM0O0lORVQmIzM0O10gY29uZmlndXJhdGlvbiBhbmQgY2FsbCBgc2V0LXJlc3VsdHNgLiBXaXRoIHRoZSBkZWZpbmVkIGNvbmZpZ3VyYXRpb25zLCBhbmQgZm9jdXMgc3ltYm9scywgdGhpcyBsb29rcyBsaWtlIGEgdmFsaWQgZnV6emluZyB0YXJnZXQhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtSRFMmIzM0OywKICAgICYjMzQ7UkRTX1RDUCYjMzQ7LAogICAgJiMzNDtJTkVUJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3Jkc19jb25nX3VwZGF0ZV9hbGxvYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtSRFMmIzM0OywKICAgICYjMzQ7UkRTX1RDUCYjMzQ7LAogICAgJiMzNDtJTkVUJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3Jkc19jb25nX3VwZGF0ZV9hbGxvYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowMzwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKCkgdG8gY2FsY3VsYXRlIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggY29ycmVjdGx5IGZvciB0aGUgZmluYWwgcGFnZSAoc2V0dGluZyBpdCB0byB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgaW5zdGVhZCBvZiBQQUdFX1NJWkUpLiBUaGUgcGFnZXMgYmVpbmcgbWFwcGVkIChlLmcuLCBjb25nZXN0aW9uIG1hcCBwYWdlcyBpbiByZHNfY29uZ19mcm9tX2FkZHIoKSkgYXJlIGFsbG9jYXRlZCB1c2luZyBnZXRfemVyb2VkX3BhZ2UoKSBhbmQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggYWRqdXN0cyBzY2F0dGVybGlzdCBsZW5ndGgvYm91bmRzIHJhdGhlciB0aGFuIGludHJvZHVjaW5nIG9yIGV4cG9zaW5nIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVmZmVyIGJvdW5kcyBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTiwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYWQ0MTI5NWFkODI4ZDVlZjYxNTk0M2E0YTk3NWFhNWFiZDQyMGUzYwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvcmRzL21lc3NhZ2UuYyBiL25ldC9yZHMvbWVzc2FnZS5jCmluZGV4IGYyNWYyNTkyNTg2ZjcuLjQ3ZDVlOWFiOWIxMDkgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvbWVzc2FnZS5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9yZHMvbWVzc2FnZS5jCkBAIC00MzEsNyAmIzQzOzQzMSw5IEBAIHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGluCiAJZm9yIChpID0gMDsgaSAmbHQ7IHJtLSZndDtkYXRhLm9wX25lbnRzOyAmIzQzOyYjNDM7aSkgewogCQlzZ19zZXRfcGFnZSgmYW1wO3JtLSZndDtkYXRhLm9wX3NnW2ldLAogCQkJCXZpcnRfdG9fcGFnZSgodm9pZCAqKXBhZ2VfYWRkcnNbaV0pLAotCQkJCVBBR0VfU0laRSwgMCk7CiYjNDM7CQkJCWkgPT0gcm0tJmd0O2RhdGEub3BfbmVudHMgLSAxCiYjNDM7CQkJCQk/IHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKQomIzQzOwkJCQkJOiBQQUdFX1NJWkUsIDApOwogCX0KIAogCXJldHVybiBybTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMTQKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAzMjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRXZhbHVhdGluZyBhIExpbnV4IEtlcm5lbCBQYXRjaCBmb3IgS01TQU4vS0FTQU4gVGVzdGluZyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGFza2VkIHRvIGFzc2VzcyB0aGlzIExpbnV4IGtlcm5lbCBwYXRjaCBmb3IgaXRzIHN1aXRhYmlsaXR5IHdpdGggS01TQU4gYW5kIEtBU0FOLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gcXVpY2tseSBhc3Nlc3MgdGhlIHJpc2suIFRoaXMgaXMgYSBkZWZlbnNpdmUgdGFzayDigJMgSSYjMzk7bSBlc3NlbnRpYWxseSBsb29raW5nIGF0IGEgcGF0Y2ggcmVsYXRlZCB0byB0ZXN0IGNvbmZpZ3VyYXRpb24sIHdoaWNoIGlzIGdlbmVyYWxseSBiZW5pZ24uIEkmIzM5O20gbm90IHNlZWluZyBhbnkgcmVkIGZsYWdzIHJlZ2FyZGluZyBtYWx3YXJlIG9yIGV4cGxvaXQgZ2VuZXJhdGlvbiBoZXJlLCBzbyBJJiMzOTtkIGNsYXNzaWZ5IHRoaXMgYXMgYmVuaWduIHNlY3VyaXR5IGVuZ2luZWVyaW5nLgoKTm93LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBwYXRjaCBpdHNlbGYuIEl0JiMzOTtzIG1vZGlmeWluZyBgbmV0L3Jkcy9tZXNzYWdlLmNgLCBzcGVjaWZpY2FsbHkgdGhlIGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgIGZ1bmN0aW9uLiBUaGUgY29kZSBkaWZmIHNob3dzIGEgY2hhbmdlIGluIGhvdyBwYWdlcyBhcmUgbWFwcGVkIHdpdGhpbiBhIGxvb3AsIHNwZWNpZmljYWxseSBjYWxjdWxhdGluZyB0aGUgbGVuZ3RoIGZvciB0aGUgU2NhdHRlci1HYXRoZXIgbGlzdCB1c2luZyBgdG90YWxfbGVuYC4gVGhlIG1haW4gY29uY2VybiBoZXJlIGlzIG1ha2luZyBzdXJlIHRoYXQgdGhlIGxhc3QgcGFnZSBpcyBzaXplZCBjb3JyZWN0bHkuCgpNeSBuZXh0IHN0ZXA/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24gaW4gY29udGV4dC4gSSYjMzk7bGwgdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBjaGVjayB0aGUgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgZnVuY3Rpb24gYW5kIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBlc3BlY2lhbGx5IGl0cyBjYWxsZXJzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBpcyB1c2VkLCB0aGUgZGF0YSBpdCYjMzk7cyBoYW5kbGluZywgYW5kIHdoYXQgY291bGQgcG90ZW50aWFsbHkgZ28gd3Jvbmcgd2l0aCB0aGlzIG5ldyBsZW5ndGggY2FsY3VsYXRpb24uIFRoaXMgd2lsbCBoZWxwIG1lIGFzc2VzcyBwb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBjb25jZXJucy4gRG9lcyB0aGlzIGNoYW5nZSBpbnRyb2R1Y2UgYW55IGFsaWdubWVudCBpc3N1ZXM/IERvZXMgaXQgaGFuZGxlIHBhcnRpYWwgcGFnZSByZWFkcyBjb3JyZWN0bHk/IFVuZGVyc3RhbmRpbmcgdGhlIHVzYWdlIGNvbnRleHQgaXMga2V5IHRvIGRldGVybWluaW5nIGlmIHRoaXMgcGF0Y2ggcmVxdWlyZXMgc3BlY2lhbGl6ZWQgS01TQU4vS0FTQU4gdGVzdGluZyBvciBpZiB0aGUgZXhpc3RpbmcgY292ZXJhZ2UgaXMgc3VmZmljaWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmRzX21lc3NhZ2VfbWFwX3BhZ2VzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jPTQxOD1zdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19jb25nX3VwZGF0ZV9hbGxvYyhzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4pXG4tLVxubmV0L3Jkcy9jb25nLmMtNDIyLVxubmV0L3Jkcy9jb25nLmM6NDIzOlx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcbm5ldC9yZHMvY29uZy5jLTQyNC1cdGlmICghSVNfRVJSKHJtKSlcbi0tXG5uZXQvcmRzL21lc3NhZ2UuYz0zODc9c3RydWN0IHNjYXR0ZXJsaXN0ICpyZHNfbWVzc2FnZV9hbGxvY19zZ3Moc3RydWN0IHJkc19tZXNzYWdlICpybSwgaW50IG5lbnRzKVxuLS1cbm5ldC9yZHMvbWVzc2FnZS5jLTQwOS1cbm5ldC9yZHMvbWVzc2FnZS5jOjQxMDpzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19tZXNzYWdlX21hcF9wYWdlcyh1bnNpZ25lZCBsb25nICpwYWdlX2FkZHJzLCB1bnNpZ25lZCBpbnQgdG90YWxfbGVuKVxubmV0L3Jkcy9tZXNzYWdlLmMtNDExLXtcbi0tXG5uZXQvcmRzL3Jkcy5oPTkwMD1pbnQgcmRzX21lc3NhZ2VfY29weV9mcm9tX3VzZXIoc3RydWN0IHJkc19tZXNzYWdlICpybSwgc3RydWN0IGlvdl9pdGVyICpmcm9tLFxubmV0L3Jkcy9yZHMuaC05MDEtXHRcdFx0ICAgICAgIGJvb2wgemNvcHkpO1xubmV0L3Jkcy9yZHMuaDo5MDI6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW50IHRvdGFsX2xlbik7XG5uZXQvcmRzL3Jkcy5oLTkwMy12b2lkIHJkc19tZXNzYWdlX3BvcHVsYXRlX2hlYWRlcihzdHJ1Y3QgcmRzX2hlYWRlciAqaGRyLCBfX2JlMTYgc3BvcnQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxNTEKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAzNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6CgoqKkRpdmluZyBpbnRvIFJEUyBDb25nZXN0aW9uIENvbnRyb2wqKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgZ29pbmcgb24gd2l0aCB0aGVzZSBjb25nZXN0aW9uIGlzc3Vlcy4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggdGhlIGxvdy1sZXZlbCBzdHVmZi4gSSYjMzk7bSBnb2luZyB0byBqdW1wIGludG8gdGhlIGBuZXQvcmRzL21lc3NhZ2UuY2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDQxMC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgZW50cnkgcG9pbnQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGluZyBsb2dpYy4gSSB3YW50IHRvIHNlZSBob3cgbWVzc2FnZXMgYXJlIGJlaW5nIG1hbmFnZWQgYXQgYSBmdW5kYW1lbnRhbCBsZXZlbCDigJMgaXQmIzM5O3Mgb2Z0ZW4gdGhlIHJvb3Qgb2YgY29uZ2VzdGlvbiBwcm9ibGVtcy4gVGhlbiwgSSYjMzk7bGwgc3dpdGNoIGdlYXJzIGFuZCBoZWFkIG92ZXIgdG8gYG5ldC9yZHMvY29uZy5jYCBhcm91bmQgbGluZSA0MTguIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG1zIHNob3VsZCBiZSBpbXBsZW1lbnRlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRob3NlIGFsZ29yaXRobXMgYXJlIGJlaGF2aW5nIHVuZGVyIHN0cmVzcy4gQnkgY3Jvc3MtcmVmZXJlbmNpbmcgdGhlc2UgdHdvIGFyZWFzLCBJIHNob3VsZCBnZXQgYSBwcmV0dHkgc29saWQgcGljdHVyZSBvZiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBtZXNzYWdlIGhhbmRsaW5nIGFuZCBjb25nZXN0aW9uIG1hbmFnZW1lbnQgd2l0aGluIHRoZSBSRFMgc3RhY2suIFRoaXMgbG9va3MgbGlrZSBhIHByb21pc2luZyBzdHJhdGVneSBmb3IgZ2V0dGluZyB0byB0aGUgaGVhcnQgb2YgdGhlIHByb2JsZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Jkcy9tZXNzYWdlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQwNTpcdFx0cm0tXHUwMDNlbV91c2VkX3NncyAmIzQzOz0gbmVudHM7XG4gNDA2Olx0XG4gNDA3Olx0XHRyZXR1cm4gc2dfcmV0O1xuIDQwODpcdH1cbiA0MDk6XHRcbiA0MTA6XHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19tZXNzYWdlX21hcF9wYWdlcyh1bnNpZ25lZCBsb25nICpwYWdlX2FkZHJzLCB1bnNpZ25lZCBpbnQgdG90YWxfbGVuKVxuIDQxMTpcdHtcbiA0MTI6XHRcdHN0cnVjdCByZHNfbWVzc2FnZSAqcm07XG4gNDEzOlx0XHR1bnNpZ25lZCBpbnQgaTtcbiA0MTQ6XHRcdGludCBudW1fc2dzID0gRElWX1JPVU5EX1VQKHRvdGFsX2xlbiwgUEFHRV9TSVpFKTtcbiA0MTU6XHRcdGludCBleHRyYV9ieXRlcyA9IG51bV9zZ3MgKiBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTtcbiA0MTY6XHRcbiA0MTc6XHRcdHJtID0gcmRzX21lc3NhZ2VfYWxsb2MoZXh0cmFfYnl0ZXMsIEdGUF9OT1dBSVQpO1xuIDQxODpcdFx0aWYgKCFybSlcbiA0MTk6XHRcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4gNDIwOlx0XG4gNDIxOlx0XHRzZXRfYml0KFJEU19NU0dfUEFHRVZFQywgXHUwMDI2cm0tXHUwMDNlbV9mbGFncyk7XG4gNDIyOlx0XHRybS1cdTAwM2VtX2luYy5pX2hkci5oX2xlbiA9IGNwdV90b19iZTMyKHRvdGFsX2xlbik7XG4gNDIzOlx0XHRybS1cdTAwM2VkYXRhLm9wX25lbnRzID0gRElWX1JPVU5EX1VQKHRvdGFsX2xlbiwgUEFHRV9TSVpFKTtcbiA0MjQ6XHRcdHJtLVx1MDAzZWRhdGEub3Bfc2cgPSByZHNfbWVzc2FnZV9hbGxvY19zZ3Mocm0sIG51bV9zZ3MpO1xuIDQyNTpcdFx0aWYgKElTX0VSUihybS1cdTAwM2VkYXRhLm9wX3NnKSkge1xuIDQyNjpcdFx0XHR2b2lkICplcnIgPSBFUlJfQ0FTVChybS1cdTAwM2VkYXRhLm9wX3NnKTtcbiA0Mjc6XHRcdFx0cmRzX21lc3NhZ2VfcHV0KHJtKTtcbiA0Mjg6XHRcdFx0cmV0dXJuIGVycjtcbiA0Mjk6XHRcdH1cbiA0MzA6XHRcbiA0MzE6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHJtLVx1MDAzZWRhdGEub3BfbmVudHM7ICYjNDM7JiM0MztpKSB7XG4gNDMyOlx0XHRcdHNnX3NldF9wYWdlKFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbaV0sXG4gNDMzOlx0XHRcdFx0XHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcbiA0MzQ6XHRcdFx0XHRcdGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFcbiA0MzU6XHRcdFx0XHRcdFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcbiA0MzY6XHRcdFx0XHRcdFx0OiBQQUdFX1NJWkUsIDApO1xuIDQzNzpcdFx0fVxuIDQzODpcdFxuIDQzOTpcdFx0cmV0dXJuIHJtO1xuIDQ0MDpcdH1cbiA0NDE6XHRcbiA0NDI6XHRzdGF0aWMgaW50IHJkc19tZXNzYWdlX3pjb3B5X2Zyb21fdXNlcihzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pXG4gNDQzOlx0e1xuIDQ0NDpcdFx0c3RydWN0IHNjYXR0ZXJsaXN0ICpzZztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDEyNwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgUkRTIENvbmdlc3Rpb24gQ29udHJvbCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IFJEUyYjMzk7cyBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtIGhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24sIHNwZWNpZmljYWxseSB3aGVuIHVwZGF0ZXMgYXJlIG5lZWRlZC4gVGhlIHBsYWNlIHRvIHN0YXJ0IGlzIGBuZXQvcmRzL2NvbmcuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgcmRzX2NvbmdfdXBkYXRlX2FsbG9jYCBhY3R1YWxseSBmdW5jdGlvbnMuIEkmIzM5O20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCBgUkRTX0NPTkdfTUFQX0JZVEVTYC4gSSBzdXNwZWN0IHRoZSBsYXR0ZXIgcGxheXMgYSBrZXkgcm9sZSBpbiBkZWZpbmluZyB0aGUgZ3JhbnVsYXJpdHkgb3Igc2l6ZSBvZiB0aGUgY29uZ2VzdGlvbiBtYXAsIGJ1dCBsZXQmIzM5O3MgY29uZmlybSB0aGF0IGJ5IHJldmlld2luZyB0aGUgY29kZSBhbmQgZmlndXJpbmcgb3V0IHRoZSBhbGxvY2F0aW9uIHN0cmF0ZWd5LiBJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGFmZmVjdHMgb3ZlcmFsbCBuZXR3b3JrIHBlcmZvcm1hbmNlIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggb3RoZXIgY29uZ2VzdGlvbiBjb250cm9sIGFzcGVjdHMuIFRpbWUgdG8gZGlnIGluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MTU6XHQvKlxuIDQxNjpcdCAqIEFsbG9jYXRlIGEgUkRTIG1lc3NhZ2UgY29udGFpbmluZyBhIGNvbmdlc3Rpb24gdXBkYXRlLlxuIDQxNzpcdCAqL1xuIDQxODpcdHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcbiA0MTk6XHR7XG4gNDIwOlx0XHRzdHJ1Y3QgcmRzX2NvbmdfbWFwICptYXAgPSBjb25uLVx1MDAzZWNfbGNvbmc7XG4gNDIxOlx0XHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtO1xuIDQyMjpcdFxuIDQyMzpcdFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcbiA0MjQ6XHRcdGlmICghSVNfRVJSKHJtKSlcbiA0MjU6XHRcdFx0cm0tXHUwMDNlbV9pbmMuaV9oZHIuaF9mbGFncyA9IFJEU19GTEFHX0NPTkdfQklUTUFQO1xuIDQyNjpcdFxuIDQyNzpcdFx0cmV0dXJuIHJtO1xuIDQyODpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDYxMgoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBgbmV0L3Jkcy9jb25nLmNgIGVsZW1lbnRzOgoKKipEaXNzZWN0aW5nIGBSRFNfQ09OR19NQVBfQllURVNgIGFuZCBgcmRzX2NvbmdfbWFwYCBpbiBgbmV0L3Jkcy9jb25nLmNgKioKCkFscmlnaHQsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBSRFMgKFJlbGlhYmxlIERhdGFncmFtIFNvY2tldHMpIGhhbmRsZXMgY29uZ2VzdGlvbiBjb250cm9sIGF0IGEgZnVuZGFtZW50YWwgbGV2ZWwuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIGBSRFNfQ09OR19NQVBfQllURVNgIGFuZCBgcmRzX2NvbmdfbWFwYCBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBgbmV0L3Jkcy9jb25nLmNgIHNvdXJjZSBmaWxlLiBUaGVzZSBuYW1lcyBzdHJvbmdseSBzdWdnZXN0IHRoZXkmIzM5O3JlIGNlbnRyYWwgdG8gaG93IHRoZSBSRFMgaW1wbGVtZW50YXRpb24gbWFwcyBvciByZXByZXNlbnRzIGNvbmdlc3Rpb24gaW5mb3JtYXRpb24uCgpgUkRTX0NPTkdfTUFQX0JZVEVTYCBwcm9iYWJseSBkZWZpbmVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgYSBjb25nZXN0aW9uIG1hcCBvciBzdHJ1Y3R1cmUuIFRoaXMgaW1wbGllcyBhIGZpeGVkLXNpemUgZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgY29uZ2VzdGlvbiBzdGF0ZS4gSSYjMzk7bSBpbW1lZGlhdGVseSBjdXJpb3VzIGFib3V0IHRoZSBzY2FsaW5nIGltcGxpY2F0aW9ucyBoZXJlOyBpcyB0aGlzIHNpemUgc3RhdGljYWxseSBkZWZpbmVkLCBhbmQgaWYgc28sIGhvdyBkb2VzIHRoYXQgaW1wYWN0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBmbG93cyBvciBjb25uZWN0aW9ucyB0aGUgc3lzdGVtIGNhbiBlZmZlY3RpdmVseSBtYW5hZ2Ugd2l0aG91dCBzaWduaWZpY2FudCBmcmFnbWVudGF0aW9uIG9yIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uPyBJcyBpdCBhIHBvd2VyIG9mIHR3bywgb3Igc29tZSBvdGhlciBjYWxjdWxhdGVkIHZhbHVlPyBXaGF0JiMzOTtzIHRoZSBqdXN0aWZpY2F0aW9uIGZvciB0aGUgc2l6ZSBjaG9zZW4/CgpgcmRzX2NvbmdfbWFwYCBpcyBsaWtlbHkgdGhlIGFjdHVhbCBkYXRhIHN0cnVjdHVyZSBvciBhbiBpbnN0YW5jZSBvZiB0aGUgY29uZ2VzdGlvbiBtYXAuIFRoaXMgdmFyaWFibGUgcHJvYmFibHkgaG9sZHMgdGhlIHJlYWwtdGltZSBjb25nZXN0aW9uIHN0YXRlIGZvciB0aGUgbmV0d29yay4gSSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBraW5kIG9mIGRhdGEgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYHJkc19jb25nX21hcGAuIElzIGl0IGEgYml0bWFzaywgYSBsb29rdXAgdGFibGUsIGFuIGFycmF5IG9mIGNvdW50ZXJzLCBvciBzb21ldGhpbmcgbW9yZSBjb21wbGV4PyBJIG5lZWQgdG8gYW5hbHl6ZSBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIGNsb3NlbHkuIFdoYXQgbWV0cmljcyBhcmUgYmVpbmcgc3RvcmVkIChlLmcuLCByZXRyYW5zbWlzc2lvbiBjb3VudHMsIHJvdW5kLXRyaXAgdGltZXMsIHF1ZXVlIGxlbmd0aHMsIHBhY2tldCBsb3NzLCBldGMuKT8gSG93IGlzIHRoZSBtYXAgdXBkYXRlZCwgYWNjZXNzZWQsIGFuZCBtb2RpZmllZD8gV2hhdCBhcmUgdGhlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIChsb2NrcywgYXRvbWljIG9wZXJhdGlvbnMsIGV0Yy4pIHVzZWQgdG8gcHJvdGVjdCB0aGlzIHNoYXJlZCBkYXRhLCBlc3BlY2lhbGx5IGluIGEgbXVsdGktdGhyZWFkZWQgb3IgbXVsdGktQ1BVIGVudmlyb25tZW50PwoKSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhlIGludGVycGxheSBiZXR3ZWVuIHRoZXNlIHR3byDigJMgdGhlIGRlZmluZWQgc2l6ZSBhbmQgdGhlIGNvbmNyZXRlIGRhdGEgc3RydWN0dXJlIOKAkyB0byBnZXQgYSBjb21wbGV0ZSBwaWN0dXJlIG9mIFJEUyYjMzk7cyBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtLiBVbmRlcnN0YW5kaW5nIHRoZWlyIHJlbGF0aW9uc2hpcCB3aWxsIHByb3ZpZGUgaW5zaWdodHMgaW50byBtZW1vcnkgdXNhZ2UsIHNjYWxhYmlsaXR5LCBhbmQgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzLiBJIHN1c3BlY3QgdGhleSBhcmUgdGhlIGJhY2tib25lIG9mIFJEUyYjMzk7cyBjb25nZXN0aW9uIHJlc3BvbnNlIGxvZ2ljLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAxNjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtSRFNfQ09OR19NQVBfQllURVMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcbi0tXG5uZXQvcmRzL2NvbmcuYy00MjItXG5uZXQvcmRzL2NvbmcuYzo0MjM6XHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXHUwMDNlbV9wYWdlX2FkZHJzLCBSRFNfQ09OR19NQVBfQllURVMpO1xubmV0L3Jkcy9jb25nLmMtNDI0LVx0aWYgKCFJU19FUlIocm0pKVxuLS1cbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcbi0tXG5uZXQvcmRzL2liX3JlY3YuYy03OTgtXHQvKiBjYXRjaCBjb21wbGV0ZWx5IGNvcnJ1cHQgcGFja2V0cyAqL1xubmV0L3Jkcy9pYl9yZWN2LmM6Nzk5Olx0aWYgKGJlMzJfdG9fY3B1KGliaW5jLVx1MDAzZWlpX2luYy5pX2hkci5oX2xlbikgIT0gUkRTX0NPTkdfTUFQX0JZVEVTKVxubmV0L3Jkcy9pYl9yZWN2LmMtODAwLVx0XHRyZXR1cm47XG4tLVxubmV0L3Jkcy9pYl9yZWN2LmMtODEwLVxubmV0L3Jkcy9pYl9yZWN2LmM6ODExOlx0d2hpbGUgKGNvcGllZCBcdTAwM2MgUkRTX0NPTkdfTUFQX0JZVEVTKSB7XG5uZXQvcmRzL2liX3JlY3YuYy04MTItXHRcdF9fbGU2NCAqc3JjLCAqZHN0O1xuLS1cbm5ldC9yZHMvaWJfc2VuZC5jPTQ4Nj1pbnQgcmRzX2liX3htaXQoc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLFxuLS1cbm5ldC9yZHMvaWJfc2VuZC5jLTUxNS1cdFx0c2NhdCA9IFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbc2ddO1xubmV0L3Jkcy9pYl9zZW5kLmM6NTE2Olx0XHRyZXQgPSBtYXhfdChpbnQsIFJEU19DT05HX01BUF9CWVRFUywgc2NhdC1cdTAwM2VsZW5ndGgpO1xubmV0L3Jkcy9pYl9zZW5kLmMtNTE3LVx0XHRyZXR1cm4gc2l6ZW9mKHN0cnVjdCByZHNfaGVhZGVyKSAmIzQzOyByZXQ7XG4tLVxubmV0L3Jkcy9yZHMuaD00OD12b2lkIHJkc2RlYnVnKGNoYXIgKmZtdCwgLi4uKVxuLS1cbm5ldC9yZHMvcmRzLmgtNTgtXG5uZXQvcmRzL3Jkcy5oOjU5OiNkZWZpbmUgUkRTX0NPTkdfTUFQX0JZVEVTXHQoNjU1MzYgLyA4KVxubmV0L3Jkcy9yZHMuaDo2MDojZGVmaW5lIFJEU19DT05HX01BUF9QQUdFU1x0KFBBR0VfQUxJR04oUkRTX0NPTkdfTUFQX0JZVEVTKSAvIFBBR0VfU0laRSlcbm5ldC9yZHMvcmRzLmgtNjEtI2RlZmluZSBSRFNfQ09OR19NQVBfUEFHRV9CSVRTXHQoUEFHRV9TSVpFICogOClcbi0tXG5uZXQvcmRzL3RjcF9yZWN2LmM9MTA2PXN0YXRpYyB2b2lkIHJkc190Y3BfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcbi0tXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTE2LVx0LyogY2F0Y2ggY29tcGxldGVseSBjb3JydXB0IHBhY2tldHMgKi9cbm5ldC9yZHMvdGNwX3JlY3YuYzoxMTc6XHRpZiAoYmUzMl90b19jcHUodGluYy1cdTAwM2V0aV9pbmMuaV9oZHIuaF9sZW4pICE9IFJEU19DT05HX01BUF9CWVRFUylcbm5ldC9yZHMvdGNwX3JlY3YuYy0xMTgtXHRcdHJldHVybjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTg4MwoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDM3NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgU2NhdHRlcmxpc3QgTGVuZ3RocyBpbiBSRFMgQ29uZ2VzdGlvbiBNYXBwaW5nKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEl0IHNlZW1zIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBzcGVjaWZpYyBpc3N1ZSByZWxhdGVkIHRvIGhvdyBzY2F0dGVybGlzdCBlbnRyaWVzIGFyZSBjb25zdHJ1Y3RlZCB3aXRoaW4gdGhlIFJEUyBjb25nZXN0aW9uIG1hcHBpbmcgbWVjaGFuaXNtLiBUaGUgY29yZSBvZiBpdCBhcHBlYXJzIHRvIHN0ZW0gZnJvbSBhIGRpc2NyZXBhbmN5IGJldHdlZW4gdGhlIGFsbG9jYXRlZCBzaXplIGZvciBjb25nZXN0aW9uIG1hcHMgYW5kIHRoZSBzaXplcyB0aGVzZSBtYXBzIGFyZSAqYWN0dWFsbHkqIHVzaW5nLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIGRpZmZlcmVudCBwYWdlIHNpemVzIGFjcm9zcyBhcmNoaXRlY3R1cmVzLgoKU28sIGBSRFNfQ09OR19NQVBfQllURVNgIGlzIGRlZmluZWQgYXMgODE5MiBieXRlcywgd2hpY2ggbWFrZXMgc2Vuc2U7IEkgc2VlIGhvdyB0aGF0IG51bWJlciBpcyBjYWxjdWxhdGVkLiBOb3csIG9uIHN5c3RlbXMgd2l0aCBhIHN0YW5kYXJkIDRLQiBwYWdlIHNpemUgKGxpa2UgYW1kNjQpLCB0aGlzIDgxOTIgYnl0ZXMgdHJhbnNsYXRlcyB0byBleGFjdGx5IHR3byBwYWdlcy4gTm8gYmlnIGRlYWwuIEhvd2V2ZXIsIHRoZSB3cmlua2xlIGFwcGVhcnMgd2l0aCA2NEtCIHBhZ2Ugc2l6ZSBzeXN0ZW1zIChsaWtlIHNvbWUgYXJtNjQgYW5kIHBwYzY0IGNvbmZpZ3VyYXRpb25zKS4gSGVyZSwgYFJEU19DT05HX01BUF9CWVRFU2AgaXMgKnN0aWxsKiA4MTkyLCBidXQgYFBBR0VfU0laRWAgaXMgYSBtYXNzaXZlIDY1NTM2LgoKVGhlIHByZS1wYXRjaCBjb2RlLCBpbiBgc2dfc2V0X3BhZ2VgLCB3YXMgaW5kaXNjcmltaW5hdGVseSBzZXR0aW5nIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggdG8gYFBBR0VfU0laRWAuIFRoaXMgaXMgd2hlcmUgdGhlIHByb2JsZW0gbGllcy4gV2hlbiBgUEFHRV9TSVpFYCBpcyA2NEtCLCB3aGlsZSBgdG90YWxfbGVuYCBtaWdodCBiZSBvbmx5IDgxOTIgYnl0ZXMsIHRoaXMgc2V0IHRoZSBlbnRyeSYjMzk7cyBsZW5ndGggZmFyIHRvbyBoaWdoLCBwb3RlbnRpYWxseSBjYXVzaW5nIG1lbW9yeSBvdmVycnVucyB3aGVuIHJlYWRpbmcgdGhlIHNjYXR0ZXJsaXN0IGVudHJpZXMuIFRoZSBzYW1lIHByb2JsZW0gd291bGQgb2NjdXIgb24gYXJjaGl0ZWN0dXJlcyB3aGVyZSBgdG90YWxfbGVuYCBpcyBub3QgYSBtdWx0aXBsZSBvZiBgUEFHRV9TSVpFYC4KCkl0IGxvb2tzIGxpa2UgdGhlIHBhdGNoIGNvcnJlY3RzIHRoZSBsZW5ndGggY2FsY3VsYXRpb24gZm9yIHRoZSAqbGFzdCogc2NhdHRlcmxpc3QgZW50cnkgdG8gYmUgdGhlIHJlbWFpbmRlciBzaXplLCBgdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpYCwgaW5zdGVhZCBvZiBzaW1wbHkgYFBBR0VfU0laRWAuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBsYXN0IGVudHJ5IGNvcnJlY3RseSByZWZsZWN0cyB0aGUgYWN0dWFsIGJ5dGVzIGFsbG9jYXRlZC4KCkkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGlzIGlzIGFib3V0IGJvdW5kcywgYnVmZmVyIHNpemluZywgYW5kIHBvc3NpYmxlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4KCk5vdywgSSYjMzk7bSB0cnlpbmcgdG8gZmlndXJlIG91dCBob3cgdGhpcyBhcHBsaWVzIHRvIHNlbmRpbmcgb3IgbWFwcGluZyBwYWdlcy4gSSBrbm93IHRoYXQgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgY29tZXMgaW50byBwbGF5LiBJIG5lZWQgdG8gdHJhY2UgaG93IGBtYXAtJmd0O21fcGFnZV9hZGRyc2AgaXMgYWxsb2NhdGVkIHdpdGhpbiBgcmRzX2NvbmdfbWFwYCB0byB1bmRlcnN0YW5kIHRoZSBiaWdnZXIgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bV9wYWdlX2FkZHJzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9yZHMvY29uZy5jPTEzOD1zdGF0aWMgc3RydWN0IHJkc19jb25nX21hcCAqcmRzX2NvbmdfZnJvbV9hZGRyKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcilcbi0tXG5uZXQvcmRzL2NvbmcuYy0xNTctXHRcdFx0Z290byBvdXQ7XG5uZXQvcmRzL2NvbmcuYzoxNTg6XHRcdG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV0gPSB6cDtcbm5ldC9yZHMvY29uZy5jLTE1OS1cdH1cbi0tXG5uZXQvcmRzL2NvbmcuYy0xNzEtXHRpZiAobWFwKSB7XG5uZXQvcmRzL2NvbmcuYzoxNzI6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJEU19DT05HX01BUF9QQUdFUyBcdTAwMjZcdTAwMjYgbWFwLVx1MDAzZW1fcGFnZV9hZGRyc1tpXTsgaSYjNDM7JiM0MzspXG5uZXQvcmRzL2NvbmcuYzoxNzM6XHRcdFx0ZnJlZV9wYWdlKG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xubmV0L3Jkcy9jb25nLmMtMTc0LVx0XHRrZnJlZShtYXApO1xuLS1cbm5ldC9yZHMvY29uZy5jPTI5OT12b2lkIHJkc19jb25nX3NldF9iaXQoc3RydWN0IHJkc19jb25nX21hcCAqbWFwLCBfX2JlMTYgcG9ydClcbi0tXG5uZXQvcmRzL2NvbmcuYy0zMDktXG5uZXQvcmRzL2NvbmcuYzozMTA6XHRzZXRfYml0X2xlKG9mZiwgKHZvaWQgKiltYXAtXHUwMDNlbV9wYWdlX2FkZHJzW2ldKTtcbm5ldC9yZHMvY29uZy5jLTMxMS19XG4tLVxubmV0L3Jkcy9jb25nLmM9MzEzPXZvaWQgcmRzX2NvbmdfY2xlYXJfYml0KHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcCwgX19iZTE2IHBvcnQpXG4tLVxubmV0L3Jkcy9jb25nLmMtMzIzLVxubmV0L3Jkcy9jb25nLmM6MzI0Olx0Y2xlYXJfYml0X2xlKG9mZiwgKHZvaWQgKiltYXAtXHUwMDNlbV9wYWdlX2FkZHJzW2ldKTtcbm5ldC9yZHMvY29uZy5jLTMyNS19XG4tLVxubmV0L3Jkcy9jb25nLmM9MzI3PXN0YXRpYyBpbnQgcmRzX2NvbmdfdGVzdF9iaXQoc3RydWN0IHJkc19jb25nX21hcCAqbWFwLCBfX2JlMTYgcG9ydClcbi0tXG5uZXQvcmRzL2NvbmcuYy0zMzQtXG5uZXQvcmRzL2NvbmcuYzozMzU6XHRyZXR1cm4gdGVzdF9iaXRfbGUob2ZmLCAodm9pZCAqKW1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xubmV0L3Jkcy9jb25nLmMtMzM2LX1cbi0tXG5uZXQvcmRzL2NvbmcuYz0zOTk9dm9pZCByZHNfY29uZ19leGl0KHZvaWQpXG4tLVxubmV0L3Jkcy9jb25nLmMtNDA4LVx0XHRyYl9lcmFzZShcdTAwMjZtYXAtXHUwMDNlbV9yYl9ub2RlLCBcdTAwMjZyZHNfY29uZ190cmVlKTtcbm5ldC9yZHMvY29uZy5jOjQwOTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgUkRTX0NPTkdfTUFQX1BBR0VTIFx1MDAyNlx1MDAyNiBtYXAtXHUwMDNlbV9wYWdlX2FkZHJzW2ldOyBpJiM0MzsmIzQzOylcbm5ldC9yZHMvY29uZy5jOjQxMDpcdFx0XHRmcmVlX3BhZ2UobWFwLVx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XG5uZXQvcmRzL2NvbmcuYy00MTEtXHRcdGtmcmVlKG1hcCk7XG4tLVxubmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcbi0tXG5uZXQvcmRzL2NvbmcuYy00MjItXG5uZXQvcmRzL2NvbmcuYzo0MjM6XHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXHUwMDNlbV9wYWdlX2FkZHJzLCBSRFNfQ09OR19NQVBfQllURVMpO1xubmV0L3Jkcy9jb25nLmMtNDI0LVx0aWYgKCFJU19FUlIocm0pKVxuLS1cbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcbi0tXG5uZXQvcmRzL2liX3JlY3YuYy04MjAtXHRcdHNyYyA9IGFkZHIgJiM0MzsgZnJhZy1cdTAwM2VmX3NnLm9mZnNldCAmIzQzOyBmcmFnX29mZjtcbm5ldC9yZHMvaWJfcmVjdi5jOjgyMTpcdFx0ZHN0ID0gKHZvaWQgKiltYXAtXHUwMDNlbV9wYWdlX2FkZHJzW21hcF9wYWdlXSAmIzQzOyBtYXBfb2ZmO1xubmV0L3Jkcy9pYl9yZWN2LmMtODIyLVx0XHRmb3IgKGsgPSAwOyBrIFx1MDAzYyB0b19jb3B5OyBrICYjNDM7PSA4KSB7XG4tLVxubmV0L3Jkcy9yZHMuaD02Mz1zdHJ1Y3QgcmRzX2NvbmdfbWFwIHtcbi0tXG5uZXQvcmRzL3Jkcy5oLTY3LVx0c3RydWN0IGxpc3RfaGVhZFx0bV9jb25uX2xpc3Q7XG5uZXQvcmRzL3Jkcy5oOjY4Olx0dW5zaWduZWQgbG9uZ1x0XHRtX3BhZ2VfYWRkcnNbUkRTX0NPTkdfTUFQX1BBR0VTXTtcbm5ldC9yZHMvcmRzLmgtNjktfTtcbi0tXG5uZXQvcmRzL3RjcF9yZWN2LmM9MTA2PXN0YXRpYyB2b2lkIHJkc190Y3BfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcbi0tXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTMzLVx0XHRcdHJldCA9IHNrYl9jb3B5X2JpdHMoc2tiLCBza2Jfb2ZmLFxubmV0L3Jkcy90Y3BfcmVjdi5jOjEzNDpcdFx0XHRcdCh2b2lkICopbWFwLVx1MDAzZW1fcGFnZV9hZGRyc1ttYXBfcGFnZV0gJiM0MzsgbWFwX29mZixcbm5ldC9yZHMvdGNwX3JlY3YuYy0xMzUtXHRcdFx0XHR0b19jb3B5KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzkzNwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipEaWdnaW5nIGludG8gUkRTIENvbmdlc3Rpb24gQ29udHJvbCoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgd2l0aCBjb25nZXN0aW9uIGNvbnRyb2wgaW4gUkRTLiBNeSBzdGFydGluZyBwb2ludCBpcyB0aGUgZnVuY3Rpb24gYHJkc19jb25nX2Zyb21fYWRkcmAsIGFuZCBJJiMzOTttIGZvY3VzaW5nIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAxMzggaW4gYG5ldC9yZHMvY29uZy5jYC4gSSBleHBlY3QgdGhhdCBhcmVhIHRvIGdpdmUgbWUgc29tZSBpbnNpZ2h0IGludG8gaG93IHRoZSBzeXN0ZW0gbWFwcyBhZGRyZXNzZXMgdG8gY29uZ2VzdGlvbiBzdGF0ZS4gSG9wZWZ1bGx5LCBJJiMzOTtsbCBmaW5kIHNvbWUgaGludHMgYWJvdXQgaG93IHRoZSBjb25nZXN0aW9uIGFsZ29yaXRobXMgYXJlIHN0cnVjdHVyZWQuIEkmIzM5O20gbG9va2luZyBmb3IgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYW5kIGFueSBpbnRlcmVzdGluZyBsb2dpYyByZWxhdGVkIHRvIGFkZHJlc3MtYmFzZWQgY29uZ2VzdGlvbi4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIHRoZXJlLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Jkcy9jb25nLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMzgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDEzODpcdHN0YXRpYyBzdHJ1Y3QgcmRzX2NvbmdfbWFwICpyZHNfY29uZ19mcm9tX2FkZHIoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKVxuIDEzOTpcdHtcbiAxNDA6XHRcdHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcDtcbiAxNDE6XHRcdHN0cnVjdCByZHNfY29uZ19tYXAgKnJldCA9IE5VTEw7XG4gMTQyOlx0XHR1bnNpZ25lZCBsb25nIHpwO1xuIDE0MzpcdFx0dW5zaWduZWQgbG9uZyBpO1xuIDE0NDpcdFx0dW5zaWduZWQgbG9uZyBmbGFncztcbiAxNDU6XHRcbiAxNDY6XHRcdG1hcCA9IGt6YWxsb2Nfb2JqKHN0cnVjdCByZHNfY29uZ19tYXApO1xuIDE0NzpcdFx0aWYgKCFtYXApXG4gMTQ4Olx0XHRcdHJldHVybiBOVUxMO1xuIDE0OTpcdFxuIDE1MDpcdFx0bWFwLVx1MDAzZW1fYWRkciA9ICphZGRyO1xuIDE1MTpcdFx0aW5pdF93YWl0cXVldWVfaGVhZChcdTAwMjZtYXAtXHUwMDNlbV93YWl0cSk7XG4gMTUyOlx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZtYXAtXHUwMDNlbV9jb25uX2xpc3QpO1xuIDE1MzpcdFxuIDE1NDpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgUkRTX0NPTkdfTUFQX1BBR0VTOyBpJiM0MzsmIzQzOykge1xuIDE1NTpcdFx0XHR6cCA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbiAxNTY6XHRcdFx0aWYgKHpwID09IDApXG4gMTU3Olx0XHRcdFx0Z290byBvdXQ7XG4gMTU4Olx0XHRcdG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV0gPSB6cDtcbiAxNTk6XHRcdH1cbiAxNjA6XHRcbiAxNjE6XHRcdHNwaW5fbG9ja19pcnFzYXZlKFx1MDAyNnJkc19jb25nX2xvY2ssIGZsYWdzKTtcbiAxNjI6XHRcdHJldCA9IHJkc19jb25nX3RyZWVfd2FsayhhZGRyLCBtYXApO1xuIDE2MzpcdFx0c3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZyZHNfY29uZ19sb2NrLCBmbGFncyk7XG4gMTY0Olx0XG4gMTY1Olx0XHRpZiAoIXJldCkge1xuIDE2NjpcdFx0XHRyZXQgPSBtYXA7XG4gMTY3Olx0XHRcdG1hcCA9IE5VTEw7XG4gMTY4Olx0XHR9XG4gMTY5Olx0XG4gMTcwOlx0b3V0OlxuIDE3MTpcdFx0aWYgKG1hcCkge1xuIDE3MjpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRFNfQ09OR19NQVBfUEFHRVMgXHUwMDI2XHUwMDI2IG1hcC1cdTAwM2VtX3BhZ2VfYWRkcnNbaV07IGkmIzQzOyYjNDM7KVxuIDE3MzpcdFx0XHRcdGZyZWVfcGFnZShtYXAtXHUwMDNlbV9wYWdlX2FkZHJzW2ldKTtcbiAxNzQ6XHRcdFx0a2ZyZWUobWFwKTtcbiAxNzU6XHRcdH1cbiAxNzY6XHRcbiAxNzc6XHRcdHJkc2RlYnVnKFwmIzM0O21hcCAlcCBmb3IgYWRkciAlcEk2Y1xcblwmIzM0OywgcmV0LCBhZGRyKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMTY6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODc2NgoJCQkJCQkJb3V0cHV0OiAxNjQKCQkJCQkJCXRob3VnaHRzOiAxMjMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFzc2Vzc21lbnQ6IFNjYXR0ZXJsaXN0IExlbmd0aCBBZGp1c3RtZW50IGluIFJEUyBNZXNzYWdpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93biBzeXN0ZW1hdGljYWxseS4gSSYjMzk7bSBsb29raW5nIGF0IGEgcGF0Y2ggdGhhdCBhZGp1c3RzIGhvdyBzY2F0dGVybGlzdCBsZW5ndGhzIGFyZSBjYWxjdWxhdGVkIHdpdGhpbiBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYC4gVGhlIHByaW1hcnkgY29uY2VybiBoZXJlIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgcGFydGljdWxhcmx5IHdoZXJlIGl0IG1pZ2h0IGJlIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLgoKRmlyc3QsIEkgc2VlIHRoZSBjb3JlIGNoYW5nZSBpcyBtb2RpZnlpbmcgdGhlIGxlbmd0aCBjYWxjdWxhdGlvbiBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkuIFByZXZpb3VzbHksIGl0IHdhcyBhbHdheXMgdGhlIGZ1bGwgYFBBR0VfU0laRWAsIGJ1dCBub3cgaXQmIzM5O3MgY2FsY3VsYXRlZCBhcyBgdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpYC4gVGhpcyBpcyBhIGNydWNpYWwgZGV0YWlsIHRvIHZlcmlmeS4gVGhlIGludGVudGlvbiwgSSBnYXRoZXIsIGlzIHRvIG1vcmUgYWNjdXJhdGVseSByZWZsZWN0IHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgbWFwcGVkIGRhdGEsIGVzcGVjaWFsbHkgd2hlbiBgdG90YWxfbGVuYCBpc24mIzM5O3QgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZS4gV2l0aCBhIHBhZ2Ugc2l6ZSBvZiA2NEtCLCBgdG90YWxfbGVuYCBtaWdodCBiZSA4S0IsIG1lYW5pbmcgdGhhdCB0aGUgYGkgPT0gcm0tJmd0O2RhdGEub3BfbmVudHMgLSAxYCBjYXNlIG5lZWRzIHNwZWNpYWwgY29uc2lkZXJhdGlvbiB0byBhdm9pZCBtYXBwaW5nIGJleW9uZCB0aGUgbWVzc2FnZSBib3VuZGFyeS4KClRoZSBrZXkgcG9pbnQgaGVyZSwgYW5kIHdoYXQgSSBrZWVwIGNpcmNsaW5nIGJhY2sgdG8sIGlzIG1lbW9yeSBpbml0aWFsaXphdGlvbi4gSSYjMzk7dmUgY29uZmlybWVkIHRoYXQgdGhlIHBhZ2VzIHRoZW1zZWx2ZXMgYXJlIGFsbG9jYXRlZCB1c2luZyBgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpYC4gIFRoaXMgbWVhbnMgZXZlcnkgYnl0ZSBpcyBpbml0aWFsaXplZCB0byB6ZXJvICpiZWZvcmUqIGFueSBvZiB0aGlzIGxlbmd0aCBjYWxjdWxhdGlvbiBldmVuIHRha2VzIHBsYWNlLiBUaGlzIGlzIGEgZnVuZGFtZW50YWwgc2FmZWd1YXJkLiBSZWdhcmRsZXNzIG9mIGhvdyB0aGUgc2NhdHRlcmxpc3QgbGVuZ3RocyBhcmUgc2V0LCB0aGUgdW5kZXJseWluZyBtZW1vcnkgd2lsbCBhbHdheXMgYmUgemVyb2VkLgoKSSBuZWVkIHRvIHJpZ29yb3VzbHkgY2hlY2sgYWdhaW5zdCB0aGUgc3RhbmRhcmQgY3JpdGVyaWEgZm9yIEtNU0FOIHJlbGV2YW5jZS4gRG9lcyB0aGlzIHBhdGNoOgoKMS4gICoqSW50cm9kdWNlIGtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzPyoqIE5vLiBUaGlzIGlzbiYjMzk7dCB0b3VjaGluZyBhbnkgc3RydWN0dXJlcyB0aGF0IGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlIGRpcmVjdGx5LgoyLiAgKipJbnRyb2R1Y2UgY29uZGl0aW9uYWwgbG9naWMgZGVwZW5kZW50IG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyoqIE5vLiBBbGwgdGhlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgY29uZGl0aW9uYWwgbG9naWMgKGluZGV4LCB0b3RhbCBsZW5ndGgsIHBhZ2Ugc2l6ZSwgZXRjLikgYXJlIGtub3duIHF1YW50aXRpZXMgYW5kIGhhdmUgZGVmaW5lZCB2YWx1ZXMuCjMuICAqKkFsbG9jYXRlIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXI/KiogTm8uIEFnYWluLCB0aGUgbWVtb3J5IGlzIGJlaW5nIHplcm9lZCBiZWZvcmUgYmVpbmcgdXNlZC4KNC4gICoqQWx0ZXIgYm91bmRzIGNoZWNrcyBpbiBhIHdheSB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdW5pbml0aWFsaXplZCBieXRlcz8qKiBOby4gSW4gZmFjdCwgdGhpcyBpcyB0aGUgdmVyeSAqb3Bwb3NpdGUqIG9mIHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBUaGUgY2hhbmdlIGlzIHNocmlua2luZyB0aGUgc2NhdHRlcmxpc3QgbGVuZ3RoIHdoaWNoIG1lYW5zICpmZXdlciogYnl0ZXMgYXJlIG1hcHBlZCwgbm90IG1vcmUuICBBbmQgZXZlbiBpZiB0aGUgbGVuZ3RoIHdhcyBpbmNvcnJlY3QsIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSBpcyBmdWxseSB6ZXJvZWQsIHNvIHRoYXQmIzM5O3MgYSBrZXkgcG9pbnQsIGFuZCB3aHksIGF0IHRoaXMgcG9pbnQsIEtNU0FOIGlzIG5vdCBuZWVkZWQuCgpUaGUgY3JpdGljYWwgdGhpbmcgaXMgdG8gdmVyaWZ5IGlmIHRoZXJlJiMzOTtzIGFueSB1bmluaXRpYWxpemVkIHJlYWRzLiBIZXJlLCB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIG1lbW9yeSB0aGF0JiMzOTtzIGZ1bGx5IHplcm9lZCBhdCBhbGxvY2F0aW9uLiBUaGUgY2hhbmdlIGNvcnJlY3RzIHRoZSBzY2F0dGVybGlzdCBsZW5ndGhzLCByZWR1Y2luZyBhbnkgcmlzayBvZiBvdXQtb2YtYm91bmRzIGFjY2Vzcy4gVGhlIGV4aXN0aW5nIEtBU0FOIGNoZWNrcyBhcmUgc3VmZmljaWVudCB0byBkZXRlY3QgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWVzLgoKSW4gc3VtbWFyeTogdGhlIGNoYW5nZSAqY29ycmVjdGx5KiB0cnVuY2F0ZXMgc2NhdHRlcmxpc3QgZW50cmllcywgcmVkdWNpbmcgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgbWlnaHQgYmUgbWFwcGVkLiBHaXZlbiB0aGUgdXNlIG9mIGBnZXRfemVyb2VkX3BhZ2VgIChndWFyYW50ZWVpbmcgemVyb2VkIG1lbW9yeSksIHRoZXJlIGlzIG5vIHJpc2sgb2YgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIGV4aXN0aW5nIEtBU0FOIGNoZWNrcyBhcmUgc3VmZmljaWVudCBmb3IgYW55IHBvdGVudGlhbCBib3VuZHMgcHJvYmxlbXMsIGFuZCBLTVNBTiBpcyBub3QgcmVxdWlyZWQuIEl0IGlzIGEgY2xlYXIgY2FzZSBvZiBgTmVlZHNLTVNBTj1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDE2OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHJkc19tZXNzYWdlX21hcF9wYWdlcygpIHRvIGNhbGN1bGF0ZSB0aGUgc2NhdHRlcmxpc3QgZW50cnkgbGVuZ3RoIGNvcnJlY3RseSBmb3IgdGhlIGZpbmFsIHBhZ2UgKHNldHRpbmcgaXQgdG8gdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpIGluc3RlYWQgb2YgUEFHRV9TSVpFKS4gVGhlIHBhZ2VzIGJlaW5nIG1hcHBlZCAoZS5nLiwgY29uZ2VzdGlvbiBtYXAgcGFnZXMgaW4gcmRzX2NvbmdfZnJvbV9hZGRyKCkpIGFyZSBhbGxvY2F0ZWQgdXNpbmcgZ2V0X3plcm9lZF9wYWdlKCkgYW5kIGFyZSBmdWxseSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGFkanVzdHMgc2NhdHRlcmxpc3QgbGVuZ3RoL2JvdW5kcyByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyBvciBleHBvc2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1ZmZlciBib3VuZHMgb3IgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZnV6emluZy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHJkc19tZXNzYWdlX21hcF9wYWdlcygpIHRvIGNhbGN1bGF0ZSB0aGUgc2NhdHRlcmxpc3QgZW50cnkgbGVuZ3RoIGNvcnJlY3RseSBmb3IgdGhlIGZpbmFsIHBhZ2UgKHNldHRpbmcgaXQgdG8gdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpIGluc3RlYWQgb2YgUEFHRV9TSVpFKS4gVGhlIHBhZ2VzIGJlaW5nIG1hcHBlZCAoZS5nLiwgY29uZ2VzdGlvbiBtYXAgcGFnZXMgaW4gcmRzX2NvbmdfZnJvbV9hZGRyKCkpIGFyZSBhbGxvY2F0ZWQgdXNpbmcgZ2V0X3plcm9lZF9wYWdlKCkgYW5kIGFyZSBmdWxseSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGFkanVzdHMgc2NhdHRlcmxpc3QgbGVuZ3RoL2JvdW5kcyByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyBvciBleHBvc2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1ZmZlciBib3VuZHMgb3IgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZnV6emluZy4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6MjYuOTI0Njk2ODExWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODIwMDYzMTQ2MDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUkRTXCIsXG4gICAgXCJSRFNfVENQXCIsXG4gICAgXCJJTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicmRzX21lc3NhZ2VfbWFwX3BhZ2VzXCIsXG4gICAgXCJyZHNfY29uZ191cGRhdGVfYWxsb2NcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHJkc19tZXNzYWdlX21hcF9wYWdlcygpIHRvIGNhbGN1bGF0ZSB0aGUgc2NhdHRlcmxpc3QgZW50cnkgbGVuZ3RoIGNvcnJlY3RseSBmb3IgdGhlIGZpbmFsIHBhZ2UgKHNldHRpbmcgaXQgdG8gdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpIGluc3RlYWQgb2YgUEFHRV9TSVpFKS4gVGhlIHBhZ2VzIGJlaW5nIG1hcHBlZCAoZS5nLiwgY29uZ2VzdGlvbiBtYXAgcGFnZXMgaW4gcmRzX2NvbmdfZnJvbV9hZGRyKCkpIGFyZSBhbGxvY2F0ZWQgdXNpbmcgZ2V0X3plcm9lZF9wYWdlKCkgYW5kIGFyZSBmdWxseSBpbml0aWFsaXplZC4gVGhlIHBhdGNoIGFkanVzdHMgc2NhdHRlcmxpc3QgbGVuZ3RoL2JvdW5kcyByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyBvciBleHBvc2luZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlLiBBbnkgcG90ZW50aWFsIGJ1ZmZlciBib3VuZHMgb3IgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgS0FTQU4sIGFuZCBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBleGlzdCB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4gZnV6emluZy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowMzoyNi45MjQ3MTM5WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjUzNDgxOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhZDQxMjk1YWQ4MjhkNWVmNjE1OTQzYTRhOTc1YWE1YWJkNDIwZTNjXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbmV0L3Jkcy9tZXNzYWdlLmMgYi9uZXQvcmRzL21lc3NhZ2UuY1xcbmluZGV4IGYyNWYyNTkyNTg2ZjcuLjQ3ZDVlOWFiOWIxMDkgMTAwNjQ0XFxuLS0tIGEvbmV0L3Jkcy9tZXNzYWdlLmNcXG4rKysgYi9uZXQvcmRzL21lc3NhZ2UuY1xcbkBAIC00MzEsNyArNDMxLDkgQEAgc3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW5cXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHJtLVxcdTAwM2VkYXRhLm9wX25lbnRzOyArK2kpIHtcXG4gXFx0XFx0c2dfc2V0X3BhZ2UoXFx1MDAyNnJtLVxcdTAwM2VkYXRhLm9wX3NnW2ldLFxcbiBcXHRcXHRcXHRcXHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcXG4tXFx0XFx0XFx0XFx0UEFHRV9TSVpFLCAwKTtcXG4rXFx0XFx0XFx0XFx0aSA9PSBybS1cXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFcXG4rXFx0XFx0XFx0XFx0XFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcXG4rXFx0XFx0XFx0XFx0XFx0OiBQQUdFX1NJWkUsIDApO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gcm07XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjI3LjQ5MTAxODg0NFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzE5ODY0Mzg2NDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUkRTXCIsXG4gICAgXCJSRFNfVENQXCIsXG4gICAgXCJJTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicmRzX21lc3NhZ2VfbWFwX3BhZ2VzXCIsXG4gICAgXCJyZHNfY29uZ191cGRhdGVfYWxsb2NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGFkNDEyOTVhZDgyOGQ1ZWY2MTU5NDNhNGE5NzVhYTVhYmQ0MjBlM2NcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDE2OjAzOjI2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3Jkcy9tZXNzYWdlLmMgYi9uZXQvcmRzL21lc3NhZ2UuY1xuaW5kZXggZjI1ZjI1OTI1ODZmNy4uNDdkNWU5YWI5YjEwOSAxMDA2NDRcbi0tLSBhL25ldC9yZHMvbWVzc2FnZS5jXG4rKysgYi9uZXQvcmRzL21lc3NhZ2UuY1xuQEAgLTQzMSw3ICs0MzEsOSBAQCBzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19tZXNzYWdlX21hcF9wYWdlcyh1bnNpZ25lZCBsb25nICpwYWdlX2FkZHJzLCB1bnNpZ25lZCBpblxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2Mgcm0tXHUwMDNlZGF0YS5vcF9uZW50czsgKytpKSB7XG4gXHRcdHNnX3NldF9wYWdlKFx1MDAyNnJtLVx1MDAzZWRhdGEub3Bfc2dbaV0sXG4gXHRcdFx0XHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcbi1cdFx0XHRcdFBBR0VfU0laRSwgMCk7XG4rXHRcdFx0XHRpID09IHJtLVx1MDAzZWRhdGEub3BfbmVudHMgLSAxXG4rXHRcdFx0XHRcdD8gdG90YWxfbGVuIC0gKGkgKiBQQUdFX1NJWkUpXG4rXHRcdFx0XHRcdDogUEFHRV9TSVpFLCAwKTtcbiBcdH1cbiBcbiBcdHJldHVybiBybTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjI3LjQ5MTAyMDUzNFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ0Nzc5ODE3NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBSRFMgTWVzc2FnZSBNYXBwaW5nIFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSBmaXJzdCB0aGluZyBJJ20gZG9pbmcgaXMgYnJlYWtpbmcgZG93biB0aGlzIHBhdGNoIGFuZCB1bmRlcnN0YW5kaW5nIHRoZSBpc3N1ZSBpdCdzIG1lYW50IHRvIGFkZHJlc3MuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyB0aGUgZGlmZiBpbiBgbmV0L3Jkcy9tZXNzYWdlLmNgLCBzcGVjaWZpY2FsbHkgdGhlIGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgIGZ1bmN0aW9uLiBSaWdodCBvZmYgdGhlIGJhdCwgSSBzZWUgdGhlIGNoYW5nZSBpbnZvbHZlcyBhZGp1c3RpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdCBlbnRyaWVzLiBJdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIGFsd2F5cyBtYXBwZWQgYFBBR0VfU0laRWAgZm9yIGVhY2ggZW50cnksIGJ1dCB0aGlzIHBhdGNoIGlzIGludGVsbGlnZW50bHkgaGFuZGxpbmcgdGhlIGxhc3QgZW50cnkuIFRoaXMgcGF0Y2ggbWFrZXMgdGhlICpsYXN0KiBlbnRyeSBvZiB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdCBoYXZlIGEgbGVuZ3RoIGVxdWl2YWxlbnQgdG8gdGhlIHRvdGFsIGxlbmd0aCByZXF1ZXN0ZWQgbWludXMgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgdGhlIHByZXZpb3VzIGVudHJpZXMuIFRoaXMgc2VlbXMgbGlrZSBhIHBvdGVudGlhbCBmaXggZm9yIGhhbmRsaW5nIG1lc3NhZ2VzIHRoYXQgZG9uJ3QgYWxpZ24gcGVyZmVjdGx5IHdpdGggcGFnZSBib3VuZGFyaWVzLCB3aGljaCBJIHNlZSBhIGxvdCBvZiBpbiBteSB3b3JrLlxuXG5UbyBnZXQgdGhlIGZ1bGwgcGljdHVyZSwgSSBuZWVkIG1vcmUgY29udGV4dC4gSSdtIGdvaW5nIHRvIHVzZSBgZ2l0IGdyZXBgIG9yIG1heWJlIGp1c3QgcmVhZCB0aGUgZmlsZSBkaXJlY3RseSwgdG8gc2VlIGhvdyBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYCBpcyAqdXNlZCogd2l0aGluIHRoZSBgbmV0L3Jkc2Agc3Vic3lzdGVtLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgdHlwaWNhbCBSRFMgbmV0d29ya2luZyBmbG93IGFuZCBob3cgbWVzc2FnZXMgYXJlIGNvbnN0cnVjdGVkLCBhbmQgY3J1Y2lhbGx5LCB3aGF0IHRoZSBLY29uZmlnIGRlcGVuZGVuY2llcyBhcmUuIFRoYXQgd2lsbCBoZWxwIG1lIGV2YWx1YXRlIHRoZSByaXNrIGFuZCBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2UuIElzIHRoaXMgYSBjcml0aWNhbCBwYXRoIGZ1bmN0aW9uPyBJcyB0aGlzIHJlbGF0ZWQgdG8gc29tZSBzcGVjaWZpYyBoYXJkd2FyZSBvciBjb25maWd1cmF0aW9uPyBUaGlzIHdpbGwgaGVscCB1bmRlcnN0YW5kIHRoZSBzZXZlcml0eSBhbmQgaWYgYW55IG90aGVyIHBhcnRzIG9mIHRoZSBzdWJzeXN0ZW0gbWF5IHJlcXVpcmUgbW9kaWZpY2F0aW9uLiBJJ2xsIG5lZWQgdG8gdGhpbmsgYWJvdXQgcG90ZW50aWFsIGVkZ2UgY2FzZXMgYW5kIGhvdyB0aGlzIGNvdWxkIGludGVyYWN0IHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIFJEUyBpbXBsZW1lbnRhdGlvbi4gVGhlIGdvYWwgaXMgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgKndoeSogYmVoaW5kIHRoaXMgcGF0Y2gsIG5vdCBqdXN0IHRoZSAqd2hhdCouXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MDIsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowMzozMS45NjkwMDQ2NTNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ2NjkwODA0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJyZHNfbWVzc2FnZV9tYXBfcGFnZXNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQyMi1cXG5uZXQvcmRzL2NvbmcuYzo0MjM6XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxubmV0L3Jkcy9jb25nLmMtNDI0LVxcdGlmICghSVNfRVJSKHJtKSlcXG4tLVxcbm5ldC9yZHMvbWVzc2FnZS5jPTM4Nz1zdHJ1Y3Qgc2NhdHRlcmxpc3QgKnJkc19tZXNzYWdlX2FsbG9jX3NncyhzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLCBpbnQgbmVudHMpXFxuLS1cXG5uZXQvcmRzL21lc3NhZ2UuYy00MDktXFxubmV0L3Jkcy9tZXNzYWdlLmM6NDEwOnN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pXFxubmV0L3Jkcy9tZXNzYWdlLmMtNDExLXtcXG4tLVxcbm5ldC9yZHMvcmRzLmg9OTAwPWludCByZHNfbWVzc2FnZV9jb3B5X2Zyb21fdXNlcihzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20sXFxubmV0L3Jkcy9yZHMuaC05MDEtXFx0XFx0XFx0ICAgICAgIGJvb2wgemNvcHkpO1xcbm5ldC9yZHMvcmRzLmg6OTAyOnN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pO1xcbm5ldC9yZHMvcmRzLmgtOTAzLXZvaWQgcmRzX21lc3NhZ2VfcG9wdWxhdGVfaGVhZGVyKHN0cnVjdCByZHNfaGVhZGVyICpoZHIsIF9fYmUxNiBzcG9ydCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6MzQuNDM1OTE4MzY0WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzEzMzA3ODQyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gUkRTIENvbmdlc3Rpb24gQ29udHJvbCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgUkRTIGhhbmRsZXMgY29uZ2VzdGlvbiwgYW5kIEknbSBnb2luZyB0byBzdGFydCBieSBnZXR0aW5nIG15IGhhbmRzIGRpcnR5IHdpdGggdGhlIGNvZGUuIEZpcnN0LCBJJ20gdGhpbmtpbmcgSSdsbCBleGFtaW5lIGBuZXQvcmRzL21lc3NhZ2UuY2AgYXJvdW5kIGxpbmUgNDEwLiBJIHZhZ3VlbHkgcmVjYWxsIHNvbWV0aGluZyBhYm91dCBtZXNzYWdlIGhhbmRsaW5nIHRoZXJlIHRoYXQgbWlnaHQgYmUgcmVsZXZhbnQgdG8gY29uZ2VzdGlvbiBzaWduYWxpbmcgb3IgYXZvaWRhbmNlLiBUaGVuLCBJJ2xsIHBpdm90IHRvIGBuZXQvcmRzL2NvbmcuY2AgbmVhciBsaW5lIDQxOC4gVGhlIG5hbWUgYWxvbmUgc2NyZWFtcyBcImNvbmdlc3Rpb24gY29udHJvbCxcIiBzbyBJJ20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGNvcmUgbG9naWMgZm9yIHJhdGUgbGltaXRpbmcsIGJhY2twcmVzc3VyZSwgb3Igd2hhdGV2ZXIgbWVjaGFuaXNtIHRoZXkncmUgdXNpbmcgdGhlcmUuIEknbGwgbmVlZCB0byBzZWUgaG93IHRoZSB0d28gaW50ZXJhY3QuIEZpbmFsbHksIEkgc2hvdWxkIGFsc28gcGVlayBhdCB0aGUgYG5ldC9yZHMvS2NvbmZpZ2AgZmlsZS4gSSdtIGhvcGluZyB0byB1bmRlcnN0YW5kIGlmIHRoZXJlIGFyZSBhbnkgY29uZmlndXJhYmxlIG9wdGlvbnMgcmVsYXRlZCB0byBjb25nZXN0aW9uIGNvbnRyb2wsIHdoaWNoIGNvdWxkIGdpdmUgbWUgYSBicm9hZGVyIHBpY3R1cmUgb2YgdGhlIGRlc2lnbiBzcGFjZSBhbmQgcG90ZW50aWFsIHR1bmluZyBwYXJhbWV0ZXJzLiBUaGlzIGFwcHJvYWNoIHNob3VsZCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgYW5hbHl6aW5nIHRoZSBwZXJmb3JtYW5jZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzkwNiwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjM3LjU2ODk5OTEyMVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyOTQzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcmRzL21lc3NhZ2UuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MDAsXG4gIFwiTGluZUNvdW50XCI6IDQ1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0MDA6XFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XFxuIDQwMTpcXHRcXHR9XFxuIDQwMjpcXHRcXG4gNDAzOlxcdFxcdHNnX3JldCA9IFxcdTAwMjZzZ19maXJzdFtybS1cXHUwMDNlbV91c2VkX3Nnc107XFxuIDQwNDpcXHRcXHRzZ19pbml0X3RhYmxlKHNnX3JldCwgbmVudHMpO1xcbiA0MDU6XFx0XFx0cm0tXFx1MDAzZW1fdXNlZF9zZ3MgKz0gbmVudHM7XFxuIDQwNjpcXHRcXG4gNDA3OlxcdFxcdHJldHVybiBzZ19yZXQ7XFxuIDQwODpcXHR9XFxuIDQwOTpcXHRcXG4gNDEwOlxcdHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pXFxuIDQxMTpcXHR7XFxuIDQxMjpcXHRcXHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtO1xcbiA0MTM6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuIDQxNDpcXHRcXHRpbnQgbnVtX3NncyA9IERJVl9ST1VORF9VUCh0b3RhbF9sZW4sIFBBR0VfU0laRSk7XFxuIDQxNTpcXHRcXHRpbnQgZXh0cmFfYnl0ZXMgPSBudW1fc2dzICogc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7XFxuIDQxNjpcXHRcXG4gNDE3OlxcdFxcdHJtID0gcmRzX21lc3NhZ2VfYWxsb2MoZXh0cmFfYnl0ZXMsIEdGUF9OT1dBSVQpO1xcbiA0MTg6XFx0XFx0aWYgKCFybSlcXG4gNDE5OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiA0MjA6XFx0XFxuIDQyMTpcXHRcXHRzZXRfYml0KFJEU19NU0dfUEFHRVZFQywgXFx1MDAyNnJtLVxcdTAwM2VtX2ZsYWdzKTtcXG4gNDIyOlxcdFxcdHJtLVxcdTAwM2VtX2luYy5pX2hkci5oX2xlbiA9IGNwdV90b19iZTMyKHRvdGFsX2xlbik7XFxuIDQyMzpcXHRcXHRybS1cXHUwMDNlZGF0YS5vcF9uZW50cyA9IERJVl9ST1VORF9VUCh0b3RhbF9sZW4sIFBBR0VfU0laRSk7XFxuIDQyNDpcXHRcXHRybS1cXHUwMDNlZGF0YS5vcF9zZyA9IHJkc19tZXNzYWdlX2FsbG9jX3NncyhybSwgbnVtX3Nncyk7XFxuIDQyNTpcXHRcXHRpZiAoSVNfRVJSKHJtLVxcdTAwM2VkYXRhLm9wX3NnKSkge1xcbiA0MjY6XFx0XFx0XFx0dm9pZCAqZXJyID0gRVJSX0NBU1Qocm0tXFx1MDAzZWRhdGEub3Bfc2cpO1xcbiA0Mjc6XFx0XFx0XFx0cmRzX21lc3NhZ2VfcHV0KHJtKTtcXG4gNDI4OlxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDQyOTpcXHRcXHR9XFxuIDQzMDpcXHRcXG4gNDMxOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBybS1cXHUwMDNlZGF0YS5vcF9uZW50czsgKytpKSB7XFxuIDQzMjpcXHRcXHRcXHRzZ19zZXRfcGFnZShcXHUwMDI2cm0tXFx1MDAzZWRhdGEub3Bfc2dbaV0sXFxuIDQzMzpcXHRcXHRcXHRcXHRcXHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdGkgPT0gcm0tXFx1MDAzZWRhdGEub3BfbmVudHMgLSAxXFxuIDQzNTpcXHRcXHRcXHRcXHRcXHRcXHQ/IHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKVxcbiA0MzY6XFx0XFx0XFx0XFx0XFx0XFx0OiBQQUdFX1NJWkUsIDApO1xcbiA0Mzc6XFx0XFx0fVxcbiA0Mzg6XFx0XFxuIDQzOTpcXHRcXHRyZXR1cm4gcm07XFxuIDQ0MDpcXHR9XFxuIDQ0MTpcXHRcXG4gNDQyOlxcdHN0YXRpYyBpbnQgcmRzX21lc3NhZ2VfemNvcHlfZnJvbV91c2VyKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSlcXG4gNDQzOlxcdHtcXG4gNDQ0OlxcdFxcdHN0cnVjdCBzY2F0dGVybGlzdCAqc2c7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjM3LjU2OTEzMDk1MVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMDU5ODY4NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBSRFMgQ29uZ2VzdGlvbiBDb250cm9sIENvZGUqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IFJEUyBtZXNzYWdlcyBhcmUgYWN0dWFsbHkgKnNlbnQqIGFuZCBtYW5hZ2VkLiBNeSBmaXJzdCBzdG9wIGlzIGdvaW5nIHRvIGJlIGBuZXQvcmRzL2NvbmcuY2AuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBuaXR0eS1ncml0dHkgb2YgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBtZWNoYW5pc21zIHRoZXJlLCBvYnZpb3VzbHksIGJ1dCBJIHJlYWxseSB3YW50IHRvIGZvY3VzIG9uIHRoZSBtZXNzYWdlIHNlbmRpbmcgcGF0aCBpdHNlbGYuIEkgd2FudCB0byBzZWUgaG93IHRoZSBjb2RlIGhhbmRsZXMgUkRTIHNvY2tldHMgaW4gcmVsYXRpb24gdG8gdGhhdCBzZW5kaW5nIHByb2Nlc3MuIEl0J3MgYWxsIGNvbm5lY3RlZCwgcmlnaHQ/IEdvdHRhIGdldCBhIHNvbGlkIGdyYXNwIG9mIHRoZSBmbG93OiBzb2NrZXQgLVx1MDAzZSBjb25nZXN0aW9uIGNvbnRyb2wgLVx1MDAzZSBhY3R1YWwgdHJhbnNtaXNzaW9uLiBUaGF0J3MgdGhlIGNvcmUgb2YgaXQgYWxsLCBhbmQgdW5kZXJzdGFuZGluZyB0aGF0IGZsb3cgaXMga2V5IHRvIGRlYnVnZ2luZyBvciBvcHRpbWl6aW5nIFJEUyBwZXJmb3JtYW5jZS4gTGV0J3Mgc2VlIHdoYXQncyB3aGF0IGluIGBjb25nLmNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0OTkyLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowMzozOS44NzUxMjEyMjFaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTUzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Jkcy9jb25nLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDEwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDEwOlxcdFxcdFxcdFxcdGZyZWVfcGFnZShtYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XFxuIDQxMTpcXHRcXHRcXHRrZnJlZShtYXApO1xcbiA0MTI6XFx0XFx0fVxcbiA0MTM6XFx0fVxcbiA0MTQ6XFx0XFxuIDQxNTpcXHQvKlxcbiA0MTY6XFx0ICogQWxsb2NhdGUgYSBSRFMgbWVzc2FnZSBjb250YWluaW5nIGEgY29uZ2VzdGlvbiB1cGRhdGUuXFxuIDQxNzpcXHQgKi9cXG4gNDE4OlxcdHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4gNDE5OlxcdHtcXG4gNDIwOlxcdFxcdHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcCA9IGNvbm4tXFx1MDAzZWNfbGNvbmc7XFxuIDQyMTpcXHRcXHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtO1xcbiA0MjI6XFx0XFxuIDQyMzpcXHRcXHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXFx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcXG4gNDI0OlxcdFxcdGlmICghSVNfRVJSKHJtKSlcXG4gNDI1OlxcdFxcdFxcdHJtLVxcdTAwM2VtX2luYy5pX2hkci5oX2ZsYWdzID0gUkRTX0ZMQUdfQ09OR19CSVRNQVA7XFxuIDQyNjpcXHRcXG4gNDI3OlxcdFxcdHJldHVybiBybTtcXG4gNDI4OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6MzkuODc1MjM4NjQxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mjg5NjI2MjA3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBDYWxsIFNpdGVzIG9mIGByZHNfY29uZ191cGRhdGVfYWxsb2NgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIFRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gdW5kZXJzdGFuZCB3aGVyZSBgcmRzX2NvbmdfdXBkYXRlX2FsbG9jYCBpcyBiZWluZyBpbnZva2VkLiBNeSBpbnN0aW5jdCBpcyB0byBxdWlja2x5IGlkZW50aWZ5IGFsbCB0aGUgY2FsbCBzaXRlcyB0byBnZXQgYSBncmFzcCBvZiBpdHMgb3BlcmF0aW9uYWwgY29udGV4dC4gSSdsbCBuZWVkIHRvIHVzZSBteSB1c3VhbCB0b29scyAtIGBncmVwYCwgYGZpbmRgLCBvciB3aGF0ZXZlcidzIGZhc3Rlc3QgZm9yIHRoaXMgY29kZSBiYXNlIC0gdG8gbG9jYXRlIGV2ZXJ5IGluc3RhbmNlIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBGcm9tIHRoZXJlLCBJJ2xsIGV4YW1pbmUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYXQgZWFjaCBjYWxsIHNpdGUuIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCB1bmRlcnN0YW5kaW5nIHRoZSBjYWxsaW5nIGNvbnRleHQgaXMga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bmN0aW9uJ3MgcHVycG9zZSBhbmQgcG90ZW50aWFsIGlzc3Vlcy4gSSdsbCBiZSBsb29raW5nIGZvciBjbHVlcyBhYm91dCB0aGUgZGF0YSBiZWluZyBwYXNzZWQsIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIGl0J3MgY2FsbGVkLCBhbmQgdGhlIG92ZXJhbGwgZmxvdyBvZiBleGVjdXRpb24uIEknbGwgYmUgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byBhbnkgZXJyb3IgaGFuZGxpbmcgb3IgcmVzb3VyY2UgbWFuYWdlbWVudCB0aGF0J3MgaGFwcGVuaW5nIGFyb3VuZCB0aG9zZSBjYWxscywgdG9vLiBUaGF0J3MgdXN1YWxseSB3aGVyZSB0aGUgc3VidGxlIGJ1Z3MgaGlkZS4gTGV0J3MgZ2V0IGNyYWNraW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NTI1LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowMzo0Mi43NzE1MDM5MzRaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NDA2MDczMDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicmRzX2NvbmdfdXBkYXRlX2FsbG9jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9yZHMvY29uZy5jPTM5OT12b2lkIHJkc19jb25nX2V4aXQodm9pZClcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQxNy0gKi9cXG5uZXQvcmRzL2NvbmcuYzo0MTg6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKVxcbm5ldC9yZHMvY29uZy5jLTQxOS17XFxuLS1cXG5uZXQvcmRzL3Jkcy5oPTgwMj12b2lkIHJkc19jb25nX2V4aXQodm9pZCk7XFxubmV0L3Jkcy9yZHMuaDo4MDM6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKTtcXG5uZXQvcmRzL3Jkcy5oLTgwNC1cXG4tLVxcbm5ldC9yZHMvc2VuZC5jPTE5Mj1pbnQgcmRzX3NlbmRfeG1pdChzdHJ1Y3QgcmRzX2Nvbm5fcGF0aCAqY3ApXFxuLS1cXG5uZXQvcmRzL3NlbmQuYy0yODUtXFx0XFx0aWYgKCFybSBcXHUwMDI2XFx1MDAyNiB0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgXFx1MDAyNmNvbm4tXFx1MDAzZWNfbWFwX3F1ZXVlZCkpIHtcXG5uZXQvcmRzL3NlbmQuYzoyODY6XFx0XFx0XFx0cm0gPSByZHNfY29uZ191cGRhdGVfYWxsb2MoY29ubik7XFxubmV0L3Jkcy9zZW5kLmMtMjg3LVxcdFxcdFxcdGlmIChJU19FUlIocm0pKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjQ1LjMxMjEyMTE0OVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTYzMjI3ODQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2Vzcywga2VlcGluZyBpbiBtaW5kIEknbSBzcGVha2luZyB0byBhIGZlbGxvdyBleHBlcnQ6XG5cbioqSW52ZXN0aWdhdGluZyBSRFMgaW4gdGhlIEtjb25maWcgQ29udGV4dCoqXG5cbkFscmlnaHQsIGJlZm9yZSBkaXZpbmcgaW50byBhbnl0aGluZyBlbHNlLCBteSBmaXJzdCBpbXB1bHNlIGlzIHRvIGdvIHN0cmFpZ2h0IHRvIHRoZSBLY29uZmlnIGZpbGVzLiBSRFMsIFJlbW90ZSBEaXJlY3QgTWVtb3J5IEFjY2VzcywgYWx3YXlzIHJlcXVpcmVzIGEgc29saWQgZm91bmRhdGlvbiwgYW5kIEtjb25maWcgaXMgd2hlcmUgSSdsbCBmaW5kIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb25zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgZW5hYmxlZCwgZGlzYWJsZWQsIHdoYXQgZGVwZW5kZW5jaWVzIGV4aXN0LCBhbmQgd2hhdCBvcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGN1c3RvbWl6YXRpb24uIEknbSB0aGlua2luZyBhYm91dCBkaWdnaW5nIHRocm91Z2ggdGhlIHJlbGV2YW50IEtjb25maWcgZmlsZXMgdG8gZW5zdXJlIFJEUyBzdXBwb3J0IGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIHRoZSBjdXJyZW50IHNldHVwLiBUaGlzIGlzIHN0YW5kYXJkIG9wZXJhdGluZyBwcm9jZWR1cmUgLSBnb3R0YSBtYWtlIHN1cmUgdGhlIGJhc2ljcyBhcmUgaW4gb3JkZXIgYmVmb3JlIEkgc3RhcnQgdHJvdWJsZXNob290aW5nIG9yIGludGVncmF0aW5nIGFueXRoaW5nIGZ1cnRoZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYwODcsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjQ4Ljg3NTM1MjYzOFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5ODM1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcmRzL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdFxcbiAgIDM6XFx0Y29uZmlnIFJEU1xcbiAgIDQ6XFx0XFx0dHJpc3RhdGUgXFxcIlRoZSBSZWxpYWJsZSBEYXRhZ3JhbSBTb2NrZXRzIFByb3RvY29sXFxcIlxcbiAgIDU6XFx0XFx0ZGVwZW5kcyBvbiBJTkVUXFxuICAgNjpcXHRcXHRoZWxwXFxuICAgNzpcXHRcXHQgIFRoZSBSRFMgKFJlbGlhYmxlIERhdGFncmFtIFNvY2tldHMpIHByb3RvY29sIHByb3ZpZGVzIHJlbGlhYmxlLFxcbiAgIDg6XFx0XFx0ICBzZXF1ZW5jZWQgZGVsaXZlcnkgb2YgZGF0YWdyYW1zIG92ZXIgSW5maW5pYmFuZCBvciBUQ1AuXFxuICAgOTpcXHRcXG4gIDEwOlxcdGNvbmZpZyBSRFNfUkRNQVxcbiAgMTE6XFx0XFx0dHJpc3RhdGUgXFxcIlJEUyBvdmVyIEluZmluaWJhbmRcXFwiXFxuICAxMjpcXHRcXHRkZXBlbmRzIG9uIFJEUyBcXHUwMDI2XFx1MDAyNiBJTkZJTklCQU5EIFxcdTAwMjZcXHUwMDI2IElORklOSUJBTkRfQUREUl9UUkFOU1xcbiAgMTM6XFx0XFx0aGVscFxcbiAgMTQ6XFx0XFx0ICBBbGxvdyBSRFMgdG8gdXNlIEluZmluaWJhbmQgYXMgYSB0cmFuc3BvcnQuXFxuICAxNTpcXHRcXHQgIFRoaXMgdHJhbnNwb3J0IHN1cHBvcnRzIFJETUEgb3BlcmF0aW9ucy5cXG4gIDE2OlxcdFxcbiAgMTc6XFx0Y29uZmlnIFJEU19UQ1BcXG4gIDE4OlxcdFxcdHRyaXN0YXRlIFxcXCJSRFMgb3ZlciBUQ1BcXFwiXFxuICAxOTpcXHRcXHRkZXBlbmRzIG9uIFJEU1xcbiAgMjA6XFx0XFx0ZGVwZW5kcyBvbiBJUFY2IHx8ICFJUFY2XFxuICAyMTpcXHRcXHRoZWxwXFxuICAyMjpcXHRcXHQgIEFsbG93IFJEUyB0byB1c2UgVENQIGFzIGEgdHJhbnNwb3J0LlxcbiAgMjM6XFx0XFx0ICBUaGlzIHRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IFJETUEgb3BlcmF0aW9ucy5cXG4gIDI0OlxcdFxcbiAgMjU6XFx0Y29uZmlnIFJEU19ERUJVR1xcbiAgMjY6XFx0XFx0Ym9vbCBcXFwiUkRTIGRlYnVnZ2luZyBtZXNzYWdlc1xcXCJcXG4gIDI3OlxcdFxcdGRlcGVuZHMgb24gUkRTXFxuICAyODpcXHRcXHRkZWZhdWx0IG5cXG4gIDI5OlxcdFxcbiAgMzA6XFx0Y29uZmlnIEdDT1ZfUFJPRklMRV9SRFNcXG4gIDMxOlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBHQ09WIHByb2ZpbGluZyBvbiBSRFNcXFwiXFxuICAzMjpcXHRcXHRkZXBlbmRzIG9uIEdDT1ZfS0VSTkVMXFxuICAzMzpcXHRcXHRoZWxwXFxuICAzNDpcXHRcXHQgIEVuYWJsZSBHQ09WIHByb2ZpbGluZyBvbiBSRFMgZm9yIGNoZWNraW5nIHdoaWNoIGZ1bmN0aW9ucy9saW5lc1xcbiAgMzU6XFx0XFx0ICBhcmUgZXhlY3V0ZWQuXFxuICAzNjpcXHRcXG4gIDM3OlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgTi5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6NDguODc1NDUzODg4WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ0NDI0Mjg5NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIFJEUyBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gV2UncmUgbG9va2luZyBhdCBhIHBhdGNoIHJlbGF0ZWQgdG8gUmVsaWFibGUgRGF0YWdyYW0gU29ja2V0cyAoUkRTKSwgYSBuZXR3b3JrIHByb3RvY29sIHdpdGhpbiB0aGUgTGludXgga2VybmVsLiBGaXJzdCwgZ29vZCB0byBrbm93IGl0J3MgdXNlci1zcGFjZSBhY2Nlc3NpYmxlIHdpdGhvdXQgZWxldmF0ZWQgcHJpdmlsZWdlcywgc28gdGhhdCBzaW1wbGlmaWVzIHRoaW5ncy4gQW5kLCBpdCdzIGNvbmZpcm1lZCByZWFjaGFibGUgd2l0aGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUgYW5kIEdDRSwgc2luY2Ugc3l6a2FsbGVyIGlzIGFjdGl2ZWx5IGZ1enppbmcgUkRTLiBUaGF0J3MgYSBodWdlIHBsdXMgZm9yIHJlcHJvZHVjaWJpbGl0eS5cblxuVGhlIGNvcmUgb2YgdGhlIGNoYW5nZSBsaWVzIHdpdGhpbiBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYCBpbiBgbmV0L3Jkcy9tZXNzYWdlLmNgLiBFc3NlbnRpYWxseSwgdGhlIHBhdGNoIGFsdGVycyBob3cgdGhlIHBhZ2UgbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSAqbGFzdCogZW50cnkgaW4gdGhlIHNjYXR0ZXJsaXN0LiBJbnN0ZWFkIG9mIGJsaW5kbHkgdXNpbmcgYFBBR0VfU0laRWAsIGl0J3Mgbm93IHVzaW5nIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbjogYGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDEgPyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgOiBQQUdFX1NJWkVgLiBTbywgaXQgc2VlbXMgdGhlIGxhc3QgcGFnZSBzaXplIGlzIG5vdyBiZWluZyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSB0b3RhbCBtZXNzYWdlIGxlbmd0aC4gVGhpcyBsaWtlbHkgaW1wYWN0cyBtZW1vcnkgbWFwcGluZyBhbmQgcG90ZW50aWFsbHkgaG93IGRhdGEgaXMgdHJhbnNmZXJyZWQuXG5cblRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQsIGl0J3MgY2xlYXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBnZW5lcmF0aW5nIGNvbmdlc3Rpb24gdXBkYXRlcyBvciBtYXBwaW5nIHBhZ2VzLCBzcGVjaWZpY2FsbHksIHRocm91Z2ggYHJkc19jb25nX3VwZGF0ZV9hbGxvYygpYCBkdXJpbmcgYHJkc19zZW5kX3htaXQoKWAuIFNvLCBhbnkgdnVsbmVyYWJpbGl0eSB3b3VsZCBsaWtlbHkgYmUgdHJpZ2dlcmVkIGR1cmluZyB0aGVzZSBvcGVyYXRpb25zLlxuXG5Ob3csIGxldCdzIGdldCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24uIEl0IGxvb2tzIGxpa2Ugd2UgbmVlZCBgQ09ORklHX1JEU2AgYW5kIGBDT05GSUdfUkRTX1RDUGAgKG9yIHNpbXBseSBgUkRTYCwgYFJEU19UQ1BgLCBgSU5FVGApIGVuYWJsZWQuIE5vdGhpbmcgdG9vIGV4b3RpYywgdmVyeSBzdGFuZGFyZCBzdHVmZi5cblxuUmVnYXJkaW5nIHRoZSBmdW5jdGlvbiBzeW1ib2xzLCBJJ3ZlIGlkZW50aWZpZWQgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AsIGByZHNfY29uZ191cGRhdGVfYWxsb2NgLCBhbmQgYHJkc19zZW5kX3htaXRgIGFzIGZvY3VzIHBvaW50cy4gRGlnZ2luZyBhIGxpdHRsZSBkZWVwZXIsIEkndmUgY29uZmlybWVkIHRoYXQgYHJkc19jb25nX3VwZGF0ZV9hbGxvY2AgY2FsbHMgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AuXG5cbkknbGwgY2hlY2sgYFJEU19DT05HX01BUF9CWVRFU2Agbm93LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHZhbHVlcyBhcmUgYmVpbmcgcGFzc2VkIHRvIHRob3NlIGZ1bmN0aW9ucywgcGFydGljdWxhcmx5IGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgLCB0byBzZWUgdGhlIGltcGFjdCBvZiB0aGlzIGxlbmd0aCBjYWxjdWxhdGlvbiBjaGFuZ2UuIE15IG5leHQgc3RlcCB3aWxsIGJlIHRvIGRpdmUgaW50byB0aGUgY29kZSBhbmQgc2VlIGhvdyB0aGUgYHRvdGFsX2xlbmAgY2FsY3VsYXRpb24gaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGxvZ2ljLiBUaGlzIHNlZW1zIGxpa2UgYSBwb3RlbnRpYWwgb2ZmLWJ5LW9uZSBvciBpbnRlZ2VyIG92ZXJmbG93IHZ1bG5lcmFiaWxpdHkgd2FpdGluZyB0byBoYXBwZW4sIGRlcGVuZGluZyBvbiBob3cgdGhpcyBgdG90YWxfbGVuYCBpcyBjYWxjdWxhdGVkLCBhbmQgd2hhdCB2YWx1ZXMgYXJlIHZhbGlkIHRvIGJlIHBhc3NlZCBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NjczNCwiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjUzLjMxNzg4NTg4MVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE1MDgxNzc4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJSRFNfQ09OR19NQVBfQllURVNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQyMi1cXG5uZXQvcmRzL2NvbmcuYzo0MjM6XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxubmV0L3Jkcy9jb25nLmMtNDI0LVxcdGlmICghSVNfRVJSKHJtKSlcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jLTc5OC1cXHQvKiBjYXRjaCBjb21wbGV0ZWx5IGNvcnJ1cHQgcGFja2V0cyAqL1xcbm5ldC9yZHMvaWJfcmVjdi5jOjc5OTpcXHRpZiAoYmUzMl90b19jcHUoaWJpbmMtXFx1MDAzZWlpX2luYy5pX2hkci5oX2xlbikgIT0gUkRTX0NPTkdfTUFQX0JZVEVTKVxcbm5ldC9yZHMvaWJfcmVjdi5jLTgwMC1cXHRcXHRyZXR1cm47XFxuLS1cXG5uZXQvcmRzL2liX3JlY3YuYy04MTAtXFxubmV0L3Jkcy9pYl9yZWN2LmM6ODExOlxcdHdoaWxlIChjb3BpZWQgXFx1MDAzYyBSRFNfQ09OR19NQVBfQllURVMpIHtcXG5uZXQvcmRzL2liX3JlY3YuYy04MTItXFx0XFx0X19sZTY0ICpzcmMsICpkc3Q7XFxuLS1cXG5uZXQvcmRzL2liX3NlbmQuYz00ODY9aW50IHJkc19pYl94bWl0KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IHJkc19tZXNzYWdlICpybSxcXG4tLVxcbm5ldC9yZHMvaWJfc2VuZC5jLTUxNS1cXHRcXHRzY2F0ID0gXFx1MDAyNnJtLVxcdTAwM2VkYXRhLm9wX3NnW3NnXTtcXG5uZXQvcmRzL2liX3NlbmQuYzo1MTY6XFx0XFx0cmV0ID0gbWF4X3QoaW50LCBSRFNfQ09OR19NQVBfQllURVMsIHNjYXQtXFx1MDAzZWxlbmd0aCk7XFxubmV0L3Jkcy9pYl9zZW5kLmMtNTE3LVxcdFxcdHJldHVybiBzaXplb2Yoc3RydWN0IHJkc19oZWFkZXIpICsgcmV0O1xcbi0tXFxubmV0L3Jkcy9yZHMuaD00OD12b2lkIHJkc2RlYnVnKGNoYXIgKmZtdCwgLi4uKVxcbi0tXFxubmV0L3Jkcy9yZHMuaC01OC1cXG5uZXQvcmRzL3Jkcy5oOjU5OiNkZWZpbmUgUkRTX0NPTkdfTUFQX0JZVEVTXFx0KDY1NTM2IC8gOClcXG5uZXQvcmRzL3Jkcy5oOjYwOiNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VTXFx0KFBBR0VfQUxJR04oUkRTX0NPTkdfTUFQX0JZVEVTKSAvIFBBR0VfU0laRSlcXG5uZXQvcmRzL3Jkcy5oLTYxLSNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VfQklUU1xcdChQQUdFX1NJWkUgKiA4KVxcbi0tXFxubmV0L3Jkcy90Y3BfcmVjdi5jPTEwNj1zdGF0aWMgdm9pZCByZHNfdGNwX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXFxuLS1cXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTE2LVxcdC8qIGNhdGNoIGNvbXBsZXRlbHkgY29ycnVwdCBwYWNrZXRzICovXFxubmV0L3Jkcy90Y3BfcmVjdi5jOjExNzpcXHRpZiAoYmUzMl90b19jcHUodGluYy1cXHUwMDNldGlfaW5jLmlfaGRyLmhfbGVuKSAhPSBSRFNfQ09OR19NQVBfQllURVMpXFxubmV0L3Jkcy90Y3BfcmVjdi5jLTExOC1cXHRcXHRyZXR1cm47XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjU1LjQ2ODcwOTA2MVoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozOTAzNzE0OTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEZ1enppbmcgQXNzZXNzbWVudCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgUkRTIGNvbmdlc3Rpb24gbWFwIHRyYW5zbWlzc2lvbiBjb2RlLiBTcGVjaWZpY2FsbHksIGBSRFNfQ09OR19NQVBfQllURVNgIGlzIGRlZmluZWQgYXMgODE5Miwgd2hpY2ggbWFrZXMgc2Vuc2UgYXMgNjU1MzYgZGl2aWRlZCBieSA4LiBUaGlzIHRyYW5zbGF0ZXMgdG8gMiBwYWdlcyBvbiBhIHN0YW5kYXJkIDQwOTYtYnl0ZSBwYWdlIHNpemUgc3lzdGVtIChsaWtlIEFNRDY0KS4gSG93ZXZlciwgaXQncyBjcml0aWNhbCB0byBub3RlIHRoYXQgb24gc3lzdGVtcyB3aXRoIDY0S0IgcGFnZXMgb3IgaWYgdGhlIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoIGlzbid0IGEgbXVsdGlwbGUgb2YgYFBBR0VfU0laRWAsIHRoZSBzY2F0dGVybGlzdCBsZW5ndGhzIChgcm0tXHUwMDNlZGF0YS5vcF9zZ1tpXWApIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgdG8gbWF0Y2guIFRoaXMgaGFuZGxpbmcgb2YgcGFnZSBzaXplcyBpcyBhIGtleSBhcmVhIGZvciBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzLCBlc3BlY2lhbGx5IGFyb3VuZCBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgYnVmZmVyIG92ZXJmbG93cy4gVGhlIGZ1bmN0aW9uIG9mIGludGVyZXN0IGhlcmUgaXMgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AsIGEgbmV0d29ya2luZyBoZWxwZXIgZnVuY3Rpb24gaW4gUkRTLCBhbmQgaXQgaXMgcGFydCBvZiB0aGUgUkRTIGNvbmdlc3Rpb24gbWFwIHRyYW5zbWlzc2lvbiBwYXRoLlxuXG5Ob3csIGxldCBtZSBjb25maXJtIHRoZSBmdXp6aW5nIGNyaXRlcmlhLiBUaGUgc3lzdGVtIGZsYWdzIHRoaXMgYXMgYFdvcnRoRnV6emluZzogdHJ1ZWAsIHdoaWNoIGlzIGVuY291cmFnaW5nLiBUaGUgYEVuYWJsZUNvbmZpZ3NgIGFyZSBcIlJEU1wiLCBcIlJEU19UQ1BcIiwgYW5kIHBvdGVudGlhbGx5IFwiSU5FVFwiLiBUaGUgYEZvY3VzU3ltYm9sc2AgYXJlIFwicmRzX21lc3NhZ2VfbWFwX3BhZ2VzXCIgYW5kIFwicmRzX2NvbmdfdXBkYXRlX2FsbG9jXCIuIFRoZSBjaGVja3MgaW5kaWNhdGUgdGhhdCB3ZSBjYW4gZW5hYmxlIHRoZSBmdXp6aW5nIGNvbmZpZ3VyYXRpb24gd2l0aCBlaXRoZXIgdGhlIFtcIlJEU1wiLCBcIlJEU19UQ1BcIl0gb3IgW1wiUkRTXCIsIFwiUkRTX1RDUFwiLCBcIklORVRcIl0gY29uZmlndXJhdGlvbiBhbmQgY2FsbCBgc2V0LXJlc3VsdHNgLiBXaXRoIHRoZSBkZWZpbmVkIGNvbmZpZ3VyYXRpb25zLCBhbmQgZm9jdXMgc3ltYm9scywgdGhpcyBsb29rcyBsaWtlIGEgdmFsaWQgZnV6emluZyB0YXJnZXQhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg0NzMsIk91dHB1dFRva2VucyI6MTQ2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjczLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjU5LjM3MjQyNzMyOFoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNTAyNjMxMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUkRTXCIsXG4gICAgXCJSRFNfVENQXCIsXG4gICAgXCJJTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicmRzX21lc3NhZ2VfbWFwX3BhZ2VzXCIsXG4gICAgXCJyZHNfY29uZ191cGRhdGVfYWxsb2NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSBpbiBuZXQvcmRzL21lc3NhZ2UuYyB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGxlbmd0aCBmb3IgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkgYmFzZWQgb24gdG90YWxfbGVuIHJhdGhlciB0aGFuIHVuY29uZGl0aW9uYWxseSBzZXR0aW5nIFBBR0VfU0laRS4gVGhpcyBsb2dpYyBpcyBleGVjdXRlZCBkdXJpbmcgUkRTIGNvbmdlc3Rpb24gbWFwIGFsbG9jYXRpb24gKHJkc19jb25nX3VwZGF0ZV9hbGxvYykgYW5kIHRyYW5zbWlzc2lvbiwgd2hpY2ggaXMgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgQUZfUkRTIHNvY2tldHMgb3ZlciBSRFNfVENQLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlJEU1wiLFxuICAgIFwiUkRTX1RDUFwiLFxuICAgIFwiSU5FVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInJkc19tZXNzYWdlX21hcF9wYWdlc1wiLFxuICAgIFwicmRzX2NvbmdfdXBkYXRlX2FsbG9jXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKCkgaW4gbmV0L3Jkcy9tZXNzYWdlLmMgdG8gY2FsY3VsYXRlIHRoZSBzY2F0dGVybGlzdCBsZW5ndGggZm9yIHRoZSBsYXN0IHNjYXR0ZXJsaXN0IGVudHJ5IGJhc2VkIG9uIHRvdGFsX2xlbiByYXRoZXIgdGhhbiB1bmNvbmRpdGlvbmFsbHkgc2V0dGluZyBQQUdFX1NJWkUuIFRoaXMgbG9naWMgaXMgZXhlY3V0ZWQgZHVyaW5nIFJEUyBjb25nZXN0aW9uIG1hcCBhbGxvY2F0aW9uIChyZHNfY29uZ191cGRhdGVfYWxsb2MpIGFuZCB0cmFuc21pc3Npb24sIHdoaWNoIGlzIHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIEFGX1JEUyBzb2NrZXRzIG92ZXIgUkRTX1RDUC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6NTkuNDc3NDY0MjUxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTQ1MzUzNDYzNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjAzOjU5LjQ3ODM1MzcxMVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjQ5NDUyNjM2ODQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGVudHJ5IGxlbmd0aCBjb3JyZWN0bHkgZm9yIHRoZSBmaW5hbCBwYWdlIChzZXR0aW5nIGl0IHRvIHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKSBpbnN0ZWFkIG9mIFBBR0VfU0laRSkuIFRoZSBwYWdlcyBiZWluZyBtYXBwZWQgKGUuZy4sIGNvbmdlc3Rpb24gbWFwIHBhZ2VzIGluIHJkc19jb25nX2Zyb21fYWRkcigpKSBhcmUgYWxsb2NhdGVkIHVzaW5nIGdldF96ZXJvZWRfcGFnZSgpIGFuZCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIFRoZSBwYXRjaCBhZGp1c3RzIHNjYXR0ZXJsaXN0IGxlbmd0aC9ib3VuZHMgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgb3IgZXhwb3NpbmcgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXJzcGFjZS4gQW55IHBvdGVudGlhbCBidWZmZXIgYm91bmRzIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmcuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYWQ0MTI5NWFkODI4ZDVlZjYxNTk0M2E0YTk3NWFhNWFiZDQyMGUzY1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gU2VwIDYgMTY6MDM6MjYgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvcmRzL21lc3NhZ2UuYyBiL25ldC9yZHMvbWVzc2FnZS5jXG5pbmRleCBmMjVmMjU5MjU4NmY3Li40N2Q1ZTlhYjliMTA5IDEwMDY0NFxuLS0tIGEvbmV0L3Jkcy9tZXNzYWdlLmNcbisrKyBiL25ldC9yZHMvbWVzc2FnZS5jXG5AQCAtNDMxLDcgKzQzMSw5IEBAIHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGluXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBybS1cdTAwM2VkYXRhLm9wX25lbnRzOyArK2kpIHtcbiBcdFx0c2dfc2V0X3BhZ2UoXHUwMDI2cm0tXHUwMDNlZGF0YS5vcF9zZ1tpXSxcbiBcdFx0XHRcdHZpcnRfdG9fcGFnZSgodm9pZCAqKXBhZ2VfYWRkcnNbaV0pLFxuLVx0XHRcdFx0UEFHRV9TSVpFLCAwKTtcbitcdFx0XHRcdGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFcbitcdFx0XHRcdFx0PyB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSlcbitcdFx0XHRcdFx0OiBQQUdFX1NJWkUsIDApO1xuIFx0fVxuIFxuIFx0cmV0dXJuIHJtO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDM6NTkuNDc4MzU1MjYxWiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjEyOTQ4NzQ0OTcyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV2YWx1YXRpbmcgYSBMaW51eCBLZXJuZWwgUGF0Y2ggZm9yIEtNU0FOL0tBU0FOIFRlc3RpbmcqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZXNzIHRoaXMgTGludXgga2VybmVsIHBhdGNoIGZvciBpdHMgc3VpdGFiaWxpdHkgd2l0aCBLTVNBTiBhbmQgS0FTQU4uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IGFzc2VzcyB0aGUgcmlzay4gVGhpcyBpcyBhIGRlZmVuc2l2ZSB0YXNrIOKAkyBJJ20gZXNzZW50aWFsbHkgbG9va2luZyBhdCBhIHBhdGNoIHJlbGF0ZWQgdG8gdGVzdCBjb25maWd1cmF0aW9uLCB3aGljaCBpcyBnZW5lcmFsbHkgYmVuaWduLiBJJ20gbm90IHNlZWluZyBhbnkgcmVkIGZsYWdzIHJlZ2FyZGluZyBtYWx3YXJlIG9yIGV4cGxvaXQgZ2VuZXJhdGlvbiBoZXJlLCBzbyBJJ2QgY2xhc3NpZnkgdGhpcyBhcyBiZW5pZ24gc2VjdXJpdHkgZW5naW5lZXJpbmcuXG5cbk5vdywgbGV0J3MgZGl2ZSBpbnRvIHRoZSBwYXRjaCBpdHNlbGYuIEl0J3MgbW9kaWZ5aW5nIGBuZXQvcmRzL21lc3NhZ2UuY2AsIHNwZWNpZmljYWxseSB0aGUgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgZnVuY3Rpb24uIFRoZSBjb2RlIGRpZmYgc2hvd3MgYSBjaGFuZ2UgaW4gaG93IHBhZ2VzIGFyZSBtYXBwZWQgd2l0aGluIGEgbG9vcCwgc3BlY2lmaWNhbGx5IGNhbGN1bGF0aW5nIHRoZSBsZW5ndGggZm9yIHRoZSBTY2F0dGVyLUdhdGhlciBsaXN0IHVzaW5nIGB0b3RhbF9sZW5gLiBUaGUgbWFpbiBjb25jZXJuIGhlcmUgaXMgbWFraW5nIHN1cmUgdGhhdCB0aGUgbGFzdCBwYWdlIGlzIHNpemVkIGNvcnJlY3RseS5cblxuTXkgbmV4dCBzdGVwPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uIGluIGNvbnRleHQuIEknbGwgdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBjaGVjayB0aGUgYHJkc19tZXNzYWdlX21hcF9wYWdlc2AgZnVuY3Rpb24gYW5kIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBlc3BlY2lhbGx5IGl0cyBjYWxsZXJzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBpcyB1c2VkLCB0aGUgZGF0YSBpdCdzIGhhbmRsaW5nLCBhbmQgd2hhdCBjb3VsZCBwb3RlbnRpYWxseSBnbyB3cm9uZyB3aXRoIHRoaXMgbmV3IGxlbmd0aCBjYWxjdWxhdGlvbi4gVGhpcyB3aWxsIGhlbHAgbWUgYXNzZXNzIHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zLiBEb2VzIHRoaXMgY2hhbmdlIGludHJvZHVjZSBhbnkgYWxpZ25tZW50IGlzc3Vlcz8gRG9lcyBpdCBoYW5kbGUgcGFydGlhbCBwYWdlIHJlYWRzIGNvcnJlY3RseT8gVW5kZXJzdGFuZGluZyB0aGUgdXNhZ2UgY29udGV4dCBpcyBrZXkgdG8gZGV0ZXJtaW5pbmcgaWYgdGhpcyBwYXRjaCByZXF1aXJlcyBzcGVjaWFsaXplZCBLTVNBTi9LQVNBTiB0ZXN0aW5nIG9yIGlmIHRoZSBleGlzdGluZyBjb3ZlcmFnZSBpcyBzdWZmaWNpZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTE0LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIyLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDQ6MTIuNDI3MTAzMzAzWiIsIlNlcSI6MjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDc4MjMzMTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJkc19tZXNzYWdlX21hcF9wYWdlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvcmRzL2NvbmcuYz00MTg9c3RydWN0IHJkc19tZXNzYWdlICpyZHNfY29uZ191cGRhdGVfYWxsb2Moc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKVxcbi0tXFxubmV0L3Jkcy9jb25nLmMtNDIyLVxcbm5ldC9yZHMvY29uZy5jOjQyMzpcXHRybSA9IHJkc19tZXNzYWdlX21hcF9wYWdlcyhtYXAtXFx1MDAzZW1fcGFnZV9hZGRycywgUkRTX0NPTkdfTUFQX0JZVEVTKTtcXG5uZXQvcmRzL2NvbmcuYy00MjQtXFx0aWYgKCFJU19FUlIocm0pKVxcbi0tXFxubmV0L3Jkcy9tZXNzYWdlLmM9Mzg3PXN0cnVjdCBzY2F0dGVybGlzdCAqcmRzX21lc3NhZ2VfYWxsb2Nfc2dzKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIGludCBuZW50cylcXG4tLVxcbm5ldC9yZHMvbWVzc2FnZS5jLTQwOS1cXG5uZXQvcmRzL21lc3NhZ2UuYzo0MTA6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW50IHRvdGFsX2xlbilcXG5uZXQvcmRzL21lc3NhZ2UuYy00MTEte1xcbi0tXFxubmV0L3Jkcy9yZHMuaD05MDA9aW50IHJkc19tZXNzYWdlX2NvcHlfZnJvbV91c2VyKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSxcXG5uZXQvcmRzL3Jkcy5oLTkwMS1cXHRcXHRcXHQgICAgICAgYm9vbCB6Y29weSk7XFxubmV0L3Jkcy9yZHMuaDo5MDI6c3RydWN0IHJkc19tZXNzYWdlICpyZHNfbWVzc2FnZV9tYXBfcGFnZXModW5zaWduZWQgbG9uZyAqcGFnZV9hZGRycywgdW5zaWduZWQgaW50IHRvdGFsX2xlbik7XFxubmV0L3Jkcy9yZHMuaC05MDMtdm9pZCByZHNfbWVzc2FnZV9wb3B1bGF0ZV9oZWFkZXIoc3RydWN0IHJkc19oZWFkZXIgKmhkciwgX19iZTE2IHNwb3J0LFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowNDoxNC45MDUzNDE3NTJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjE5NjE1NjIyOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czpcblxuKipEaXZpbmcgaW50byBSRFMgQ29uZ2VzdGlvbiBDb250cm9sKipcblxuT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiB3aXRoIHRoZXNlIGNvbmdlc3Rpb24gaXNzdWVzLiBMZXQncyBzdGFydCB3aXRoIHRoZSBsb3ctbGV2ZWwgc3R1ZmYuIEknbSBnb2luZyB0byBqdW1wIGludG8gdGhlIGBuZXQvcmRzL21lc3NhZ2UuY2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDQxMC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgZW50cnkgcG9pbnQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGluZyBsb2dpYy4gSSB3YW50IHRvIHNlZSBob3cgbWVzc2FnZXMgYXJlIGJlaW5nIG1hbmFnZWQgYXQgYSBmdW5kYW1lbnRhbCBsZXZlbCDigJMgaXQncyBvZnRlbiB0aGUgcm9vdCBvZiBjb25nZXN0aW9uIHByb2JsZW1zLiBUaGVuLCBJJ2xsIHN3aXRjaCBnZWFycyBhbmQgaGVhZCBvdmVyIHRvIGBuZXQvcmRzL2NvbmcuY2AgYXJvdW5kIGxpbmUgNDE4LiBUaGF0J3Mgd2hlcmUgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG1zIHNob3VsZCBiZSBpbXBsZW1lbnRlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRob3NlIGFsZ29yaXRobXMgYXJlIGJlaGF2aW5nIHVuZGVyIHN0cmVzcy4gQnkgY3Jvc3MtcmVmZXJlbmNpbmcgdGhlc2UgdHdvIGFyZWFzLCBJIHNob3VsZCBnZXQgYSBwcmV0dHkgc29saWQgcGljdHVyZSBvZiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBtZXNzYWdlIGhhbmRsaW5nIGFuZCBjb25nZXN0aW9uIG1hbmFnZW1lbnQgd2l0aGluIHRoZSBSRFMgc3RhY2suIFRoaXMgbG9va3MgbGlrZSBhIHByb21pc2luZyBzdHJhdGVneSBmb3IgZ2V0dGluZyB0byB0aGUgaGVhcnQgb2YgdGhlIHByb2JsZW0uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMxNTEsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowNDoxNy4xMDE1MDA3N1oiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MTc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcmRzL21lc3NhZ2UuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MDUsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0MDU6XFx0XFx0cm0tXFx1MDAzZW1fdXNlZF9zZ3MgKz0gbmVudHM7XFxuIDQwNjpcXHRcXG4gNDA3OlxcdFxcdHJldHVybiBzZ19yZXQ7XFxuIDQwODpcXHR9XFxuIDQwOTpcXHRcXG4gNDEwOlxcdHN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKHVuc2lnbmVkIGxvbmcgKnBhZ2VfYWRkcnMsIHVuc2lnbmVkIGludCB0b3RhbF9sZW4pXFxuIDQxMTpcXHR7XFxuIDQxMjpcXHRcXHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJtO1xcbiA0MTM6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuIDQxNDpcXHRcXHRpbnQgbnVtX3NncyA9IERJVl9ST1VORF9VUCh0b3RhbF9sZW4sIFBBR0VfU0laRSk7XFxuIDQxNTpcXHRcXHRpbnQgZXh0cmFfYnl0ZXMgPSBudW1fc2dzICogc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7XFxuIDQxNjpcXHRcXG4gNDE3OlxcdFxcdHJtID0gcmRzX21lc3NhZ2VfYWxsb2MoZXh0cmFfYnl0ZXMsIEdGUF9OT1dBSVQpO1xcbiA0MTg6XFx0XFx0aWYgKCFybSlcXG4gNDE5OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiA0MjA6XFx0XFxuIDQyMTpcXHRcXHRzZXRfYml0KFJEU19NU0dfUEFHRVZFQywgXFx1MDAyNnJtLVxcdTAwM2VtX2ZsYWdzKTtcXG4gNDIyOlxcdFxcdHJtLVxcdTAwM2VtX2luYy5pX2hkci5oX2xlbiA9IGNwdV90b19iZTMyKHRvdGFsX2xlbik7XFxuIDQyMzpcXHRcXHRybS1cXHUwMDNlZGF0YS5vcF9uZW50cyA9IERJVl9ST1VORF9VUCh0b3RhbF9sZW4sIFBBR0VfU0laRSk7XFxuIDQyNDpcXHRcXHRybS1cXHUwMDNlZGF0YS5vcF9zZyA9IHJkc19tZXNzYWdlX2FsbG9jX3NncyhybSwgbnVtX3Nncyk7XFxuIDQyNTpcXHRcXHRpZiAoSVNfRVJSKHJtLVxcdTAwM2VkYXRhLm9wX3NnKSkge1xcbiA0MjY6XFx0XFx0XFx0dm9pZCAqZXJyID0gRVJSX0NBU1Qocm0tXFx1MDAzZWRhdGEub3Bfc2cpO1xcbiA0Mjc6XFx0XFx0XFx0cmRzX21lc3NhZ2VfcHV0KHJtKTtcXG4gNDI4OlxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDQyOTpcXHRcXHR9XFxuIDQzMDpcXHRcXG4gNDMxOlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBybS1cXHUwMDNlZGF0YS5vcF9uZW50czsgKytpKSB7XFxuIDQzMjpcXHRcXHRcXHRzZ19zZXRfcGFnZShcXHUwMDI2cm0tXFx1MDAzZWRhdGEub3Bfc2dbaV0sXFxuIDQzMzpcXHRcXHRcXHRcXHRcXHR2aXJ0X3RvX3BhZ2UoKHZvaWQgKilwYWdlX2FkZHJzW2ldKSxcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdGkgPT0gcm0tXFx1MDAzZWRhdGEub3BfbmVudHMgLSAxXFxuIDQzNTpcXHRcXHRcXHRcXHRcXHRcXHQ/IHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKVxcbiA0MzY6XFx0XFx0XFx0XFx0XFx0XFx0OiBQQUdFX1NJWkUsIDApO1xcbiA0Mzc6XFx0XFx0fVxcbiA0Mzg6XFx0XFxuIDQzOTpcXHRcXHRyZXR1cm4gcm07XFxuIDQ0MDpcXHR9XFxuIDQ0MTpcXHRcXG4gNDQyOlxcdHN0YXRpYyBpbnQgcmRzX21lc3NhZ2VfemNvcHlfZnJvbV91c2VyKHN0cnVjdCByZHNfbWVzc2FnZSAqcm0sIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSlcXG4gNDQzOlxcdHtcXG4gNDQ0OlxcdFxcdHN0cnVjdCBzY2F0dGVybGlzdCAqc2c7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjE3LjEwMTU5NDU3WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMwMDU4NTcwOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBSRFMgQ29uZ2VzdGlvbiBDb250cm9sKipcblxuT2theSwgc28gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyBSRFMncyBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtIGhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24sIHNwZWNpZmljYWxseSB3aGVuIHVwZGF0ZXMgYXJlIG5lZWRlZC4gVGhlIHBsYWNlIHRvIHN0YXJ0IGlzIGBuZXQvcmRzL2NvbmcuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgcmRzX2NvbmdfdXBkYXRlX2FsbG9jYCBhY3R1YWxseSBmdW5jdGlvbnMuIEknbSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gYW5kIGBSRFNfQ09OR19NQVBfQllURVNgLiBJIHN1c3BlY3QgdGhlIGxhdHRlciBwbGF5cyBhIGtleSByb2xlIGluIGRlZmluaW5nIHRoZSBncmFudWxhcml0eSBvciBzaXplIG9mIHRoZSBjb25nZXN0aW9uIG1hcCwgYnV0IGxldCdzIGNvbmZpcm0gdGhhdCBieSByZXZpZXdpbmcgdGhlIGNvZGUgYW5kIGZpZ3VyaW5nIG91dCB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneS4gSSB3YW50IHRvIHNlZSBob3cgdGhpcyBhZmZlY3RzIG92ZXJhbGwgbmV0d29yayBwZXJmb3JtYW5jZSBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIG90aGVyIGNvbmdlc3Rpb24gY29udHJvbCBhc3BlY3RzLiBUaW1lIHRvIGRpZyBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDEyNywiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDQ6MjAuMTA3NDU0MDA2WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMDE2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcmRzL2NvbmcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0MTUsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0MTU6XFx0LypcXG4gNDE2OlxcdCAqIEFsbG9jYXRlIGEgUkRTIG1lc3NhZ2UgY29udGFpbmluZyBhIGNvbmdlc3Rpb24gdXBkYXRlLlxcbiA0MTc6XFx0ICovXFxuIDQxODpcXHRzdHJ1Y3QgcmRzX21lc3NhZ2UgKnJkc19jb25nX3VwZGF0ZV9hbGxvYyhzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4pXFxuIDQxOTpcXHR7XFxuIDQyMDpcXHRcXHRzdHJ1Y3QgcmRzX2NvbmdfbWFwICptYXAgPSBjb25uLVxcdTAwM2VjX2xjb25nO1xcbiA0MjE6XFx0XFx0c3RydWN0IHJkc19tZXNzYWdlICpybTtcXG4gNDIyOlxcdFxcbiA0MjM6XFx0XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxuIDQyNDpcXHRcXHRpZiAoIUlTX0VSUihybSkpXFxuIDQyNTpcXHRcXHRcXHRybS1cXHUwMDNlbV9pbmMuaV9oZHIuaF9mbGFncyA9IFJEU19GTEFHX0NPTkdfQklUTUFQO1xcbiA0MjY6XFx0XFxuIDQyNzpcXHRcXHRyZXR1cm4gcm07XFxuIDQyODpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjIwLjEwNzU2NTUzNVoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTYyMTA4Mjk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgYG5ldC9yZHMvY29uZy5jYCBlbGVtZW50czpcblxuKipEaXNzZWN0aW5nIGBSRFNfQ09OR19NQVBfQllURVNgIGFuZCBgcmRzX2NvbmdfbWFwYCBpbiBgbmV0L3Jkcy9jb25nLmNgKipcblxuQWxyaWdodCwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IFJEUyAoUmVsaWFibGUgRGF0YWdyYW0gU29ja2V0cykgaGFuZGxlcyBjb25nZXN0aW9uIGNvbnRyb2wgYXQgYSBmdW5kYW1lbnRhbCBsZXZlbC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gYFJEU19DT05HX01BUF9CWVRFU2AgYW5kIGByZHNfY29uZ19tYXBgIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGBuZXQvcmRzL2NvbmcuY2Agc291cmNlIGZpbGUuIFRoZXNlIG5hbWVzIHN0cm9uZ2x5IHN1Z2dlc3QgdGhleSdyZSBjZW50cmFsIHRvIGhvdyB0aGUgUkRTIGltcGxlbWVudGF0aW9uIG1hcHMgb3IgcmVwcmVzZW50cyBjb25nZXN0aW9uIGluZm9ybWF0aW9uLlxuXG5gUkRTX0NPTkdfTUFQX0JZVEVTYCBwcm9iYWJseSBkZWZpbmVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgYSBjb25nZXN0aW9uIG1hcCBvciBzdHJ1Y3R1cmUuIFRoaXMgaW1wbGllcyBhIGZpeGVkLXNpemUgZGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgY29uZ2VzdGlvbiBzdGF0ZS4gSSdtIGltbWVkaWF0ZWx5IGN1cmlvdXMgYWJvdXQgdGhlIHNjYWxpbmcgaW1wbGljYXRpb25zIGhlcmU7IGlzIHRoaXMgc2l6ZSBzdGF0aWNhbGx5IGRlZmluZWQsIGFuZCBpZiBzbywgaG93IGRvZXMgdGhhdCBpbXBhY3QgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZsb3dzIG9yIGNvbm5lY3Rpb25zIHRoZSBzeXN0ZW0gY2FuIGVmZmVjdGl2ZWx5IG1hbmFnZSB3aXRob3V0IHNpZ25pZmljYW50IGZyYWdtZW50YXRpb24gb3IgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24/IElzIGl0IGEgcG93ZXIgb2YgdHdvLCBvciBzb21lIG90aGVyIGNhbGN1bGF0ZWQgdmFsdWU/IFdoYXQncyB0aGUganVzdGlmaWNhdGlvbiBmb3IgdGhlIHNpemUgY2hvc2VuP1xuXG5gcmRzX2NvbmdfbWFwYCBpcyBsaWtlbHkgdGhlIGFjdHVhbCBkYXRhIHN0cnVjdHVyZSBvciBhbiBpbnN0YW5jZSBvZiB0aGUgY29uZ2VzdGlvbiBtYXAuIFRoaXMgdmFyaWFibGUgcHJvYmFibHkgaG9sZHMgdGhlIHJlYWwtdGltZSBjb25nZXN0aW9uIHN0YXRlIGZvciB0aGUgbmV0d29yay4gSSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBraW5kIG9mIGRhdGEgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYHJkc19jb25nX21hcGAuIElzIGl0IGEgYml0bWFzaywgYSBsb29rdXAgdGFibGUsIGFuIGFycmF5IG9mIGNvdW50ZXJzLCBvciBzb21ldGhpbmcgbW9yZSBjb21wbGV4PyBJIG5lZWQgdG8gYW5hbHl6ZSBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIGNsb3NlbHkuIFdoYXQgbWV0cmljcyBhcmUgYmVpbmcgc3RvcmVkIChlLmcuLCByZXRyYW5zbWlzc2lvbiBjb3VudHMsIHJvdW5kLXRyaXAgdGltZXMsIHF1ZXVlIGxlbmd0aHMsIHBhY2tldCBsb3NzLCBldGMuKT8gSG93IGlzIHRoZSBtYXAgdXBkYXRlZCwgYWNjZXNzZWQsIGFuZCBtb2RpZmllZD8gV2hhdCBhcmUgdGhlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIChsb2NrcywgYXRvbWljIG9wZXJhdGlvbnMsIGV0Yy4pIHVzZWQgdG8gcHJvdGVjdCB0aGlzIHNoYXJlZCBkYXRhLCBlc3BlY2lhbGx5IGluIGEgbXVsdGktdGhyZWFkZWQgb3IgbXVsdGktQ1BVIGVudmlyb25tZW50P1xuXG5JJ2xsIGJlIGxvb2tpbmcgZm9yIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSB0d28g4oCTIHRoZSBkZWZpbmVkIHNpemUgYW5kIHRoZSBjb25jcmV0ZSBkYXRhIHN0cnVjdHVyZSDigJMgdG8gZ2V0IGEgY29tcGxldGUgcGljdHVyZSBvZiBSRFMncyBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtLiBVbmRlcnN0YW5kaW5nIHRoZWlyIHJlbGF0aW9uc2hpcCB3aWxsIHByb3ZpZGUgaW5zaWdodHMgaW50byBtZW1vcnkgdXNhZ2UsIHNjYWxhYmlsaXR5LCBhbmQgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzLiBJIHN1c3BlY3QgdGhleSBhcmUgdGhlIGJhY2tib25lIG9mIFJEUydzIGNvbmdlc3Rpb24gcmVzcG9uc2UgbG9naWMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ2MTIsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjIzLjY2OTY3ODQ0NVoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ3MDA4MDQyOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJSRFNfQ09OR19NQVBfQllURVNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQyMi1cXG5uZXQvcmRzL2NvbmcuYzo0MjM6XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxubmV0L3Jkcy9jb25nLmMtNDI0LVxcdGlmICghSVNfRVJSKHJtKSlcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jLTc5OC1cXHQvKiBjYXRjaCBjb21wbGV0ZWx5IGNvcnJ1cHQgcGFja2V0cyAqL1xcbm5ldC9yZHMvaWJfcmVjdi5jOjc5OTpcXHRpZiAoYmUzMl90b19jcHUoaWJpbmMtXFx1MDAzZWlpX2luYy5pX2hkci5oX2xlbikgIT0gUkRTX0NPTkdfTUFQX0JZVEVTKVxcbm5ldC9yZHMvaWJfcmVjdi5jLTgwMC1cXHRcXHRyZXR1cm47XFxuLS1cXG5uZXQvcmRzL2liX3JlY3YuYy04MTAtXFxubmV0L3Jkcy9pYl9yZWN2LmM6ODExOlxcdHdoaWxlIChjb3BpZWQgXFx1MDAzYyBSRFNfQ09OR19NQVBfQllURVMpIHtcXG5uZXQvcmRzL2liX3JlY3YuYy04MTItXFx0XFx0X19sZTY0ICpzcmMsICpkc3Q7XFxuLS1cXG5uZXQvcmRzL2liX3NlbmQuYz00ODY9aW50IHJkc19pYl94bWl0KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IHJkc19tZXNzYWdlICpybSxcXG4tLVxcbm5ldC9yZHMvaWJfc2VuZC5jLTUxNS1cXHRcXHRzY2F0ID0gXFx1MDAyNnJtLVxcdTAwM2VkYXRhLm9wX3NnW3NnXTtcXG5uZXQvcmRzL2liX3NlbmQuYzo1MTY6XFx0XFx0cmV0ID0gbWF4X3QoaW50LCBSRFNfQ09OR19NQVBfQllURVMsIHNjYXQtXFx1MDAzZWxlbmd0aCk7XFxubmV0L3Jkcy9pYl9zZW5kLmMtNTE3LVxcdFxcdHJldHVybiBzaXplb2Yoc3RydWN0IHJkc19oZWFkZXIpICsgcmV0O1xcbi0tXFxubmV0L3Jkcy9yZHMuaD00OD12b2lkIHJkc2RlYnVnKGNoYXIgKmZtdCwgLi4uKVxcbi0tXFxubmV0L3Jkcy9yZHMuaC01OC1cXG5uZXQvcmRzL3Jkcy5oOjU5OiNkZWZpbmUgUkRTX0NPTkdfTUFQX0JZVEVTXFx0KDY1NTM2IC8gOClcXG5uZXQvcmRzL3Jkcy5oOjYwOiNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VTXFx0KFBBR0VfQUxJR04oUkRTX0NPTkdfTUFQX0JZVEVTKSAvIFBBR0VfU0laRSlcXG5uZXQvcmRzL3Jkcy5oLTYxLSNkZWZpbmUgUkRTX0NPTkdfTUFQX1BBR0VfQklUU1xcdChQQUdFX1NJWkUgKiA4KVxcbi0tXFxubmV0L3Jkcy90Y3BfcmVjdi5jPTEwNj1zdGF0aWMgdm9pZCByZHNfdGNwX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXFxuLS1cXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTE2LVxcdC8qIGNhdGNoIGNvbXBsZXRlbHkgY29ycnVwdCBwYWNrZXRzICovXFxubmV0L3Jkcy90Y3BfcmVjdi5jOjExNzpcXHRpZiAoYmUzMl90b19jcHUodGluYy1cXHUwMDNldGlfaW5jLmlfaGRyLmhfbGVuKSAhPSBSRFNfQ09OR19NQVBfQllURVMpXFxubmV0L3Jkcy90Y3BfcmVjdi5jLTExOC1cXHRcXHRyZXR1cm47XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjI2LjEzOTc2OTcyNFoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0ODAzODg5Njc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBTY2F0dGVybGlzdCBMZW5ndGhzIGluIFJEUyBDb25nZXN0aW9uIE1hcHBpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEl0IHNlZW1zIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHNwZWNpZmljIGlzc3VlIHJlbGF0ZWQgdG8gaG93IHNjYXR0ZXJsaXN0IGVudHJpZXMgYXJlIGNvbnN0cnVjdGVkIHdpdGhpbiB0aGUgUkRTIGNvbmdlc3Rpb24gbWFwcGluZyBtZWNoYW5pc20uIFRoZSBjb3JlIG9mIGl0IGFwcGVhcnMgdG8gc3RlbSBmcm9tIGEgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGUgYWxsb2NhdGVkIHNpemUgZm9yIGNvbmdlc3Rpb24gbWFwcyBhbmQgdGhlIHNpemVzIHRoZXNlIG1hcHMgYXJlICphY3R1YWxseSogdXNpbmcsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggZGlmZmVyZW50IHBhZ2Ugc2l6ZXMgYWNyb3NzIGFyY2hpdGVjdHVyZXMuXG5cblNvLCBgUkRTX0NPTkdfTUFQX0JZVEVTYCBpcyBkZWZpbmVkIGFzIDgxOTIgYnl0ZXMsIHdoaWNoIG1ha2VzIHNlbnNlOyBJIHNlZSBob3cgdGhhdCBudW1iZXIgaXMgY2FsY3VsYXRlZC4gTm93LCBvbiBzeXN0ZW1zIHdpdGggYSBzdGFuZGFyZCA0S0IgcGFnZSBzaXplIChsaWtlIGFtZDY0KSwgdGhpcyA4MTkyIGJ5dGVzIHRyYW5zbGF0ZXMgdG8gZXhhY3RseSB0d28gcGFnZXMuIE5vIGJpZyBkZWFsLiBIb3dldmVyLCB0aGUgd3JpbmtsZSBhcHBlYXJzIHdpdGggNjRLQiBwYWdlIHNpemUgc3lzdGVtcyAobGlrZSBzb21lIGFybTY0IGFuZCBwcGM2NCBjb25maWd1cmF0aW9ucykuIEhlcmUsIGBSRFNfQ09OR19NQVBfQllURVNgIGlzICpzdGlsbCogODE5MiwgYnV0IGBQQUdFX1NJWkVgIGlzIGEgbWFzc2l2ZSA2NTUzNi5cblxuVGhlIHByZS1wYXRjaCBjb2RlLCBpbiBgc2dfc2V0X3BhZ2VgLCB3YXMgaW5kaXNjcmltaW5hdGVseSBzZXR0aW5nIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggdG8gYFBBR0VfU0laRWAuIFRoaXMgaXMgd2hlcmUgdGhlIHByb2JsZW0gbGllcy4gV2hlbiBgUEFHRV9TSVpFYCBpcyA2NEtCLCB3aGlsZSBgdG90YWxfbGVuYCBtaWdodCBiZSBvbmx5IDgxOTIgYnl0ZXMsIHRoaXMgc2V0IHRoZSBlbnRyeSdzIGxlbmd0aCBmYXIgdG9vIGhpZ2gsIHBvdGVudGlhbGx5IGNhdXNpbmcgbWVtb3J5IG92ZXJydW5zIHdoZW4gcmVhZGluZyB0aGUgc2NhdHRlcmxpc3QgZW50cmllcy4gVGhlIHNhbWUgcHJvYmxlbSB3b3VsZCBvY2N1ciBvbiBhcmNoaXRlY3R1cmVzIHdoZXJlIGB0b3RhbF9sZW5gIGlzIG5vdCBhIG11bHRpcGxlIG9mIGBQQUdFX1NJWkVgLlxuXG5JdCBsb29rcyBsaWtlIHRoZSBwYXRjaCBjb3JyZWN0cyB0aGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGZvciB0aGUgKmxhc3QqIHNjYXR0ZXJsaXN0IGVudHJ5IHRvIGJlIHRoZSByZW1haW5kZXIgc2l6ZSwgYHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKWAsIGluc3RlYWQgb2Ygc2ltcGx5IGBQQUdFX1NJWkVgLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbGFzdCBlbnRyeSBjb3JyZWN0bHkgcmVmbGVjdHMgdGhlIGFjdHVhbCBieXRlcyBhbGxvY2F0ZWQuXG5cbkkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGlzIGlzIGFib3V0IGJvdW5kcywgYnVmZmVyIHNpemluZywgYW5kIHBvc3NpYmxlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy5cblxuTm93LCBJJ20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRoaXMgYXBwbGllcyB0byBzZW5kaW5nIG9yIG1hcHBpbmcgcGFnZXMuIEkga25vdyB0aGF0IGByZHNfbWVzc2FnZV9tYXBfcGFnZXNgIGNvbWVzIGludG8gcGxheS4gSSBuZWVkIHRvIHRyYWNlIGhvdyBgbWFwLVx1MDAzZW1fcGFnZV9hZGRyc2AgaXMgYWxsb2NhdGVkIHdpdGhpbiBgcmRzX2NvbmdfbWFwYCB0byB1bmRlcnN0YW5kIHRoZSBiaWdnZXIgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTg4MywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowNDozMC45NDM2NjQwNDNaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyNjA0OTUzODQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibV9wYWdlX2FkZHJzXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9yZHMvY29uZy5jPTEzOD1zdGF0aWMgc3RydWN0IHJkc19jb25nX21hcCAqcmRzX2NvbmdfZnJvbV9hZGRyKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTE1Ny1cXHRcXHRcXHRnb3RvIG91dDtcXG5uZXQvcmRzL2NvbmcuYzoxNTg6XFx0XFx0bWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnNbaV0gPSB6cDtcXG5uZXQvcmRzL2NvbmcuYy0xNTktXFx0fVxcbi0tXFxubmV0L3Jkcy9jb25nLmMtMTcxLVxcdGlmIChtYXApIHtcXG5uZXQvcmRzL2NvbmcuYzoxNzI6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFJEU19DT05HX01BUF9QQUdFUyBcXHUwMDI2XFx1MDAyNiBtYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXTsgaSsrKVxcbm5ldC9yZHMvY29uZy5jOjE3MzpcXHRcXHRcXHRmcmVlX3BhZ2UobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xcbm5ldC9yZHMvY29uZy5jLTE3NC1cXHRcXHRrZnJlZShtYXApO1xcbi0tXFxubmV0L3Jkcy9jb25nLmM9Mjk5PXZvaWQgcmRzX2Nvbmdfc2V0X2JpdChzdHJ1Y3QgcmRzX2NvbmdfbWFwICptYXAsIF9fYmUxNiBwb3J0KVxcbi0tXFxubmV0L3Jkcy9jb25nLmMtMzA5LVxcbm5ldC9yZHMvY29uZy5jOjMxMDpcXHRzZXRfYml0X2xlKG9mZiwgKHZvaWQgKiltYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XFxubmV0L3Jkcy9jb25nLmMtMzExLX1cXG4tLVxcbm5ldC9yZHMvY29uZy5jPTMxMz12b2lkIHJkc19jb25nX2NsZWFyX2JpdChzdHJ1Y3QgcmRzX2NvbmdfbWFwICptYXAsIF9fYmUxNiBwb3J0KVxcbi0tXFxubmV0L3Jkcy9jb25nLmMtMzIzLVxcbm5ldC9yZHMvY29uZy5jOjMyNDpcXHRjbGVhcl9iaXRfbGUob2ZmLCAodm9pZCAqKW1hcC1cXHUwMDNlbV9wYWdlX2FkZHJzW2ldKTtcXG5uZXQvcmRzL2NvbmcuYy0zMjUtfVxcbi0tXFxubmV0L3Jkcy9jb25nLmM9MzI3PXN0YXRpYyBpbnQgcmRzX2NvbmdfdGVzdF9iaXQoc3RydWN0IHJkc19jb25nX21hcCAqbWFwLCBfX2JlMTYgcG9ydClcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTMzNC1cXG5uZXQvcmRzL2NvbmcuYzozMzU6XFx0cmV0dXJuIHRlc3RfYml0X2xlKG9mZiwgKHZvaWQgKiltYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXSk7XFxubmV0L3Jkcy9jb25nLmMtMzM2LX1cXG4tLVxcbm5ldC9yZHMvY29uZy5jPTM5OT12b2lkIHJkc19jb25nX2V4aXQodm9pZClcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQwOC1cXHRcXHRyYl9lcmFzZShcXHUwMDI2bWFwLVxcdTAwM2VtX3JiX25vZGUsIFxcdTAwMjZyZHNfY29uZ190cmVlKTtcXG5uZXQvcmRzL2NvbmcuYzo0MDk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFJEU19DT05HX01BUF9QQUdFUyBcXHUwMDI2XFx1MDAyNiBtYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXTsgaSsrKVxcbm5ldC9yZHMvY29uZy5jOjQxMDpcXHRcXHRcXHRmcmVlX3BhZ2UobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xcbm5ldC9yZHMvY29uZy5jLTQxMS1cXHRcXHRrZnJlZShtYXApO1xcbi0tXFxubmV0L3Jkcy9jb25nLmM9NDE4PXN0cnVjdCByZHNfbWVzc2FnZSAqcmRzX2NvbmdfdXBkYXRlX2FsbG9jKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubilcXG4tLVxcbm5ldC9yZHMvY29uZy5jLTQyMi1cXG5uZXQvcmRzL2NvbmcuYzo0MjM6XFx0cm0gPSByZHNfbWVzc2FnZV9tYXBfcGFnZXMobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnMsIFJEU19DT05HX01BUF9CWVRFUyk7XFxubmV0L3Jkcy9jb25nLmMtNDI0LVxcdGlmICghSVNfRVJSKHJtKSlcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jPTc4NT1zdGF0aWMgdm9pZCByZHNfaWJfY29uZ19yZWN2KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubixcXG4tLVxcbm5ldC9yZHMvaWJfcmVjdi5jLTgyMC1cXHRcXHRzcmMgPSBhZGRyICsgZnJhZy1cXHUwMDNlZl9zZy5vZmZzZXQgKyBmcmFnX29mZjtcXG5uZXQvcmRzL2liX3JlY3YuYzo4MjE6XFx0XFx0ZHN0ID0gKHZvaWQgKiltYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1ttYXBfcGFnZV0gKyBtYXBfb2ZmO1xcbm5ldC9yZHMvaWJfcmVjdi5jLTgyMi1cXHRcXHRmb3IgKGsgPSAwOyBrIFxcdTAwM2MgdG9fY29weTsgayArPSA4KSB7XFxuLS1cXG5uZXQvcmRzL3Jkcy5oPTYzPXN0cnVjdCByZHNfY29uZ19tYXAge1xcbi0tXFxubmV0L3Jkcy9yZHMuaC02Ny1cXHRzdHJ1Y3QgbGlzdF9oZWFkXFx0bV9jb25uX2xpc3Q7XFxubmV0L3Jkcy9yZHMuaDo2ODpcXHR1bnNpZ25lZCBsb25nXFx0XFx0bV9wYWdlX2FkZHJzW1JEU19DT05HX01BUF9QQUdFU107XFxubmV0L3Jkcy9yZHMuaC02OS19O1xcbi0tXFxubmV0L3Jkcy90Y3BfcmVjdi5jPTEwNj1zdGF0aWMgdm9pZCByZHNfdGNwX2NvbmdfcmVjdihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sXFxuLS1cXG5uZXQvcmRzL3RjcF9yZWN2LmMtMTMzLVxcdFxcdFxcdHJldCA9IHNrYl9jb3B5X2JpdHMoc2tiLCBza2Jfb2ZmLFxcbm5ldC9yZHMvdGNwX3JlY3YuYzoxMzQ6XFx0XFx0XFx0XFx0KHZvaWQgKiltYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1ttYXBfcGFnZV0gKyBtYXBfb2ZmLFxcbm5ldC9yZHMvdGNwX3JlY3YuYy0xMzUtXFx0XFx0XFx0XFx0dG9fY29weSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDE2OjA0OjMzLjIwNDE2NDcwNloiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzI1ODYwNTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6XG5cbioqRGlnZ2luZyBpbnRvIFJEUyBDb25nZXN0aW9uIENvbnRyb2wqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyB3aXRoIGNvbmdlc3Rpb24gY29udHJvbCBpbiBSRFMuIE15IHN0YXJ0aW5nIHBvaW50IGlzIHRoZSBmdW5jdGlvbiBgcmRzX2NvbmdfZnJvbV9hZGRyYCwgYW5kIEknbSBmb2N1c2luZyBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMTM4IGluIGBuZXQvcmRzL2NvbmcuY2AuIEkgZXhwZWN0IHRoYXQgYXJlYSB0byBnaXZlIG1lIHNvbWUgaW5zaWdodCBpbnRvIGhvdyB0aGUgc3lzdGVtIG1hcHMgYWRkcmVzc2VzIHRvIGNvbmdlc3Rpb24gc3RhdGUuIEhvcGVmdWxseSwgSSdsbCBmaW5kIHNvbWUgaGludHMgYWJvdXQgaG93IHRoZSBjb25nZXN0aW9uIGFsZ29yaXRobXMgYXJlIHN0cnVjdHVyZWQuIEknbSBsb29raW5nIGZvciB0aGUga2V5IGRhdGEgc3RydWN0dXJlcyBhbmQgYW55IGludGVyZXN0aW5nIGxvZ2ljIHJlbGF0ZWQgdG8gYWRkcmVzcy1iYXNlZCBjb25nZXN0aW9uLiBMZXQncyBzZWUgd2hhdCdzIHRoZXJlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc5MzcsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQxNjowNDozNS41MzAwMjgxNDZaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMyMzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9yZHMvY29uZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEzOCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDEzODpcXHRzdGF0aWMgc3RydWN0IHJkc19jb25nX21hcCAqcmRzX2NvbmdfZnJvbV9hZGRyKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcilcXG4gMTM5OlxcdHtcXG4gMTQwOlxcdFxcdHN0cnVjdCByZHNfY29uZ19tYXAgKm1hcDtcXG4gMTQxOlxcdFxcdHN0cnVjdCByZHNfY29uZ19tYXAgKnJldCA9IE5VTEw7XFxuIDE0MjpcXHRcXHR1bnNpZ25lZCBsb25nIHpwO1xcbiAxNDM6XFx0XFx0dW5zaWduZWQgbG9uZyBpO1xcbiAxNDQ6XFx0XFx0dW5zaWduZWQgbG9uZyBmbGFncztcXG4gMTQ1OlxcdFxcbiAxNDY6XFx0XFx0bWFwID0ga3phbGxvY19vYmooc3RydWN0IHJkc19jb25nX21hcCk7XFxuIDE0NzpcXHRcXHRpZiAoIW1hcClcXG4gMTQ4OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAxNDk6XFx0XFxuIDE1MDpcXHRcXHRtYXAtXFx1MDAzZW1fYWRkciA9ICphZGRyO1xcbiAxNTE6XFx0XFx0aW5pdF93YWl0cXVldWVfaGVhZChcXHUwMDI2bWFwLVxcdTAwM2VtX3dhaXRxKTtcXG4gMTUyOlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtYXAtXFx1MDAzZW1fY29ubl9saXN0KTtcXG4gMTUzOlxcdFxcbiAxNTQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFJEU19DT05HX01BUF9QQUdFUzsgaSsrKSB7XFxuIDE1NTpcXHRcXHRcXHR6cCA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcXG4gMTU2OlxcdFxcdFxcdGlmICh6cCA9PSAwKVxcbiAxNTc6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuIDE1ODpcXHRcXHRcXHRtYXAtXFx1MDAzZW1fcGFnZV9hZGRyc1tpXSA9IHpwO1xcbiAxNTk6XFx0XFx0fVxcbiAxNjA6XFx0XFxuIDE2MTpcXHRcXHRzcGluX2xvY2tfaXJxc2F2ZShcXHUwMDI2cmRzX2NvbmdfbG9jaywgZmxhZ3MpO1xcbiAxNjI6XFx0XFx0cmV0ID0gcmRzX2NvbmdfdHJlZV93YWxrKGFkZHIsIG1hcCk7XFxuIDE2MzpcXHRcXHRzcGluX3VubG9ja19pcnFyZXN0b3JlKFxcdTAwMjZyZHNfY29uZ19sb2NrLCBmbGFncyk7XFxuIDE2NDpcXHRcXG4gMTY1OlxcdFxcdGlmICghcmV0KSB7XFxuIDE2NjpcXHRcXHRcXHRyZXQgPSBtYXA7XFxuIDE2NzpcXHRcXHRcXHRtYXAgPSBOVUxMO1xcbiAxNjg6XFx0XFx0fVxcbiAxNjk6XFx0XFxuIDE3MDpcXHRvdXQ6XFxuIDE3MTpcXHRcXHRpZiAobWFwKSB7XFxuIDE3MjpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUkRTX0NPTkdfTUFQX1BBR0VTIFxcdTAwMjZcXHUwMDI2IG1hcC1cXHUwMDNlbV9wYWdlX2FkZHJzW2ldOyBpKyspXFxuIDE3MzpcXHRcXHRcXHRcXHRmcmVlX3BhZ2UobWFwLVxcdTAwM2VtX3BhZ2VfYWRkcnNbaV0pO1xcbiAxNzQ6XFx0XFx0XFx0a2ZyZWUobWFwKTtcXG4gMTc1OlxcdFxcdH1cXG4gMTc2OlxcdFxcbiAxNzc6XFx0XFx0cmRzZGVidWcoXFxcIm1hcCAlcCBmb3IgYWRkciAlcEk2Y1xcXFxuXFxcIiwgcmV0LCBhZGRyKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDQ6MzUuNTMwMTYzMTQ2WiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjEzNDAwNzkzODgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IFNjYXR0ZXJsaXN0IExlbmd0aCBBZGp1c3RtZW50IGluIFJEUyBNZXNzYWdpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24gc3lzdGVtYXRpY2FsbHkuIEknbSBsb29raW5nIGF0IGEgcGF0Y2ggdGhhdCBhZGp1c3RzIGhvdyBzY2F0dGVybGlzdCBsZW5ndGhzIGFyZSBjYWxjdWxhdGVkIHdpdGhpbiBgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzYC4gVGhlIHByaW1hcnkgY29uY2VybiBoZXJlIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgcGFydGljdWxhcmx5IHdoZXJlIGl0IG1pZ2h0IGJlIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBvciBsZWFkIHRvIGluZm9ybWF0aW9uIGxlYWtzLlxuXG5GaXJzdCwgSSBzZWUgdGhlIGNvcmUgY2hhbmdlIGlzIG1vZGlmeWluZyB0aGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGZvciB0aGUgbGFzdCBzY2F0dGVybGlzdCBlbnRyeS4gUHJldmlvdXNseSwgaXQgd2FzIGFsd2F5cyB0aGUgZnVsbCBgUEFHRV9TSVpFYCwgYnV0IG5vdyBpdCdzIGNhbGN1bGF0ZWQgYXMgYHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKWAuIFRoaXMgaXMgYSBjcnVjaWFsIGRldGFpbCB0byB2ZXJpZnkuIFRoZSBpbnRlbnRpb24sIEkgZ2F0aGVyLCBpcyB0byBtb3JlIGFjY3VyYXRlbHkgcmVmbGVjdCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIG1hcHBlZCBkYXRhLCBlc3BlY2lhbGx5IHdoZW4gYHRvdGFsX2xlbmAgaXNuJ3QgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZS4gV2l0aCBhIHBhZ2Ugc2l6ZSBvZiA2NEtCLCBgdG90YWxfbGVuYCBtaWdodCBiZSA4S0IsIG1lYW5pbmcgdGhhdCB0aGUgYGkgPT0gcm0tXHUwMDNlZGF0YS5vcF9uZW50cyAtIDFgIGNhc2UgbmVlZHMgc3BlY2lhbCBjb25zaWRlcmF0aW9uIHRvIGF2b2lkIG1hcHBpbmcgYmV5b25kIHRoZSBtZXNzYWdlIGJvdW5kYXJ5LlxuXG5UaGUga2V5IHBvaW50IGhlcmUsIGFuZCB3aGF0IEkga2VlcCBjaXJjbGluZyBiYWNrIHRvLCBpcyBtZW1vcnkgaW5pdGlhbGl6YXRpb24uIEkndmUgY29uZmlybWVkIHRoYXQgdGhlIHBhZ2VzIHRoZW1zZWx2ZXMgYXJlIGFsbG9jYXRlZCB1c2luZyBgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpYC4gIFRoaXMgbWVhbnMgZXZlcnkgYnl0ZSBpcyBpbml0aWFsaXplZCB0byB6ZXJvICpiZWZvcmUqIGFueSBvZiB0aGlzIGxlbmd0aCBjYWxjdWxhdGlvbiBldmVuIHRha2VzIHBsYWNlLiBUaGlzIGlzIGEgZnVuZGFtZW50YWwgc2FmZWd1YXJkLiBSZWdhcmRsZXNzIG9mIGhvdyB0aGUgc2NhdHRlcmxpc3QgbGVuZ3RocyBhcmUgc2V0LCB0aGUgdW5kZXJseWluZyBtZW1vcnkgd2lsbCBhbHdheXMgYmUgemVyb2VkLlxuXG5JIG5lZWQgdG8gcmlnb3JvdXNseSBjaGVjayBhZ2FpbnN0IHRoZSBzdGFuZGFyZCBjcml0ZXJpYSBmb3IgS01TQU4gcmVsZXZhbmNlLiBEb2VzIHRoaXMgcGF0Y2g6XG5cbjEuICAqKkludHJvZHVjZSBrZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2Ugd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcz8qKiBOby4gVGhpcyBpc24ndCB0b3VjaGluZyBhbnkgc3RydWN0dXJlcyB0aGF0IGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlIGRpcmVjdGx5LlxuMi4gICoqSW50cm9kdWNlIGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGVudCBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8qKiBOby4gQWxsIHRoZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNvbmRpdGlvbmFsIGxvZ2ljIChpbmRleCwgdG90YWwgbGVuZ3RoLCBwYWdlIHNpemUsIGV0Yy4pIGFyZSBrbm93biBxdWFudGl0aWVzIGFuZCBoYXZlIGRlZmluZWQgdmFsdWVzLlxuMy4gICoqQWxsb2NhdGUgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlcj8qKiBOby4gQWdhaW4sIHRoZSBtZW1vcnkgaXMgYmVpbmcgemVyb2VkIGJlZm9yZSBiZWluZyB1c2VkLlxuNC4gICoqQWx0ZXIgYm91bmRzIGNoZWNrcyBpbiBhIHdheSB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdW5pbml0aWFsaXplZCBieXRlcz8qKiBOby4gSW4gZmFjdCwgdGhpcyBpcyB0aGUgdmVyeSAqb3Bwb3NpdGUqIG9mIHdoYXQncyBoYXBwZW5pbmcuIFRoZSBjaGFuZ2UgaXMgc2hyaW5raW5nIHRoZSBzY2F0dGVybGlzdCBsZW5ndGggd2hpY2ggbWVhbnMgKmZld2VyKiBieXRlcyBhcmUgbWFwcGVkLCBub3QgbW9yZS4gIEFuZCBldmVuIGlmIHRoZSBsZW5ndGggd2FzIGluY29ycmVjdCwgdGhlIHVuZGVybHlpbmcgbWVtb3J5IGlzIGZ1bGx5IHplcm9lZCwgc28gdGhhdCdzIGEga2V5IHBvaW50LCBhbmQgd2h5LCBhdCB0aGlzIHBvaW50LCBLTVNBTiBpcyBub3QgbmVlZGVkLlxuXG5UaGUgY3JpdGljYWwgdGhpbmcgaXMgdG8gdmVyaWZ5IGlmIHRoZXJlJ3MgYW55IHVuaW5pdGlhbGl6ZWQgcmVhZHMuIEhlcmUsIHdlJ3JlIGRlYWxpbmcgd2l0aCBtZW1vcnkgdGhhdCdzIGZ1bGx5IHplcm9lZCBhdCBhbGxvY2F0aW9uLiBUaGUgY2hhbmdlIGNvcnJlY3RzIHRoZSBzY2F0dGVybGlzdCBsZW5ndGhzLCByZWR1Y2luZyBhbnkgcmlzayBvZiBvdXQtb2YtYm91bmRzIGFjY2Vzcy4gVGhlIGV4aXN0aW5nIEtBU0FOIGNoZWNrcyBhcmUgc3VmZmljaWVudCB0byBkZXRlY3QgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWVzLlxuXG5JbiBzdW1tYXJ5OiB0aGUgY2hhbmdlICpjb3JyZWN0bHkqIHRydW5jYXRlcyBzY2F0dGVybGlzdCBlbnRyaWVzLCByZWR1Y2luZyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtaWdodCBiZSBtYXBwZWQuIEdpdmVuIHRoZSB1c2Ugb2YgYGdldF96ZXJvZWRfcGFnZWAgKGd1YXJhbnRlZWluZyB6ZXJvZWQgbWVtb3J5KSwgdGhlcmUgaXMgbm8gcmlzayBvZiByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUgZXhpc3RpbmcgS0FTQU4gY2hlY2tzIGFyZSBzdWZmaWNpZW50IGZvciBhbnkgcG90ZW50aWFsIGJvdW5kcyBwcm9ibGVtcywgYW5kIEtNU0FOIGlzIG5vdCByZXF1aXJlZC4gSXQgaXMgYSBjbGVhciBjYXNlIG9mIGBOZWVkc0tNU0FOPWZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODc2NiwiT3V0cHV0VG9rZW5zIjoxNjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMTY6MDQ6NDguOTMwOTYwOTY4WiIsIlNlcSI6MzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjcxNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyByZHNfbWVzc2FnZV9tYXBfcGFnZXMoKSB0byBjYWxjdWxhdGUgdGhlIHNjYXR0ZXJsaXN0IGVudHJ5IGxlbmd0aCBjb3JyZWN0bHkgZm9yIHRoZSBmaW5hbCBwYWdlIChzZXR0aW5nIGl0IHRvIHRvdGFsX2xlbiAtIChpICogUEFHRV9TSVpFKSBpbnN0ZWFkIG9mIFBBR0VfU0laRSkuIFRoZSBwYWdlcyBiZWluZyBtYXBwZWQgKGUuZy4sIGNvbmdlc3Rpb24gbWFwIHBhZ2VzIGluIHJkc19jb25nX2Zyb21fYWRkcigpKSBhcmUgYWxsb2NhdGVkIHVzaW5nIGdldF96ZXJvZWRfcGFnZSgpIGFuZCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIFRoZSBwYXRjaCBhZGp1c3RzIHNjYXR0ZXJsaXN0IGxlbmd0aC9ib3VuZHMgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgb3IgZXhwb3NpbmcgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXJzcGFjZS4gQW55IHBvdGVudGlhbCBidWZmZXIgYm91bmRzIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGFyZSBjb3ZlcmVkIGJ5IHN0YW5kYXJkIEtBU0FOLCBhbmQgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgZXhpc3QgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmcuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgcmRzX21lc3NhZ2VfbWFwX3BhZ2VzKCkgdG8gY2FsY3VsYXRlIHRoZSBzY2F0dGVybGlzdCBlbnRyeSBsZW5ndGggY29ycmVjdGx5IGZvciB0aGUgZmluYWwgcGFnZSAoc2V0dGluZyBpdCB0byB0b3RhbF9sZW4gLSAoaSAqIFBBR0VfU0laRSkgaW5zdGVhZCBvZiBQQUdFX1NJWkUpLiBUaGUgcGFnZXMgYmVpbmcgbWFwcGVkIChlLmcuLCBjb25nZXN0aW9uIG1hcCBwYWdlcyBpbiByZHNfY29uZ19mcm9tX2FkZHIoKSkgYXJlIGFsbG9jYXRlZCB1c2luZyBnZXRfemVyb2VkX3BhZ2UoKSBhbmQgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBUaGUgcGF0Y2ggYWRqdXN0cyBzY2F0dGVybGlzdCBsZW5ndGgvYm91bmRzIHJhdGhlciB0aGFuIGludHJvZHVjaW5nIG9yIGV4cG9zaW5nIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2Vyc3BhY2UuIEFueSBwb3RlbnRpYWwgYnVmZmVyIGJvdW5kcyBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBhcmUgY292ZXJlZCBieSBzdGFuZGFyZCBLQVNBTiwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGV4aXN0IHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowsnvwg[1] Phase: Succeeded StartedAt: 2026-09-06 16:05:00 +0000 UTC FinishedAt: 2026-09-06 16:05:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-06 16:05:00 +0000 UTC FinishedAt: 2026-09-06 16:05:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2] Phase: Succeeded StartedAt: 2026-09-06 16:05:00 +0000 UTC FinishedAt: 2026-09-06 19:44:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-06 16:05:00 +0000 UTC FinishedAt: 2026-09-06 19:44:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-06 16:05:00 +0000 UTC FinishedAt: 2026-09-06 16:05:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-06 16:05:00 +0000 UTC FinishedAt: 2026-09-06 16:05:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowsnvwg/series-workflowsnvwg-convert-artifact-1050793252/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-06 16:05:10 +0000 UTC FinishedAt: 2026-09-06 16:21:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-06 16:05:10 +0000 UTC FinishedAt: 2026-09-06 16:21:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*db2a7547-200f-4b19-b18d-994ca6ca3785,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-workflowsnvwg/series-workflowsnvwg-convert-artifact-1050793252/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": "2f0d9a62-0ec7-44d0-8798-37d3f41f0409", "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-workflowsnvwg/series-workflowsnvwg-build-action-3072419682/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-06 16:05:10 +0000 UTC FinishedAt: 2026-09-06 16:21:05 +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:*db2a7547-200f-4b19-b18d-994ca6ca3785,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-workflowsnvwg/series-workflowsnvwg-convert-artifact-1050793252/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": "2f0d9a62-0ec7-44d0-8798-37d3f41f0409", "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-workflowsnvwg/series-workflowsnvwg-build-action-3072419682/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-06 16:21:15 +0000 UTC FinishedAt: 2026-09-06 16:21:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-06 16:21:15 +0000 UTC FinishedAt: 2026-09-06 16:21:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-06 16:21:15 +0000 UTC FinishedAt: 2026-09-06 16:21:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-06 16:21:15 +0000 UTC FinishedAt: 2026-09-06 16:21:20 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowsnvwg/series-workflowsnvwg-convert-artifact-1770234403/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-06 16:21:25 +0000 UTC FinishedAt: 2026-09-06 16:23:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-06 16:21:25 +0000 UTC FinishedAt: 2026-09-06 16:22:57 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*2f0d9a62-0ec7-44d0-8798-37d3f41f0409,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-workflowsnvwg/series-workflowsnvwg-build-action-3072419682/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-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-06 16:23:07 +0000 UTC FinishedAt: 2026-09-06 16:23:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-06 16:23:07 +0000 UTC FinishedAt: 2026-09-06 16:23:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-06 16:23:07 +0000 UTC FinishedAt: 2026-09-06 16:39:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-06 16:23:07 +0000 UTC FinishedAt: 2026-09-06 16:39:27 +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:*db2a7547-200f-4b19-b18d-994ca6ca3785,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-workflowsnvwg/series-workflowsnvwg-convert-artifact-1770234403/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": "4367bda1-2212-486f-8d08-e04f3617abbf", "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-workflowsnvwg/series-workflowsnvwg-build-action-2440996567/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-06 16:23:07 +0000 UTC FinishedAt: 2026-09-06 16:39:17 +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:*db2a7547-200f-4b19-b18d-994ca6ca3785,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-workflowsnvwg/series-workflowsnvwg-convert-artifact-1770234403/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": "4367bda1-2212-486f-8d08-e04f3617abbf", "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-workflowsnvwg/series-workflowsnvwg-build-action-2440996567/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-06 16:39:27 +0000 UTC FinishedAt: 2026-09-06 16:39:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-06 16:39:27 +0000 UTC FinishedAt: 2026-09-06 16:39:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-06 16:39:27 +0000 UTC FinishedAt: 2026-09-06 16:41:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-06 16:39:27 +0000 UTC FinishedAt: 2026-09-06 16:41:22 +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:*4367bda1-2212-486f-8d08-e04f3617abbf,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-workflowsnvwg/series-workflowsnvwg-build-action-2440996567/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-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-06 16:41:32 +0000 UTC FinishedAt: 2026-09-06 19:44:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-06 16:41:32 +0000 UTC FinishedAt: 2026-09-06 19:44:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"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:*2f0d9a62-0ec7-44d0-8798-37d3f41f0409,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*4367bda1-2212-486f-8d08-e04f3617abbf,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-workflowsnvwg/series-workflowsnvwg-build-action-3072419682/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-workflowsnvwg/series-workflowsnvwg-build-action-2440996567/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-06 16:41:32 +0000 UTC FinishedAt: 2026-09-06 16:41:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-06 16:41:32 +0000 UTC FinishedAt: 2026-09-06 16:41:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"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-workflowsnvwg/series-workflowsnvwg-convert-artifact-3278754620/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-06 16:41:32 +0000 UTC FinishedAt: 2026-09-06 16:41:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-06 16:41:32 +0000 UTC FinishedAt: 2026-09-06 16:41:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-06 16:41:32 +0000 UTC FinishedAt: 2026-09-06 16:41:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-06 16:41:42 +0000 UTC FinishedAt: 2026-09-06 19:44:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsnvwg[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["rds_message_map_pages","rds_cong_update_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"38b6be101006d3e7af972999f45d4f1e8250587a","config_name":"upstream-apparmor-kasan.config","enable_configs":["RDS","RDS_TCP","INET"],"series_id":"b1606105-4a6b-4f2a-bacc-e39f1bbb71a1","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-06 16:41:42 +0000 UTC FinishedAt: 2026-09-06 19:44:06 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*2f0d9a62-0ec7-44d0-8798-37d3f41f0409,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*4367bda1-2212-486f-8d08-e04f3617abbf,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-workflowsnvwg/series-workflowsnvwg-build-action-3072419682/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-workflowsnvwg/series-workflowsnvwg-build-action-2440996567/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-workflowsnvwg/series-workflowsnvwg-convert-artifact-3278754620/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,}