Name: series-workflowvxrql Phase: Succeeded StartedAt: 2026-08-10 12:23:56 +0000 UTC FinishedAt: 2026-08-10 16:25:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[0] Phase: Succeeded StartedAt: 2026-08-10 12:23:56 +0000 UTC FinishedAt: 2026-08-10 12:46:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[0].run-triage Phase: Succeeded StartedAt: 2026-08-10 12:23:56 +0000 UTC FinishedAt: 2026-08-10 12:46:04 +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": "fcaeecb8b0cd44f77d03b28de0671258d4db18f8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MPTCP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "fcaeecb8b0cd44f77d03b28de0671258d4db18f8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MPTCP" ], "series_id": "61aa9e41-29c0-4079-8b1e-000255c141d1" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "mptcp_get_options", "mptcp_incoming_options" ], "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+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01QVENQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bXB0Y3BfZ2V0X29wdGlvbnMmIzM0OywKICAgICYjMzQ7bXB0Y3BfaW5jb21pbmdfb3B0aW9ucyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlc3RyaWN0cyB0aGUgcGFyc2luZyBvZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGluIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb2Nlc3NlZCBpZiBjZXJ0YWluIG90aGVyIG9wdGlvbnMgKGluY2x1ZGluZyBhbm90aGVyIGBNUFRDUE9QVF9EU1NgKSBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQuXG5cbkJlZm9yZSB0aGlzIHBhdGNoLCBpZiBhIFRDUCBwYWNrZXQgY29udGFpbmVkIG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMsIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgdnVsbmVyYWJpbGl0eSBjb3VsZCBiZSB0cmlnZ2VyZWQuIFRoZSBgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgbXBfb3B0YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGZ1bmN0aW9ucyBsaWtlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zKClgLiBPbmx5IGl0cyBgc3RhdHVzYCBmaWVsZCAod2hpY2ggY29udGFpbnMgYml0ZmllbGRzIGxpa2UgYHVzZV9hY2tgIGFuZCBgdXNlX21hcGApIGlzIHplcm9lZCwgbGVhdmluZyBkYXRhIGZpZWxkcyBsaWtlIGBkYXRhX2Fja2AgYW5kIGBkYXRhX3NlcWAgdW5pbml0aWFsaXplZC5cblxuSWYgYSB2YWxpZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gd2FzIHBhcnNlZCBmaXJzdCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDBgKSwgaXQgd291bGQgc2V0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgIGJ1dCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQuIElmIGEgc2Vjb25kLCBtYWxmb3JtZWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGZvbGxvd2VkIChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMWAgYnV0IGFuIGludmFsaWQgYG9wc2l6ZWApLCBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYml0ZmllbGQgdG8gYHVzZV9hY2sgPSAxYCBidXQgYnJlYWsgZWFybHkgYmVmb3JlIHBvcHVsYXRpbmcgdGhlIGBkYXRhX2Fja2AgZmllbGQuXG5cblRoZSBjYWxsZXIgd291bGQgdGhlbiBzZWUgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIHNldCAoZnJvbSB0aGUgZmlyc3Qgb3B0aW9uKSBhbmQgcmVhZCB0aGUgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkgZnJvbSBgZGF0YV9hY2tgIChkdWUgdG8gdGhlIGNvcnJ1cHRlZCBgdXNlX2FjayA9IDFgIGJpdGZpZWxkIGZyb20gdGhlIHNlY29uZCBvcHRpb24pLiBUaGlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdvdWxkIHRoZW4gYmUgdXNlZCBpbiBjb250cm9sIGZsb3cgKGUuZy4sIHVwZGF0aW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIgYG1zay1cdTAwM2VzbmRfdW5hYCBpbiBgYWNrX3VwZGF0ZV9tc2soKWApIG9yIGNvcGllZCBpbnRvIHNrYiBleHRlbnNpb25zLlxuXG5TdGFuZGFyZCBLQVNBTiBkb2VzIG5vdCBkZXRlY3QgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBjYXRjaCB0aGlzIGV4YWN0IGNsYXNzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgcGFyc2luZyBvZiBNUFRDUCBvcHRpb25zLCBzcGVjaWZpY2FsbHkgcmVzdHJpY3RpbmcgdGhlIGNvbWJpbmF0aW9ucyBvZiBEU1Mgb3B0aW9ucyB3aXRoIG90aGVyIG9wdGlvbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBNUFRDUCBvcHRpb24gcGFyc2luZyBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDU1N2ZiNmU5NThiMjU3ZDgyODVkMjU5NDdjYzI1ZWM1YTU1MjAzNjZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAxMCAxMjo0MToyMiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvbXB0Y3Avb3B0aW9ucy5jIGIvbmV0L21wdGNwL29wdGlvbnMuY1xuaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDRcbi0tLSBhL25ldC9tcHRjcC9vcHRpb25zLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9tcHRjcC9vcHRpb25zLmNcbkBAIC0xNTMsNiAmIzQzOzE1MywxMyBAQCBzdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiBcdFx0YnJlYWs7XG4gXG4gXHRjYXNlIE1QVENQT1BUX0RTUzpcbiYjNDM7XHRcdC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG4mIzQzO1x0XHRpZiAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8XG4mIzQzO1x0XHRcdFx0XHQgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfFxuJiM0MztcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcbiYjNDM7XHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcbiBcdFx0cHJfZGVidWcoXCYjMzQ7RFNTXFxuXCYjMzQ7KTtcbiBcdFx0cHRyJiM0MzsmIzQzOztcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TVBUQ1AmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttcHRjcF9nZXRfb3B0aW9ucyYjMzQ7LAogICAgJiMzNDttcHRjcF9pbmNvbWluZ19vcHRpb25zJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBwYXJzaW5nIG9mIE1QVENQIG9wdGlvbnMsIHNwZWNpZmljYWxseSByZXN0cmljdGluZyB0aGUgY29tYmluYXRpb25zIG9mIERTUyBvcHRpb25zIHdpdGggb3RoZXIgb3B0aW9ucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIE1QVENQIG9wdGlvbiBwYXJzaW5nIGxvZ2ljLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNTU3ZmI2ZTk1OGIyNTdkODI4NWQyNTk0N2NjMjVlYzVhNTUyMDM2NgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gQXVnIDEwIDEyOjQxOjIyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L21wdGNwL29wdGlvbnMuYyBiL25ldC9tcHRjcC9vcHRpb25zLmMKaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDQKLS0tIGEvbmV0L21wdGNwL29wdGlvbnMuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvbXB0Y3Avb3B0aW9ucy5jCkBAIC0xNTMsNiAmIzQzOzE1MywxMyBAQCBzdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJYnJlYWs7CiAKIAljYXNlIE1QVENQT1BUX0RTUzoKJiM0MzsJCS8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovCiYjNDM7CQlpZiAoKG1wX29wdC0mZ3Q7c3Vib3B0aW9ucyAmYW1wOyB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8CiYjNDM7CQkJCQkgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfAomIzQzOwkJCQkJICAgIE9QVElPTl9NUFRDUF9QUklPIHwKJiM0MzsJCQkJCSAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CiAJCXByX2RlYnVnKCYjMzQ7RFNTXG4mIzM0Oyk7CiAJCXB0ciYjNDM7JiM0Mzs7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAyMAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDEwMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1QVENQIERTUyBPcHRpb24gSGFuZGxpbmcqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCB0d2Vha3MgYG5ldC9tcHRjcC9vcHRpb25zLmNgLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIGJlIGFkZGluZyBhIGNoZWNrIHdpdGhpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBmb3IgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbi4gVGhhdCYjMzk7cyBnb29kLCB3ZSBuZWVkIHRvIGhhbmRsZSBEU1MgcHJvcGVybHkuIE5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBjb25kaXRpb24gaXQmIzM5O3MgaW50cm9kdWNpbmcuIEl0IGxvb2tzIGxpa2UgdGhlIHBhdGNoIGlzIGRlc2lnbmVkIHRvIGJlIHZlcnkgc3RyaWN0OiBpZiB0aGUgYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AgZmllbGQsIHdoaWNoIGNvbnRhaW5zIHRoZSBzdWItb3B0aW9ucyAqd2l0aGluKiB0aGUgRFNTIG9wdGlvbiwgY29udGFpbnMgYW55dGhpbmcgKm90aGVyIHRoYW4qIGBBRERfQUREUmAsIGBSTV9BRERSYCwgYFBSSU9gLCBvciBgRkFJTGAsIHRoZSBEU1Mgb3B0aW9uIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQsIGFzIHRoZSBjb2RlIGJyZWFrcyBvdXQgb2YgcGFyc2luZy4KCkVzc2VudGlhbGx5LCB0aGUgbG9naWMgc2VlbXMgdG8gYmUgc2F5aW5nLCAmIzM0O0lmIHlvdSYjMzk7cmUgdXNpbmcgRFNTLCB5b3UgKm11c3QqIHVzZSBvbmx5IHRoZXNlIHNwZWNpZmljIHN1Yi1vcHRpb25zLCBhbmQgbm90aGluZyBlbHNlLiYjMzQ7IEkgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gd2h5IHRoaXMgcmVzdHJpY3Rpb24gaXMgYmVpbmcgaW1wb3NlZC4gSXMgdGhpcyBhIGRlbGliZXJhdGUgZGVzaWduIGNob2ljZSByZWxhdGVkIHRvIHNlY3VyaXR5LCBjb21wYXRpYmlsaXR5LCBvciBzb21lIG90aGVyIGludGVybmFsIHJlcXVpcmVtZW50PyBPciBpcyB0aGlzIGEgcG90ZW50aWFsIGJ1ZyB0aGF0IHdpbGwgY2F1c2UgaXNzdWVzIHdpdGggbW9yZSBhZHZhbmNlZCBvciBmdXR1cmUgRFNTIGV4dGVuc2lvbnM/IEkmIzM5O20gZ29pbmcgdG8gbmVlZCB0byByZXZpZXcgdGhlIGNvbnRleHQgYW5kIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgYWRkZWQgY2hlY2sgdG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbnMuIExldCBtZSBnbyBiYWNrIHRvIGBtcHRjcF9wYXJzZV9vcHRpb25gIGFuZCBzZWUgd2hhdCYjMzk7cyBhY3R1YWxseSBoYXBwZW5pbmcgYXJvdW5kIHRoaXMgY29kZSBzbmlwcGV0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21wdGNwX3BhcnNlX29wdGlvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9vcHRpb25zLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYz0xOD1zdGF0aWMgYm9vbCBtcHRjcF9jYXBfZmxhZ19zaGEyNTYodTggZmxhZ3MpXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYy0yMi1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MjM6c3RhdGljIHZvaWQgbXB0Y3BfcGFyc2Vfb3B0aW9uKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTI0LVx0XHRcdCAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBvcHNpemUsXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYz0zNjY9dm9pZCBtcHRjcF9nZXRfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAwLVx0XHRcdGlmIChvcGNvZGUgPT0gVENQT1BUX01QVENQKVxubmV0L21wdGNwL29wdGlvbnMuYzo0MDE6XHRcdFx0XHRtcHRjcF9wYXJzZV9vcHRpb24oc2tiLCBwdHIsIG9wc2l6ZSwgbXBfb3B0KTtcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAyLVx0XHRcdHB0ciAmIzQzOz0gb3BzaXplIC0gMjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzAxCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogNDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBwcmVzZW50ZWQgYXMgaWYgaXQmIzM5O3MgbXkgb3duLgoKKipBbmFseXppbmcgdGhlIGBtcHRjcF9wYXJzZV9vcHRpb25gIEZ1bmN0aW9uKioKClJpZ2h0LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYG1wdGNwX3BhcnNlX29wdGlvbmAuIEl0JiMzOTtzIGNsZWFybHkgYSBjcml0aWNhbCBwYXJ0IG9mIHRoZSBNUFRDUCBvcHRpb24gcHJvY2Vzc2luZywgYXMgaXQmIzM5O3MgZGlyZWN0bHkgY2FsbGVkIGJ5IGBtcHRjcF9nZXRfb3B0aW9uc2AuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBhY2Nlc3NpYmlsaXR5IG9mIGBtcHRjcF9nZXRfb3B0aW9uc2AuIElzIHRoaXMgc29tZXRoaW5nIHRoYXQmIzM5O3MgZXhwb3J0ZWQsIGFjY2Vzc2libGUgZnJvbSBvdGhlciBtb2R1bGVzLCBvciBpcyBpdCBhIGxvY2FsLCBpbnRlcm5hbCBmdW5jdGlvbj8gVGhhdCBkaXN0aW5jdGlvbiBtYXR0ZXJzIGJlY2F1c2UgaXQgdGVsbHMgbWUgaG93IHdpZGVseSB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgdXNlZCBhbmQgaWYgaXQgaXMgYW4gYXJlYSB0aGF0IGNvdWxkIGludHJvZHVjZSBleHRlcm5hbCBkZXBlbmRlbmNpZXMsIGlmIHRoZXJlIGlzIGFuIGlzc3VlLiBMZXQmIzM5O3MgZGlnIGRlZXBlciBhbmQgc2VlIGlmIHRoYXQmIzM5O3Mgc3RhdGljIG9yIGV4cG9ydGVkLCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcHRjcF9nZXRfb3B0aW9ucyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9tcHRjcC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYz0yMz1zdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTM2NS1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MzY2OnZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY3LVx0XHQgICAgICAgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgKm1wX29wdClcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTExNDA9Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNjYtXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNjc6XHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFx1MDAyNm1wX29wdCk7XG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNjgtXG4tLVxubmV0L21wdGNwL3Byb3RvY29sLmg9OTE4PXN0cnVjdCBzb2NrICptcHRjcF9za19jbG9uZV9pbml0KGNvbnN0IHN0cnVjdCBzb2NrICpzayxcbi0tXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC05MjEtXHRcdFx0XHQgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKTtcbm5ldC9tcHRjcC9wcm90b2NvbC5oOjkyMjp2b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC05MjMtXHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KTtcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jPTE0Nz1zdGF0aWMgaW50IHN1YmZsb3dfY2hlY2tfcmVxKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTE2Ny1cbm5ldC9tcHRjcC9zdWJmbG93LmM6MTY4Olx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xubmV0L21wdGNwL3N1YmZsb3cuYy0xNjktXG4tLVxubmV0L21wdGNwL3N1YmZsb3cuYz0yNjU9aW50IG1wdGNwX3N1YmZsb3dfaW5pdF9jb29raWVfcmVxKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTI3NS1cdHN1YmZsb3dfaW5pdF9yZXEocmVxLCBza19saXN0ZW5lcik7XG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjI3NjpcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9zdWJmbG93LmMtMjc3LVxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmM9NTI2PXN0YXRpYyB2b2lkIHN1YmZsb3dfZmluaXNoX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtNTQ0LVxubmV0L21wdGNwL3N1YmZsb3cuYzo1NDU6XHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFx1MDAyNm1wX29wdCk7XG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTU0Ni1cdGlmIChzdWJmbG93LVx1MDAzZXJlcXVlc3RfbXB0Y3ApIHtcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jPTgwNj1zdGF0aWMgc3RydWN0IHNvY2sgKnN1YmZsb3dfc3luX3JlY3Zfc29jayhjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXG4tLVxubmV0L21wdGNwL3N1YmZsb3cuYy04NDYtXHRcdCAqL1xubmV0L21wdGNwL3N1YmZsb3cuYzo4NDc6XHRcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9zdWJmbG93LmMtODQ4LVx0XHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjZcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg1Mi1cdH0gZWxzZSBpZiAoc3ViZmxvd19yZXEtXHUwMDNlbXBfam9pbikge1xubmV0L21wdGNwL3N1YmZsb3cuYzo4NTM6XHRcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9zdWJmbG93LmMtODU0LVx0XHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX01QSl9BQ0spKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM4ODcKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZSwgd2l0aCBhICoqYm9sZGVkIGhlYWRlcioqOgoKKipBbmFseXppbmcgTVBUQ1AgT3B0aW9uIEhhbmRsaW5nICZhbXA7IENvbmZpZ3VyYXRpb24qKgoKUmlnaHQsIHNvIGBtcHRjcF9nZXRfb3B0aW9uc2AgaXMgdW5kZW5pYWJseSB0aGUgZnVuY3Rpb24gaGFuZGxpbmcgaW5jb21pbmcgTVBUQ1Agb3B0aW9ucy4gVGhhdCYjMzk7cyBnb29kLCB0aGF0JiMzOTtzIHdoYXQgd2UgZXhwZWN0LiBUaGUgcGF0Y2ggaXRzZWxmIGlzIG1ha2luZyBjaGFuZ2VzIHRvIGhvdyB3ZSBwYXJzZSB0aG9zZSBNUFRDUCBvcHRpb25zLiBGdW5jdGlvbmFsbHksIHRoaXMgaXMgdGhlIGNydXggb2YgdGhlIG1vZGlmaWNhdGlvbi4gQmVmb3JlIEkgZGlnIHRvbyBkZWVwbHkgaW50byB0aGUgY29kZSBhbmQgdGhlIHBhdGNoIGl0c2VsZiwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzeXN0ZW0gdG8gZW5zdXJlIHRoZSBNUFRDUCBmdW5jdGlvbmFsaXR5IGlzIGFjdGl2ZSwgYW5kIGNvbmZpcm0gdGhlIHJlbGV2YW50IHNldHRpbmdzLiBUaGF0IHNlZW1zIGxpa2UgYSBsb2dpY2FsIGZpcnN0IHN0ZXAgYmVmb3JlIEkgZGl2ZSBpbnRvIHRoZSBuaXR0eS1ncml0dHkgb2YgdGhlIHBhcnNpbmcgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTVBUQ1AmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbXB0Y3AvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3AvS2NvbmZpZy0xLVxubmV0L21wdGNwL0tjb25maWc6Mjpjb25maWcgTVBUQ1Bcbm5ldC9tcHRjcC9LY29uZmlnLTMtXHRib29sIFwmIzM0O01QVENQOiBNdWx0aXBhdGggVENQXCYjMzQ7XG4tLVxubmV0L21wdGNwL0tjb25maWc9MTY9Y29uZmlnIElORVRfTVBUQ1BfRElBR1xuLS1cbm5ldC9tcHRjcC9LY29uZmlnLTE5LVxubmV0L21wdGNwL0tjb25maWc6MjA6Y29uZmlnIE1QVENQX0lQVjZcbm5ldC9tcHRjcC9LY29uZmlnLTIxLVx0Ym9vbCBcJiMzNDtNUFRDUDogSVB2NiBzdXBwb3J0IGZvciBNdWx0aXBhdGggVENQXCYjMzQ7XG4tLVxubmV0L21wdGNwL0tjb25maWctMjQtXG5uZXQvbXB0Y3AvS2NvbmZpZzoyNTpjb25maWcgTVBUQ1BfS1VOSVRfVEVTVFxubmV0L21wdGNwL0tjb25maWctMjYtXHR0cmlzdGF0ZSBcJiMzNDtUaGlzIGJ1aWxkcyB0aGUgTVBUQ1AgS1VuaXQgdGVzdHNcJiMzNDsgaWYgIUtVTklUX0FMTF9URVNUU1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQzNDkKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1QVENQIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB3ZSYjMzk7cmUgd29ya2luZyB3aXRoIGlzIGRlZmluaXRlbHkgYE1QVENQYC4gR2l2ZW4gdGhhdCwgSSBuZWVkIHRvIHBpbnBvaW50IHdoZXJlIHRoZSBpbnRlcmVzdGluZyBsb2dpYyByZXNpZGVzLiBNeSBndXQgdGVsbHMgbWUgZWl0aGVyIGBtcHRjcF9nZXRfb3B0aW9uc2Agb3IgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGlzIHRoZSBmdW5jdGlvbiB0byBleGFtaW5lLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AuIFRoYXQgc2VlbXMgbGlrZSB0aGUgbG9naWNhbCBlbnRyeSBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhpcyBoYW5kbGVzIGluY29taW5nIHRyYWZmaWMsIGRvZXNuJiMzOTt0IGl0PwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcHRjcF9pbmNvbWluZ19vcHRpb25zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L21wdGNwLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTEwNjA9c3RhdGljIHZvaWQgYWNrX3VwZGF0ZV9tc2soc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTEwODUtXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjEwODY6XHQvKiB0aGlzIGFzc3VtZXMgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpIGlzIGludm9rZWQgYWZ0ZXIgdGNwX2FjaygpICovXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTEwODctXHRpZiAoYWZ0ZXI2NChtc2stXHUwMDNld25kX2VuZCwgc25kX254dCkpXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYz0xMTE5PXN0YXRpYyBib29sIGFkZF9hZGRyX2htYWNfdmFsaWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExMzktICovXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNDA6Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE0MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3NzgKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhhdCBxdWVzdGlvbjoKCioqQW5hbHl6aW5nIHRoZSBDYWxsIFNpdGVzIG9mIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB3aGVyZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgaXMgYWN0dWFsbHkgdXNlZC4gVGhhdCBmdW5jdGlvbiBjYWxsIGlzIHByZXR0eSBjcml0aWNhbCBpbiB0aGUgTVBUQ1Agc3RhY2ssIHNvIHVuZGVyc3RhbmRpbmcgaXRzIGNhbGwgc2l0ZXMgaXMgZnVuZGFtZW50YWwgdG8gZmlndXJpbmcgb3V0IGhvdyBvcHRpb25zIGdldCBoYW5kbGVkIHdoZW4gYSBuZXcgTVBUQ1AgY29ubmVjdGlvbiBpcyBiZWluZyBzZXQgdXAuIFRoaXMgd2lsbCBoZWxwIHRvIGFuYWx5emUgbmV0d29yayBiZWhhdmlvdXIuIEkmIzM5O2xsIG5lZWQgdG8ganVtcCBpbnRvIHRoZSBjb2RlIGFuZCBzdGFydCBzZWFyY2hpbmcuIFByb2JhYmx5IHVzaW5nIGBncmVwYCBvciBhIHNpbWlsYXIgdG9vbCB0byBmaW5kIGFsbCBpbnN0YW5jZXMgb2YgdGhhdCBmdW5jdGlvbiBuYW1lLiBJJiMzOTtsbCBuZWVkIHRvIGJlIG1pbmRmdWwgb2YgcG90ZW50aWFsIG1hY3JvcyBvciBpbmRpcmVjdCBjYWxscyBhcyB3ZWxsLiBUaGUgZ29hbCBpc24mIzM5O3QganVzdCBhIGxpdGVyYWwgc3RyaW5nIG1hdGNoOyBJIG5lZWQgdG8gdW5kZXJzdGFuZCAqaG93KiBpdCYjMzk7cyBiZWluZyB1c2VkIHdpdGhpbiB0aGUgTVBUQ1AgZnJhbWV3b3JrIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBvcHRpb25zIGFyZSBwcm9jZXNzZWQuIEkgbmVlZCB0byBub3RlIHRoZSBjb250ZXh0IGFyb3VuZCBlYWNoIGNhbGwgLSB0aGUgYXJndW1lbnRzIHBhc3NlZCwgd2hhdCBvdGhlciBmdW5jdGlvbnMgaXQmIzM5O3MgaW50ZXJhY3Rpbmcgd2l0aCwgYW5kIHdoYXQgdGhlIG92ZXJhbGwgb2JqZWN0aXZlIG9mIHRoZSBjb2RlIHNlZ21lbnQgYXBwZWFycyB0byBiZS4gQmFzZWQgb24gdGhlIHN1cnJvdW5kaW5nIGNvZGUsIEkgY2FuIGdhaW4gYSBzb2xpZCBtZW50YWwgbW9kZWwgb2YgdGhlIG9wdGlvbiBuZWdvdGlhdGlvbiBwcm9jZXNzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcHRjcF9pbmNvbWluZ19vcHRpb25zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L21wdGNwLmg9MTU2PWludCBtcHRjcF9lc3RhYmxpc2hlZF9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5pbmNsdWRlL25ldC9tcHRjcC5oLTE1OC1cdFx0XHQgICAgICBzdHJ1Y3QgbXB0Y3Bfb3V0X29wdGlvbnMgKm9wdHMpO1xuaW5jbHVkZS9uZXQvbXB0Y3AuaDoxNTk6Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7XG5pbmNsdWRlL25ldC9tcHRjcC5oLTE2MC1cbi0tXG5pbmNsdWRlL25ldC9tcHRjcC5oPTI2Nj1zdGF0aWMgaW5saW5lIGJvb2wgbXB0Y3Bfc3luYWNrX29wdGlvbnMoY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLFxuLS1cbmluY2x1ZGUvbmV0L21wdGNwLmgtMjcyLVxuaW5jbHVkZS9uZXQvbXB0Y3AuaDoyNzM6c3RhdGljIGlubGluZSBib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLFxuaW5jbHVkZS9uZXQvbXB0Y3AuaC0yNzQtXHRcdFx0XHRcdCAgc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvaXB2NC90Y3BfaW5wdXQuYz00ODg0PXZvaWQgdGNwX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODkwLVx0LyogbXB0Y3AgY2FuJiMzOTt0IHRlbGwgdXMgdG8gaWdub3JlIHJlc2V0IHBrdHMsXG5uZXQvaXB2NC90Y3BfaW5wdXQuYzo0ODkxOlx0ICogc28ganVzdCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBtcHRjcF9pbmNvbWluZ19vcHRpb25zKCkuXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODkyLVx0ICovXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODkzLVx0aWYgKHNrX2lzX21wdGNwKHNrKSlcbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjQ4OTQ6XHRcdG1wdGNwX2luY29taW5nX29wdGlvbnMoc2ssIHNrYik7XG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODk1LVxuLS1cbm5ldC9pcHY0L3RjcF9pbnB1dC5jPTU2MDc9c3RhdGljIHZvaWQgdGNwX2RhdGFfcXVldWUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTU2MTYtXHQgKi9cbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjU2MTc6XHRpZiAoc2tfaXNfbXB0Y3Aoc2spIFx1MDAyNlx1MDAyNiAhbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzaywgc2tiKSkge1xubmV0L2lwdjQvdGNwX2lucHV0LmMtNTYxOC1cdFx0X19rZnJlZV9za2Ioc2tiKTtcbi0tXG5uZXQvaXB2NC90Y3BfaW5wdXQuYz03MTUyPXRjcF9yY3Zfc3RhdGVfcHJvY2VzcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4tLVxubmV0L2lwdjQvdGNwX2lucHV0LmMtNzM3OS1cdFx0XHQgKi9cbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjczODA6XHRcdFx0aWYgKHNrX2lzX21wdGNwKHNrKSBcdTAwMjZcdTAwMjYgIW1wdGNwX2luY29taW5nX29wdGlvbnMoc2ssIHNrYikpXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy03MzgxLVx0XHRcdFx0Z290byBkaXNjYXJkO1xuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmM9MTA2MD1zdGF0aWMgdm9pZCBhY2tfdXBkYXRlX21zayhzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTA4NS1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MTA4NjpcdC8qIHRoaXMgYXNzdW1lcyBtcHRjcF9pbmNvbWluZ19vcHRpb25zKCkgaXMgaW52b2tlZCBhZnRlciB0Y3BfYWNrKCkgKi9cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTA4Ny1cdGlmIChhZnRlcjY0KG1zay1cdTAwM2V3bmRfZW5kLCBzbmRfbnh0KSlcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTExMTk9c3RhdGljIGJvb2wgYWRkX2FkZHJfaG1hY192YWxpZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTEzOS0gKi9cbm5ldC9tcHRjcC9vcHRpb25zLmM6MTE0MDpib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxubmV0L21wdGNwL29wdGlvbnMuYy0xMTQxLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjAwNQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDEyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1QVENQIE9wdGlvbiBIYW5kbGluZyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGxvb2tpbmcgaW50byB0aGlzIE1QVENQIGNoYW5nZSwgYW5kIG15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBhbmQgYG1wdGNwX2dldF9vcHRpb25zYCBhcmUgdGhlIGtleSBmdW5jdGlvbnMgdG8gZm9jdXMgb24uIFNpbmNlIHRoZSBhY3R1YWwgbW9kaWZpY2F0aW9uIGlzIHdpdGhpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCwgd2hpY2ggaXMgdW5mb3J0dW5hdGVseSBzdGF0aWMsIHRoZSBiZXN0IGVudHJ5IHBvaW50IHRvIHVuZGVyc3RhbmQgdGhlIHdpZGVyIGltcGxpY2F0aW9ucyB3aWxsIGJlIGBtcHRjcF9nZXRfb3B0aW9uc2AsIGFzIGl0JiMzOTtzIHRoZSBjbG9zZXN0IG5vbi1zdGF0aWMgZnVuY3Rpb24uCgpGaXJzdCwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgdGhhdCBtaWdodCBpbXBhY3QgdGhpcyBiZWhhdmlvdXIuIFdlIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUgTVBUQ1AgaXMgZW5hYmxlZCwgb2J2aW91c2x5LgoKTm93LCBpdCBzZWVtcyBsaWtlIHRoaXMgY2hhbmdlIHNwZWNpZmljYWxseSByZXN0cmljdHMgdGhlIGJlaGF2aW91ciBvZiBEU1Mgb3B0aW9ucyB3aGVuIGNvbWJpbmVkIHdpdGggb3RoZXIgTVBUQ1Agb3B0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLgoKTGV0IG1lIGNpcmNsZSBiYWNrIGFuZCBtZXRpY3Vsb3VzbHkgcmV2aWV3IGBtcHRjcF9nZXRfb3B0aW9uc2AgYW5kIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBpbiBtb3JlIGRldGFpbCwgbm93IHRoYXQgSSBoYXZlIGEgYmV0dGVyIGlkZWEgb2YgdGhlIGNvbnRleHQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21wdGNwX2dldF9vcHRpb25zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTIzPXN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY1LVxubmV0L21wdGNwL29wdGlvbnMuYzozNjY6dm9pZCBtcHRjcF9nZXRfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxubmV0L21wdGNwL29wdGlvbnMuYy0zNjctXHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmM9MTE0MD1ib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2Ni1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MTE2NzpcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2OC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjYxNwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDY4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKgoKT2theSwgc28gYG1wdGNwX2dldF9vcHRpb25zYCBpcyBpbmRlZWQgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRob3NlIG9wdGlvbnMsIGFuZCBpbXBvcnRhbnRseSwgaXQmIzM5O3MgKm5vdCogc3RhdGljLCBtYWtpbmcgaXQgYWNjZXNzaWJsZSBhcyBJIHN1c3BlY3RlZC4gVGhhdCYjMzk7cyBhIGtleSBwaWVjZSBvZiB0aGUgcHV6emxlLiBJJiMzOTtsbCBtYWtlIHN1cmUgdG8ga2VlcCBib3RoIGBtcHRjcF9nZXRfb3B0aW9uc2AgYW5kIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBpbiBzaGFycCBmb2N1cyBoZXJlLCB0aGV5JiMzOTtyZSB0aGUgY29yZSBzeW1ib2xzIEkgbmVlZCB0byB1bmRlcnN0YW5kLiBHaXZlbiB0aGUgY29udGV4dCwgbXkgY29uZmlnIGlzLCBuYXR1cmFsbHksIGBNUFRDUGAuCgpOb3csIGxldCYjMzk7cyBzdGVwIGJhY2sgZm9yIGEgbW9tZW50LiBCZWZvcmUgZGl2aW5nIGRlZXBlciBpbnRvIHRoZSBzcGVjaWZpY3Mgb2Ygb3B0aW9uIHBhcnNpbmcsIEkgd2FudCB0byBjb25maXJtIC0gYXJlIHRoZXJlIGFueSBjcml0aWNhbCBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgYW55IGxvdy1sZXZlbCBmdW5jdGlvbnMgb3IgZXh0ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYE1QVENQYCByZWxpZXMgdXBvbj8gSSBuZWVkIHRvIGJ1aWxkIGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgYXJjaGl0ZWN0dXJhbCBsYW5kc2NhcGUgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgZGV0YWlsZWQgYW5hbHlzaXMgb2YgdGhlIHBhcnNpbmcgbG9naWMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNUFRDUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9LY29uZmlnLTEtXG5uZXQvbXB0Y3AvS2NvbmZpZzoyOmNvbmZpZyBNUFRDUFxubmV0L21wdGNwL0tjb25maWctMy1cdGJvb2wgXCYjMzQ7TVBUQ1A6IE11bHRpcGF0aCBUQ1BcJiMzNDtcbi0tXG5uZXQvbXB0Y3AvS2NvbmZpZz0xNj1jb25maWcgSU5FVF9NUFRDUF9ESUFHXG4tLVxubmV0L21wdGNwL0tjb25maWctMTktXG5uZXQvbXB0Y3AvS2NvbmZpZzoyMDpjb25maWcgTVBUQ1BfSVBWNlxubmV0L21wdGNwL0tjb25maWctMjEtXHRib29sIFwmIzM0O01QVENQOiBJUHY2IHN1cHBvcnQgZm9yIE11bHRpcGF0aCBUQ1BcJiMzNDtcbi0tXG5uZXQvbXB0Y3AvS2NvbmZpZy0yNC1cbm5ldC9tcHRjcC9LY29uZmlnOjI1OmNvbmZpZyBNUFRDUF9LVU5JVF9URVNUXG5uZXQvbXB0Y3AvS2NvbmZpZy0yNi1cdHRyaXN0YXRlIFwmIzM0O1RoaXMgYnVpbGRzIHRoZSBNUFRDUCBLVW5pdCB0ZXN0c1wmIzM0OyBpZiAhS1VOSVRfQUxMX1RFU1RTXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcxMzYKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgTVBUQ1AgS2NvbmZpZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MgYW5kIGNyYWNrIG9wZW4gdGhlIGBuZXQvbXB0Y3AvS2NvbmZpZ2AgZmlsZS4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgdGhlIE11bHRwYXRoIFRDUCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXZhaWxhYmxlIGluIHRoZSBrZXJuZWwuIFRoaXMgY29uZmlnIGZpbGUgaXMgdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIgd2hlbiBpdCBjb21lcyB0byBlbmFibGluZyBhbmQgY3VzdG9taXppbmcgTVBUQ1AmIzM5O3MgYmVoYXZpb3IuIEkmIzM5O20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIHNlZWluZyB3aGF0IGxldmVsIG9mIGNvbnRyb2wgaXQgcHJvdmlkZXMgb3ZlciBkaWZmZXJlbnQgZmVhdHVyZXMg4oCTIHRoaW5ncyBsaWtlIHBhdGggbWFuYWdlbWVudCwgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobXMgKGFuZCB0aGUgcG90ZW50aWFsIHRvIGFkZCBjdXN0b20gb25lcyksIHN1YmZsb3cgZXN0YWJsaXNobWVudCwgYW5kIGhvdyBpdCBoYW5kbGVzIGRpZmZlcmVudCBuZXR3b3JrIGVudmlyb25tZW50cy4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIGEgc3RydWN0dXJlZCBicmVha2Rvd24gb2YgZGVwZW5kZW5jaWVzIGFuZCBkZWZhdWx0IHZhbHVlcywgd2hpY2ggaGVscHMgdW5kZXJzdGFuZCBob3cgdGhlIGRpZmZlcmVudCBwaWVjZXMgb2YgTVBUQ1AgZml0IHRvZ2V0aGVyLiBBcmUgdGhlcmUgYW55IGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcz8gQXJlIGFueSBmZWF0dXJlcyBleHBlcmltZW50YWwgYW5kIHRodXMgYmVoaW5kIGEgY29uZmlnIGZsYWc/IEkmIzM5O20gaG9waW5nIGl0IGNsZWFybHkgbWFwcyBvdXQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgdmFyaW91cyBNUFRDUCBjb21wb25lbnRzIGFuZCB0aGVpciByZXNwZWN0aXZlIGNvbXBpbGUtdGltZSBzZXR0aW5ncy4gSXQmIzM5O3MgdGltZSB0byBzZWUgd2hhdCB0aGlzIEtjb25maWcgZmlsZSBob2xkcyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3AvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdFxuICAgMjpcdGNvbmZpZyBNUFRDUFxuICAgMzpcdFx0Ym9vbCBcJiMzNDtNUFRDUDogTXVsdGlwYXRoIFRDUFwmIzM0O1xuICAgNDpcdFx0ZGVwZW5kcyBvbiBJTkVUXG4gICA1Olx0XHRzZWxlY3QgU0tCX0VYVEVOU0lPTlNcbiAgIDY6XHRcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NlxuICAgNzpcdFx0c2VsZWN0IENSWVBUT19MSUJfVVRJTFNcbiAgIDg6XHRcdGhlbHBcbiAgIDk6XHRcdCAgTXVsdGlwYXRoIFRDUCAoTVBUQ1ApIGNvbm5lY3Rpb25zIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBvdmVyIG11bHRpcGxlXG4gIDEwOlx0XHQgIHN1YmZsb3dzIGluIG9yZGVyIHRvIHV0aWxpemUgbXVsdGlwbGUgbmV0d29yayBwYXRocy4gRWFjaCBzdWJmbG93XG4gIDExOlx0XHQgIHVzZXMgdGhlIFRDUCBwcm90b2NvbCwgYW5kIFRDUCBvcHRpb25zIGNhcnJ5IGhlYWRlciBpbmZvcm1hdGlvbiBmb3JcbiAgMTI6XHRcdCAgTVBUQ1AuXG4gIDEzOlx0XG4gIDE0Olx0aWYgTVBUQ1BcbiAgMTU6XHRcbiAgMTY6XHRjb25maWcgSU5FVF9NUFRDUF9ESUFHXG4gIDE3Olx0XHRkZXBlbmRzIG9uIElORVRfRElBR1xuICAxODpcdFx0ZGVmX3RyaXN0YXRlIElORVRfRElBR1xuICAxOTpcdFxuICAyMDpcdGNvbmZpZyBNUFRDUF9JUFY2XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc2NjAKCQkJCQkJCW91dHB1dDogOTEKCQkJCQkJCXRob3VnaHRzOiAyMDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNUFRDUCBDb25maWd1cmF0aW9uIENoYW5nZSoqCgpPa2F5LCBzbyB0aGlzIG1vZGlmaWNhdGlvbiByZWFsbHkgaGluZ2VzIG9uIHRoZSBgSU5FVGAgc3RhbmRhcmQsIHdoaWNoIEkgYWxyZWFkeSB1bmRlcnN0YW5kLiBUaGUgY29yZSBvZiB0aGlzIHNlZW1zIHRvIGJlIGRyaXZlbiBieSBjaGFuZ2VzIHRvIGBNUFRDUGAgY29uZmlndXJhdGlvbiBvbmx5LiBJIGNhbiBpZ25vcmUgdGhlIG90aGVycyBmb3Igbm93LgoKTGV0JiMzOTtzIGRpZyBhIGJpdCBkZWVwZXIuIEkgc2VlIGBtcHRjcF9wYXJzZV9vcHRpb25gIGlzIHN0YXRpYywgc28gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uIGhlcmUgaXMgYG1wdGNwX2dldF9vcHRpb25zYCwgd2hpY2ggY2FsbHMgdGhlIGZvcm1lci4gVGhlIHJlYWwgbWVhdCBvZiB0aGUgY2hhbmdlIGlzIHdpdGhpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCwgd2hpY2ggaXMgdXNlZCBieSBgbXB0Y3BfZ2V0X29wdGlvbnNgLgoKSXQgc2VlbXMgdGhpcyBwYXRjaCAqcmVzdHJpY3RzKiBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBNUFRDUCBvcHRpb25zLiBJbiBteSB2aWV3LCB0aGF0JiMzOTtzIGEgY2xhc3NpYyBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGRpcmVjdGx5IGltcGFjdHMgaG93IHRoZSBvcHRpb25zIGFyZSBwYXJzZWQgYW5kIHByb2Nlc3NlZC4gSXQmIzM5O3MgYSBwcmltZSB0YXJnZXQgZm9yIGZ1enppbmcuCgpHaXZlbiB0aGF0LCBJJiMzOTttIGdvaW5nIHRvIHNldDoKCiogICBgV29ydGhGdXp6aW5nOiB0cnVlYCAtIGJlY2F1c2UgdGhpcyBjaGFuZ2UgaGFzIGRpcmVjdCBmdW5jdGlvbmFsIGltcGxpY2F0aW9ucy4KKiAgIGBGb2N1c1N5bWJvbHM6IFsmIzM0O21wdGNwX2dldF9vcHRpb25zJiMzNDssICYjMzQ7bXB0Y3BfaW5jb21pbmdfb3B0aW9ucyYjMzQ7XWAgLSBzaW5jZSB0aGUgY2hhbmdlIGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgcGFyc2luZywgSSB3YW50IHRvIGtlZXAgYW4gZXllIG9uIHRoZXNlIHBhcnNpbmcgZnVuY3Rpb25zLgoqICAgYEVuYWJsZUNvbmZpZ3M6IFsmIzM0O01QVENQJiMzNDtdYCAtIHRvIGxpbWl0IG15IGZvY3VzIHRvIHRoZSBhZmZlY3RlZCBjb25maWd1cmF0aW9uLgoqICAgYFJlYXNvbmluZzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHBhcnNpbmcgb2YgTVBUQ1Agb3B0aW9ucywgc3BlY2lmaWNhbGx5IHJlc3RyaWN0aW5nIHRoZSBjb21iaW5hdGlvbnMgb2YgRFNTIG9wdGlvbnMgd2l0aCBvdGhlciBvcHRpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgTVBUQ1Agb3B0aW9uIHBhcnNpbmcgbG9naWMuJiMzNDtgIC0gSSBuZWVkIHRvIGp1c3RpZnkgbXkgYXBwcm9hY2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNUFRDUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21wdGNwX2dldF9vcHRpb25zJiMzNDssCiAgICAmIzM0O21wdGNwX2luY29taW5nX29wdGlvbnMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHBhcnNpbmcgb2YgTVBUQ1Agb3B0aW9ucywgc3BlY2lmaWNhbGx5IHJlc3RyaWN0aW5nIHRoZSBjb21iaW5hdGlvbnMgb2YgRFNTIG9wdGlvbnMgd2l0aCBvdGhlciBvcHRpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgTVBUQ1Agb3B0aW9uIHBhcnNpbmcgbG9naWMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01QVENQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bXB0Y3BfZ2V0X29wdGlvbnMmIzM0OywKICAgICYjMzQ7bXB0Y3BfaW5jb21pbmdfb3B0aW9ucyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgcGFyc2luZyBvZiBNUFRDUCBvcHRpb25zLCBzcGVjaWZpY2FsbHkgcmVzdHJpY3RpbmcgdGhlIGNvbWJpbmF0aW9ucyBvZiBEU1Mgb3B0aW9ucyB3aXRoIG90aGVyIG9wdGlvbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBNUFRDUCBvcHRpb24gcGFyc2luZyBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4zbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXN0cmljdHMgdGhlIHBhcnNpbmcgb2YgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9jZXNzZWQgaWYgY2VydGFpbiBvdGhlciBvcHRpb25zIChpbmNsdWRpbmcgYW5vdGhlciBgTVBUQ1BPUFRfRFNTYCkgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkLlxuXG5CZWZvcmUgdGhpcyBwYXRjaCwgaWYgYSBUQ1AgcGFja2V0IGNvbnRhaW5lZCBtdWx0aXBsZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLCBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHZ1bG5lcmFiaWxpdHkgY291bGQgYmUgdHJpZ2dlcmVkLiBUaGUgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdGAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBpbiBmdW5jdGlvbnMgbGlrZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpYC4gT25seSBpdHMgYHN0YXR1c2AgZmllbGQgKHdoaWNoIGNvbnRhaW5zIGJpdGZpZWxkcyBsaWtlIGB1c2VfYWNrYCBhbmQgYHVzZV9tYXBgKSBpcyB6ZXJvZWQsIGxlYXZpbmcgZGF0YSBmaWVsZHMgbGlrZSBgZGF0YV9hY2tgIGFuZCBgZGF0YV9zZXFgIHVuaW5pdGlhbGl6ZWQuXG5cbklmIGEgdmFsaWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIHdhcyBwYXJzZWQgZmlyc3QgKGUuZy4sIHdpdGggYHVzZV9hY2sgPSAwYCksIGl0IHdvdWxkIHNldCB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgaW4gYG1wX29wdC5zdWJvcHRpb25zYCBidXQgbGVhdmUgYGRhdGFfYWNrYCB1bmluaXRpYWxpemVkLiBJZiBhIHNlY29uZCwgbWFsZm9ybWVkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBmb2xsb3dlZCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDFgIGJ1dCBhbiBpbnZhbGlkIGBvcHNpemVgKSwgYG1wdGNwX3BhcnNlX29wdGlvbigpYCB3b3VsZCBvdmVyd3JpdGUgdGhlIGJpdGZpZWxkIHRvIGB1c2VfYWNrID0gMWAgYnV0IGJyZWFrIGVhcmx5IGJlZm9yZSBwb3B1bGF0aW5nIHRoZSBgZGF0YV9hY2tgIGZpZWxkLlxuXG5UaGUgY2FsbGVyIHdvdWxkIHRoZW4gc2VlIHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBzZXQgKGZyb20gdGhlIGZpcnN0IG9wdGlvbikgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5IGZyb20gYGRhdGFfYWNrYCAoZHVlIHRvIHRoZSBjb3JydXB0ZWQgYHVzZV9hY2sgPSAxYCBiaXRmaWVsZCBmcm9tIHRoZSBzZWNvbmQgb3B0aW9uKS4gVGhpcyB1bmluaXRpYWxpemVkIG1lbW9yeSB3b3VsZCB0aGVuIGJlIHVzZWQgaW4gY29udHJvbCBmbG93IChlLmcuLCB1cGRhdGluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIGBtc2stXHUwMDNlc25kX3VuYWAgaW4gYGFja191cGRhdGVfbXNrKClgKSBvciBjb3BpZWQgaW50byBza2IgZXh0ZW5zaW9ucy5cblxuU3RhbmRhcmQgS0FTQU4gZG9lcyBub3QgZGV0ZWN0IHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5LiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyBleGFjdCBjbGFzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNTU3ZmI2ZTk1OGIyNTdkODI4NWQyNTk0N2NjMjVlYzVhNTUyMDM2NgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gQXVnIDEwIDEyOjQxOjIyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L21wdGNwL29wdGlvbnMuYyBiL25ldC9tcHRjcC9vcHRpb25zLmMKaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDQKLS0tIGEvbmV0L21wdGNwL29wdGlvbnMuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvbXB0Y3Avb3B0aW9ucy5jCkBAIC0xNTMsNiAmIzQzOzE1MywxMyBAQCBzdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJYnJlYWs7CiAKIAljYXNlIE1QVENQT1BUX0RTUzoKJiM0MzsJCS8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovCiYjNDM7CQlpZiAoKG1wX29wdC0mZ3Q7c3Vib3B0aW9ucyAmYW1wOyB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8CiYjNDM7CQkJCQkgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfAomIzQzOwkJCQkJICAgIE9QVElPTl9NUFRDUF9QUklPIHwKJiM0MzsJCQkJCSAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CiAJCXByX2RlYnVnKCYjMzQ7RFNTXG4mIzM0Oyk7CiAJCXB0ciYjNDM7JiM0Mzs7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMTcKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyODMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUGF0Y2ggUmVzdHJpY3RpbmcgRFNTIE9wdGlvbiBQYXJzaW5nKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGluIGBuZXQvbXB0Y3Avb3B0aW9ucy5jYC4gSXQmIzM5O3MgdG91Y2hpbmcgdGhlIGBtcHRjcF9wYXJzZV9vcHRpb25gIGZ1bmN0aW9uLCBzcGVjaWZpY2FsbHkgYWRkaW5nIGEgcmVzdHJpY3Rpb24gZm9yIHRoZSBgTVBUQ1BPUFRfRFNTYCBjYXNlLiBUaGUgYWRkZWQgY2hlY2sgaXMgZmlsdGVyaW5nIHdoaWNoIHN1Ym9wdGlvbnMgYXJlIHZhbGlkIGFsb25nc2lkZSBEU1MuIEl0IGxvb2tzIGxpa2UgaXTigJlzIGFsbG93aW5nIERTUyB0byBvbmx5IHdvcmsgd2l0aCB0aGUgYEFERF9BRERSYCwgYFJNX0FERFJgLCBgUFJJT2AsIGFuZCBgRkFJTGAgc3Vib3B0aW9ucy4gSWYgKmFueSogb3RoZXIgc3Vib3B0aW9uIGlzIHNldCwgdGhlIHN3aXRjaCBqdXN0IGJyZWFrcywgYW5kIERTUyBwYXJzaW5nIGlzIHNraXBwZWQuCgpNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgZG9lcyB0aGlzIGludHJvZHVjZSBhIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2U/IElmIHRoZSBEU1MgcGFyc2luZyBpcyBieXBhc3NlZCwgYXJlIHRoZXJlIGZpZWxkcyB3aXRoaW4gYG1wX29wdGAgdGhhdCBtaWdodCBub3QgZ2V0IHByb3Blcmx5IGluaXRpYWxpemVkPyBUaGF0JiMzOTtzIGEgY2xhc3NpYyBzb3VyY2Ugb2YgcHJvYmxlbXMsIGFuZCBzb21ldGhpbmcgSSBhbHdheXMgaGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0LgoKUmlnaHQsIEkgbmVlZCB0byByZW1pbmQgbXlzZWxmIGhvdyB0aGlzIHdob2xlIHRoaW5nIHdvcmtzLiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBpcyBwYXJzaW5nIG9wdGlvbnMgZnJvbSBhbiBgc2tiYCwgYW5kIGl0IHVzZXMgdGhlIGZ1bmN0aW9uIHRvIHBvcHVsYXRlIHRoZSBgbXBfb3B0YCBzdHJ1Y3R1cmUuIE9rYXksIHNvIEkgc2hvdWxkIGJlIHRha2luZyBhIGNsb3NlciBsb29rIGF0IGJvdGggYG1wdGNwX3BhcnNlX29wdGlvbmAgYW5kIHRoZSBgbXBfb3B0YCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBzdXBwb3NlZCB0byBiZSBpbml0aWFsaXplZCB3aGVuLCBhbmQgd2hhdCB0aGUgY29uc2VxdWVuY2VzIGFyZSBpZiBEU1MgcGFyc2luZyBkb2VzbiYjMzk7dCBoYXBwZW4gaW4gYSBwYXJ0aWN1bGFyIHNjZW5hcmlvLiBJJiMzOTtsbCBuZWVkIHRvIHRyYWNlIHRoZSBkYXRhIGZsb3cgdG8gYmUgc3VyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bXB0Y3BfcGFyc2Vfb3B0aW9uJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTE4PXN0YXRpYyBib29sIG1wdGNwX2NhcF9mbGFnX3NoYTI1Nih1OCBmbGFncylcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTIyLVxubmV0L21wdGNwL29wdGlvbnMuYzoyMzpzdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC9tcHRjcC9vcHRpb25zLmMtMjQtXHRcdFx0ICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IG9wc2l6ZSxcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTM2Nj12b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYy00MDAtXHRcdFx0aWYgKG9wY29kZSA9PSBUQ1BPUFRfTVBUQ1ApXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjQwMTpcdFx0XHRcdG1wdGNwX3BhcnNlX29wdGlvbihza2IsIHB0ciwgb3BzaXplLCBtcF9vcHQpO1xubmV0L21wdGNwL29wdGlvbnMuYy00MDItXHRcdFx0cHRyICYjNDM7PSBvcHNpemUgLSAyO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODk0CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBtcHRjcF9nZXRfb3B0aW9uc2AgYW5kIGBtcHRjcF9wYXJzZV9vcHRpb25gIGJ1c2luZXNzLiBJIGltbWVkaWF0ZWx5IHJlY29nbml6ZSB0aGVzZSBhcyB0aGUgY29yZSBmdW5jdGlvbnMgaW52b2x2ZWQgaW4gdGhlIE1QVENQIG9wdGlvbiBuZWdvdGlhdGlvbiBhbmQgcGFyc2luZyBwcm9jZXNzLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZmlndXJlIG91dCB0aGUgZmxvdy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIHJlbGF0ZSwgc3BlY2lmaWNhbGx5OgoKKiAgICoqYG1wdGNwX2dldF9vcHRpb25zYCoqOiBJcyB0aGlzIGEgdG9wLWxldmVsIGRpc3BhdGNoZXI/IERvZXMgaXQgYWN0IGFzIGFuIGVudHJ5IHBvaW50LCBwZXJoYXBzIGNhbGxlZCBkdXJpbmcgY29ubmVjdGlvbiBzZXR1cCBvciB3aGVuIHJlY2VpdmluZyBhbiBNUFRDUC1zcGVjaWZpYyBUQ1Agb3B0aW9uPyBNeSBpbW1lZGlhdGUgZ3Vlc3MgaXMgdGhpcyBpcyBsaWtlbHkgaW52b2tlZCB3aXRoaW4gdGhlIFRDUCBzdGFjayBvciBNUFRDUCBsYXllciB0byByZXRyaWV2ZSBhbmQgcHJlcGFyZSB0aGUgZGF0YSB3aXRoaW4gdGhlIG9wdGlvbiBmaWVsZC4KCiogICAqKmBtcHRjcF9wYXJzZV9vcHRpb25gKio6IFRoaXMgaXMgZGVmaW5pdGVseSB3aGVyZSB0aGUgaGVhdnkgbGlmdGluZyBoYXBwZW5zLiBUaGlzIGlzIHRoZSBkZWNvZGVyLiBJJiMzOTttIGltYWdpbmluZyBhIHN3aXRjaCBvciBzZXJpZXMgb2YgYGlmL2Vsc2VgIHN0YXRlbWVudHMgdGhhdCBjaGVjayB0aGUgb3B0aW9uIGtpbmQgYW5kIHRoZW4gdW5wYWNrIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHN0cnVjdHVyZS4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IHRoZSBkZXRhaWxzIHdpdGhpbiB0aGUga2VybmVsLiBJIGNhbiBzdGFydCBieSB0aGlua2luZyBhYm91dCB3aGF0JiMzOTtzIGludm9sdmVkIGluIHRoaXMgZnVuY3Rpb24uIFRoaXMgaXMgbW9zdCBsaWtlbHk6IENoZWNraW5nIG9wdGlvbiB0eXBlLCBwYXJzaW5nIGl0cyBjb250ZW50LCB2YWxpZGF0aW5nIGl0cyBzaXplLCBoYW5kbGluZyBhbnkgcG90ZW50aWFsIGVycm9ycyB0aGF0IG1heSBhcmlzZS4KCkkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHdoZXJlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLCBhbmQgaG93IHRoZXkgaW50ZXJhY3QuIEFyZSB0aGV5IHBhcnQgb2YgdGhlIFNZTi9TWU4tQUNLL0FDSyBoYW5kbGluZz8gQXJlIHRoZXkgY2FsbGVkIG9ubHkgZHVyaW5nIHRoZSBpbml0aWFsIGhhbmRzaGFrZSwgb3IgYXJlIHRoZXkgaW52b2tlZCBsYXRlciB0byBoYW5kbGUgbWlkLWNvbm5lY3Rpb24gbW9kaWZpY2F0aW9ucywgc3VjaCBhcyBhZGRpbmcgbmV3IHN1YmZsb3dzPyBXaGF0IHNvcnQgb2YgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB0aGV5IHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8/CgpJJiMzOTtsbCBhbHNvIGhhdmUgdG8ga2VlcCBpbiBtaW5kIHBvc3NpYmxlIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBhbmQgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyB3aXRoaW4gdGhpcyBvcHRpb24gcHJvY2Vzc2luZy4gQXJlIHRoZXJlIGFueSBlZGdlIGNhc2VzIG9yIHVudXN1YWwgcGF5bG9hZHMgdGhhdCBjb3VsZCBsZWFkIHRvIGJ1ZmZlciBvdmVyZmxvd3Mgb3IgZGVuaWFsLW9mLXNlcnZpY2U/IFRpbWUgdG8gZGlnIGluIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9tcHRjcC9vcHRpb25zLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNjYsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzNjY6XHR2b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG4gMzY3Olx0XHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuIDM2ODpcdHtcbiAzNjk6XHRcdGNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpO1xuIDM3MDpcdFx0Y29uc3QgdW5zaWduZWQgY2hhciAqcHRyO1xuIDM3MTpcdFx0aW50IGxlbmd0aDtcbiAzNzI6XHRcbiAzNzM6XHRcdC8qIEVuc3VyZSB0aGF0IGNhc3RpbmcgdGhlIHdob2xlIHN0YXR1cyB0byB1MzIgaXMgZWZmaWNpZW50IGFuZCBzYWZlICovXG4gMzc0Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mX2ZpZWxkKHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkLCBzdGF0dXMpICE9IHNpemVvZih1MzIpKTtcbiAzNzU6XHRcdEJVSUxEX0JVR19PTighSVNfQUxJR05FRChvZmZzZXRvZihzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCwgc3RhdHVzKSxcbiAzNzY6XHRcdFx0XHRcdCBzaXplb2YodTMyKSkpO1xuIDM3NzpcdFx0Kih1MzIgKilcdTAwMjZtcF9vcHQtXHUwMDNlc3RhdHVzID0gMDtcbiAzNzg6XHRcbiAzNzk6XHRcdGxlbmd0aCA9ICh0aC1cdTAwM2Vkb2ZmICogNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7XG4gMzgwOlx0XHRwdHIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSh0aCAmIzQzOyAxKTtcbiAzODE6XHRcbiAzODI6XHRcdHdoaWxlIChsZW5ndGggXHUwMDNlIDApIHtcbiAzODM6XHRcdFx0aW50IG9wY29kZSA9ICpwdHImIzQzOyYjNDM7O1xuIDM4NDpcdFx0XHRpbnQgb3BzaXplO1xuIDM4NTpcdFxuIDM4NjpcdFx0XHRzd2l0Y2ggKG9wY29kZSkge1xuIDM4NzpcdFx0XHRjYXNlIFRDUE9QVF9FT0w6XG4gMzg4Olx0XHRcdFx0cmV0dXJuO1xuIDM4OTpcdFx0XHRjYXNlIFRDUE9QVF9OT1A6XHQvKiBSZWY6IFJGQyA3OTMgc2VjdGlvbiAzLjEgKi9cbiAzOTA6XHRcdFx0XHRsZW5ndGgtLTtcbiAzOTE6XHRcdFx0XHRjb250aW51ZTtcbiAzOTI6XHRcdFx0ZGVmYXVsdDpcbiAzOTM6XHRcdFx0XHRpZiAobGVuZ3RoIFx1MDAzYyAyKVxuIDM5NDpcdFx0XHRcdFx0cmV0dXJuO1xuIDM5NTpcdFx0XHRcdG9wc2l6ZSA9ICpwdHImIzQzOyYjNDM7O1xuIDM5NjpcdFx0XHRcdGlmIChvcHNpemUgXHUwMDNjIDIpIC8qIFwmIzM0O3NpbGx5IG9wdGlvbnNcJiMzNDsgKi9cbiAzOTc6XHRcdFx0XHRcdHJldHVybjtcbiAzOTg6XHRcdFx0XHRpZiAob3BzaXplIFx1MDAzZSBsZW5ndGgpXG4gMzk5Olx0XHRcdFx0XHRyZXR1cm47XHQvKiBkb24mIzM5O3QgcGFyc2UgcGFydGlhbCBvcHRpb25zICovXG4gNDAwOlx0XHRcdFx0aWYgKG9wY29kZSA9PSBUQ1BPUFRfTVBUQ1ApXG4gNDAxOlx0XHRcdFx0XHRtcHRjcF9wYXJzZV9vcHRpb24oc2tiLCBwdHIsIG9wc2l6ZSwgbXBfb3B0KTtcbiA0MDI6XHRcdFx0XHRwdHIgJiM0Mzs9IG9wc2l6ZSAtIDI7XG4gNDAzOlx0XHRcdFx0bGVuZ3RoIC09IG9wc2l6ZTtcbiA0MDQ6XHRcdFx0fVxuIDQwNTpcdFx0fVxuIDQwNjpcdH1cbiA0MDc6XHRcbiA0MDg6XHRib29sIG1wdGNwX3N5bl9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiA0MDk6XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgc3RydWN0IG1wdGNwX291dF9vcHRpb25zICpvcHRzKVxuIDQxMDpcdHtcbiA0MTE6XHRcdHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3cgPSBtcHRjcF9zdWJmbG93X2N0eChzayk7XG4gNDEyOlx0XG4gNDEzOlx0XHQvKiB3ZSB3aWxsIHVzZSBzbmRfaXNuIHRvIGRldGVjdCBmaXJzdCBwa3QgW3JlXXRyYW5zbWlzc2lvblxuIDQxNDpcdFx0ICogaW4gbXB0Y3BfZXN0YWJsaXNoZWRfb3B0aW9uc19tcCgpXG4gNDE1Olx0XHQgKi9cbiA0MTY6XHRcdHN1YmZsb3ctXHUwMDNlc25kX2lzbiA9IFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VlbmRfc2VxO1xuIDQxNzpcdFx0aWYgKHN1YmZsb3ctXHUwMDNlcmVxdWVzdF9tcHRjcCkge1xuIDQxODpcdFx0XHRpZiAodW5saWtlbHkoc3ViZmxvd19zaW11bHRhbmVvdXNfY29ubmVjdChzaykpKSB7XG4gNDE5Olx0XHRcdFx0V0FSTl9PTl9PTkNFKCFtcHRjcF90cnlfZmFsbGJhY2soc2ssIE1QVENQX01JQl9TSU1VTFRDT05ORkFMTEJBQ0spKTtcbiA0MjA6XHRcbiA0MjE6XHRcdFx0XHQvKiBFbnN1cmUgbXB0Y3BfZmluaXNoX2Nvbm5lY3QoKSB3aWxsIG5vdCBwcm9jZXNzIHRoZVxuIDQyMjpcdFx0XHRcdCAqIE1QQyBoYW5kc2hha2UuXG4gNDIzOlx0XHRcdFx0ICovXG4gNDI0Olx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXF1ZXN0X21wdGNwID0gMDtcbiA0MjU6XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gNDI2Olx0XHRcdH1cbiA0Mjc6XHRcbiA0Mjg6XHRcdFx0b3B0cy1cdTAwM2VzdWJvcHRpb25zID0gT1BUSU9OX01QVENQX01QQ19TWU47XG4gNDI5Olx0XHRcdG9wdHMtXHUwMDNlY3N1bV9yZXFkID0gbXB0Y3BfaXNfY2hlY2tzdW1fZW5hYmxlZChzb2NrX25ldChzaykpO1xuIDQzMDpcdFx0XHRvcHRzLVx1MDAzZWFsbG93X2pvaW5faWQwID0gbXB0Y3BfYWxsb3dfam9pbl9pZDAoc29ja19uZXQoc2spKTtcbiA0MzE6XHRcdFx0KnNpemUgPSBUQ1BPTEVOX01QVENQX01QQ19TWU47XG4gNDMyOlx0XHRcdHJldHVybiB0cnVlO1xuIDQzMzpcdFx0fSBlbHNlIGlmIChzdWJmbG93LVx1MDAzZXJlcXVlc3Rfam9pbikge1xuIDQzNDpcdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZW1vdGVfdG9rZW49JXUsIG5vbmNlPSV1XFxuXCYjMzQ7LCBzdWJmbG93LVx1MDAzZXJlbW90ZV90b2tlbixcbiA0MzU6XHRcdFx0XHQgc3ViZmxvdy1cdTAwM2Vsb2NhbF9ub25jZSk7XG4gNDM2Olx0XHRcdG9wdHMtXHUwMDNlc3Vib3B0aW9ucyA9IE9QVElPTl9NUFRDUF9NUEpfU1lOO1xuIDQzNzpcdFx0XHRvcHRzLVx1MDAzZWpvaW5faWQgPSBzdWJmbG93LVx1MDAzZWxvY2FsX2lkO1xuIDQzODpcdFx0XHRvcHRzLVx1MDAzZXRva2VuID0gc3ViZmxvdy1cdTAwM2VyZW1vdGVfdG9rZW47XG4gNDM5Olx0XHRcdG9wdHMtXHUwMDNlbm9uY2UgPSBzdWJmbG93LVx1MDAzZWxvY2FsX25vbmNlO1xuIDQ0MDpcdFx0XHRvcHRzLVx1MDAzZWJhY2t1cCA9IHN1YmZsb3ctXHUwMDNlcmVxdWVzdF9ia3VwO1xuIDQ0MTpcdFx0XHQqc2l6ZSA9IFRDUE9MRU5fTVBUQ1BfTVBKX1NZTjtcbiA0NDI6XHRcdFx0cmV0dXJuIHRydWU7XG4gNDQzOlx0XHR9XG4gNDQ0Olx0XHRyZXR1cm4gZmFsc2U7XG4gNDQ1Olx0fVxuIDQ0NjpcdFxuIDQ0NzpcdHN0YXRpYyB2b2lkIGNsZWFyXzNyZGFja19yZXRyYW5zbWlzc2lvbihzdHJ1Y3Qgc29jayAqc2spXG4gNDQ4Olx0e1xuIDQ0OTpcdFx0c3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spO1xuIDQ1MDpcdFxuIDQ1MTpcdFx0c2tfc3RvcF90aW1lcihzaywgXHUwMDI2aWNzay1cdTAwM2VpY3NrX2RlbGFja190aW1lcik7XG4gNDUyOlx0XHRpY3NrLVx1MDAzZWljc2tfYWNrLmF0byA9IDA7XG4gNDUzOlx0XHRpY3NrLVx1MDAzZWljc2tfYWNrLnBlbmRpbmcgXHUwMDI2PSB+KElDU0tfQUNLX1NDSEVEIHwgSUNTS19BQ0tfVElNRVIpO1xuIDQ1NDpcdH1cbiA0NTU6XHRcbiA0NTY6XHRzdGF0aWMgYm9vbCBtcHRjcF9lc3RhYmxpc2hlZF9vcHRpb25zX21wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiA0NTc6XHRcdFx0XHRcdFx0IGJvb2wgc25kX2RhdGFfZmluX2VuYWJsZSwgaW50ICpzaXplLFxuIDQ1ODpcdFx0XHRcdFx0XHQgc3RydWN0IG1wdGNwX291dF9vcHRpb25zICpvcHRzKVxuIDQ1OTpcdHtcbiA0NjA6XHRcdHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3cgPSBtcHRjcF9zdWJmbG93X2N0eChzayk7XG4gNDYxOlx0XHRzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrID0gbXB0Y3Bfc2soc3ViZmxvdy1cdTAwM2Vjb25uKTtcbiA0NjI6XHRcdHN0cnVjdCBtcHRjcF9leHQgKm1wZXh0O1xuIDQ2MzpcdFx0dW5zaWduZWQgaW50IGRhdGFfbGVuO1xuIDQ2NDpcdFx0dTggbGVuO1xuIDQ2NTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MDMwCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCYjMzk7cyBpbm5lciBtb25vbG9ndWU6CgoqKk1QVENQIE9wdGlvbiBIYW5kbGluZzogQSBRdWljayBNZW50YWwgQ2hlY2sqKgoKUmlnaHQsIGBtcHRjcF9nZXRfb3B0aW9uc2AgaXMgc3RhcnRpbmcgYnkgemVyb2luZyBvdXQgYG1wX29wdC0mZ3Q7c3RhdHVzYC4gVGhhdCYjMzk7cyBzdGFuZGFyZCBwcmFjdGljZSwgYSBnb29kIGluaXRpYWwgY2xlYXJpbmcgb2YgdGhlIHNsYXRlIGJlZm9yZSB3ZSBkaXZlIGludG8gcGFyc2luZyBhbnl0aGluZy4gSXQmIzM5O3MgYSBmdW5kYW1lbnRhbCBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcgbW92ZSDigJMgZW5zdXJpbmcgYSBjbGVhbiBzdGF0ZSBhbmQgcHJldmVudGluZyB1bmV4cGVjdGVkIGNhcnJ5LW92ZXIgdmFsdWVzIGZyb20gcHJldmlvdXMgb3BlcmF0aW9ucy4gTWFrZXMgcGVyZmVjdCBzZW5zZS4KCk5vdywgbGV0IG1lIGp1c3QgYnJpbmcgdXAgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkYCBpbiBteSBoZWFkLi4uIHllYWgsIG9rYXksIGdvdCBpdC4gVGhpcyBzdHJ1Y3QgaXMgd2hlcmUgYWxsIHRoZSBpbmNvbWluZyBNUFRDUCBvcHRpb24gZGF0YSBpcyBzdG9yZWQsIGNhdGVnb3JpemVkLCBhbmQgbWFuYWdlZC4gSSYjMzk7bSBtZW50YWxseSByZXZpZXdpbmcgaXRzIG1lbWJlcnMg4oCTIHRoZSBmbGFncywgdGhlIGFkZHJlc3NlcywgdGhlIGNhcGFiaWxpdGllcy4gQSBxdWljayByZWZyZXNoIG9uIHdoYXQgZmllbGRzIGFyZSByZWxldmFudCB0byB0aGUgY3VycmVudCBvcHRpb24gbmVnb3RpYXRpb24gaXMgYWx3YXlzIGJlbmVmaWNpYWwuIE5lZWQgdG8gc3RheSBzaGFycCB0byBhZGRyZXNzIHN1YnRsZSBudWFuY2VzIGluIHRoZSBtZXNzYWdlLiBOb3csIEkgY2FuIGNvbnRpbnVlIHdpdGggY29uZmlkZW5jZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgXFx7JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9wcm90b2NvbC5oPTEzOD1zdGF0aWMgaW5saW5lIGJvb2wgYmVmb3JlNjQoX191NjQgc2VxMSwgX191NjQgc2VxMilcbi0tXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC0xNDQtXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaDoxNDU6c3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQge1xubmV0L21wdGNwL3Byb3RvY29sLmgtMTQ2LVx0dTY0XHRzbmRyX2tleTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTQxMwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSYjMzk7cmUgbXkgb3duOgoKKipBbmFseXppbmcgdGhlIG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgU3RydWN0dXJlKioKCkFscmlnaHQsIGxldCYjMzk7cyBwdWxsIHVwIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZGAuIEkmIzM5O3ZlIHNlZW4gdGhpcyBiZWZvcmUsIG9mIGNvdXJzZSwgYnV0IGl0JiMzOTtzIGFsd2F5cyBnb29kIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3MsIGVzcGVjaWFsbHkgd2hlbiBjb25zaWRlcmluZyBlZGdlIGNhc2VzLiBUaGlzIHN0cnVjdHVyZSBpcyB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgaG93IE11bHRpcGF0aCBUQ1AgKE1QVENQKSBoYW5kbGVzIG9wdGlvbiBuZWdvdGlhdGlvbiBvbiBhIHJlY2VpdmVkIHBhY2tldCwgc28gSSBuZWVkIGEgc29saWQgdW5kZXJzdGFuZGluZyBvZiBlYWNoIGZpZWxkIGFuZCBpdHMgaW1wbGljYXRpb25zLgoKSSYjMzk7bGwgYmUgbG9va2luZyBjbG9zZWx5IGF0IHRoZSBiaXRmaWVsZHMsIHRoZSBzaXplIG9mIGVhY2ggbWVtYmVyLCBhbmQgd2hhdCBlYWNoIGZpZWxkIHNpZ25pZmllcyBpbiB0aGUgTVBUQ1AgcHJvdG9jb2wuIEkmIzM5O2xsIG5lZWQgdG8ga25vdyB0aGlzIGxpa2UgdGhlIGJhY2sgb2YgbXkgaGFuZC4gSSB3aWxsIGFuYWx5emUgdGhlIHN0cnVjdHVyZSwgYW5kIGl0IGlzIGNydWNpYWwgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgY3VycmVudCBNUFRDUCBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGluZm9ybSBteSB3b3JrLCBhbmQgaXMgZXNzZW50aWFsIGZvciBpbXBsZW1lbnRpbmcgbmV3IGZlYXR1cmVzIG9yIGRlYnVnZ2luZyBleGlzdGluZyBvbmVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9tcHRjcC9wcm90b2NvbC5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTQ1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNDU6XHRzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCB7XG4gMTQ2Olx0XHR1NjRcdHNuZHJfa2V5O1xuIDE0NzpcdFx0dTY0XHRyY3ZyX2tleTtcbiAxNDg6XHRcdHU2NFx0ZGF0YV9hY2s7XG4gMTQ5Olx0XHR1NjRcdGRhdGFfc2VxO1xuIDE1MDpcdFx0dTMyXHRzdWJmbG93X3NlcTtcbiAxNTE6XHRcdHUxNlx0ZGF0YV9sZW47XG4gMTUyOlx0XHRfX3N1bTE2XHRjc3VtO1xuIDE1MzpcdFx0c3RydWN0X2dyb3VwKHN0YXR1cyxcbiAxNTQ6XHRcdFx0dTE2IHN1Ym9wdGlvbnM7XG4gMTU1Olx0XHRcdHUxNiB1c2VfbWFwOjEsXG4gMTU2Olx0XHRcdCAgICBkc242NDoxLFxuIDE1NzpcdFx0XHQgICAgZGF0YV9maW46MSxcbiAxNTg6XHRcdFx0ICAgIHVzZV9hY2s6MSxcbiAxNTk6XHRcdFx0ICAgIGFjazY0OjEsXG4gMTYwOlx0XHRcdCAgICBtcGNfbWFwOjEsXG4gMTYxOlx0XHRcdCAgICByZXNldF9yZWFzb246NCxcbiAxNjI6XHRcdFx0ICAgIHJlc2V0X3RyYW5zaWVudDoxLFxuIDE2MzpcdFx0XHQgICAgZWNobzoxLFxuIDE2NDpcdFx0XHQgICAgYmFja3VwOjEsXG4gMTY1Olx0XHRcdCAgICBkZW55X2pvaW5faWQwOjEsXG4gMTY2Olx0XHRcdCAgICBfX3VudXNlZDoyO1xuIDE2NzpcdFx0KTtcbiAxNjg6XHRcdHU4XHRqb2luX2lkO1xuIDE2OTpcdFx0dTMyXHR0b2tlbjtcbiAxNzA6XHRcdHUzMlx0bm9uY2U7XG4gMTcxOlx0XHR1NjRcdHRobWFjO1xuIDE3MjpcdFx0dThcdGhtYWNbTVBUQ1BPUFRfSE1BQ19MRU5dO1xuIDE3MzpcdFx0c3RydWN0IG1wdGNwX2FkZHJfaW5mbyBhZGRyO1xuIDE3NDpcdFx0c3RydWN0IG1wdGNwX3JtX2xpc3Qgcm1fbGlzdDtcbiAxNzU6XHRcdHU2NFx0YWhtYWM7XG4gMTc2Olx0XHR1NjRcdGZhaWxfc2VxO1xuIDE3NzpcdH07XG4gMTc4Olx0XG4gMTc5Olx0c3RhdGljIGlubGluZSBfX2JlMzIgbXB0Y3Bfb3B0aW9uKHU4IHN1Ym9wdCwgdTggbGVuLCB1OCBuaWIsIHU4IGZpZWxkKVxuIDE4MDpcdHtcbiAxODE6XHRcdHJldHVybiBodG9ubCgoVENQT1BUX01QVENQIFx1MDAzY1x1MDAzYyAyNCkgfCAobGVuIFx1MDAzY1x1MDAzYyAxNikgfCAoc3Vib3B0IFx1MDAzY1x1MDAzYyAxMikgfFxuIDE4MjpcdFx0XHQgICAgICgobmliIFx1MDAyNiAweEYpIFx1MDAzY1x1MDAzYyA4KSB8IGZpZWxkKTtcbiAxODM6XHR9XG4gMTg0Olx0XG4gMTg1Olx0ZW51bSBtcHRjcF9wbV9zdGF0dXMge1xuIDE4NjpcdFx0TVBUQ1BfUE1fQUREX0FERFJfUkVDRUlWRUQsXG4gMTg3Olx0XHRNUFRDUF9QTV9BRERfQUREUl9TRU5EX0FDSyxcbiAxODg6XHRcdE1QVENQX1BNX1JNX0FERFJfUkVDRUlWRUQsXG4gMTg5Olx0XHRNUFRDUF9QTV9FU1RBQkxJU0hFRCxcbiAxOTA6XHRcdE1QVENQX1BNX1NVQkZMT1dfRVNUQUJMSVNIRUQsXG4gMTkxOlx0XHRNUFRDUF9QTV9BTFJFQURZX0VTVEFCTElTSEVELFx0LyogcGVyc2lzdGVudCBzdGF0dXMsIHNldCBhZnRlciBFU1RBQkxJU0hFRCBldmVudCAqL1xuIDE5MjpcdFx0TVBUQ1BfUE1fTVBDX0VORFBPSU5UX0FDQ09VTlRFRCAvKiBwZXJzaXN0ZW50IHN0YXR1cywgc2V0IGFmdGVyIE1QQyBsb2NhbCBhZGRyZXNzIGlzXG4gMTkzOlx0XHRcdFx0XHRcdCAqIGFjY291bnRlZCBpbnQgaWRfYXZhaWxfYml0bWFwXG4gMTk0Olx0XHRcdFx0XHRcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NDc4CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMzY3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBQYXJzaW5nIExvZ2ljKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBtcHRjcF9nZXRfb3B0aW9uc2AgZnVuY3Rpb24sIGFuZCBpdCB6ZXJvZXMgb3V0IGBtcF9vcHQtJmd0O3N0YXR1c2AsIHdoaWNoIGluY2x1ZGVzIHRoZSBgc3Vib3B0aW9uc2AgZmllbGQgYW5kIGJpdGZpZWxkcy4gVGhlbiwgdGhpcyBwYXRjaCBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBjYXVnaHQgbXkgZXllLiBTcGVjaWZpY2FsbHksIHRoZSBEU1MgY2FzZS4gSXQgY2hlY2tzIGlmIGBtcF9vcHQtJmd0O3N1Ym9wdGlvbnNgIGhhcyBhbnkgYml0cyBzZXQgb3RoZXIgdGhhbiBgT1BUSU9OX01QVENQX0FERF9BRERSYCwgYE9QVElPTl9NUFRDUF9STV9BRERSYCwgYE9QVElPTl9NUFRDUF9QUklPYCwgb3IgYE9QVElPTl9NUFRDUF9GQUlMYC4gSWYgaXQgZG9lcywgaXQganVzdCBicmVha3Mgb3V0IG9mIHRoZSBgc3dpdGNoYCBzdGF0ZW1lbnQsIHdoaWNoIHNlZW1zLi4ub2RkLgoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcywgJiMzNDtIYW5nIG9uLCB3b3VsZG4mIzM5O3QgYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AgbmVlZCB0byBiZSB6ZXJvIGluIHRoZSBmaXJzdCBwbGFjZSBmb3IgdGhpcyBjaGVjayB0byB3b3JrPyYjMzQ7IEJ1dCB0aGVuIEkgcmVtZW1iZXJlZCwgYG1wdGNwX2dldF9vcHRpb25zYCAqZG9lcyogemVybyBpdCBvdXQgcmlnaHQgYXQgdGhlIHN0YXJ0OiBgKih1MzIgKikmYW1wO21wX29wdC0mZ3Q7c3RhdHVzID0gMDtgLiBTbywgdGhhdCBiaXQgd29ya3MuCgpCdXQgbm93IEkmIzM5O20gc2VlaW5nIGEgcG90ZW50aWFsIGZsYXcuIElmIGBtcHRjcF9wYXJzZV9vcHRpb25gIGJyZWFrcyBiZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIGl0ICp3b24mIzM5O3QqIHNldCBgT1BUSU9OX01QVENQX0RTU2AgaW4gYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AuIEFuZCBjcml0aWNhbGx5LCBpdCB3b24mIzM5O3QgcG9wdWxhdGUgYWxsIHRoZSBvdGhlciBmaWVsZHMgcmVsYXRlZCB0byB0aGUgRFNTIG9wdGlvbiBsaWtlIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGBkYXRhX2xlbmAsIGFuZCBgY3N1bWAuIFNvLCB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyBnb2luZyB0byBjaGVjayBgbXBfb3B0LSZndDtzdWJvcHRpb25zYCBhbmQgc2VlIHRoYXQgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQuIEVmZmVjdGl2ZWx5LCB0aGUgRFNTIG9wdGlvbiB3aWxsIGJlIHNpbGVudGx5IGlnbm9yZWQuIElzIHRoaXMgYnkgZGVzaWduIG9yIGEgc3VidGxlIGJ1Zz8KCkFoLCByaWdodCwgYG1wX29wdGAgaXMgdHlwaWNhbGx5IGEgbG9jYWwgdmFyaWFibGUsIGxpa2UgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkYCwgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gVGhlIGNvbnNlcXVlbmNlcyBvZiB0aGUgZGVzY3JpYmVkIGxvZ2ljIGNvdWxkIGJlIGludGVyZXN0aW5nLiBJJiMzOTtkIGJldHRlciBkb3VibGUtY2hlY2sgdGhlIGNhbGxlcnMgb2YgYG1wdGNwX2dldF9vcHRpb25zYCBhbmQgZm9sbG93IHRoZSBmbG93IHRvIHNlZSBob3cgdGhpcyBEU1MgaW5mb3JtYXRpb24gaXMgYmVpbmcgaGFuZGxlZCBmdXJ0aGVyIHVwc3RyZWFtLiBUaGlzIGxvb2tzIGxpa2UgYSBwb3RlbnRpYWwgYXJlYSBmb3IgZnVydGhlciBpbnZlc3RpZ2F0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcHRjcF9nZXRfb3B0aW9uc1xcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTIzPXN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY1LVxubmV0L21wdGNwL29wdGlvbnMuYzozNjY6dm9pZCBtcHRjcF9nZXRfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxubmV0L21wdGNwL29wdGlvbnMuYy0zNjctXHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmM9MTE0MD1ib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2Ni1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MTE2NzpcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2OC1cbi0tXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaD05MTg9c3RydWN0IHNvY2sgKm1wdGNwX3NrX2Nsb25lX2luaXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxuLS1cbm5ldC9tcHRjcC9wcm90b2NvbC5oLTkyMS1cdFx0XHRcdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpO1xubmV0L21wdGNwL3Byb3RvY29sLmg6OTIyOnZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC9tcHRjcC9wcm90b2NvbC5oLTkyMy1cdFx0ICAgICAgIHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpO1xuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmM9MTQ3PXN0YXRpYyBpbnQgc3ViZmxvd19jaGVja19yZXEoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLFxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtMTY3LVxubmV0L21wdGNwL3N1YmZsb3cuYzoxNjg6XHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFx1MDAyNm1wX29wdCk7XG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTE2OS1cbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jPTI2NT1pbnQgbXB0Y3Bfc3ViZmxvd19pbml0X2Nvb2tpZV9yZXEoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLFxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtMjc1LVx0c3ViZmxvd19pbml0X3JlcShyZXEsIHNrX2xpc3RlbmVyKTtcbm5ldC9tcHRjcC9zdWJmbG93LmM6Mjc2Olx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xubmV0L21wdGNwL3N1YmZsb3cuYy0yNzctXG4tLVxubmV0L21wdGNwL3N1YmZsb3cuYz01MjY9c3RhdGljIHZvaWQgc3ViZmxvd19maW5pc2hfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXG4tLVxubmV0L21wdGNwL3N1YmZsb3cuYy01NDQtXG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjU0NTpcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9zdWJmbG93LmMtNTQ2LVx0aWYgKHN1YmZsb3ctXHUwMDNlcmVxdWVzdF9tcHRjcCkge1xuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmM9ODA2PXN0YXRpYyBzdHJ1Y3Qgc29jayAqc3ViZmxvd19zeW5fcmVjdl9zb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzayxcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg0Ni1cdFx0ICovXG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjg0NzpcdFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xubmV0L21wdGNwL3N1YmZsb3cuYy04NDgtXHRcdGlmICghKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNlxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtODUyLVx0fSBlbHNlIGlmIChzdWJmbG93X3JlcS1cdTAwM2VtcF9qb2luKSB7XG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjg1MzpcdFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xubmV0L21wdGNwL3N1YmZsb3cuYy04NTQtXHRcdGlmICghKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfTVBKX0FDSykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgyNTYKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgYG1wdGNwX2luY29taW5nX29wdGlvbnNgKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2Agc2l0dWF0aW9uLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBzZWUgd2hhdCYjMzk7cyBhY3R1YWxseSAqaW4qIHRoaXMgdGhpbmcuIFdoYXQmIzM5O3MgdGhlIGNvbnRleHQ/IElzIGl0IHJlbGF0ZWQgdG8gdGhlIGNvcmUgTVAtVENQIG5lZ290aWF0aW9uIG9yIG1vcmUgZG93bnN0cmVhbT8gV2hhdCBraW5kIG9mIG9wdGlvbnMgYXJlIHdlIHRhbGtpbmcgYWJvdXQgaGVyZT8gSSBuZWVkIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIHdlJiMzOTtyZSBsb29raW5nIGF0IHN0YW5kYXJkIE1QLVRDUCBvcHRpb25zIGxpa2UgYE1QX0NBUEFCTEVgLCBgTVBfSk9JTmAsIGV0Yy4sIG9yIHNvbWV0aGluZyBtb3JlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHRoYXQgbWlnaHQgYmUgZmxvd2luZyB0aHJvdWdoIHRoZSBNUFRDUCBsYXllci4gSSBpbW1lZGlhdGVseSB0aGluayBhYm91dCBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uLiBJcyB0aGVyZSBhIGRlZmluZWQgc3RydWN0dXJlPyBBcmUgdGhlcmUgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3Mgb3Igb3RoZXIgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIEkgc2hvdWxkIGJlIGxvb2tpbmcgZm9yPyBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGNvdWxkIGJlIGNydWNpYWwgZm9yIG92ZXJhbGwgc3lzdGVtIHN0YWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugc28gSSBhbSBpbnRlcmVzdGVkIGluIGxvb2tpbmcgYXQgdGhlIGRldGFpbHMuIFdlIHNob3VsZCBjaGVjayB0aGlzIHRob3JvdWdobHkuIExldCYjMzk7cyBzdGFydCBkaWdnaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9tcHRjcC9vcHRpb25zLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExNDA6XHRib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuMTE0MTpcdHtcbjExNDI6XHRcdHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3cgPSBtcHRjcF9zdWJmbG93X2N0eChzayk7XG4xMTQzOlx0XHRzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrID0gbXB0Y3Bfc2soc3ViZmxvdy1cdTAwM2Vjb25uKTtcbjExNDQ6XHRcdHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtcbjExNDU6XHRcdHN0cnVjdCBtcHRjcF9leHQgKm1wZXh0O1xuMTE0NjpcdFxuMTE0NzpcdFx0aWYgKF9fbXB0Y3BfY2hlY2tfZmFsbGJhY2sobXNrKSkge1xuMTE0ODpcdFx0XHQvKiBLZWVwIGl0IHNpbXBsZSBhbmQgdW5jb25kaXRpb25hbGx5IHRyaWdnZXIgc2VuZCBkYXRhIGNsZWFudXAgYW5kXG4xMTQ5Olx0XHRcdCAqIHBlbmRpbmcgcXVldWUgc3Bvb2xpbmcuIFdlIHdpbGwgbmVlZCB0byBhY3F1aXJlIHRoZSBkYXRhIGxvY2tcbjExNTA6XHRcdFx0ICogZm9yIG1vcmUgYWNjdXJhdGUgY2hlY2tzLCBhbmQgb25jZSB0aGUgbG9jayBpcyBhY3F1aXJlZCwgc3VjaFxuMTE1MTpcdFx0XHQgKiBoZWxwZXJzIGFyZSBjaGVhcC5cbjExNTI6XHRcdFx0ICovXG4xMTUzOlx0XHRcdG1wdGNwX2RhdGFfbG9jayhzdWJmbG93LVx1MDAzZWNvbm4pO1xuMTE1NDpcdFx0XHRpZiAoc2tfc3RyZWFtX21lbW9yeV9mcmVlKHNrKSlcbjExNTU6XHRcdFx0XHRfX21wdGNwX2NoZWNrX3B1c2goc3ViZmxvdy1cdTAwM2Vjb25uLCBzayk7XG4xMTU2Olx0XG4xMTU3Olx0XHRcdC8qIG9uIGZhbGxiYWNrIHdlIGp1c3QgbmVlZCB0byBpZ25vcmUgdGhlIG1zay1sZXZlbCBzbmRfdW5hLCBhc1xuMTE1ODpcdFx0XHQgKiB0aGlzIGlzIHJlYWxseSBwbGFpbiBUQ1BcbjExNTk6XHRcdFx0ICovXG4xMTYwOlx0XHRcdF9fbXB0Y3Bfc25kX3VuYV91cGRhdGUobXNrLCBSRUFEX09OQ0UobXNrLVx1MDAzZXNuZF9ueHQpKTtcbjExNjE6XHRcbjExNjI6XHRcdFx0X19tcHRjcF9kYXRhX2Fja2VkKHN1YmZsb3ctXHUwMDNlY29ubik7XG4xMTYzOlx0XHRcdG1wdGNwX2RhdGFfdW5sb2NrKHN1YmZsb3ctXHUwMDNlY29ubik7XG4xMTY0Olx0XHRcdHJldHVybiB0cnVlO1xuMTE2NTpcdFx0fVxuMTE2NjpcdFxuMTE2NzpcdFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xuMTE2ODpcdFxuMTE2OTpcdFx0LyogVGhlIHN1YmZsb3cgY2FuIGJlIGluIGNsb3NlIHN0YXRlIG9ubHkgaWYgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxuMTE3MDpcdFx0ICoganVzdCBzZW50IGEgcmVzZXQuIElmIHNvLCB0ZWxsIHRoZSBjYWxsZXIgdG8gaWdub3JlIHRoZSBjdXJyZW50IHBhY2tldC5cbjExNzE6XHRcdCAqL1xuMTE3MjpcdFx0aWYgKCFjaGVja19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHNrLCBzdWJmbG93LCBza2IsIFx1MDAyNm1wX29wdCkpXG4xMTczOlx0XHRcdHJldHVybiBzay1cdTAwM2Vza19zdGF0ZSAhPSBUQ1BfQ0xPU0U7XG4xMTc0Olx0XG4xMTc1Olx0XHRpZiAodW5saWtlbHkobXBfb3B0LnN1Ym9wdGlvbnMgIT0gT1BUSU9OX01QVENQX0RTUykpIHtcbjExNzY6XHRcdFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0ZBU1RDTE9TRSkgXHUwMDI2XHUwMDI2XG4xMTc3Olx0XHRcdCAgICBSRUFEX09OQ0UobXNrLVx1MDAzZWxvY2FsX2tleSkgPT0gbXBfb3B0LnJjdnJfa2V5KSB7XG4xMTc4Olx0XHRcdFx0V1JJVEVfT05DRShtc2stXHUwMDNlcmN2X2Zhc3RjbG9zZSwgdHJ1ZSk7XG4xMTc5Olx0XHRcdFx0bXB0Y3Bfc2NoZWR1bGVfd29yaygoc3RydWN0IHNvY2sgKiltc2spO1xuMTE4MDpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBU1RDTE9TRVJYKTtcbjExODE6XHRcdFx0fVxuMTE4MjpcdFxuMTE4MzpcdFx0XHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfQUREX0FERFIpIFx1MDAyNlx1MDAyNlxuMTE4NDpcdFx0XHQgICAgYWRkX2FkZHJfaG1hY192YWxpZChtc2ssIFx1MDAyNm1wX29wdCkpIHtcbjExODU6XHRcdFx0XHRpZiAoIW1wX29wdC5lY2hvKSB7XG4xMTg2Olx0XHRcdFx0XHRtcHRjcF9wbV9hZGRfYWRkcl9yZWNlaXZlZChzaywgXHUwMDI2bXBfb3B0LmFkZHIpO1xuMTE4NzpcdFx0XHRcdFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX0FEREFERFIpO1xuMTE4ODpcdFx0XHRcdH0gZWxzZSB7XG4xMTg5Olx0XHRcdFx0XHRtcHRjcF9wbV9hZGRfYWRkcl9lY2hvZWQobXNrLCBcdTAwMjZtcF9vcHQuYWRkcik7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0NjkKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA0MTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBpbiBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSW4gdGhlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBmdW5jdGlvbiwgYG1wX29wdGAsIHRoZSBzdHJ1Y3QgaG9sZGluZyB0aGUgcmVjZWl2ZWQgTVBUQ1Agb3B0aW9ucywgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gTXkgaW1tZWRpYXRlIGNvbmNlcm4/IEl0JiMzOTtzICpub3QqIGluaXRpYWxpemVkLiBOb3csIGBtcHRjcF9nZXRfb3B0aW9uc2AgZG9lcyB6ZXJvIG91dCBgbXBfb3B0LnN0YXR1c2AsIGluY2x1ZGluZyB0aGUgYHN1Ym9wdGlvbnNgIGZpZWxkLCB3aGljaCBpcyBnb29kLiBCdXQgd2FpdOKApiBpdCAqb25seSogemVyb3MgYHN0YXR1c2AhIEl0IHVzZXMgYSByYXRoZXIgY3J1ZGUgY2FzdCB0byBhIHUzMiBwb2ludGVyIHRvIGFjaGlldmUgdGhpcy4KClRoZSByZWFsIHByb2JsZW0gbGllcyBpbiBob3cgdGhlIGNvZGUgaGFuZGxlcyBgTVBUQ1BPUFRfRFNTYC4gYG1wdGNwX2dldF9vcHRpb25zYCB0aGVuIHByb2NlZWRzIHRvIHBhcnNlIHRoZXNlIG9wdGlvbnMuIElmIGl0IGVuY291bnRlcnMgYSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24sIGl0IHNldHMgYE9QVElPTl9NUFRDUF9EU1NgIGluIGBtcF9vcHQuc3Vib3B0aW9uc2AgYW5kIHBvcHVsYXRlcyB0aGUgcmVsZXZhbnQgZGF0YSBmaWVsZHMg4oCTIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGV0Yy4KClRoZSBjcml0aWNhbCB0aGluZywgdGhlIG5ldyBjaGVjayBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCwgaXMgd2hhdCBtYWtlcyB0aGlzIHJlYWxseSB0cmlja3kuIElmLCBhbmQgdGhpcyBpcyB0aGUgY3J1eCwgdGhlIHBhcnNpbmcgb2YgYE1QVENQT1BUX0RTU2AgYnJlYWtzIG91dCBkdWUgdG8gdGhpcyBuZXcsIHJlc3RyaWN0aXZlIGNoZWNrLi4uCgpgYGBjCgljYXNlIE1QVENQT1BUX0RTUzoKCQkvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqLwoJCWlmICgobXBfb3B0LSZndDtzdWJvcHRpb25zICZhbXA7IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHwKCQkJCQkgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfAoJCQkJCSAgICBPUFRJT05fTVBUQ1BfUFJJTyB8CgkJCQkJICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMCkKCQkJYnJlYWs7CmBgYAoKLi4udGhlbiBgT1BUSU9OX01QVENQX0RTU2AgKmlzIG5vdCogc2V0IGluIGBtcF9vcHQuc3Vib3B0aW9uc2AuIFRoYXQgaXMsIGlmIHRoZSBEU1Mgb3B0aW9uIGlzIHByZXNlbnQgYWxvbmcgd2l0aCBvdGhlciBkaXNhbGxvd2VkIG9wdGlvbnMsIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBub3Qgc2V0LgoKVGhlIGNvZGUgdGhlbiBjaGVja3M6CgpgYGBjCglpZiAodW5saWtlbHkobXBfb3B0LnN1Ym9wdGlvbnMgIT0gT1BUSU9OX01QVENQX0RTUykpIHsKYGBgCgpTbywgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQsIHRoaXMgYGlmYCBjb25kaXRpb24gd2lsbCBiZSB0cnVlLCBtZWFuaW5nIHdlIGVudGVyIHRoaXMgYmxvY2sgb2YgY29kZS4KCkhlcmUmIzM5O3Mgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZyDigJMgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQsIGFyZSB3ZSByZWFkaW5nIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnk/IEkgbmVlZCB0byB2ZXJpZnkgd2hhdCBmaWVsZHMgYXJlIHJlYWQgd2l0aGluIHRoYXQgJiMzNDt1bmxpa2VseSYjMzQ7IGJsb2NrLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSBwb3RlbnRpYWwgbGllcyBmb3IgYSBzZXJpb3VzIHZ1bG5lcmFiaWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDExNzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTE3NTpcdFx0aWYgKHVubGlrZWx5KG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1MpKSB7XG4xMTc2Olx0XHRcdGlmICgobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9GQVNUQ0xPU0UpIFx1MDAyNlx1MDAyNlxuMTE3NzpcdFx0XHQgICAgUkVBRF9PTkNFKG1zay1cdTAwM2Vsb2NhbF9rZXkpID09IG1wX29wdC5yY3ZyX2tleSkge1xuMTE3ODpcdFx0XHRcdFdSSVRFX09OQ0UobXNrLVx1MDAzZXJjdl9mYXN0Y2xvc2UsIHRydWUpO1xuMTE3OTpcdFx0XHRcdG1wdGNwX3NjaGVkdWxlX3dvcmsoKHN0cnVjdCBzb2NrICopbXNrKTtcbjExODA6XHRcdFx0XHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBGQVNUQ0xPU0VSWCk7XG4xMTgxOlx0XHRcdH1cbjExODI6XHRcbjExODM6XHRcdFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0FERF9BRERSKSBcdTAwMjZcdTAwMjZcbjExODQ6XHRcdFx0ICAgIGFkZF9hZGRyX2htYWNfdmFsaWQobXNrLCBcdTAwMjZtcF9vcHQpKSB7XG4xMTg1Olx0XHRcdFx0aWYgKCFtcF9vcHQuZWNobykge1xuMTE4NjpcdFx0XHRcdFx0bXB0Y3BfcG1fYWRkX2FkZHJfcmVjZWl2ZWQoc2ssIFx1MDAyNm1wX29wdC5hZGRyKTtcbjExODc6XHRcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9BRERBRERSKTtcbjExODg6XHRcdFx0XHR9IGVsc2Uge1xuMTE4OTpcdFx0XHRcdFx0bXB0Y3BfcG1fYWRkX2FkZHJfZWNob2VkKG1zaywgXHUwMDI2bXBfb3B0LmFkZHIpO1xuMTE5MDpcdFx0XHRcdFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX0VDSE9BREQpO1xuMTE5MTpcdFx0XHRcdH1cbjExOTI6XHRcbjExOTM6XHRcdFx0XHRpZiAobXBfb3B0LmFkZHIucG9ydClcbjExOTQ6XHRcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9QT1JUQUREKTtcbjExOTU6XHRcdFx0fVxuMTE5NjpcdFxuMTE5NzpcdFx0XHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9STV9BRERSKVxuMTE5ODpcdFx0XHRcdG1wdGNwX3BtX3JtX2FkZHJfcmVjZWl2ZWQobXNrLCBcdTAwMjZtcF9vcHQucm1fbGlzdCk7XG4xMTk5Olx0XG4xMjAwOlx0XHRcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX1BSSU8pIHtcbjEyMDE6XHRcdFx0XHRtcHRjcF9wbV9tcF9wcmlvX3JlY2VpdmVkKHNrLCBtcF9vcHQuYmFja3VwKTtcbjEyMDI6XHRcdFx0XHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBQUklPUlgpO1xuMTIwMzpcdFx0XHR9XG4xMjA0Olx0XG4xMjA1Olx0XHRcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0ZBSUwpIHtcbjEyMDY6XHRcdFx0XHRtcHRjcF9wbV9tcF9mYWlsX3JlY2VpdmVkKHNrLCBtcF9vcHQuZmFpbF9zZXEpO1xuMTIwNzpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBSUxSWCk7XG4xMjA4Olx0XHRcdH1cbjEyMDk6XHRcbjEyMTA6XHRcdFx0aWYgKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfUlNUKSB7XG4xMjExOlx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXNldF9zZWVuID0gMTtcbjEyMTI6XHRcdFx0XHRzdWJmbG93LVx1MDAzZXJlc2V0X3JlYXNvbiA9IG1wX29wdC5yZXNldF9yZWFzb247XG4xMjEzOlx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXNldF90cmFuc2llbnQgPSBtcF9vcHQucmVzZXRfdHJhbnNpZW50O1xuMTIxNDpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFJTVFJYKTtcbjEyMTU6XHRcdFx0fVxuMTIxNjpcdFxuMTIxNzpcdFx0XHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUykpXG4xMjE4Olx0XHRcdFx0cmV0dXJuIHRydWU7XG4xMjE5Olx0XHR9XG4xMjIwOlx0XG4xMjIxOlx0XHQvKiB3ZSBjYW4mIzM5O3Qgd2FpdCBmb3IgcmVjdm1zZygpIHRvIHVwZGF0ZSB0aGUgYWNrX3NlcSwgb3RoZXJ3aXNlXG4xMjIyOlx0XHQgKiBtb25vZGlyZWN0aW9uYWwgZmxvd3Mgd2lsbCBzdHVja1xuMTIyMzpcdFx0ICovXG4xMjI0Olx0XHRpZiAobXBfb3B0LnVzZV9hY2spXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNDM1CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogNjc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgT3B0aW9uIEhhbmRsaW5nIExvZ2ljKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdGhpczogSWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQsIHRoZW4gaXQgY2hlY2tzIGEgYnVuY2ggb2Ygb3RoZXIgb3B0aW9ucywgbGlrZSBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAsIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBhbmQgc28gb24uIEluIGVhY2ggb2YgdGhlc2UgY2FzZXMsIGl0JiMzOTtzIHJlYWRpbmcgZmllbGRzIGZyb20gYG1wX29wdGAg4oCTIGByY3ZyX2tleWAsIGBhZGRyYCwgYHJtX2xpc3RgLCBldGMuIOKAkyAqYWZ0ZXIqIGFzc3VtaW5nIGBtcHRjcF9wYXJzZV9vcHRpb25gIGhhcyBhbHJlYWR5IHBvcHVsYXRlZCB0aGVtLCB3aGljaCBpcyB0aGUga2V5IGhlcmUuCgpUaGVuIGNvbWVzIHRoaXMgY29uZGl0aW9uYWw6IGlmIGAhKG1wX29wdC5zdWJvcHRpb25zICZhbXA7IE9QVElPTl9NUFRDUF9EU1MpYCB3aGljaCBtZWFucyAmIzM0O2lmIERTUyBpc24mIzM5O3Qgc2V0LCByZXR1cm4gdHJ1ZSYjMzQ7IGFuZCBqdXN0IHN0b3BzLiBXYWl0Li4uIHRoYXQgbG9va3Mgc3VzcGljaW91cywgYmVjYXVzZSBpZiBEU1MgKmlzbiYjMzk7dCogc2V0LCBpdCAqaW1tZWRpYXRlbHkqIHJldHVybnMgd2l0aG91dCB0b3VjaGluZyB0aGUgRFNTIGZpZWxkcywgYXMgaXQgc2hvdWxkLgoKQnV0LCBpZiBgT1BUSU9OX01QVENQX0RTU2AgKmlzKiBzZXQsIHRoZW4gaXQgZ29lcyBvbiB0byByZWFkIGEgd2hvbGUgYnVuY2ggb2YgRFNTLXNwZWNpZmljIGZpZWxkcyBsaWtlIGB1c2VfYWNrYCwgYGRhdGFfYWNrYCwgYGRhdGFfc2VxYCwgZXRjLiBBZ2FpbiwgdGhlIGFzc3VtcHRpb24gaXMgdGhhdCBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBwb3B1bGF0ZWQgdGhvc2UgZmllbGRzLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCB0aG9zZSBmaWVsZHMgYXJlIHBvcHVsYXRlZCBob2xkcyB0cnVlLgoKTm93LCBJIHJlbWVtYmVyIHNlZWluZyBzb21ldGhpbmcgYWJvdXQgdGhlIGBNUFRDUE9QVF9EU1NgIGNhc2UgaW4gdGhlIGBtcHRjcF9wYXJzZV9vcHRpb25gIGZ1bmN0aW9uLiBBaCwgaGVyZSBpdCBpczogdGhlIHBhdGNoIGluY2x1ZGVzIGEgY29uc3RyYWludDogaWYgYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AgaGFzIGFueSBvcHRpb24gKm90aGVyIHRoYW4qIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBgT1BUSU9OX01QVENQX1BSSU9gLCBvciBgT1BUSU9OX01QVENQX0ZBSUxgIHNldCwgdGhlbiBpdCBicmVha3Mgb3V0LiBUaGF0IG1lYW5zLCBpbnNpZGUgdGhlIERTUyBjYXNlIGluIHRoZSBwYXJzZXIsIGlmIGFueXRoaW5nIGVsc2UsICpsaWtlKiBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAgaXMgc2V0LCB0aGUgcGFyc2VyIGp1c3QgYmFpbHMgb3V0LiBUaGlzIGlzIGdvb2QgYmVjYXVzZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2Agd2lsbCByZXR1cm4gYHRydWVgIGF0IGxpbmUgMTIxOC4KClNvLCAqaWYqIGFueSBvZiB0aG9zZSBvdGhlciBvcHRpb24gYml0cyAqYXJlKiBzZXQgYWxvbmcgd2l0aCBEU1MsIHRoZSBEU1MgcGFyc2luZyAqd29uJiMzOTt0KiBoYXBwZW4sIGFuZCB0aGUgY29kZSB3b24mIzM5O3QgcmVhZCBhbnkgdW5pbml0aWFsaXplZCBEU1MgZmllbGRzLiBSaWdodD8KCk9rYXksIHNvIEkgdGhpbmsgdGhlIHZ1bG5lcmFibGUgcmVhZCBpcyBwcm90ZWN0ZWQgYnkgdGhlIGBtcHRjcF9wYXJzZV9vcHRpb25gIGNvbnN0cmFpbnQuCgpKdXN0IHRvIGJlIHN1cmUsIGlzIHRoZXJlIGFueSBvdGhlciBsb2NhdGlvbiBpbiB0aGlzIGNvZGUgd2hlcmUgYG1wX29wdGAgaXMgcmVhZD8gSXQgaXMgd29ydGggY2hlY2tpbmcgdGhlIGNhbGwgdG8gYGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkKG1zaywgc2ssIHN1YmZsb3csIHNrYiwgJmFtcDttcF9vcHQpYC4gVGhhdCYjMzk7cyB0aGUgbmV4dCBzdGVwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjaGVja19mdWxseV9lc3RhYmxpc2hlZFxcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTg5MD1ib29sIG1wdGNwX3N5bmFja19vcHRpb25zKGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwgdW5zaWduZWQgaW50ICpzaXplLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtOTE4LVxubmV0L21wdGNwL29wdGlvbnMuYzo5MTk6c3RhdGljIGJvb2wgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zaywgc3RydWN0IHNvY2sgKnNzayxcbm5ldC9tcHRjcC9vcHRpb25zLmMtOTIwLVx0XHRcdFx0ICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYz0xMTQwPWJvb2wgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYy0xMTY4LVxubmV0L21wdGNwL29wdGlvbnMuYzoxMTY5Olx0LyogVGhlIHN1YmZsb3cgY2FuIGJlIGluIGNsb3NlIHN0YXRlIG9ubHkgaWYgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxubmV0L21wdGNwL29wdGlvbnMuYy0xMTcwLVx0ICoganVzdCBzZW50IGEgcmVzZXQuIElmIHNvLCB0ZWxsIHRoZSBjYWxsZXIgdG8gaWdub3JlIHRoZSBjdXJyZW50IHBhY2tldC5cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE3MS1cdCAqL1xubmV0L21wdGNwL29wdGlvbnMuYzoxMTcyOlx0aWYgKCFjaGVja19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHNrLCBzdWJmbG93LCBza2IsIFx1MDAyNm1wX29wdCkpXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNzMtXHRcdHJldHVybiBzay1cdTAwM2Vza19zdGF0ZSAhPSBUQ1BfQ0xPU0U7XG4tLVxubmV0L21wdGNwL3BtLmM9NjA1PXZvaWQgbXB0Y3BfcG1fZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zaywgY29uc3Qgc3RydWN0IHNvY2sgKnNzaylcbi0tXG5uZXQvbXB0Y3AvcG0uYy02MTQtXHQvKiBtcHRjcF9wbV9mdWxseV9lc3RhYmxpc2hlZCgpIGNhbiBiZSBpbnZva2VkIGJ5IG11bHRpcGxlXG5uZXQvbXB0Y3AvcG0uYzo2MTU6XHQgKiByYWNpbmcgcGF0aHMgLSBhY2NlcHQoKSBhbmQgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxubmV0L21wdGNwL3BtLmMtNjE2LVx0ICogYmUgc3VyZSB0byBzZXJ2ZSB0aGlzIGV2ZW50IG9ubHkgb25jZS5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMyMTEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgSSYjMzk7bSByZWFkeS4gSGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggdGhlc2UgYXJlIG15IHRob3VnaHRzLCBrZWVwaW5nIGluIG1pbmQgSSYjMzk7bSBkZWFsaW5nIHdpdGggYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipFeGFtaW5pbmcgYGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBsb2dpYyBvZiBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IgaW4gZGV0YWlsLiBJJiMzOTttIGltbWVkaWF0ZWx5IGZvY3VzaW5nIG9uIHdoYXQgdGhlIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIHZhbGlkYXRlIGFuZCB1bmRlciB3aGF0IGNvbmRpdGlvbnMuIFdoYXQgZGF0YSBpcyBpdCBjb25zdW1pbmcgYW5kIHdoYXQgaXMgdGhlIGV4cGVjdGVkIG91dGNvbWUgYmFzZWQgb24gdGhhdCBpbnB1dD8gSSBuZWVkIHRvIHRoaW5rIHRocm91Z2ggYW55IGVkZ2UgY2FzZXMgYW5kIHBvdGVudGlhbCBmYWlsdXJlIHNjZW5hcmlvcyB0aGUgZnVuY3Rpb24gbWlnaHQgaGFuZGxlLiBBcmUgdGhlcmUgYW55IGltcGxpY2l0IGFzc3VtcHRpb25zIGJha2VkIGludG8gdGhpcyBsb2dpYyB0aGF0IEkgbmVlZCB0byBzdXJmYWNlPyBJJiMzOTttIGFscmVhZHkgYW50aWNpcGF0aW5nIHBvdGVudGlhbCBkZWJ1Z2dpbmcgc3RlcHMgc2hvdWxkIEkgaGF2ZSB0byBhbmFseXplIGEgZG93bnN0cmVhbSBlcnJvciB3aGVyZSBpdCBwbGF5cyBhIHJvbGUuIEkmIzM5O20gZ29pbmcgdG8gY2FyZWZ1bGx5IHJlYWQgZXZlcnkgbGluZSBvZiB0aGlzIGZ1bmN0aW9uLCB0YWtpbmcgdGhlIHRpbWUgdG8gcGFyc2UgZWFjaCBjb21wb25lbnQgZm9yIHRoZSBwdXJwb3NlIG9mIGlkZW50aWZ5aW5nIGFueSBwb3NzaWJsZSBnYXBzIG9yIGluY29uc2lzdGVuY2llcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTE5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA5MTk6XHRzdGF0aWMgYm9vbCBjaGVja19mdWxseV9lc3RhYmxpc2hlZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLCBzdHJ1Y3Qgc29jayAqc3NrLFxuIDkyMDpcdFx0XHRcdFx0ICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXG4gOTIxOlx0XHRcdFx0XHQgICAgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiA5MjI6XHRcdFx0XHRcdCAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuIDkyMzpcdHtcbiA5MjQ6XHRcdC8qIGhlcmUgd2UgY2FuIHByb2Nlc3MgT29PLCBpbi13aW5kb3cgcGt0cywgb25seSBpbi1zZXF1ZW5jZSA0dGggYWNrXG4gOTI1Olx0XHQgKiB3aWxsIG1ha2UgdGhlIHN1YmZsb3cgZnVsbHkgZXN0YWJsaXNoZWRcbiA5MjY6XHRcdCAqL1xuIDkyNzpcdFx0aWYgKGxpa2VseShSRUFEX09OQ0Uoc3ViZmxvdy1cdTAwM2VmdWxseV9lc3RhYmxpc2hlZCkpKSB7XG4gOTI4Olx0XHRcdC8qIG9uIHBhc3NpdmUgc29ja2V0cywgY2hlY2sgZm9yIDNyZCBhY2sgcmV0cmFuc21pc3Npb25cbiA5Mjk6XHRcdFx0ICogbm90ZSB0aGF0IG1zayBpcyBhbHdheXMgc2V0IGJ5IHN1YmZsb3dfc3luX3JlY3Zfc29jaygpXG4gOTMwOlx0XHRcdCAqIGZvciBtcF9qb2luIHN1YmZsb3dzXG4gOTMxOlx0XHRcdCAqL1xuIDkzMjpcdFx0XHRpZiAoVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcSA9PSBzdWJmbG93LVx1MDAzZXNzbl9vZmZzZXQgJiM0MzsgMSBcdTAwMjZcdTAwMjZcbiA5MzM6XHRcdFx0ICAgIFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VlbmRfc2VxID09IFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VzZXEgXHUwMDI2XHUwMDI2XG4gOTM0Olx0XHRcdCAgICBzdWJmbG93LVx1MDAzZW1wX2pvaW4gXHUwMDI2XHUwMDI2IChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OU19NUFRDUF9NUEopIFx1MDAyNlx1MDAyNlxuIDkzNTpcdFx0XHQgICAgIXN1YmZsb3ctXHUwMDNlcmVxdWVzdF9qb2luKVxuIDkzNjpcdFx0XHRcdHRjcF9zZW5kX2Fjayhzc2spO1xuIDkzNzpcdFx0XHRnb3RvIGNoZWNrX25vdGlmeTtcbiA5Mzg6XHRcdH1cbiA5Mzk6XHRcbiA5NDA6XHRcdC8qIHdlIG11c3QgcHJvY2VzcyBPb08gcGFja2V0cyBiZWZvcmUgdGhlIGZpcnN0IHN1YmZsb3cgaXMgZnVsbHlcbiA5NDE6XHRcdCAqIGVzdGFibGlzaGVkLiBPb08gcGFja2V0cyBhcmUgaW5zdGVhZCBhIHByb3RvY29sIHZpb2xhdGlvblxuIDk0MjpcdFx0ICogZm9yIE1QX0pPSU4gc3ViZmxvd3MgYXMgdGhlIHBlZXIgbXVzdCBub3Qgc2VuZCBhbnkgZGF0YVxuIDk0MzpcdFx0ICogYmVmb3JlIHJlY2VpdmluZyB0aGUgZm9ydGggYWNrIC0gY2ZyLiBSRkMgODY4NCBzZWN0aW9uIDMuMi5cbiA5NDQ6XHRcdCAqL1xuIDk0NTpcdFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VzZXEgIT0gc3ViZmxvdy1cdTAwM2Vzc25fb2Zmc2V0ICYjNDM7IDEpIHtcbiA5NDY6XHRcdFx0aWYgKHN1YmZsb3ctXHUwMDNlbXBfam9pbilcbiA5NDc6XHRcdFx0XHRnb3RvIHJlc2V0O1xuIDk0ODpcdFx0XHRpZiAoc3ViZmxvdy1cdTAwM2Vpc19tcHRmbyBcdTAwMjZcdTAwMjYgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9NUENfQUNLKVxuIDk0OTpcdFx0XHRcdGdvdG8gc2V0X2Z1bGx5X2VzdGFibGlzaGVkO1xuIDk1MDpcdFx0XHRyZXR1cm4gc3ViZmxvdy1cdTAwM2VtcF9jYXBhYmxlO1xuIDk1MTpcdFx0fVxuIDk1MjpcdFxuIDk1MzpcdFx0aWYgKHN1YmZsb3ctXHUwMDNlcmVtb3RlX2tleV92YWxpZCBcdTAwMjZcdTAwMjZcbiA5NTQ6XHRcdCAgICAoKChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUykgXHUwMDI2XHUwMDI2IG1wX29wdC1cdTAwM2V1c2VfYWNrKSB8fFxuIDk1NTpcdFx0ICAgICAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfQUREX0FERFIpIFx1MDAyNlx1MDAyNlxuIDk1NjpcdFx0ICAgICAgKCFtcF9vcHQtXHUwMDNlZWNobyB8fCBzdWJmbG93LVx1MDAzZW1wX2pvaW4pKSkpIHtcbiA5NTc6XHRcdFx0Lyogc3ViZmxvd3MgYXJlIGZ1bGx5IGVzdGFibGlzaGVkIGFzIHNvb24gYXMgd2UgZ2V0IGFueVxuIDk1ODpcdFx0XHQgKiBhZGRpdGlvbmFsIGFjaywgaW5jbHVkaW5nIEFERF9BRERSLlxuIDk1OTpcdFx0XHQgKi9cbiA5NjA6XHRcdFx0Z290byBzZXRfZnVsbHlfZXN0YWJsaXNoZWQ7XG4gOTYxOlx0XHR9XG4gOTYyOlx0XG4gOTYzOlx0XHQvKiBJZiB0aGUgZmlyc3QgZXN0YWJsaXNoZWQgcGFja2V0IGRvZXMgbm90IGNvbnRhaW4gTVBfQ0FQQUJMRSAmIzQzOyBkYXRhXG4gOTY0Olx0XHQgKiB0aGVuIGZhbGxiYWNrIHRvIFRDUC4gRmFsbGJhY2sgc2NlbmFyaW9zIHJlcXVpcmVzIGEgcmVzZXQgZm9yXG4gOTY1Olx0XHQgKiBNUF9KT0lOIHN1YmZsb3dzLlxuIDk2NjpcdFx0ICovXG4gOTY3Olx0XHRpZiAoIShtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OU19NUFRDUF9NUEMpKSB7XG4gOTY4Olx0XHRcdGlmIChzdWJmbG93LVx1MDAzZW1wX2pvaW4pXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MzcwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBIYW5kbGluZyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgIGZ1bmN0aW9uLiBJdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoOyBpdCYjMzk7cyBjaGVja2luZyBgbXBfb3B0LSZndDtzdWJvcHRpb25zYC4gQW5kLCBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgc2V0IHdpdGhpbiB0aG9zZSBzdWJvcHRpb25zLCBpdCYjMzk7cyBjaGVja2luZyBgbXBfb3B0LSZndDt1c2VfYWNrYC4gVGhpcyBzZWVtcyBsb2dpY2FsLCBidXQgaXQgaW1tZWRpYXRlbHkgcmFpc2VzIGEgY29uY2VybjogaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHByZXNlbnQsIHNob3VsZG4mIzM5O3QgYG1wdGNwX3BhcnNlX29wdGlvbmAgaGF2ZSAqZ3VhcmFudGVlZCogdGhhdCBgdXNlX2Fja2AgaXMgcG9wdWxhdGVkPyBUaGUgbG9naWMgc2VlbXMgdG8gcmVseSBvbiB0aGF0IGFzc3VtcHRpb24uCgpUaGVuLCB0aGUgcmVkIGZsYWcgd2VudCB1cC4gV2hhdCBpZiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBlbmNvdW50ZXJzIGEgbWFsZm9ybWVkIHBhY2tldCBjb250YWluaW5nIGBNUFRDUE9QVF9EU1NgPyBJcyB0aGVyZSBhbnkgZGVmZW5zaXZlIHByb2dyYW1taW5nIGluIHBsYWNlIHRvIGhhbmRsZSB0aGF0IGNhc2U/IFRoaXMgY291bGQgbGVhZCB0byB1bmRlZmluZWQgYmVoYXZpb3Igb3IsIHdvcnNlLCBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgaWYgdGhlIGNvZGUgcHJvY2VlZHMgd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGRhdGEuIFdlICphYnNvbHV0ZWx5KiBjYW4mIzM5O3QgbGV0IHRoYXQgaGFwcGVuLiBUaGVyZWZvcmUsIEkgbmVlZCB0byBkaWcgaW50byBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCB0byB2ZXJpZnkgcHJlY2lzZWx5IGhvdyBpdCBoYW5kbGVzIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gYW5kIHRoZSBzdWJzZXF1ZW50IHBvcHVsYXRpb24gb2YgYHVzZV9hY2tgLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvZGUgaXMgcm9idXN0IGFuZCBoYW5kbGVzIGludmFsaWQgaW5wdXQgZ3JhY2VmdWxseS4gVGhpcyBuZWVkcyB0byBiZSBjaGVja2VkLCByaWdodCBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE1NTpcdFx0Y2FzZSBNUFRDUE9QVF9EU1M6XG4gMTU2Olx0XHRcdC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG4gMTU3Olx0XHRcdGlmICgobXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHxcbiAxNTg6XHRcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcbiAxNTk6XHRcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcbiAxNjA6XHRcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMClcbiAxNjE6XHRcdFx0XHRicmVhaztcbiAxNjI6XHRcbiAxNjM6XHRcdFx0cHJfZGVidWcoXCYjMzQ7RFNTXFxuXCYjMzQ7KTtcbiAxNjQ6XHRcdFx0cHRyJiM0MzsmIzQzOztcbiAxNjU6XHRcbiAxNjY6XHRcdFx0ZmxhZ3MgPSAoKnB0ciYjNDM7JiM0MzspIFx1MDAyNiBNUFRDUF9EU1NfRkxBR19NQVNLO1xuIDE2NzpcdFx0XHRtcF9vcHQtXHUwMDNlZHNuNjQgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19EU042NCkgIT0gMDtcbiAxNjg6XHRcdFx0bXBfb3B0LVx1MDAzZXVzZV9tYXAgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19IQVNfTUFQKSAhPSAwO1xuIDE2OTpcdFx0XHRtcF9vcHQtXHUwMDNlYWNrNjQgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19BQ0s2NCkgIT0gMDtcbiAxNzA6XHRcdFx0bXBfb3B0LVx1MDAzZXVzZV9hY2sgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19IQVNfQUNLKTtcbiAxNzE6XHRcbiAxNzI6XHRcdFx0ZXhwZWN0ZWRfb3BzaXplID0gVENQT0xFTl9NUFRDUF9EU1NfQkFTRTtcbiAxNzM6XHRcbiAxNzQ6XHRcdFx0aWYgKG1wX29wdC1cdTAwM2V1c2VfYWNrKSB7XG4gMTc1Olx0XHRcdFx0aWYgKG1wX29wdC1cdTAwM2VhY2s2NClcbiAxNzY6XHRcdFx0XHRcdGV4cGVjdGVkX29wc2l6ZSAmIzQzOz0gVENQT0xFTl9NUFRDUF9EU1NfQUNLNjQ7XG4gMTc3Olx0XHRcdFx0ZWxzZVxuIDE3ODpcdFx0XHRcdFx0ZXhwZWN0ZWRfb3BzaXplICYjNDM7PSBUQ1BPTEVOX01QVENQX0RTU19BQ0szMjtcbiAxNzk6XHRcdFx0fVxuIDE4MDpcdFxuIDE4MTpcdFx0XHRpZiAobXBfb3B0LVx1MDAzZXVzZV9tYXApIHtcbiAxODI6XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9maW4gPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19EQVRBX0ZJTikgIT0gMDtcbiAxODM6XHRcdFx0XHRpZiAobXBfb3B0LVx1MDAzZWRzbjY0KVxuIDE4NDpcdFx0XHRcdFx0ZXhwZWN0ZWRfb3BzaXplICYjNDM7PSBUQ1BPTEVOX01QVENQX0RTU19NQVA2NDtcbiAxODU6XHRcdFx0XHRlbHNlXG4gMTg2Olx0XHRcdFx0XHRleHBlY3RlZF9vcHNpemUgJiM0Mzs9IFRDUE9MRU5fTVBUQ1BfRFNTX01BUDMyO1xuIDE4NzpcdFx0XHR9XG4gMTg4Olx0XG4gMTg5Olx0XHRcdHByX2RlYnVnKFwmIzM0O2RhdGFfZmluPSVkIGRzbjY0PSVkIHVzZV9tYXA9JWQgYWNrNjQ9JWQgdXNlX2Fjaz0lZFxcblwmIzM0OyxcbiAxOTA6XHRcdFx0XHQgbXBfb3B0LVx1MDAzZWRhdGFfZmluLCBtcF9vcHQtXHUwMDNlZHNuNjQsXG4gMTkxOlx0XHRcdFx0IG1wX29wdC1cdTAwM2V1c2VfbWFwLCBtcF9vcHQtXHUwMDNlYWNrNjQsXG4gMTkyOlx0XHRcdFx0IG1wX29wdC1cdTAwM2V1c2VfYWNrKTtcbiAxOTM6XHRcbiAxOTQ6XHRcdFx0LyogQWx3YXlzIHBhcnNlIGFueSBjc3VtIHByZXNlbmNlIGNvbWJpbmF0aW9uLCB3ZSB3aWxsIGVuZm9yY2VcbiAxOTU6XHRcdFx0ICogUkZDIDg2ODQgU2VjdGlvbiAzLjMuMCBjaGVja3MgbGF0ZXIgaW4gc3ViZmxvd19kYXRhX3JlYWR5XG4gMTk2Olx0XHRcdCAqL1xuIDE5NzpcdFx0XHRpZiAob3BzaXplICE9IGV4cGVjdGVkX29wc2l6ZSBcdTAwMjZcdTAwMjZcbiAxOTg6XHRcdFx0ICAgIG9wc2l6ZSAhPSBleHBlY3RlZF9vcHNpemUgJiM0MzsgVENQT0xFTl9NUFRDUF9EU1NfQ0hFQ0tTVU0pXG4gMTk5Olx0XHRcdFx0YnJlYWs7XG4gMjAwOlx0XG4gMjAxOlx0XHRcdG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIHw9IE9QVElPTl9NUFRDUF9EU1M7XG4gMjAyOlx0XHRcdGlmIChtcF9vcHQtXHUwMDNldXNlX2Fjaykge1xuIDIwMzpcdFx0XHRcdGlmIChtcF9vcHQtXHUwMDNlYWNrNjQpIHtcbiAyMDQ6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2VkYXRhX2FjayA9IGdldF91bmFsaWduZWRfYmU2NChwdHIpO1xuIDIwNTpcdFx0XHRcdFx0cHRyICYjNDM7PSA4O1xuIDIwNjpcdFx0XHRcdH0gZWxzZSB7XG4gMjA3Olx0XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9hY2sgPSBnZXRfdW5hbGlnbmVkX2JlMzIocHRyKTtcbiAyMDg6XHRcdFx0XHRcdHB0ciAmIzQzOz0gNDtcbiAyMDk6XHRcdFx0XHR9XG4gMjEwOlx0XG4gMjExOlx0XHRcdFx0cHJfZGVidWcoXCYjMzQ7ZGF0YV9hY2s9JWxsdVxcblwmIzM0OywgbXBfb3B0LVx1MDAzZWRhdGFfYWNrKTtcbiAyMTI6XHRcdFx0fVxuIDIxMzpcdFxuIDIxNDpcdFx0XHRpZiAobXBfb3B0LVx1MDAzZXVzZV9tYXApIHtcbiAyMTU6XHRcdFx0XHRpZiAobXBfb3B0LVx1MDAzZWRzbjY0KSB7XG4gMjE2Olx0XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9zZXEgPSBnZXRfdW5hbGlnbmVkX2JlNjQocHRyKTtcbiAyMTc6XHRcdFx0XHRcdHB0ciAmIzQzOz0gODtcbiAyMTg6XHRcdFx0XHR9IGVsc2Uge1xuIDIxOTpcdFx0XHRcdFx0bXBfb3B0LVx1MDAzZWRhdGFfc2VxID0gZ2V0X3VuYWxpZ25lZF9iZTMyKHB0cik7XG4gMjIwOlx0XHRcdFx0XHRwdHIgJiM0Mzs9IDQ7XG4gMjIxOlx0XHRcdFx0fVxuIDIyMjpcdFxuIDIyMzpcdFx0XHRcdG1wX29wdC1cdTAwM2VzdWJmbG93X3NlcSA9IGdldF91bmFsaWduZWRfYmUzMihwdHIpO1xuIDIyNDpcdFx0XHRcdHB0ciAmIzQzOz0gNDtcbiAyMjU6XHRcbiAyMjY6XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9sZW4gPSBnZXRfdW5hbGlnbmVkX2JlMTYocHRyKTtcbiAyMjc6XHRcdFx0XHRwdHIgJiM0Mzs9IDI7XG4gMjI4Olx0XG4gMjI5Olx0XHRcdFx0aWYgKG9wc2l6ZSA9PSBleHBlY3RlZF9vcHNpemUgJiM0MzsgVENQT0xFTl9NUFRDUF9EU1NfQ0hFQ0tTVU0pIHtcbiAyMzA6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIHw9IE9QVElPTl9NUFRDUF9DU1VNUkVRRDtcbiAyMzE6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2Vjc3VtID0gZ2V0X3VuYWxpZ25lZCgoX19mb3JjZSBfX3N1bTE2ICopcHRyKTtcbiAyMzI6XHRcdFx0XHRcdHB0ciAmIzQzOz0gMjtcbiAyMzM6XHRcdFx0XHR9XG4gMjM0Olx0XG4gMjM1Olx0XHRcdFx0cHJfZGVidWcoXCYjMzQ7ZGF0YV9zZXE9JWxsdSBzdWJmbG93X3NlcT0ldSBkYXRhX2xlbj0ldSBjc3VtPSVkOiV1XFxuXCYjMzQ7LFxuIDIzNjpcdFx0XHRcdFx0IG1wX29wdC1cdTAwM2VkYXRhX3NlcSwgbXBfb3B0LVx1MDAzZXN1YmZsb3dfc2VxLFxuIDIzNzpcdFx0XHRcdFx0IG1wX29wdC1cdTAwM2VkYXRhX2xlbiwgISEobXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9DU1VNUkVRRCksXG4gMjM4Olx0XHRcdFx0XHQgbXBfb3B0LVx1MDAzZWNzdW0pO1xuIDIzOTpcdFx0XHR9XG4gMjQwOlx0XG4gMjQxOlx0XHRcdGJyZWFrO1xuIDI0MjpcdFxuIDI0MzpcdFx0Y2FzZSBNUFRDUE9QVF9BRERfQUREUjpcbiAyNDQ6XHRcdFx0bXBfb3B0LVx1MDAzZWVjaG8gPSAoKnB0ciYjNDM7JiM0MzspIFx1MDAyNiBNUFRDUF9BRERSX0VDSE87XG4gMjQ1Olx0XHRcdGlmICghbXBfb3B0LVx1MDAzZWVjaG8pIHtcbiAyNDY6XHRcdFx0XHRpZiAob3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFIgfHxcbiAyNDc6XHRcdFx0XHQgICAgb3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFJfUE9SVClcbiAyNDg6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2VhZGRyLmZhbWlseSA9IEFGX0lORVQ7XG4gMjQ5Olx0I2lmIElTX0VOQUJMRUQoQ09ORklHX01QVENQX0lQVjYpXG4gMjUwOlx0XHRcdFx0ZWxzZSBpZiAob3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFI2IHx8XG4gMjUxOlx0XHRcdFx0XHQgb3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFI2X1BPUlQpXG4gMjUyOlx0XHRcdFx0XHRtcF9vcHQtXHUwMDNlYWRkci5mYW1pbHkgPSBBRl9JTkVUNjtcbiAyNTM6XHQjZW5kaWZcbiAyNTQ6XHRcdFx0XHRlbHNlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NTY3CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNzc5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk1QVENQIERTUyBPcHRpb24gUGFyc2luZzogUG90ZW50aWFsIEZsYXcqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYG1wdGNwX3BhcnNlX29wdGlvbmAgZnVuY3Rpb24gYW5kIHNvbWV0aGluZyYjMzk7cyBidWdnaW5nIG1lLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gbm90aWNpbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgd2hlbiBoYW5kbGluZyB0aGUgRFNTIChEYXRhIFNlcXVlbmNlIFNpemUpIG9wdGlvbi4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBzZXR0aW5nIHRoZSBgbXBfb3B0LSZndDtkc242NGAsIGBtcF9vcHQtJmd0O3VzZV9tYXBgLCBgbXBfb3B0LSZndDthY2s2NGAsIGFuZCBgbXBfb3B0LSZndDt1c2VfYWNrYCBmbGFncyAqYmVmb3JlKiBpdCBhY3R1YWxseSB2YWxpZGF0ZXMgdGhlIG9wdGlvbiBzaXplIChgb3BzaXplYCkuCgpUaGUgY29kZSBwdWxscyB0aGUgZmxhZ3MsIHNldHMgdGhlIGJpdGZpZWxkcyBpbiBgbXBfb3B0YCwgYW5kICp0aGVuKiBjaGVja3MgYG9wc2l6ZWAuIElmIHRoZSBzaXplIGlzIGluY29ycmVjdCwgdGhlIGZ1bmN0aW9uIGJyZWFrcyBvdXQgb2YgdGhlIHBhcnNpbmcgbG9vcC4gVGhpcyBtZWFucyB0aGF0IGlmIGBvcHNpemVgIGlzIHdyb25nLCBhbmQgdGhlIERTUyBvcHRpb24gaXMgaW52YWxpZCwgdGhvc2UgZmxhZ3MgbGlrZSBgbXBfb3B0LSZndDt1c2VfYWNrYCBjb3VsZCBiZSBzZXQgdG8gMSwgYnV0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LSZndDtzdWJvcHRpb25zYCB3b3VsZCAqbm90KiBiZSBzZXQuCgpTaW5jZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgKm9ubHkqIGNoZWNrcyBgbXBfb3B0LnN1Ym9wdGlvbnMgJmFtcDsgT1BUSU9OX01QVENQX0RTU2AgdG8gZGV0ZXJtaW5lIGlmIERTUyBmaWVsZHMgc2hvdWxkIGJlIHByb2Nlc3NlZCwgaXQgd291bGQgaWdub3JlIGFueSBEU1MgaW5mb3JtYXRpb24gaWYgdGhlIG9wdGlvbiBzaXplIGlzIGludmFsaWQuIFRoYXQgc2VlbXMuLi4gb2theSwgZnVuY3Rpb25hbGx5LCBidXQgaXQgZGlkIG1ha2UgbWUgd29uZGVyIGlmIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IG1pZ2h0IGJlIGEgcG90ZW50aWFsIGlzc3VlIGhlcmUuCgpOb3csIHRoYXQgcGF0Y2ggYWRkcyBhIGNoZWNrOgpgYGBjCiAgICAgICAgY2FzZSBNUFRDUE9QVF9EU1M6CiAgICAgICAgICAgICAgICAvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqLwogICAgICAgICAgICAgICAgaWYgKChtcF9vcHQtJmd0O3N1Ym9wdGlvbnMgJmFtcDsgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05fTVBUQ1BfUFJJTyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKYGBgCgpUaGlzIG5ldyBjaGVjayBpcyBldmVuIG1vcmUgY29uY2VybmluZy4gSWYgdGhpcyBicmVha3MsIHRoZSBvcHRpb24gZ2V0cyBkcm9wcGVkIGJlZm9yZSBzZXR0aW5nICphbnkqIG9mIHRoZSBEU1MgZmllbGRzLiBTbywgcG90ZW50aWFsbHksIHdlIGNvdWxkIGhhdmUgYW4gaW52YWxpZCBzaXR1YXRpb24sIHdoZXJlIGFuIGBtcF9vcHRgIHN0cnVjdHVyZSBnZXRzIHVzZWQgZG93bnN0cmVhbSBhbmQgc29tZSBmaWVsZHMgYXJlIHVuaW5pdGlhbGl6ZWQuIEFuZCBJIHRoaW5rIHRoYXQmIzM5O3Mgd2hlcmUgSSBuZWVkIHRvIGNoZWNrLgoKTGV0IG1lIHRyYWNlIGJhY2sgdG8gYG1wdGNwX2dldF9vcHRpb25zYCBhZ2Fpbi4gT2theSwgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGRlY2xhcmVzIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHQ7YCBvbiB0aGUgc3RhY2ssIHdoaWNoIGlzIGdvb2QuIEl0IGNhbGxzIGBtcHRjcF9nZXRfb3B0aW9uc2AsIHBhc3NpbmcgdGhpcyBzdHJ1Y3QuIENydWNpYWxseSwgYG1wdGNwX2dldF9vcHRpb25zYCAqemVyb2VzKiBgbXBfb3B0LnN0YXR1c2AgYXQgdGhlIGJlZ2lubmluZy4gVGhhdCYjMzk7cyBnb29kOyBhbnkgZmxhZ3Mgbm90IHNldCBieSBhIHZhbGlkIG9wdGlvbiBzaG91bGQgYmUgY2xlYXJlZC4gQW5kIGFmdGVyIHplcm9pbmcgdGhpcyBzdHJ1Y3QsIGl0IHN0YXJ0cyBwYXJzaW5nIG9wdGlvbnMuIElmIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gaXMgcGFyc2VkIGNvcnJlY3RseSwgdGhlbiBgbXBfb3B0LmRhdGFfYWNrYCwgYG1wX29wdC5kYXRhX3NlcWAsIGV0Yy4gYXJlIHBvcHVsYXRlZC4gQnV0IGlmIGl0JiMzOTtzIG5vdCBwYXJzZWQgY29ycmVjdGx5LCB0aG9zZSBmaWVsZHMgcmVtYWluICp1bmluaXRpYWxpemVkKi4KCkhvd2V2ZXIsICpiZWZvcmUqIHRob3NlIGBkYXRhX2Fja2AvYGRhdGFfc2VxYCBmaWVsZHMgYXJlIHJlYWQsIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBjaGVja3MgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHNldCBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgLiBJZiBpdCYjMzk7cyBub3Qgc2V0LCBpdCBkb2VzbiYjMzk7dCB0cnkgdG8gYWNjZXNzIHRoZW0uIFNvIHRoZSB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgKm9ubHkqIHVzZWQgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHNldC4gT2theSwgdGhhdCBzb3VuZHMgbGlrZSBpdCBzaG91bGQgYmUgc2FmZS4gSSBzdGlsbCBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IHRoaXMgaXMgdHJ1ZSBpbiBhbGwgY2FzZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEyMTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTIxMDpcdFx0XHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9SU1QpIHtcbjEyMTE6XHRcdFx0XHRzdWJmbG93LVx1MDAzZXJlc2V0X3NlZW4gPSAxO1xuMTIxMjpcdFx0XHRcdHN1YmZsb3ctXHUwMDNlcmVzZXRfcmVhc29uID0gbXBfb3B0LnJlc2V0X3JlYXNvbjtcbjEyMTM6XHRcdFx0XHRzdWJmbG93LVx1MDAzZXJlc2V0X3RyYW5zaWVudCA9IG1wX29wdC5yZXNldF90cmFuc2llbnQ7XG4xMjE0Olx0XHRcdFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX01QUlNUUlgpO1xuMTIxNTpcdFx0XHR9XG4xMjE2Olx0XG4xMjE3Olx0XHRcdGlmICghKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfRFNTKSlcbjEyMTg6XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbjEyMTk6XHRcdH1cbjEyMjA6XHRcbjEyMjE6XHRcdC8qIHdlIGNhbiYjMzk7dCB3YWl0IGZvciByZWN2bXNnKCkgdG8gdXBkYXRlIHRoZSBhY2tfc2VxLCBvdGhlcndpc2VcbjEyMjI6XHRcdCAqIG1vbm9kaXJlY3Rpb25hbCBmbG93cyB3aWxsIHN0dWNrXG4xMjIzOlx0XHQgKi9cbjEyMjQ6XHRcdGlmIChtcF9vcHQudXNlX2FjaylcbjEyMjU6XHRcdFx0YWNrX3VwZGF0ZV9tc2sobXNrLCBzaywgXHUwMDI2bXBfb3B0KTtcbjEyMjY6XHRcdHJ3aW5fdXBkYXRlKG1zaywgc2ssIHNrYik7XG4xMjI3Olx0XG4xMjI4Olx0XHQvKiBaZXJvLWRhdGEtbGVuZ3RoIHBhY2tldHMgYXJlIGRyb3BwZWQgYnkgdGhlIGNhbGxlciBhbmQgbm90XG4xMjI5Olx0XHQgKiBwcm9wYWdhdGVkIHRvIHRoZSBNUFRDUCBsYXllciwgc28gdGhlIHNrYiBleHRlbnNpb24gZG9lcyBub3RcbjEyMzA6XHRcdCAqIG5lZWQgdG8gYmUgYWxsb2NhdGVkIG9yIHBvcHVsYXRlZC4gREFUQV9GSU4gaW5mb3JtYXRpb24sIGlmXG4xMjMxOlx0XHQgKiBwcmVzZW50LCBuZWVkcyB0byBiZSB1cGRhdGVkIGhlcmUgYmVmb3JlIHRoZSBza2IgaXMgZnJlZWQuXG4xMjMyOlx0XHQgKi9cbjEyMzM6XHRcdGlmIChUQ1BfU0tCX0NCKHNrYiktXHUwMDNlc2VxID09IFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VlbmRfc2VxKSB7XG4xMjM0Olx0XHRcdGlmIChtcF9vcHQuZGF0YV9maW4gXHUwMDI2XHUwMDI2IG1wX29wdC5kYXRhX2xlbiA9PSAxIFx1MDAyNlx1MDAyNlxuMTIzNTpcdFx0XHQgICAgbXB0Y3BfdXBkYXRlX3Jjdl9kYXRhX2Zpbihtc2ssIG1wX29wdC5kYXRhX3NlcSwgbXBfb3B0LmRzbjY0KSlcbjEyMzY6XHRcdFx0XHRtcHRjcF9zY2hlZHVsZV93b3JrKChzdHJ1Y3Qgc29jayAqKW1zayk7XG4xMjM3Olx0XG4xMjM4Olx0XHRcdHJldHVybiB0cnVlO1xuMTIzOTpcdFx0fVxuMTI0MDpcdFxuMTI0MTpcdFx0bXBleHQgPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfTVBUQ1ApO1xuMTI0MjpcdFx0aWYgKCFtcGV4dClcbjEyNDM6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTI0NDpcdFxuMTI0NTpcdFx0bWVtc2V0KG1wZXh0LCAwLCBzaXplb2YoKm1wZXh0KSk7XG4xMjQ2Olx0XG4xMjQ3Olx0XHRpZiAobGlrZWx5KG1wX29wdC51c2VfbWFwKSkge1xuMTI0ODpcdFx0XHRpZiAobXBfb3B0Lm1wY19tYXApIHtcbjEyNDk6XHRcdFx0XHQvKiB0aGlzIGlzIGFuIE1QX0NBUEFCTEUgY2FycnlpbmcgTVBUQ1AgZGF0YVxuMTI1MDpcdFx0XHRcdCAqIHdlIGtub3cgdGhpcyBtYXAgdGhlIGZpcnN0IGNodW5rIG9mIGRhdGFcbjEyNTE6XHRcdFx0XHQgKi9cbjEyNTI6XHRcdFx0XHRtcHRjcF9jcnlwdG9fa2V5X3NoYShzdWJmbG93LVx1MDAzZXJlbW90ZV9rZXksIE5VTEwsXG4xMjUzOlx0XHRcdFx0XHRcdCAgICAgXHUwMDI2bXBleHQtXHUwMDNlZGF0YV9zZXEpO1xuMTI1NDpcdFx0XHRcdG1wZXh0LVx1MDAzZWRhdGFfc2VxJiM0MzsmIzQzOztcbjEyNTU6XHRcdFx0XHRtcGV4dC1cdTAwM2VzdWJmbG93X3NlcSA9IDE7XG4xMjU2Olx0XHRcdFx0bXBleHQtXHUwMDNlZHNuNjQgPSAxO1xuMTI1NzpcdFx0XHRcdG1wZXh0LVx1MDAzZW1wY19tYXAgPSAxO1xuMTI1ODpcdFx0XHRcdG1wZXh0LVx1MDAzZWRhdGFfZmluID0gMDtcbjEyNTk6XHRcdFx0fSBlbHNlIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTkwMjEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxNjU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRTUyBPcHRpb24gUGFyc2luZzogQSBEZWVwIERpdmUgaW50byBQb3RlbnRpYWwgVnVsbmVyYWJpbGl0aWVzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgYWJvdXQgaG93IHRoZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgZnVuY3Rpb24gaGFuZGxlcyB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgYW5kIHJlbGF0ZWQgZGF0YS4gU3BlY2lmaWNhbGx5LCB0aGUgZnVuY3Rpb24mIzM5O3MgbG9naWMgc2VlbXMgdG8gcmV0dXJuIGVhcmx5IGlmIGBPUFRJT05fTVBUQ1BfRFNTYCBpc24mIzM5O3Qgc2V0LCB3aGljaCBhcHBlYXJzIHRvIGJlIGEgc2FmZWd1YXJkIGFnYWluc3QgdW5pbml0aWFsaXplZCByZWFkcy4gSWYgYE9QVElPTl9NUFRDUF9EU1NgICppcyogc2V0LCB0aGVuIGl0IHByb2NlZWRzIHRvIGFjY2VzcyBmaWVsZHMgbGlrZSBgdXNlX2Fja2AsIGBkYXRhX2ZpbmAsIGFuZCBgZGF0YV9sZW5gLgoKTXkgY29uY2VybiByZXZvbHZlZCBhcm91bmQgaG93IG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIG1pZ2h0IGJlIGhhbmRsZWQgd2l0aGluIGEgc2luZ2xlIHBhY2tldC4gSWYgbXVsdGlwbGUgYERTU2Agb3B0aW9ucyBleGlzdCwgdGhlIGN1cnJlbnQgcGF0Y2gmIzM5O3MgZWFybHktZXhpdCBjaGVjayBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBiYXNlZCBvbiBvdGhlciBzZXQgc3Vib3B0aW9ucyBtaWdodCBjYXVzZSB0aGUgc2Vjb25kIGBEU1NgIHBhcnNpbmcgdG8gZmFpbC4gVGhpcyBjb3VsZCBsZWFkIHRvIGEgc2NlbmFyaW8gd2hlcmUgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQsIGFuZCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgdW5leHBlY3RlZGx5IHJldHVybnMsIHNraXBwaW5nIHRoZSBjcnVjaWFsIERTUyBmaWVsZCBpbml0aWFsaXphdGlvbi4gSG93ZXZlciwgb24gZnVydGhlciByZXZpZXcsIGlmIGEgYERTU2Agb3B0aW9uIGlzIHBhcnNlZCBhbmQgdGhlbiBhIGBGQVNUQ0xPU0VgIG9wdGlvbiwgdGhlIGNvZGUgc2hvdWxkIHN0aWxsIGhhbmRsZSB0aGUgYERTU2Agb3B0aW9uIGRhdGEgY29ycmVjdGx5LiBUaGUgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGNoZWNrcyBzaG91bGQgcHJldmVudCB1bmluaXRpYWxpemVkIHJlYWRzIG9mIHRoZSBub3cgcG9wdWxhdGVkIGRhdGEuCgpBbm90aGVyIHBvdGVudGlhbCBpc3N1ZSBJIGNvbnNpZGVyZWQgd2FzIGEgYERTU2Agb3B0aW9uIGZhaWxpbmcgZWFybHkgaW4gYG1wdGNwX3BhcnNlX29wdGlvbmAsIHNwZWNpZmljYWxseSBpZiBgb3BzaXplYCBpc24mIzM5O3Qgd2hhdCYjMzk7cyBleHBlY3RlZC4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBwYXJzZXIgd291bGQgYnJlYWsgZWFybHksIGBPUFRJT05fTVBUQ1BfRFNTYCB3b3VsZCBub3QgYmUgc2V0LCBidXQgb3RoZXIgc2VlbWluZ2x5IGluaXRpYWxpc2VkIHZhcmlhYmxlcyBjb3VsZCBoYXZlIGJlZW4gc2V0LiBIb3dldmVyLCBhIHF1aWNrIGNoZWNrIG9mIHRoZSBjb2RlIGluIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBzaG93cyB0aGF0IHRoZSByb3V0aW5lIHdpbGwgcmV0dXJuIGVhcmx5IGlmIGl0IGZpbmRzIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBub3Qgc2V0LCBtZWFuaW5nIG5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMgaGVyZSBlaXRoZXIuCgpUaGUgY2VudHJhbCBxdWVzdGlvbiBiZWNhbWU6IElzIHRoZXJlIGEgcGF0aCB3aGVyZSBgT1BUSU9OX01QVENQX0RTU2AgKmlzKiBzZXQsIGJ1dCAqc29tZSogb2YgdGhlIHJlbGF0ZWQgZmllbGRzIHJlbWFpbiB1bmluaXRpYWxpemVkPyBJIGhhZCB0byB0cmFjZSB0aGUgaW5pdGlhbGl6YXRpb24gbG9naWMgd2l0aGluIGBtcHRjcF9wYXJzZV9vcHRpb25gLiBJZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGlzIHBhcnNlZCBhbmQgdGhlIG9wdGlvbiBzaXplIGlzIHZhbGlkLCB0aGVuIGBPUFRJT05fTVBUQ1BfRFNTYCBnZXRzIHNldC4gV2l0aGluIHRoYXQgb3B0aW9uIHBhcnNpbmcgcm91dGluZSwgdGhlIGZpZWxkcyBhcmUgY29uZGl0aW9uYWxseSBwb3B1bGF0ZWQgYmFzZWQgb24gd2hldGhlciBgdXNlX2Fja2Agb3IgYHVzZV9tYXBgIGFyZSBzZXQuIElmIGB1c2VfYWNrYCBpcyB0cnVlLCBpdCBwb3B1bGF0ZXMgYGRhdGFfYWNrYDsgaWYgYHVzZV9tYXBgIGlzIHRydWUsIHRoZW4gYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgYGRhdGFfbGVuYCwgYW5kIGBjc3VtYCBnZXQgcG9wdWxhdGVkLiBDb252ZXJzZWx5LCBpZiBlaXRoZXIgb2YgdGhvc2UgaXMgZmFsc2UsIHRoZSByZXNwZWN0aXZlIGZpZWxkIHJlbWFpbnMgdW5pbml0aWFsaXplZC4KClRoZW4sIEkgbG9va2VkIGF0IGhvdyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgdXNlcyB0aG9zZSBmaWVsZHMuIEl0IHNlZW1zIHRoYXQgYHVzZV9hY2tgIGlzIGNoZWNrZWQgKmJlZm9yZSogYGRhdGFfYWNrYCBpcyBhY2Nlc3NlZCwgd2hpY2ggYXBwZWFycyBzYWZlLiBIb3dldmVyLCB0aGUgc3Vic2VxdWVudCB1c2Ugb2YgYG1wX29wdC5kYXRhX2ZpbmAsIGBtcF9vcHQuZGF0YV9sZW5gLCBhbmQgYG1wX29wdC5kYXRhX3NlcWAgcmFpc2VkIGFuIGltbWVkaWF0ZSBmbGFnLiBJIHF1ZXN0aW9uZWQgd2hldGhlciBgdXNlX21hcGAgd2FzIGFsc28gY2hlY2tlZCBiZWZvcmUgdGhlc2UgdmFsdWVzIHdlcmUgYWNjZXNzZWQuCgpUaGF0JiMzOTtzIHdoZW4gSSByZWFsaXplZCB0aGF0IGBkYXRhX2ZpbmAgaXMgbGlua2VkIHRvIGB1c2VfbWFwYCEgYG1wX29wdC5kYXRhX2ZpbmAgaXMgYWN0dWFsbHkgYSBiaXRmaWVsZCwgY2xlYXJlZCBieSBgbXB0Y3BfZ2V0X29wdGlvbnNgLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgYmUgemVybyBpZiBgdXNlX21hcGAgaXMgZmFsc2UuIFRoZXJlZm9yZSwgdGhlIGNvZGUgYG1wX29wdC5kYXRhX2ZpbiAmYW1wOyZhbXA7IC4uLmAgd2lsbCBldmFsdWF0ZSB0byBmYWxzZSwgbWVhbmluZyB0aGUgdW5pbml0aWFsaXplZCBgZGF0YV9sZW5gIGFuZCBgZGF0YV9zZXFgIGFyZSBub3QgcmVhZC4gRnVydGhlciBjb2RlIGNoZWNrcyBpbiB0aGUgJiMzNDtsaWtlbHkmIzM0OyBwYXRoLCB3aGVyZSBgdXNlX21hcGAgKmlzKiB0cnVlLCBzaG93IHRoYXQgZmllbGRzIGxpa2UgYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgYGRhdGFfbGVuYCwgYW5kIGBjc3VtYCBhcmUgY29ycmVjdGx5IGNoZWNrZWQgcHJpb3IgdG8gYW55IGFjY2Vzc2VzLgoKVGhlIGNvZGUgc2VlbXMgcm9idXN0LiBJJiMzOTtsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayBvdGhlciBhcmVhcywgc3BlY2lmaWNhbGx5IHRoZSBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgIHNlY3Rpb24uIEJ1dCwgc28gZmFyLCBpdCBzZWVtcyB0aGF0IHRoZXJlJiMzOTtzIG5vIG9idmlvdXMgcGF0aCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhlIGNoZWNrcyBpbiBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgYW5kIHRoZSBjb25kaXRpb25hbCBsb2dpYyBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBhcHBlYXIgdG8gcHJvdmlkZSBhZGVxdWF0ZSBwcm90ZWN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9tcHRjcC9vcHRpb25zLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA5NTMsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDk1MzpcdFx0aWYgKHN1YmZsb3ctXHUwMDNlcmVtb3RlX2tleV92YWxpZCBcdTAwMjZcdTAwMjZcbiA5NTQ6XHRcdCAgICAoKChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUykgXHUwMDI2XHUwMDI2IG1wX29wdC1cdTAwM2V1c2VfYWNrKSB8fFxuIDk1NTpcdFx0ICAgICAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfQUREX0FERFIpIFx1MDAyNlx1MDAyNlxuIDk1NjpcdFx0ICAgICAgKCFtcF9vcHQtXHUwMDNlZWNobyB8fCBzdWJmbG93LVx1MDAzZW1wX2pvaW4pKSkpIHtcbiA5NTc6XHRcdFx0Lyogc3ViZmxvd3MgYXJlIGZ1bGx5IGVzdGFibGlzaGVkIGFzIHNvb24gYXMgd2UgZ2V0IGFueVxuIDk1ODpcdFx0XHQgKiBhZGRpdGlvbmFsIGFjaywgaW5jbHVkaW5nIEFERF9BRERSLlxuIDk1OTpcdFx0XHQgKi9cbiA5NjA6XHRcdFx0Z290byBzZXRfZnVsbHlfZXN0YWJsaXNoZWQ7XG4gOTYxOlx0XHR9XG4gOTYyOlx0XG4gOTYzOlx0XHQvKiBJZiB0aGUgZmlyc3QgZXN0YWJsaXNoZWQgcGFja2V0IGRvZXMgbm90IGNvbnRhaW4gTVBfQ0FQQUJMRSAmIzQzOyBkYXRhXG4gOTY0Olx0XHQgKiB0aGVuIGZhbGxiYWNrIHRvIFRDUC4gRmFsbGJhY2sgc2NlbmFyaW9zIHJlcXVpcmVzIGEgcmVzZXQgZm9yXG4gOTY1Olx0XHQgKiBNUF9KT0lOIHN1YmZsb3dzLlxuIDk2NjpcdFx0ICovXG4gOTY3Olx0XHRpZiAoIShtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OU19NUFRDUF9NUEMpKSB7XG4gOTY4Olx0XHRcdGlmIChzdWJmbG93LVx1MDAzZW1wX2pvaW4pXG4gOTY5Olx0XHRcdFx0Z290byByZXNldDtcbiA5NzA6XHRcdFx0c3ViZmxvdy1cdTAwM2VtcF9jYXBhYmxlID0gMDtcbiA5NzE6XHRcdFx0aWYgKCFtcHRjcF90cnlfZmFsbGJhY2soc3NrLCBNUFRDUF9NSUJfTVBDQVBBQkxFREFUQUZBTExCQUNLKSkge1xuIDk3MjpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzc2spLCBNUFRDUF9NSUJfRkFMTEJBQ0tGQUlMRUQpO1xuIDk3MzpcdFx0XHRcdGdvdG8gcmVzZXQ7XG4gOTc0Olx0XHRcdH1cbiA5NzU6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDk3NjpcdFx0fVxuIDk3NzpcdFxuIDk3ODpcdFx0aWYgKHVubGlrZWx5KCFSRUFEX09OQ0UobXNrLVx1MDAzZXBtLnNlcnZlcl9zaWRlKSkpXG4gOTc5Olx0XHRcdHByX3dhcm5fb25jZShcJiMzNDtib2d1cyBtcGMgb3B0aW9uIG9uIGVzdGFibGlzaGVkIGNsaWVudCBza1wmIzM0Oyk7XG4gOTgwOlx0XG4gOTgxOlx0c2V0X2Z1bGx5X2VzdGFibGlzaGVkOlxuIDk4MjpcdFx0aWYgKG1wX29wdC1cdTAwM2VkZW55X2pvaW5faWQwKVxuIDk4MzpcdFx0XHRXUklURV9PTkNFKG1zay1cdTAwM2VwbS5yZW1vdGVfZGVueV9qb2luX2lkMCwgdHJ1ZSk7XG4gOTg0Olx0XG4gOTg1Olx0XHRtcHRjcF9kYXRhX2xvY2soKHN0cnVjdCBzb2NrICopbXNrKTtcbiA5ODY6XHRcdF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHN1YmZsb3csIG1wX29wdCk7XG4gOTg3Olx0XHRtcHRjcF9kYXRhX3VubG9jaygoc3RydWN0IHNvY2sgKiltc2spO1xuIDk4ODpcdFxuIDk4OTpcdGNoZWNrX25vdGlmeTpcbiA5OTA6XHRcdC8qIGlmIHRoZSBzdWJmbG93IGlzIG5vdCBhbHJlYWR5IGxpbmtlZCBpbnRvIHRoZSBjb25uX2xpc3QsIHdlIGNhbiYjMzk7dFxuIDk5MTpcdFx0ICogbm90aWZ5IHRoZSBQTTogdGhpcyBzdWJmbG93IGlzIHN0aWxsIG9uIHRoZSBsaXN0ZW5lciBxdWV1ZVxuIDk5MjpcdFx0ICogYW5kIHRoZSBQTSBwb3NzaWJseSBhY3F1aXJpbmcgdGhlIHN1YmZsb3cgbG9jayBjb3VsZCByYWNlIHdpdGhcbiA5OTM6XHRcdCAqIHRoZSBsaXN0ZW5lciBjbG9zZVxuIDk5NDpcdFx0ICovXG4gOTk1Olx0XHRpZiAobGlrZWx5KHN1YmZsb3ctXHUwMDNlcG1fbm90aWZpZWQpIHx8IGxpc3RfZW1wdHkoXHUwMDI2c3ViZmxvdy1cdTAwM2Vub2RlKSlcbiA5OTY6XHRcdFx0cmV0dXJuIHRydWU7XG4gOTk3Olx0XG4gOTk4Olx0XHRzdWJmbG93LVx1MDAzZXBtX25vdGlmaWVkID0gMTtcbiA5OTk6XHRcdGlmIChzdWJmbG93LVx1MDAzZW1wX2pvaW4pIHtcbjEwMDA6XHRcdFx0Y2xlYXJfM3JkYWNrX3JldHJhbnNtaXNzaW9uKHNzayk7XG4xMDAxOlx0XHRcdG1wdGNwX3BtX3N1YmZsb3dfZXN0YWJsaXNoZWQobXNrKTtcbjEwMDI6XHRcdH0gZWxzZSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNDk1CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyBjb2RlIHNuaXBwZXQsIGRpc3RpbGxlZCBpbnRvIGEgZmlyc3QtcGVyc29uIHN1bW1hcnksIGtlZXBpbmcgaW4gbWluZCBteSBleHBlcnQgdW5kZXJzdGFuZGluZzoKCioqQW5hbHl6aW5nIHRoZSBTdWJmbG93IEVzdGFibGlzaG1lbnQgQ2hlY2sqKgoKUmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgdGhlIGNvbmRpdGlvbnMgYXJvdW5kIHRoZSBNdWx0aWhvbWVkIFRDUCAoTVBUQ1ApIERhdGEgU2VxdWVuY2UgU3luY2hyb25pemF0aW9uIChEU1MpIG9wdGlvbiBhbmQgdGhlIGhhbmRsaW5nIG9mIGpvaW4gSURzLiBJIHNlZSB0aGF0IHRoZSBjb2RlIHNwZWNpZmljYWxseSBjaGVja3MgYG1wX29wdC0mZ3Q7dXNlX2Fja2AgKm9ubHkqIGlmIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBlbmFibGVkLiBUaGF0JiMzOTtzIGdvb2Q7IGl0JiMzOTtzIGEgY29uZGl0aW9uYWwgZGVwZW5kZW5jeSwgd2hpY2ggaXMgZXhwZWN0ZWQuIFRoZSBBQ0sgdXNhZ2UgbGlrZWx5IGluZm9ybXMgaG93IERTUyBzeW5jaHJvbml6YXRpb24gaXMgbWFuYWdlZC4KCk5leHQsIEkgc2VlIGEgY2hlY2sgZm9yIGBtcF9vcHQtJmd0O2Rlbnlfam9pbl9pZDBgLiBBaCwgdGhhdCYjMzk7cyBhIGJpdGZpZWxkIHdpdGhpbiBgc3RhdHVzYC4gS25vd2luZyB0aGF0IGBzdGF0dXNgIGlzIGxpa2VseSBhIHN0cnVjdHVyZSwgSSBxdWlja2x5IGluZmVyIHRoYXQgdGhpcyBiaXRmaWVsZCwgYW5kIHRoZXJlZm9yZSB0aGUgZW50aXJlIGBzdGF0dXNgIHN0cnVjdHVyZSwgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gemVybyBlbHNld2hlcmUuIFRoaXMgaXMgc3RhbmRhcmQgcHJhY3RpY2UgdG8gZW5zdXJlIHByZWRpY3RhYmxlIHN0YXJ0aW5nIHZhbHVlcy4gQSBiaXRmaWVsZCBzcGVjaWZpY2FsbHkgdGFyZ2V0cyB3aGV0aGVyIGpvaW5zIHdpdGggSUQgMCBzaG91bGQgYmUgZGVuaWVkIChvciwgYXQgbGVhc3QsIHdoZXRoZXIgdGhleSBjb250cmlidXRlIHRvIHRoZSAqZnVsbHkgZXN0YWJsaXNoZWQqIHN0YXR1cykuIEludGVyZXN0aW5nLgoKRmluYWxseSwgdGhlIGNvZGUgdGhlbiBjYWxscyBgX19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkKG1zaywgc3ViZmxvdywgbXBfb3B0KTtgLiBUaGF0JiMzOTtzIHRoZSBjb3JlIG9mIHRoZSBsb2dpYywgdGhlIGNlbnRyYWwgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHRoZSBzdWJmbG93JiMzOTtzIGVzdGFibGlzaG1lbnQgc3RhdHVzLiBUaGUgYXJndW1lbnRzIG1ha2Ugc2Vuc2U6IGBtc2tgIGlzIHByb2JhYmx5IHNvbWUga2luZCBvZiBtYXNrIHJlcHJlc2VudGluZyB0aGUgcmVsZXZhbnQgY3JpdGVyaWEsIGBzdWJmbG93YCBpcyBvYnZpb3VzbHkgdGhlIHN1YmZsb3cgaW4gcXVlc3Rpb24sIGFuZCBgbXBfb3B0YCBwcm92aWRlcyB0aGUgTVBUQ1Agb3B0aW9ucy4gSSBuZWVkIHRvIGRpZyBpbnRvIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRgIHRvIHVuZGVyc3RhbmQgdGhlIGFjdHVhbCBkZWNpc2lvbi1tYWtpbmcgcHJvY2Vzcy4gSSYjMzk7bSBndWVzc2luZyB0aGF0IGZ1bmN0aW9uIHdpbGwgdXNlIHRoZXNlIHBhcmFtZXRlcnMgdG8gY2hlY2sgZm9yIHRoaW5ncyBsaWtlIGFja3MsIHNlcXVlbmNlIG51bWJlcnMsIGFuZCBwb3RlbnRpYWxseSBqb2luIElEcyB0byBkZWNpZGUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgZnVsbHkgZXN0YWJsaXNoZWQsIGFuZCBjYW4gYmUgY29uc2lkZXJlZCBhY3RpdmUgaW4gdGhlIE1QVENQIGZsb3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O19fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZFxcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTkxOT1zdGF0aWMgYm9vbCBjaGVja19mdWxseV9lc3RhYmxpc2hlZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLCBzdHJ1Y3Qgc29jayAqc3NrLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtOTg1LVx0bXB0Y3BfZGF0YV9sb2NrKChzdHJ1Y3Qgc29jayAqKW1zayk7XG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjk4NjpcdF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHN1YmZsb3csIG1wX29wdCk7XG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTk4Ny1cdG1wdGNwX2RhdGFfdW5sb2NrKChzdHJ1Y3Qgc29jayAqKW1zayk7XG4tLVxubmV0L21wdGNwL3Byb3RvY29sLmM9MzU1OD1zdHJ1Y3Qgc29jayAqbXB0Y3Bfc2tfY2xvbmVfaW5pdChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXG4tLVxubmV0L21wdGNwL3Byb3RvY29sLmMtMzYzMC1cdGlmIChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX01QQ19BQ0spXG5uZXQvbXB0Y3AvcHJvdG9jb2wuYzozNjMxOlx0XHRfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQobXNrLCBzdWJmbG93LCBtcF9vcHQpO1xubmV0L21wdGNwL3Byb3RvY29sLmMtMzYzMi1cdGJoX3VubG9ja19zb2NrKG5zayk7XG4tLVxubmV0L21wdGNwL3Byb3RvY29sLmg9ODA3PXZvaWQgbXB0Y3BfZ2V0X2F2YWlsYWJsZV9zY2hlZHVsZXJzKGNoYXIgKmJ1Ziwgc2l6ZV90IG1heGxlbik7XG5uZXQvbXB0Y3AvcHJvdG9jb2wuaDo4MDg6dm9pZCBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcbm5ldC9tcHRjcC9wcm90b2NvbC5oLTgwOS1cdFx0XHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfc3ViZmxvd19jb250ZXh0ICpzdWJmbG93LFxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmM9NzgwPXZvaWQgbXB0Y3Bfc3ViZmxvd19kcm9wX2N0eChzdHJ1Y3Qgc29jayAqc3NrKVxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtNzk2LVxubmV0L21wdGNwL3N1YmZsb3cuYzo3OTc6dm9pZCBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcbm5ldC9tcHRjcC9zdWJmbG93LmMtNzk4LVx0XHRcdFx0ICAgICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNTUwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHVuZGVyc3RhbmRpbmcgdGhpcyBgX19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkYCBjb25jZXB0LCBleHBsYWluZWQgYXMgaWYgaXQmIzM5O3MgbXkgb3duIHRob3VnaHQgcHJvY2VzczoKCioqTXkgRGVlcCBEaXZlIGludG8gYF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZGAqKgoKQWxyaWdodCwgc28gSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB3aGF0IHRoaXMgYF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZGAgZnVuY3Rpb24gcmVwcmVzZW50cy4gSXQgc291bmRzIGxpa2UgYSBjcml0aWNhbCBwb2ludCBpbiB0aGUgTXVsdGlQYXRoIFRDUCAoTVBUQ1ApIGNvbm5lY3Rpb24gbGlmZWN5Y2xlLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBpdHMgc3ViZmxvd3MuIEkmIzM5O20gYWxyZWFkeSB2aXN1YWxpemluZyB0aGUgTVBUQ1AgY29udHJvbCBwbGFuZSBhbmQgZGF0YSBwbGFuZSBpbnRlcmFjdGlvbnMgaW4gbXkgbWluZC4uLiBub3csIGxldCYjMzk7cyBzZWUgaG93IHRoaXMgZnVuY3Rpb24gZml0cyBpbnRvIHRoZSBwaWN0dXJlLgoKTXkgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBsaWtlbHkgc2lnbmFscyB0aGF0IGEgc3BlY2lmaWMgc3ViZmxvdywgd2l0aGluIGFuIG92ZXJhbGwgTVBUQ1AgY29ubmVjdGlvbiwgaGFzIGNvbXBsZXRlZCBpdHMgbmVjZXNzYXJ5IGhhbmRzaGFraW5nIG9yIGluaXRpYWwgc2V0dXAgcGhhc2UuIEl0JiMzOTtzIGVzc2VudGlhbGx5IHNheWluZywgJiMzNDtIZXksIHRoaXMgc3ViZmxvdyBpcyBub3cgcmVhZHkgdG8gY2FycnkgcmVhbCBkYXRhISYjMzQ7IFRoaW5rIG9mIGl0IGxpa2UgYSBncmVlbiBsaWdodCwgYSBnby1haGVhZCBzaWduYWwgZm9yIHRoYXQgcGFydGljdWxhciBwYXRoLgoKR2l2ZW4gbXkgdW5kZXJzdGFuZGluZyBvZiBNUFRDUCwgSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZSBzdWJmbG93JiMzOTtzIFRDUCBoYW5kc2hha2UgKGxpa2VseSBhIDMtd2F5IGhhbmRzaGFrZSkgaGFzIGJlZW4gY29tcGxldGVkLCBhbmQgcGVyaGFwcyBhZnRlciBhbnkgTVBUQ1Atc3BlY2lmaWMgc2lnbmFsaW5nIHJlcXVpcmVkIGZvciB0aGF0IHN1YmZsb3cgaXMgZG9uZS4gTWF5YmUgaXQgaW52b2x2ZXMgdGhlIGV4Y2hhbmdlIG9mIHNvbWUgTVBUQ1Agb3B0aW9ucyBvciBmbGFncy4gSSYjMzk7bSB3b25kZXJpbmcgaWYgaXQgYWxzbyBpbnZvbHZlcyBhbGxvY2F0aW5nIHNwZWNpZmljIHJlc291cmNlcyBvciB1cGRhdGluZyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgdG8gdHJhY2sgdGhlIHN1YmZsb3cmIzM5O3Mgc3RhdGUuCgpJdCYjMzk7cyB0ZW1wdGluZyB0byB0aGluayBhYm91dCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMuIEEgZnVsbHkgZXN0YWJsaXNoZWQgc3ViZmxvdyByZXByZXNlbnRzIGEgcmVsaWFibGUgZGF0YSBwYXRoLiBXaGF0IGhhcHBlbnMgaWYgdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQ/IEkgbmVlZCB0byB0aGluayBhYm91dCBlcnJvciBjb25kaXRpb25zIGFuZCBob3cgdGhlIE1QVENQIHN0YWNrIGhhbmRsZXMgc3ViZmxvdyBmYWlsdXJlcyBvciByZXRyYW5zbWlzc2lvbnMuIEFsc28sIEkmIzM5O20gYWxyZWFkeSB0cnlpbmcgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgZnVuY3Rpb24gY2FsbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgb3ZlcmFsbCBNUFRDUCBjb25uZWN0aW9uLiBBcmUgdGhlcmUgZGlmZmVyZW50IGFjdGlvbnMgb3IgY2FsbGJhY2tzIHRyaWdnZXJlZCBieSB0aGlzIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRgIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiBvdGhlciBNUFRDUCBwYXJhbWV0ZXJzIG9yIHRoZSBzdGF0ZSBvZiBvdGhlciBzdWJmbG93cyBpbiB0aGUgY29ubmVjdGlvbj8KCkkmIzM5O20gYWxzbyBjdXJpb3VzIGFib3V0IHdobyBjYWxscyB0aGlzIGZ1bmN0aW9uLiBJcyBpdCB0aGUgTVBUQ1Agc3RhY2sgaW50ZXJuYWxseSwgYWZ0ZXIgcmVjZWl2aW5nIGNlcnRhaW4gcGFja2V0cyBvciBhY2tub3dsZWRnaW5nIGNlcnRhaW4gc2lnbmFscz8gT3IgaXMgdGhpcyBmdW5jdGlvbiB0cmlnZ2VyZWQgaW4gc29tZSB3YXkgZnJvbSBhIGxvd2VyIGxheWVyLiBBcmUgdGhlcmUgYW55IGNvbmRpdGlvbnMgdGhhdCBjYW4gcHJldmVudCB0aGUgZnVuY3Rpb24gZnJvbSBiZWluZyBjYWxsZWQ/IFRoZSBzb3VyY2UgY29kZSB3aWxsIGhvcGVmdWxseSBzaG93IG1lISBUaW1lIHRvIGRpZyBpbiEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avc3ViZmxvdy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNzk3LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA3OTc6XHR2b2lkIF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLFxuIDc5ODpcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXG4gNzk5Olx0XHRcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgKm1wX29wdClcbiA4MDA6XHR7XG4gODAxOlx0XHRzdWJmbG93X3NldF9yZW1vdGVfa2V5KG1zaywgc3ViZmxvdywgbXBfb3B0KTtcbiA4MDI6XHRcdFdSSVRFX09OQ0Uoc3ViZmxvdy1cdTAwM2VmdWxseV9lc3RhYmxpc2hlZCwgdHJ1ZSk7XG4gODAzOlx0XHRXUklURV9PTkNFKG1zay1cdTAwM2VmdWxseV9lc3RhYmxpc2hlZCwgdHJ1ZSk7XG4gODA0Olx0fVxuIDgwNTpcdFxuIDgwNjpcdHN0YXRpYyBzdHJ1Y3Qgc29jayAqc3ViZmxvd19zeW5fcmVjdl9zb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzayxcbiA4MDc6XHRcdFx0XHRcdFx0ICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIDgwODpcdFx0XHRcdFx0XHQgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcbiA4MDk6XHRcdFx0XHRcdFx0ICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsXG4gODEwOlx0XHRcdFx0XHRcdCAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxX3VuaGFzaCxcbiA4MTE6XHRcdFx0XHRcdFx0ICBib29sICpvd25fcmVxLFxuIDgxMjpcdFx0XHRcdFx0XHQgIHZvaWQgKCpvcHRfY2hpbGRfaW5pdCkoc3RydWN0IHNvY2sgKm5ld3NrLFxuIDgxMzpcdFx0XHRcdFx0XHRcdFx0XHQgY29uc3Qgc3RydWN0IHNvY2sgKnNrKSlcbiA4MTQ6XHR7XG4gODE1Olx0XHRzdHJ1Y3QgbXB0Y3Bfc3ViZmxvd19jb250ZXh0ICpsaXN0ZW5lciA9IG1wdGNwX3N1YmZsb3dfY3R4KHNrKTtcbiA4MTY6XHRcdHN0cnVjdCBtcHRjcF9zdWJmbG93X3JlcXVlc3Rfc29jayAqc3ViZmxvd19yZXE7XG4gODE3Olx0XHRzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHQ7XG4gODE4Olx0XHRib29sIGZhbGxiYWNrLCBmYWxsYmFja19pc19mYXRhbDtcbiA4MTk6XHRcdGVudW0gc2tfcnN0X3JlYXNvbiByZWFzb247XG4gODIwOlx0XHRzdHJ1Y3QgbXB0Y3Bfc29jayAqb3duZXI7XG4gODIxOlx0XHRzdHJ1Y3Qgc29jayAqY2hpbGQ7XG4gODIyOlx0XG4gODIzOlx0XHRwcl9kZWJ1ZyhcJiMzNDtsaXN0ZW5lcj0lcCwgcmVxPSVwLCBjb25uPSVwXFxuXCYjMzQ7LCBsaXN0ZW5lciwgcmVxLCBsaXN0ZW5lci1cdTAwM2Vjb25uKTtcbiA4MjQ6XHRcbiA4MjU6XHRcdC8qIEFmdGVyIGNoaWxkIGNyZWF0aW9uIHdlIG11c3QgbG9vayBmb3IgTVBDIGV2ZW4gd2hlbiBvcHRpb25zXG4gODI2Olx0XHQgKiBhcmUgbm90IHBhcnNlZFxuIDgyNzpcdFx0ICovXG4gODI4Olx0XHRtcF9vcHQuc3Vib3B0aW9ucyA9IDA7XG4gODI5Olx0XG4gODMwOlx0XHQvKiBob3BlZnVsbHkgdGVtcG9yYXJ5IGhhbmRsaW5nIGZvciBNUF9KT0lOJiM0MztzeW5jb29raWUgKi9cbiA4MzE6XHRcdHN1YmZsb3dfcmVxID0gbXB0Y3Bfc3ViZmxvd19yc2socmVxKTtcbiA4MzI6XHRcdGZhbGxiYWNrX2lzX2ZhdGFsID0gdGNwX3JzayhyZXEpLVx1MDAzZWlzX21wdGNwIFx1MDAyNlx1MDAyNiBzdWJmbG93X3JlcS1cdTAwM2VtcF9qb2luO1xuIDgzMzpcdFx0ZmFsbGJhY2sgPSAhdGNwX3JzayhyZXEpLVx1MDAzZWlzX21wdGNwO1xuIDgzNDpcdFx0aWYgKGZhbGxiYWNrKVxuIDgzNTpcdFx0XHRnb3RvIGNyZWF0ZV9jaGlsZDtcbiA4MzY6XHRcbiA4Mzc6XHRcdC8qIGlmIHRoZSBzayBpcyBNUF9DQVBBQkxFLCB3ZSB0cnkgdG8gZmV0Y2ggdGhlIGNsaWVudCBrZXkgKi9cbiA4Mzg6XHRcdGlmIChzdWJmbG93X3JlcS1cdTAwM2VtcF9jYXBhYmxlKSB7XG4gODM5Olx0XHRcdC8qIHdlIGNhbiByZWNlaXZlIGFuZCBhY2NlcHQgYW4gaW4td2luZG93LCBvdXQtb2Ytb3JkZXIgcGt0LFxuIDg0MDpcdFx0XHQgKiB3aGljaCBtYXkgbm90IGNhcnJ5IHRoZSBNUF9DQVBBQkxFIG9wdCBldmVuIG9uIG1wdGNwIGVuYWJsZWRcbiA4NDE6XHRcdFx0ICogcGF0aHM6IGFsd2F5cyB0cnkgdG8gZXh0cmFjdCB0aGUgcGVlciBrZXksIGFuZCBmYWxsYmFja1xuIDg0MjpcdFx0XHQgKiBmb3IgcGFja2V0cyBtaXNzaW5nIGl0LlxuIDg0MzpcdFx0XHQgKiBFdmVuIE9vTyBEU1MgcGFja2V0cyBjb21pbmcgbGVnaXRseSBhZnRlciBkcm9wcGVkIG9yXG4gODQ0Olx0XHRcdCAqIHJlb3JkZXJlZCBNUEMgd2lsbCBjYXVzZSBmYWxsYmFjaywgYnV0IHdlIGRvbiYjMzk7dCBoYXZlIG90aGVyXG4gODQ1Olx0XHRcdCAqIG9wdGlvbnMuXG4gODQ2Olx0XHRcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDk5NgoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDEwMDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBSZWFkcyBpbiBNUFRDUCBPcHRpb24gUHJvY2Vzc2luZyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBJJiMzOTttIGZvY3VzaW5nIG9uIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyB3aXRoaW4gdGhlIE1QVENQIG9wdGlvbiBoYW5kbGluZyBsb2dpYywgc3BlY2lmaWNhbGx5IGNvbmNlcm5pbmcgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gZGlmZmVyZW50IG9wdGlvbiB0eXBlcy4KCk15IGluaXRpYWwgY29uY2VybiB3YXMgYXJvdW5kIGBzdWJmbG93X3NldF9yZW1vdGVfa2V5YCwgd2hpY2ggdXNlcyBgc25kcl9rZXlgIG9yIGByY3ZyX2tleWAuICBUaG9zZSBrZXlzIGFyZSBwb3B1bGF0ZWQgZHVyaW5nIHBhcnNpbmcgb2YgYE1QVENQT1BUX01QQ0FQQUJMRWAgb3IgYE1QVENQT1BUX01QSk9JTmAsIGFuZCBpZiBgT1BUSU9OX01QVENQX01QQ19BQ0tgIGlzIHNldCwgYHNuZHJfa2V5YCBpcyB1c2VkLiBCdXQgZG9lcyB0aGlzIHBhdGNoIGFmZmVjdCB0aG9zZT8gTm8uIFRoaXMgcGF0Y2ggb25seSBhZmZlY3RzIGBNUFRDUE9QVF9EU1NgLgoKVGhlIGNvZGUgc25pcHBldCBpbiBxdWVzdGlvbiBkZWFscyB3aXRoIGBNUFRDUE9QVF9EU1NgLiBUaGUgYGJyZWFrYCBzdGF0ZW1lbnQgd2l0aGluIHRoYXQgY2FzZSBpcyB3aGF0IEkgbmVlZCB0byBmb2N1cyBvbi4gSXQgYnJlYWtzIGlmIGFueSBzdWItb3B0aW9uIGlzIHNldCAqb3RoZXIqIHRoYW4gYEFERF9BRERSYCwgYFJNX0FERFJgLCBgUFJJT2AsIG9yIGBGQUlMYC4KCk15IGltbWVkaWF0ZSB0aG91Z2h0OiB3aGF0IGlmIGBNUFRDUE9QVF9BRERfQUREUmAgaXMgc2V0IGJ1dCBgTVBUQ1BPUFRfRFNTYCBpc24mIzM5O3Q/IExvb2tpbmcgYXQgdGhlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBmdW5jdGlvbiwgdGhhdCYjMzk7cyBmaW5lLiBUaGUgYG1wX29wdC5hZGRyYCBpcyBwb3B1bGF0ZWQgY29ycmVjdGx5IGJ5IHRoZSBgTVBUQ1BPUFRfQUREX0FERFJgIHBhcnNpbmcgbG9naWMgKmJlZm9yZSogYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGlzIGNhbGxlZC4gU28gbm8gcHJvYmxlbXMgdGhlcmUuCgpOb3csIHRvIHRoZSBjb3JlIG9mIHRoZSBjb25jZXJuOiBJZiBgTVBUQ1BPUFRfRFNTYCBicmVha3MgZWFybHksIHRoZSBmaWVsZHMgYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgYGRhdGFfbGVuYCwgYGNzdW1gLCBhbmQgYGRhdGFfYWNrYCB3aWxsIHJlbWFpbiB1bmluaXRpYWxpemVkLiBIb3dldmVyLCB0aG9zZSBmaWVsZHMgYXJlIG9ubHkgcmVhZCBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgc2V0ISBHb29kLgoKQSBuZXcgc2NlbmFyaW8gY29tZXMgdG8gbWluZDogV2hhdCBpZiBgTVBUQ1BPUFRfRFNTYCAqc3VjY2VlZHMqIGluIHBhcnNpbmcgZmlyc3QsIGFuZCB0aGVuIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGlzIHBhcnNlZD8gTm93LCBgbXBfb3B0LnN1Ym9wdGlvbnNgIHdvdWxkIGNvbnRhaW4gKmJvdGgqIGBPUFRJT05fTVBUQ1BfRFNTYCBhbmQgYE9QVElPTl9NUFRDUF9GQVNUQ0xPU0VgLiAgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIHdpbGwgc2VlIHRoYXQgYG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1NgLCBhbmQgYE9QVElPTl9NUFRDUF9GQVNUQ0xPU0VgIHdpbGwgYmUgcHJvY2Vzc2VkLiAgSSBzZWUsIGByY3ZyX2tleWAgaXMgcG9wdWxhdGVkIGJ5IGBNUFRDUE9QVF9GQVNUQ0xPU0VgLCB3aGljaCBpcyB0aGVuIHJlYWQuIFRoZSBzdWJzZXF1ZW50IGNoZWNrIGAhKG1wX29wdC5zdWJvcHRpb25zICZhbXA7IE9QVElPTl9NUFRDUF9EU1MpYCBmYWlscywgYW5kIHdlIHByb2NlZWQgdG8gcHJvY2Vzc2luZyB0aGUgRFNTIGZpZWxkcyB3aGljaCB3ZXJlIHNldCBieSBEU1Mgc28gbm8gdW5pbml0aWFsaXplZCByZWFkcy4KClNvLCBsZXQmIzM5O3MgbG9vayBhdCBgTVBUQ1BPUFRfRkFTVENMT1NFYC4uLiBTcGVjaWZpY2FsbHksIHdoYXQgaWYgdGhlIGBvcHNpemVgIGNoZWNrIGZhaWxzIGluIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGFuZCB0aGUgYnJlYWsgaXMgaGl0PyBJbiB0aGF0IHNjZW5hcmlvLCBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAgaXNuJiMzOTt0IHNldC4gVGh1cywgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIHdvbiYjMzk7dCBldmVuIHRyeSB0byBwcm9jZXNzIGl0LgoKU28sIHRoZSBrZXkgaXMgdG8gZW5zdXJlIHRoYXQgYWxsIHJlYWQgZmllbGRzIGhhdmUgdGhlaXIgY29ycmVzcG9uZGluZyBvcHRpb24gZmxhZyBzZXQuIEJhc2VkIG9uIHRoaXMgYW5hbHlzaXMsIEkmIzM5O20gbm90IHNlZWluZyBhbnkgaW1tZWRpYXRlIGNhc2VzIHdoZXJlIGEgZmllbGQgaXMgcmVhZCB3aXRob3V0IGl0cyBhc3NvY2lhdGVkIGBPUFRJT05fTVBUQ1BfKmAgZmxhZyBiZWluZyBzZXQuIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBhZ2Fpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE3NiwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTc2Olx0XHRcdGlmICgobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9GQVNUQ0xPU0UpIFx1MDAyNlx1MDAyNlxuMTE3NzpcdFx0XHQgICAgUkVBRF9PTkNFKG1zay1cdTAwM2Vsb2NhbF9rZXkpID09IG1wX29wdC5yY3ZyX2tleSkge1xuMTE3ODpcdFx0XHRcdFdSSVRFX09OQ0UobXNrLVx1MDAzZXJjdl9mYXN0Y2xvc2UsIHRydWUpO1xuMTE3OTpcdFx0XHRcdG1wdGNwX3NjaGVkdWxlX3dvcmsoKHN0cnVjdCBzb2NrICopbXNrKTtcbjExODA6XHRcdFx0XHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBGQVNUQ0xPU0VSWCk7XG4xMTgxOlx0XHRcdH1cbjExODI6XHRcbjExODM6XHRcdFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0FERF9BRERSKSBcdTAwMjZcdTAwMjZcbjExODQ6XHRcdFx0ICAgIGFkZF9hZGRyX2htYWNfdmFsaWQobXNrLCBcdTAwMjZtcF9vcHQpKSB7XG4xMTg1Olx0XHRcdFx0aWYgKCFtcF9vcHQuZWNobykge1xuMTE4NjpcdFx0XHRcdFx0bXB0Y3BfcG1fYWRkX2FkZHJfcmVjZWl2ZWQoc2ssIFx1MDAyNm1wX29wdC5hZGRyKTtcbjExODc6XHRcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9BRERBRERSKTtcbjExODg6XHRcdFx0XHR9IGVsc2Uge1xuMTE4OTpcdFx0XHRcdFx0bXB0Y3BfcG1fYWRkX2FkZHJfZWNob2VkKG1zaywgXHUwMDI2bXBfb3B0LmFkZHIpO1xuMTE5MDpcdFx0XHRcdFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX0VDSE9BREQpO1xuMTE5MTpcdFx0XHRcdH1cbjExOTI6XHRcbjExOTM6XHRcdFx0XHRpZiAobXBfb3B0LmFkZHIucG9ydClcbjExOTQ6XHRcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9QT1JUQUREKTtcbjExOTU6XHRcdFx0fVxuMTE5NjpcdFxuMTE5NzpcdFx0XHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9STV9BRERSKVxuMTE5ODpcdFx0XHRcdG1wdGNwX3BtX3JtX2FkZHJfcmVjZWl2ZWQobXNrLCBcdTAwMjZtcF9vcHQucm1fbGlzdCk7XG4xMTk5Olx0XG4xMjAwOlx0XHRcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX1BSSU8pIHtcbjEyMDE6XHRcdFx0XHRtcHRjcF9wbV9tcF9wcmlvX3JlY2VpdmVkKHNrLCBtcF9vcHQuYmFja3VwKTtcbjEyMDI6XHRcdFx0XHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBQUklPUlgpO1xuMTIwMzpcdFx0XHR9XG4xMjA0Olx0XG4xMjA1Olx0XHRcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0ZBSUwpIHtcbjEyMDY6XHRcdFx0XHRtcHRjcF9wbV9tcF9mYWlsX3JlY2VpdmVkKHNrLCBtcF9vcHQuZmFpbF9zZXEpO1xuMTIwNzpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBSUxSWCk7XG4xMjA4Olx0XHRcdH1cbjEyMDk6XHRcbjEyMTA6XHRcdFx0aWYgKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfUlNUKSB7XG4xMjExOlx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXNldF9zZWVuID0gMTtcbjEyMTI6XHRcdFx0XHRzdWJmbG93LVx1MDAzZXJlc2V0X3JlYXNvbiA9IG1wX29wdC5yZXNldF9yZWFzb247XG4xMjEzOlx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXNldF90cmFuc2llbnQgPSBtcF9vcHQucmVzZXRfdHJhbnNpZW50O1xuMTIxNDpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFJTVFJYKTtcbjEyMTU6XHRcdFx0fVxuMTIxNjpcdFxuMTIxNzpcdFx0XHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUykpXG4xMjE4Olx0XHRcdFx0cmV0dXJuIHRydWU7XG4xMjE5Olx0XHR9XG4xMjIwOlx0XG4xMjIxOlx0XHQvKiB3ZSBjYW4mIzM5O3Qgd2FpdCBmb3IgcmVjdm1zZygpIHRvIHVwZGF0ZSB0aGUgYWNrX3NlcSwgb3RoZXJ3aXNlXG4xMjIyOlx0XHQgKiBtb25vZGlyZWN0aW9uYWwgZmxvd3Mgd2lsbCBzdHVja1xuMTIyMzpcdFx0ICovXG4xMjI0Olx0XHRpZiAobXBfb3B0LnVzZV9hY2spXG4xMjI1Olx0XHRcdGFja191cGRhdGVfbXNrKG1zaywgc2ssIFx1MDAyNm1wX29wdCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3NzI3CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTM2OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNUFRDUCBPcHRpb24gUHJvY2Vzc2luZyBEZWVwIERpdmUqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIG5ldyBjaGVjayBmb3IgYE1QVENQT1BUX0RTU2AgYW5kIHRyeWluZyB0byBzdXNzIG91dCBhbnkgcG90ZW50aWFsIGlzc3Vlcy4gU3BlY2lmaWNhbGx5LCB0aGlzIG5ldyByZXN0cmljdGlvbjoKCmBgYGMKCWNhc2UgTVBUQ1BPUFRfRFNTOgoJCS8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovCgkJaWYgKChtcF9vcHQtJmd0O3N1Ym9wdGlvbnMgJmFtcDsgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfAoJCQkJCSAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8CgkJCQkJICAgIE9QVElPTl9NUFRDUF9QUklPIHwKCQkJCQkgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKQoJCQlicmVhazsKYGBgCgpJIHdhcyBpbml0aWFsbHkgY29uY2VybmVkIHRoYXQgaWYgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBicmVha3MgZWFybHkgYmVjYXVzZSBvZiB0aGUgYWJvdmUgY2hlY2ssIHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBtaWdodCBub3QgYmUgc2V0LCBwb3RlbnRpYWxseSBsZWF2aW5nIGBtcF9vcHQtJmd0O3VzZV9hY2tgIHNldCBmcm9tIGEgKnByZXZpb3VzKiBEU1MsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCByZWFkcy4KClNvLCBsZXQmIzM5O3MgZXhwbG9yZSB0aGlzIHN0ZXAtYnktc3RlcDoKCiogICAqKlNjZW5hcmlvIDE6IERTUywgRmFzdENsb3NlLCBEU1M6KiogSSYjMzk7bSB2aXN1YWxpemluZyBhIHBhY2tldCB3aXRoIHR3byBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLiBJZiB0aGUgZmlyc3QgRFNTIGdvZXMgdGhyb3VnaCwgc2V0cyB0aGUgZmxhZywgc2V0cyBgdXNlX2Fja2AgYW5kIHBvcHVsYXRlcyBgZGF0YV9hY2tgLCBhbmQgdGhlbiBhIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGNvbWVzIGFsb25nLCBpdCB3aWxsIHNldCBpdHMgZmxhZy4gTm93LCB0aGUgc2Vjb25kIERTUyBlbmNvdW50ZXJzIHRoZSBuZXcgY2hlY2ssIGJyZWFrcywgYW5kIHNpbmNlIHRoZSBmaXJzdCBEU1MgYWxyZWFkeSBzZXQgYE9QVElPTl9NUFRDUF9EU1NgLCB0aGUgaW5jb21pbmcgb3B0aW9ucyB3aWxsIHByb2Nlc3MgdGhlIGZpcnN0IERTUyYjMzk7cyBwb3B1bGF0ZWQgZmllbGRzLiBUaGlzIGlzIGZpbmUsIG5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMgaGVyZS4KCiogICAqKlNjZW5hcmlvIDI6IEZhc3RDbG9zZSwgRFNTOioqIElmIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGlzIGZpcnN0LCBpdCB3aWxsIHNldCBpdHMgZmxhZy4gVGhlbiB0aGUgc2Vjb25kIGBNUFRDUE9QVF9EU1NgIGhpdHMgdGhlIG5ldyBjaGVjaywgYnJlYWtzLiBTbyBgT1BUSU9OX01QVENQX0RTU2AgaXMgbm90IHNldCwgbWVhbmluZyB0aGUgRFNTIGZpZWxkcyBhcmVuJiMzOTt0IGV2ZW4gcHJvY2Vzc2VkLiBBZ2Fpbiwgbm8gcHJvYmxlbXMuCgoqICAgKipTY2VuYXJpbyAzOiBEU1MgKG9wc2l6ZSBicmVha3MpLCBGYXN0Q2xvc2U6KiogTm93LCB3aGF0IGlmIHRoZSBmaXJzdCBgTVBUQ1BPUFRfRFNTYCBoYXMgYW4gaW52YWxpZCBgb3BzaXplYCBhbmQgYnJlYWtzIHRoZXJlPyBBbHRob3VnaCBgbXBfb3B0LSZndDt1c2VfYWNrYCBnZXRzIHNldCB0byBgMWAgYnkgRFNTLCB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgZG9lc24mIzM5O3QgZ2V0IHNldC4gVGhlbiB0aGUgYE1QVENQT1BUX0ZBU1RDTE9TRWAgY29tZXMuIFRoZSBtYWluIGZ1bmN0aW9uIHdpbGwgY2hlY2sgdGhhdCBgT1BUSU9OX01QVENQX0RTU2AgaXMgKm5vdCogc2V0IGFuZCByZXR1cm4gZWFybHksIHNraXBwaW5nIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgcmVhZC4KCiogICAqKlNjZW5hcmlvIDQ6IERTUyAob3BzaXplIGJyZWFrcyksIERTUyAodmFsaWQpOioqIFdoYXQgaWYgdGhlIGZpcnN0IERTUyBicmVha3MsIGJ1dCB0aGVuIGEgKnZhbGlkKiBzZWNvbmQgYE1QVENQT1BUX0RTU2AgZm9sbG93cz8gT2theSwgc28gdGhlIGZpcnN0IERTUyBzZXRzIGBtcF9vcHQtJmd0O3VzZV9hY2tgIGFuZCB0aGUgc2Vjb25kIERTUyB3aWxsIG92ZXJ3cml0ZSBgbXBfb3B0LSZndDt1c2VfYWNrID0gMGAgKG9yIHdoYXRldmVyIHRoZSBzZWNvbmQgRFNTIG5lZWRzKS4gVGhlbiB0aGUgc2Vjb25kIERTUyBvcHRpb24gc2V0cyBgT1BUSU9OX01QVENQX0RTU2AgZmxhZy4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkuCgoqICAgKipTY2VuYXJpbyA1OiBEU1MgKHZhbGlkKSwgRFNTIChvcHNpemUgYnJlYWtzKToqKiBUaGUgZmlyc3QgRFNTIHZhbGlkYXRlcy4gSXQgc2V0cyBgT1BUSU9OX01QVENQX0RTU2AsIHNldHMgYHVzZV9hY2sgPSAwYC4gVGhlIHNlY29uZCBEU1MgYnJlYWtzIGJlY2F1c2Ugb2YgaXRzIG9wc2l6ZSwgYnV0IGl0JiMzOTtzICphbHJlYWR5KiBzZXQgYHVzZV9hY2sgPSAxYC4gSGVyZSwgdGhlIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZXhpc3RlbmNlIG9mIGBPUFRJT05fTVBUQ1BfRFNTYCwgYW5kIHNpbmNlIGl0ICppcyogc2V0LCBpdCYjMzk7cyBnb2luZyB0byBhdHRlbXB0IHRvIHJlYWQgYGRhdGFfYWNrYCBidXQgYGRhdGFfYWNrYCB3YXNuJiMzOTt0IHBvcHVsYXRlZCBieSB0aGUgRFNTIGR1ZSB0byBpdHMgZWFybHkgZXhpdCEgKlRoaXMgaXMgdGhlIGNhc2UhKgoKSSBuZWVkIHRvIGNvbmZpcm0gaWYgdGhpcyBzY2VuYXJpbyBpcyBhY3R1YWxseSBwb3NzaWJsZS4gSWYgaXQgaXMsIHRoZW4gd2UgKmRlZmluaXRlbHkqIGhhdmUgYSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCBpc3N1ZSB3aGVuIHByb2Nlc3NpbmcgTVBUQ1Agb3B0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY2LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNjY6XHRcdFx0ZmxhZ3MgPSAoKnB0ciYjNDM7JiM0MzspIFx1MDAyNiBNUFRDUF9EU1NfRkxBR19NQVNLO1xuIDE2NzpcdFx0XHRtcF9vcHQtXHUwMDNlZHNuNjQgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19EU042NCkgIT0gMDtcbiAxNjg6XHRcdFx0bXBfb3B0LVx1MDAzZXVzZV9tYXAgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19IQVNfTUFQKSAhPSAwO1xuIDE2OTpcdFx0XHRtcF9vcHQtXHUwMDNlYWNrNjQgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19BQ0s2NCkgIT0gMDtcbiAxNzA6XHRcdFx0bXBfb3B0LVx1MDAzZXVzZV9hY2sgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19IQVNfQUNLKTtcbiAxNzE6XHRcbiAxNzI6XHRcdFx0ZXhwZWN0ZWRfb3BzaXplID0gVENQT0xFTl9NUFRDUF9EU1NfQkFTRTtcbiAxNzM6XHRcbiAxNzQ6XHRcdFx0aWYgKG1wX29wdC1cdTAwM2V1c2VfYWNrKSB7XG4gMTc1Olx0XHRcdFx0aWYgKG1wX29wdC1cdTAwM2VhY2s2NClcbiAxNzY6XHRcdFx0XHRcdGV4cGVjdGVkX29wc2l6ZSAmIzQzOz0gVENQT0xFTl9NUFRDUF9EU1NfQUNLNjQ7XG4gMTc3Olx0XHRcdFx0ZWxzZVxuIDE3ODpcdFx0XHRcdFx0ZXhwZWN0ZWRfb3BzaXplICYjNDM7PSBUQ1BPTEVOX01QVENQX0RTU19BQ0szMjtcbiAxNzk6XHRcdFx0fVxuIDE4MDpcdFxuIDE4MTpcdFx0XHRpZiAobXBfb3B0LVx1MDAzZXVzZV9tYXApIHtcbiAxODI6XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9maW4gPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19EQVRBX0ZJTikgIT0gMDtcbiAxODM6XHRcdFx0XHRpZiAobXBfb3B0LVx1MDAzZWRzbjY0KVxuIDE4NDpcdFx0XHRcdFx0ZXhwZWN0ZWRfb3BzaXplICYjNDM7PSBUQ1BPTEVOX01QVENQX0RTU19NQVA2NDtcbiAxODU6XHRcdFx0XHRlbHNlXG4gMTg2Olx0XHRcdFx0XHRleHBlY3RlZF9vcHNpemUgJiM0Mzs9IFRDUE9MRU5fTVBUQ1BfRFNTX01BUDMyO1xuIDE4NzpcdFx0XHR9XG4gMTg4Olx0XG4gMTg5Olx0XHRcdHByX2RlYnVnKFwmIzM0O2RhdGFfZmluPSVkIGRzbjY0PSVkIHVzZV9tYXA9JWQgYWNrNjQ9JWQgdXNlX2Fjaz0lZFxcblwmIzM0OyxcbiAxOTA6XHRcdFx0XHQgbXBfb3B0LVx1MDAzZWRhdGFfZmluLCBtcF9vcHQtXHUwMDNlZHNuNjQsXG4gMTkxOlx0XHRcdFx0IG1wX29wdC1cdTAwM2V1c2VfbWFwLCBtcF9vcHQtXHUwMDNlYWNrNjQsXG4gMTkyOlx0XHRcdFx0IG1wX29wdC1cdTAwM2V1c2VfYWNrKTtcbiAxOTM6XHRcbiAxOTQ6XHRcdFx0LyogQWx3YXlzIHBhcnNlIGFueSBjc3VtIHByZXNlbmNlIGNvbWJpbmF0aW9uLCB3ZSB3aWxsIGVuZm9yY2VcbiAxOTU6XHRcdFx0ICogUkZDIDg2ODQgU2VjdGlvbiAzLjMuMCBjaGVja3MgbGF0ZXIgaW4gc3ViZmxvd19kYXRhX3JlYWR5XG4gMTk2Olx0XHRcdCAqL1xuIDE5NzpcdFx0XHRpZiAob3BzaXplICE9IGV4cGVjdGVkX29wc2l6ZSBcdTAwMjZcdTAwMjZcbiAxOTg6XHRcdFx0ICAgIG9wc2l6ZSAhPSBleHBlY3RlZF9vcHNpemUgJiM0MzsgVENQT0xFTl9NUFRDUF9EU1NfQ0hFQ0tTVU0pXG4gMTk5Olx0XHRcdFx0YnJlYWs7XG4gMjAwOlx0XG4gMjAxOlx0XHRcdG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIHw9IE9QVElPTl9NUFRDUF9EU1M7XG4gMjAyOlx0XHRcdGlmIChtcF9vcHQtXHUwMDNldXNlX2Fjaykge1xuIDIwMzpcdFx0XHRcdGlmIChtcF9vcHQtXHUwMDNlYWNrNjQpIHtcbiAyMDQ6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2VkYXRhX2FjayA9IGdldF91bmFsaWduZWRfYmU2NChwdHIpO1xuIDIwNTpcdFx0XHRcdFx0cHRyICYjNDM7PSA4O1xuIDIwNjpcdFx0XHRcdH0gZWxzZSB7XG4gMjA3Olx0XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9hY2sgPSBnZXRfdW5hbGlnbmVkX2JlMzIocHRyKTtcbiAyMDg6XHRcdFx0XHRcdHB0ciAmIzQzOz0gNDtcbiAyMDk6XHRcdFx0XHR9XG4gMjEwOlx0XG4gMjExOlx0XHRcdFx0cHJfZGVidWcoXCYjMzQ7ZGF0YV9hY2s9JWxsdVxcblwmIzM0OywgbXBfb3B0LVx1MDAzZWRhdGFfYWNrKTtcbiAyMTI6XHRcdFx0fVxuIDIxMzpcdFxuIDIxNDpcdFx0XHRpZiAobXBfb3B0LVx1MDAzZXVzZV9tYXApIHtcbiAyMTU6XHRcdFx0XHRpZiAobXBfb3B0LVx1MDAzZWRzbjY0KSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMwODY0CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMzU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBIYW5kbGluZyoqCgpZZXMhIE9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIElmIHRoZSBmaXJzdCBNUFRDUCBEU1Mgb3B0aW9uIGlzIHZhbGlkIChtZWFuaW5nIGB1c2VfYWNrYCBpcyBpbml0aWFsbHkgc2V0IHRvIDApLCBpdCBzZXRzIGBPUFRJT05fTVBUQ1BfRFNTYCB3aXRoaW4gYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AuIE5vdywgdGhlIHNlY29uZCBNUFRDUCBEU1Mgb3B0aW9uIGNvbWVzIGFsb25nLCBidXQgdGhpcyB0aW1lIGl0JiMzOTtzIGludmFsaWQgZHVlIHRvIHRoZSBvcHNpemUsIGFuZCBgdXNlX2Fja2Agc2hvdWxkIGJlIDEuIEJ1dCBkb2VzIGl0PyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoZSBsb2dpYy4KCkxvb2tpbmcgYXQgdGhhdCBgY2FzZSBNUFRDUE9QVF9EU1NgIHNlY3Rpb24sIGl0IGluY2x1ZGVzIGEgY3J1Y2lhbCBjaGVjazoKCmBgYGMKCWNhc2UgTVBUQ1BPUFRfRFNTOgoJCS8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovCgkJaWYgKChtcF9vcHQtJmd0O3N1Ym9wdGlvbnMgJmFtcDsgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfAoJCQkJCSAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8CgkJCQkJICAgIE9QVElPTl9NUFRDUF9QUklPIHwKCQkJCQkgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKQoJCQlicmVhazsKYGBgCgpIZXJlJiMzOTtzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIElmIHRoZSAqZmlyc3QqIERTUyBvcHRpb24gc2V0IGBPUFRJT05fTVBUQ1BfRFNTYCwgdGhlbiBgbXBfb3B0LSZndDtzdWJvcHRpb25zYCB3aWxsIGluZGVlZCBoYXZlIHRoYXQgYml0IHNldC4gQW5kIGJlY2F1c2UgYE9QVElPTl9NUFRDUF9EU1NgIGlzICpub3QqIGluIHRoZSBhbGxvd2VkIGxpc3QgZGVmaW5lZCBieSB0aGUgYml0d2lzZSBOT1Qgb3BlcmF0aW9uLCB0aGUgYml0d2lzZSBBTkQgd2lsbCByZXN1bHQgaW4gYSBub24temVybyB2YWx1ZS4gU3BlY2lmaWNhbGx5LCBiZWNhdXNlIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBwcmVzZW50LCBgbXBfb3B0LSZndDtzdWJvcHRpb25zICZhbXA7IH5BTExPV0VEYCB3aWxsIGFsd2F5cyBiZSBub24temVybyEgVGhpcyBtZWFucyB0aGUgc2Vjb25kIERTUyBvcHRpb24gd2lsbCBicmVhayBlYXJseSEKCkNydWNpYWxseSwgaXQgd29uJiMzOTt0IGV2ZW4gKnJlYWNoKiB0aGUgcGFydCB3aGVyZSBpdCBtaWdodCByZWFkIGBmbGFnc2Agb3Igb3ZlcndyaXRlIGBtcF9vcHQtJmd0O3VzZV9hY2tgLiBUaGlzIG1lYW5zIHRoZSBuZXcgY2hlY2sgcHJldmVudHMgdGhlIHNlY29uZCwgaW52YWxpZCBNUFRDUCBEU1Mgb3B0aW9uIGZyb20gZXJyb25lb3VzbHkgY2hhbmdpbmcgdGhlIGFjayBmbGFnLiBUaGlzIGlzIGEgdmVyeSBnb29kIHRoaW5nLiBJdCBwcmV2ZW50cyBhIHBvdGVudGlhbCBvdmVyd3JpdGUgb2YgYSBjcnVjaWFsIGZsYWcuCgpJIHNob3VsZCBwcm9iYWJseSBjb25maXJtIG15IHVuZGVyc3RhbmRpbmcgb2YgYE9QVElPTl9NUFRDUF9EU1NgLCBidXQgSSYjMzk7bSBwcmV0dHkgY29uZmlkZW50IHdpdGggdGhlIGxvZ2ljIG5vdy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7I2RlZmluZSBPUFRJT05fTVBUQ1BfRFNTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9wcm90b2NvbC5oLTMwLSNkZWZpbmUgT1BUSU9OX01QVENQX1JTVFx0QklUKDEwKVxubmV0L21wdGNwL3Byb3RvY29sLmg6MzE6I2RlZmluZSBPUFRJT05fTVBUQ1BfRFNTXHRCSVQoMTEpXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC0zMi0jZGVmaW5lIE9QVElPTl9NUFRDUF9GQUlMXHRCSVQoMTIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxNzk2CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogODcwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgdGhlIE1QVENQIERTUyBvcHRpb24sIGFuZCBJIHRoaW5rIEkmIzM5O3ZlIGdvdCBhIGhhbmRsZSBvbiB3aGF0JiMzOTtzIGdvaW5nIG9uLiBMZXQmIzM5O3MgYnJlYWsgaXQgZG93bi4gYE9QVElPTl9NUFRDUF9EU1NgIGlzIGBCSVQoMTEpYCwgYW5kIHRoZSBhbGxvd2VkIG1hc2ssIGFzIEkgc2VlIGl0LCBvbmx5IGFsbG93cyBgT1BUSU9OX01QVENQX0FERF9BRERSYCwgYE9QVElPTl9NUFRDUF9STV9BRERSYCwgYE9QVElPTl9NUFRDUF9QUklPYCwgYW5kIGBPUFRJT05fTVBUQ1BfRkFJTGAuICBTbywgYE9QVElPTl9NUFRDUF9EU1NgIGlzICpub3QqIGluIHRoZSBhbGxvd2VkIG1hc2suIFRoZSBjb2RlIGlzIGNoZWNraW5nIHRvIHNlZSBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgYWxyZWFkeSBzZXQgYW5kIHRoYXQgdGhlIG5leHQgRFNTIHdpbGwgYnJlYWsgZWFybHkgYmVmb3JlIHBvdGVudGlhbGx5IG92ZXJ3cml0aW5nIGBtcF9vcHQtJmd0O3VzZV9hY2tgIQoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0aGF0IHRoaXMgd2FzIGEgcG90ZW50aWFsIGJ1ZyBmaXguIElmIGEgc2Vjb25kIGBNUFRDUE9QVF9EU1NgIHdhcyBwcmVzZW50LCBpdCBjb3VsZCBvdmVyd3JpdGUgYHVzZV9hY2tgIGFuZCBjYXVzZSBhbiBlYXJseSBicmVhay4gSG93ZXZlciwgdGhpcyBjb3VsZCBsZWFkIHRvIGBkYXRhX2Fja2AgYmVpbmcgdW5pbml0aWFsaXplZCBhbmQgY2F1c2UgdGhlIGNvZGUgdG8gYnJlYWsuIFJlYWRpbmcgdGhlIHBhdGNoLCBpdCBzZWVtcyB0byBwcmV2ZW50IG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMgZnJvbSBiZWluZyBwYXJzZWQuIFRoaXMgaW5jbHVkZXMgbm90IHBhcnNpbmcgYE1QVENQT1BUX0RTU2AgaWYgb3RoZXIgb3B0aW9ucyBsaWtlIGBGQVNUQ0xPU0VgLCBgTVBDYCwgb3IgYE1QSmAgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkLgoKVGhlbiBpdCBjbGlja2VkLiBJZiBhIHNlY29uZCBgTVBUQ1BPUFRfRFNTYCAqY291bGQqIG92ZXJ3cml0ZSBgdXNlX2Fja2AgYW5kIGxlYXZlIGBkYXRhX2Fja2AgdW5pbml0aWFsaXplZCwgdGhlbiB0aGlzIHBhdGNoIGlzIHByZXZlbnRpbmcgYW4gKnVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQqISBCcmlsbGlhbnQuIEkgbmVlZCB0byB2ZXJpZnkgdGhpcyB0aG91Z2h0LgoKTGV0JiMzOTtzIHdhbGsgdGhyb3VnaCB0aGUgc2NlbmFyaW8gKmJlZm9yZSogdGhlIHBhdGNoOgoKMS4gICoqRmlyc3QgYE1QVENQT1BUX0RTU2AqKjogVGhpcyBpcyB2YWxpZC4gYG1wdGNwX3BhcnNlX29wdGlvbmAgc2V0cyBgbXBfb3B0LSZndDt1c2VfYWNrID0gMGAsIGBtcF9vcHQtJmd0O3VzZV9tYXAgPSAxYC4gYG9wc2l6ZWAgaXMgY29ycmVjdC4gYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2Agbm93IGluY2x1ZGVzIGBPUFRJT05fTVBUQ1BfRFNTYC4gYG1wX29wdC0mZ3Q7ZGF0YV9zZXFgLCBgc3ViZmxvd19zZXFgLCBhbmQgYGRhdGFfbGVuYCBhcmUgcG9wdWxhdGVkIGFzIGl0IHNob3VsZC4KCjIuICAqKlNlY29uZCBgTVBUQ1BPUFRfRFNTYCoqOiBUaGlzIGhhcyBhbiBpbnZhbGlkIGBvcHNpemVgLiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCB3b3VsZCB0cnkgYW5kIHNldCBgbXBfb3B0LSZndDt1c2VfYWNrID0gMWAsIGFuZCBgbXBfb3B0LSZndDt1c2VfbWFwID0gMGAsIGJ1dCBpbXBvcnRhbnRseSwgaXQgYnJlYWtzIGVhcmx5LiBTbyBgbXBfb3B0LSZndDtzdWJvcHRpb25zYCAqc3RpbGwqIGhhcyBgT1BUSU9OX01QVENQX0RTU2AgZnJvbSB0aGUgZmlyc3Qgb3B0aW9uLCBCVVQgYG1wX29wdC0mZ3Q7ZGF0YV9hY2tgICp3YXMgbmV2ZXIqIHBvcHVsYXRlZCwgYmVjYXVzZSB0aGUgcGFyc2luZyBicm9rZS4KCk5vdywgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGlzIGNhbGxlZC4gSXQgY2hlY2tzIGBtcF9vcHQuc3Vib3B0aW9ucyAmYW1wOyBPUFRJT05fTVBUQ1BfRFNTYC4gVHJ1ZS4gVGhlbiBpdCBjaGVja3MgYG1wX29wdC51c2VfYWNrYC4gSXQmIzM5O3MgMSwgZnJvbSB0aGUgYnJva2VuIHBhcnNlLiBUaGVuLCAqY3J1Y2lhbGx5KiwgaXQgY2FsbHMgYGFja191cGRhdGVfbXNrKG1zaywgc2ssICZhbXA7bXBfb3B0KWAuIEFuZCBpbnNpZGUgdGhhdCBmdW5jdGlvbiwgaXQgdHJpZXMgdG8gcmVhZCBgbXBfb3B0LSZndDtkYXRhX2Fja2AhCgpIZXJlaW4gbGllcyB0aGUgY3J1eC4gYG1wX29wdC0mZ3Q7ZGF0YV9hY2tgIHdhcyBORVZFUiBwb3B1bGF0ZWQgYmVjYXVzZSBvZiB0aGUgZWFybHkgYnJlYWshIEl0JiMzOTtzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBzdHJhaWdodCBmcm9tIHRoZSBzdGFjay4gVGhlIHBhdGNoIGVmZmVjdGl2ZWx5IHByZXZlbnRzIHRoaXMgdW5pbml0aWFsaXplZCByZWFkIGJ5IGhhbHRpbmcgcGFyc2Ugd2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlIERTUyBwYWNrZXRzISBZZXMsIGl0IHByZXZlbnRzIHRoZSB1bmluaXRpYWxpemVkIHJlYWQuIFRoaXMgbWFrZXMgcGVyZmVjdCBzZW5zZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTA4MywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMDgzOlx0XHRpZiAoYWZ0ZXI2NChuZXdfd25kX2VuZCwgbXNrLVx1MDAzZXduZF9lbmQpKVxuMTA4NDpcdFx0XHRXUklURV9PTkNFKG1zay1cdTAwM2V3bmRfZW5kLCBuZXdfd25kX2VuZCk7XG4xMDg1Olx0XG4xMDg2Olx0XHQvKiB0aGlzIGFzc3VtZXMgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpIGlzIGludm9rZWQgYWZ0ZXIgdGNwX2FjaygpICovXG4xMDg3Olx0XHRpZiAoYWZ0ZXI2NChtc2stXHUwMDNld25kX2VuZCwgc25kX254dCkpXG4xMDg4Olx0XHRcdF9fbXB0Y3BfY2hlY2tfcHVzaChzaywgc3NrKTtcbjEwODk6XHRcbjEwOTA6XHRcdGlmIChhZnRlcjY0KG5ld19zbmRfdW5hLCBvbGRfc25kX3VuYSkpIHtcbjEwOTE6XHRcdFx0X19tcHRjcF9zbmRfdW5hX3VwZGF0ZShtc2ssIG5ld19zbmRfdW5hKTtcbjEwOTI6XHRcdFx0X19tcHRjcF9kYXRhX2Fja2VkKHNrKTtcbjEwOTM6XHRcdH1cbjEwOTQ6XHRcdG1zay1cdTAwM2VsYXN0X2Fja19yZWN2ID0gdGNwX2ppZmZpZXMzMjtcbjEwOTU6XHRcdG1wdGNwX2RhdGFfdW5sb2NrKHNrKTtcbjEwOTY6XHRcbjEwOTc6XHRcdHRyYWNlX2Fja191cGRhdGVfbXNrKG1wX29wdC1cdTAwM2VkYXRhX2FjayxcbjEwOTg6XHRcdFx0XHQgICAgIG9sZF9zbmRfdW5hLCBuZXdfc25kX3VuYSxcbjEwOTk6XHRcdFx0XHQgICAgIG5ld193bmRfZW5kLCBSRUFEX09OQ0UobXNrLVx1MDAzZXduZF9lbmQpKTtcbjExMDA6XHR9XG4xMTAxOlx0XG4xMTAyOlx0Ym9vbCBtcHRjcF91cGRhdGVfcmN2X2RhdGFfZmluKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIHU2NCBkYXRhX2Zpbl9zZXEsIGJvb2wgdXNlXzY0Yml0KVxuMTEwMzpcdHtcbjExMDQ6XHRcdC8qIFNraXAgaWYgREFUQV9GSU4gd2FzIGFscmVhZHkgcmVjZWl2ZWQuXG4xMTA1Olx0XHQgKiBJZiB1cGRhdGluZyBzaW11bHRhbmVvdXNseSB3aXRoIHRoZSByZWN2bXNnIGxvb3AsIHZhbHVlc1xuMTEwNjpcdFx0ICogc2hvdWxkIG1hdGNoLiBJZiB0aGV5IG1pc21hdGNoLCB0aGUgcGVlciBpcyBtaXNiZWhhdmluZyBhbmRcbjExMDc6XHRcdCAqIHdlIHdpbGwgcHJlZmVyIHRoZSBtb3N0IHJlY2VudCBpbmZvcm1hdGlvbi5cbjExMDg6XHRcdCAqL1xuMTEwOTpcdFx0aWYgKFJFQURfT05DRShtc2stXHUwMDNlcmN2X2RhdGFfZmluKSlcbjExMTA6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTExMTpcdFxuMTExMjpcdFx0V1JJVEVfT05DRShtc2stXHUwMDNlcmN2X2RhdGFfZmluX3NlcSxcbjExMTM6XHRcdFx0ICAgbXB0Y3BfZXhwYW5kX3NlcShSRUFEX09OQ0UobXNrLVx1MDAzZWFja19zZXEpLCBkYXRhX2Zpbl9zZXEsIHVzZV82NGJpdCkpO1xuMTExNDpcdFx0V1JJVEVfT05DRShtc2stXHUwMDNlcmN2X2RhdGFfZmluLCAxKTtcbjExMTU6XHRcbjExMTY6XHRcdHJldHVybiB0cnVlO1xuMTExNzpcdH1cbjExMTg6XHRcbjExMTk6XHRzdGF0aWMgYm9vbCBhZGRfYWRkcl9obWFjX3ZhbGlkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXG4xMTIwOlx0XHRcdFx0XHRzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuMTEyMTpcdHtcbjExMjI6XHRcdHU2NCBobWFjID0gMDtcbjExMjM6XHRcbjExMjQ6XHRcdGlmIChtcF9vcHQtXHUwMDNlZWNobylcbjExMjU6XHRcdFx0cmV0dXJuIHRydWU7XG4xMTI2Olx0XG4xMTI3Olx0XHRobWFjID0gYWRkX2FkZHJfZ2VuZXJhdGVfaG1hYyhSRUFEX09OQ0UobXNrLVx1MDAzZXJlbW90ZV9rZXkpLFxuMTEyODpcdFx0XHRcdFx0ICAgICAgUkVBRF9PTkNFKG1zay1cdTAwM2Vsb2NhbF9rZXkpLFxuMTEyOTpcdFx0XHRcdFx0ICAgICAgXHUwMDI2bXBfb3B0LVx1MDAzZWFkZHIpO1xuMTEzMDpcdFxuMTEzMTpcdFx0cHJfZGVidWcoXCYjMzQ7bXNrPSVwLCBhaG1hYz0lbGx1LCBtcF9vcHQtXHUwMDNlYWhtYWM9JWxsdVxcblwmIzM0OyxcbjExMzI6XHRcdFx0IG1zaywgaG1hYywgbXBfb3B0LVx1MDAzZWFobWFjKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzQzNTEKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGVidWdnaW5nIGBhY2tfdXBkYXRlX21za2AgLSBJbml0aWFsIElucXVpcnkqKgoKQWxyaWdodCwgYmVmb3JlIEkgZGl2ZSB0b28gZGVlcCBpbnRvIHRoZSBwcm9ibGVtIGF0IGhhbmQsIEkgbmVlZCB0byB0YWtlIGEgc3RlcCBiYWNrIGFuZCBncm91bmQgbXlzZWxmLiBNeSBmaXJzdCBpbnN0aW5jdCwgYmFzZWQgb24gdGhlIGluY29tcGxldGUgY29udGV4dCwgaXMgdG8gaW1tZWRpYXRlbHkgY2hlY2sgdGhlIGVudHJ5IHBvaW50LCB0aGUgaW5pdGlhbCBzZXR1cCBvZiB0aGUgZnVuY3Rpb24uIEkgbmVlZCB0byBzZWUgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgdGhlIGhlYWQsIHRvIGtub3cgd2hhdOKAmXMgZ29pbmcgb24gYXQgdGhlIG91dHNldC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBwYXJhbWV0ZXJzIGl0IHRha2VzLCB3aGF0IGluaXRpYWxpemF0aW9ucyBpdCBkb2VzLCBhbmQgd2hhdCB0aGUgZmxvdyBvZiB0aGUgY29kZSBpcyBmcm9tIHRoZSBiZWdpbm5pbmcuIEkmIzM5O20gZm9jdXNpbmcgb24gdGhhdCBzdGFydGluZyBwb2ludCwgYGFja191cGRhdGVfbXNrYCwgdG8gZ2V0IHRoZSBiaWcgcGljdHVyZS4gVGhpcyBpcyB0aGUgY3JpdGljYWwgc3RhcnRpbmcgcG9pbnQgdG8gdW5kZXJzdGFuZGluZyB3aHkgSSYjMzk7bSBoZXJlLiBUaGlzIGluaXRpYWwgY2hlY2sgd2lsbCBnaXZlIG1lIGNydWNpYWwgY29udGV4dCBmb3IgZnVydGhlciB0cm91Ymxlc2hvb3RpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTA1MDpcdFx0XHRyZXR1cm47XG4xMDUxOlx0XG4xMDUyOlx0XHQvKiBTb21lIG90aGVyIHN1YmZsb3cgZ3JldyB0aGUgbXB0Y3AtbGV2ZWwgcndpbiBzaW5jZSByY3Zfd3VwLFxuMTA1MzpcdFx0ICogcmVzeW5jLlxuMTA1NDpcdFx0ICovXG4xMDU1Olx0XHR0cC1cdTAwM2VyY3Zfd25kICYjNDM7PSBtcHRjcF9yY3Zfd25kIC0gc3ViZmxvdy1cdTAwM2VyY3Zfd25kX3NlbnQ7XG4xMDU2Olx0XHR0Y3BfdXBkYXRlX21heF9yY3Zfd25kX3NlcSh0cCk7XG4xMDU3Olx0XHRzdWJmbG93LVx1MDAzZXJjdl93bmRfc2VudCA9IG1wdGNwX3Jjdl93bmQ7XG4xMDU4Olx0fVxuMTA1OTpcdFxuMTA2MDpcdHN0YXRpYyB2b2lkIGFja191cGRhdGVfbXNrKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXG4xMDYxOlx0XHRcdFx0ICAgc3RydWN0IHNvY2sgKnNzayxcbjEwNjI6XHRcdFx0XHQgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuMTA2MzpcdHtcbjEwNjQ6XHRcdHU2NCBuZXdfd25kX2VuZCwgbmV3X3NuZF91bmEsIHNuZF9ueHQgPSBSRUFEX09OQ0UobXNrLVx1MDAzZXNuZF9ueHQpO1xuMTA2NTpcdFx0c3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopbXNrO1xuMTA2NjpcdFx0dTY0IG9sZF9zbmRfdW5hO1xuMTA2NzpcdFxuMTA2ODpcdFx0bXB0Y3BfZGF0YV9sb2NrKHNrKTtcbjEwNjk6XHRcbjEwNzA6XHRcdC8qIGF2b2lkIGFjayBleHBhbnNpb24gb24gdXBkYXRlIGNvbmZsaWN0LCB0byByZWR1Y2UgdGhlIHJpc2sgb2ZcbjEwNzE6XHRcdCAqIHdyb25nbHkgZXhwYW5kaW5nIHRvIGEgZnV0dXJlIGFjayBzZXF1ZW5jZSBudW1iZXIsIHdoaWNoIGlzIHdheVxuMTA3MjpcdFx0ICogbW9yZSBkYW5nZXJvdXMgdGhhbiBtaXNzaW5nIGFuIGFja1xuMTA3MzpcdFx0ICovXG4xMDc0Olx0XHRvbGRfc25kX3VuYSA9IG1zay1cdTAwM2VzbmRfdW5hO1xuMTA3NTpcdFx0bmV3X3NuZF91bmEgPSBtcHRjcF9leHBhbmRfc2VxKG9sZF9zbmRfdW5hLCBtcF9vcHQtXHUwMDNlZGF0YV9hY2ssIG1wX29wdC1cdTAwM2VhY2s2NCk7XG4xMDc2Olx0XG4xMDc3Olx0XHQvKiBBQ0sgZm9yIGRhdGEgbm90IGV2ZW4gc2VudCB5ZXQ/IElnbm9yZS4qL1xuMTA3ODpcdFx0aWYgKHVubGlrZWx5KGFmdGVyNjQobmV3X3NuZF91bmEsIHNuZF9ueHQpKSlcbjEwNzk6XHRcdFx0bmV3X3NuZF91bmEgPSBvbGRfc25kX3VuYTtcbjEwODA6XHRcbjEwODE6XHRcdG5ld193bmRfZW5kID0gbmV3X3NuZF91bmEgJiM0MzsgdGNwX3NrKHNzayktXHUwMDNlc25kX3duZDtcbjEwODI6XHRcbjEwODM6XHRcdGlmIChhZnRlcjY0KG5ld193bmRfZW5kLCBtc2stXHUwMDNld25kX2VuZCkpXG4xMDg0Olx0XHRcdFdSSVRFX09OQ0UobXNrLVx1MDAzZXduZF9lbmQsIG5ld193bmRfZW5kKTtcbjEwODU6XHRcbjEwODY6XHRcdC8qIHRoaXMgYXNzdW1lcyBtcHRjcF9pbmNvbWluZ19vcHRpb25zKCkgaXMgaW52b2tlZCBhZnRlciB0Y3BfYWNrKCkgKi9cbjEwODc6XHRcdGlmIChhZnRlcjY0KG1zay1cdTAwM2V3bmRfZW5kLCBzbmRfbnh0KSlcbjEwODg6XHRcdFx0X19tcHRjcF9jaGVja19wdXNoKHNrLCBzc2spO1xuMTA4OTpcdFxuMTA5MDpcdFx0aWYgKGFmdGVyNjQobmV3X3NuZF91bmEsIG9sZF9zbmRfdW5hKSkge1xuMTA5MTpcdFx0XHRfX21wdGNwX3NuZF91bmFfdXBkYXRlKG1zaywgbmV3X3NuZF91bmEpO1xuMTA5MjpcdFx0XHRfX21wdGNwX2RhdGFfYWNrZWQoc2spO1xuMTA5MzpcdFx0fVxuMTA5NDpcdFx0bXNrLVx1MDAzZWxhc3RfYWNrX3JlY3YgPSB0Y3BfamlmZmllczMyO1xuMTA5NTpcdFx0bXB0Y3BfZGF0YV91bmxvY2soc2spO1xuMTA5NjpcdFxuMTA5NzpcdFx0dHJhY2VfYWNrX3VwZGF0ZV9tc2sobXBfb3B0LVx1MDAzZWRhdGFfYWNrLFxuMTA5ODpcdFx0XHRcdCAgICAgb2xkX3NuZF91bmEsIG5ld19zbmRfdW5hLFxuMTA5OTpcdFx0XHRcdCAgICAgbmV3X3duZF9lbmQsIFJFQURfT05DRShtc2stXHUwMDNld25kX2VuZCkpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNTUwOAoJCQkJCQkJb3V0cHV0OiA0NjUKCQkJCQkJCXRob3VnaHRzOiAzODgxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlVuaW5pdGlhbGl6ZWQgTWVtb3J5IFZ1bG5lcmFiaWxpdHkgaW4gTVBUQ1AgRFNTIE9wdGlvbiBQYXJzaW5nKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gZGlzc2VjdGluZyB0aGlzIGNvZGUsIGFuZCBpdCYjMzk7cyBsb29raW5nIGxpa2Ugd2UgaGF2ZSBhIGNsYXNzaWMgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUuICBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRoYXQgaWYgYSBwYWNrZXQgY29udGFpbnMgbXVsdGlwbGUgTVBUQ1AgRFNTIG9wdGlvbnMsIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyBtYWxmb3JtZWQsIHdlIGNhbiBlbmQgdXAgcmVhZGluZyB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gIAoKSGVyZSYjMzk7cyB0aGUgZ2lzdDogYGFja191cGRhdGVfbXNrYCByZWFkcyBgbXBfb3B0LSZndDtkYXRhX2Fja2AgdG8gdXBkYXRlIGBtc2stJmd0O3NuZF91bmFgLiAgSWYgYG1wX29wdC0mZ3Q7ZGF0YV9hY2tgIGlzbiYjMzk7dCBpbml0aWFsaXplZCwgd2UgY2FuIGFja25vd2xlZGdlIGludmFsaWQgZGF0YSwgb3IgZXZlbiB3b3JzZSwgdXNlIGEgY29tcGxldGVseSByYW5kb20gdmFsdWUuICBUaGUgcHJvYmxlbSBhcmlzZXMgaW4gaG93IHdlIHBhcnNlIE1QVENQIG9wdGlvbnMuICBgbXB0Y3BfZ2V0X29wdGlvbnNgIGl0ZXJhdGVzIHRocm91Z2ggdGhlIG9wdGlvbnMsIGFuZCBzZXRzIGZsYWdzIG9uIGEgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdGAgc3RydWN0dXJlIHRoYXQgbGl2ZXMgb24gdGhlICpzdGFjayouICBDcnVjaWFsbHksIG5vdCBhbGwgZmllbGRzIG9mIHRoaXMgc3RydWN0IGFyZSBpbml0aWFsaXplZCB0byB6ZXJvOyBvbmx5IHRoZSBgc3RhdHVzYCBmaWVsZCBpcyBleHBsaWNpdGx5IGNsZWFyZWQuCgpMZXQmIzM5O3MgbG9vayBhdCBhIHNjZW5hcmlvIHdpdGggdHdvIERTUyBvcHRpb25zOiB0aGUgZmlyc3QgaXMgJiMzNDtnb29kJiMzNDssIGJ1dCB0aGUgc2Vjb25kIGlzIG1hbGZvcm1lZCAoZS5nLiwgYSB3cm9uZyBzaXplKS4gVGhlIGZpcnN0IERTUyB3aWxsIGNvcnJlY3RseSBzZXQgYE9QVElPTl9NUFRDUF9EU1NgIGFuZCBtaWdodCBzZXQgYHVzZV9hY2sgPSAwYC4gVGhlIHNlY29uZCwgbWFsZm9ybWVkIERTUyBtaWdodCBzZXQgYHVzZV9hY2sgPSAxYCBvciBvdGhlciBmbGFnLCBidXQgYnJlYWsgZWFybHksIHdpdGhvdXQgZXZlciBpbml0aWFsaXppbmcgYG1wX29wdC0mZ3Q7ZGF0YV9hY2tgLiAgYG1wdGNwX2luY29taW5nX29wdGlvbnNgICpzdGlsbCogc2VlcyBgT1BUSU9OX01QVENQX0RTU2Agc2V0IGJ5IHRoZSBmaXJzdCBEU1Mgb3B0aW9uLCBzbyB0aGUgZnVuY3Rpb24gdGhlbiBnb2VzIHRvIHVzZSB0aGUgcG90ZW50aWFsbHkgbW9kaWZpZWQgYml0ZmllbGRzLCBidXQgdGhlc2UgYml0ZmllbGRzIG1heSBpbnN0cnVjdCB0aGUgZnVuY3Rpb24gdG8gcmVhZCBmcm9tIHRoZSB1bmluaXRpYWxpemVkIGBtcF9vcHQtJmd0O2RhdGFfYWNrYCBmaWVsZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhbHVlIGlzIHRoZW4gdXNlZCBpbiBhIGNyaXRpY2FsIHVwZGF0ZTogaXQmIzM5O3MgdXNlZCB0byBtb2RpZnkgYG1zay0mZ3Q7c25kX3VuYWAgd2hpY2ggbGVhZHMgdG8gaW5jb3JyZWN0IGFja25vd2xlZGdlbWVudCBvZiBkYXRhLiBUaGlzIGlzIHdoZXJlIHRoaXMgZ29lcyBmcm9tIGJhZCB0byByZWFsbHkgYmFkIQoKTm93LCBkb2VzIHRoaXMgbGVhayB0byB1c2VyIHNwYWNlPyBObywgaXQmIzM5O3MgYW4gaW50ZXJuYWwgc3RhdGUgbWFjaGluZSBpc3N1ZS4gQnV0LCBpcyBpdCBjYXVnaHQgYnkgS0FTQU4/IE5vLCB0aGF0IGlzIG5vdCBLQVNBTiYjMzk7cyBqb2IuIEJ1dCBLTVNBTiBkb2VzISAgS01TQU4gc3BlY2lmaWNhbGx5IGNhdGNoZXMgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMhIElmIGBtcF9vcHQtJmd0O2RhdGFfYWNrYCBpcyB1bmluaXRpYWxpemVkLCBLTVNBTiB3aWxsIHRyaWdnZXIgYSB3YXJuaW5nLgoKTG9va2luZyBtb3JlIGNsb3NlbHkgYXQgdGhlIGNvZGUsIGl0IHR1cm5zIG91dCB0aGF0IGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHQ7YCBpcyBkZWNsYXJlZCBvbiB0aGUgc3RhY2sgaW4gc2V2ZXJhbCBrZXkgZnVuY3Rpb25zIGxpa2UgYG1wdGNwX2luY29taW5nX29wdGlvbnNgLCBgc3ViZmxvd19jaGVja19yZXFgLCBgbXB0Y3Bfc3ViZmxvd19pbml0X2Nvb2tpZV9yZXFgLCBldGMuIEluIGFsbCB0aGVzZSBjYXNlcywgYG1wX29wdGAgaXMgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkuICBTbyBpdCYjMzk7cyBub3QganVzdCBhIHNpbmdsZSBjb2RlIHBhdGguCgpUaGUgcGF0Y2gmIzM5O3MgZml4IGludm9sdmVzIHJlc3RyaWN0aW5nIHdoZW4gYE1QVENQT1BUX0RTU2AgY2FuIGJlIHBhcnNlZC4gSWYgaXQgZGV0ZWN0cyBhIERTUyBvcHRpb24gYWZ0ZXIgb3RoZXIgc3BlY2lmaWMgb3B0aW9ucywgaXQgYWJvcnRzIHBhcnNpbmcgaW1tZWRpYXRlbHkuICBUaGlzIHByZXZlbnRzIHRoZSBjb3JydXB0ZWQgYml0ZmllbGRzLiBUaGVyZWZvcmUsIHRoZSBwYXRjaCB3aWxsIGZpeCBhIGJ1ZyB3aGVyZSBhbiBpbnZhbGlkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBjb3VsZCBjb3JydXB0IGZsYWdzIHdpdGhvdXQgcG9wdWxhdGluZyBkYXRhIGZpZWxkcywgcmVzdWx0aW5nIGluIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWFkcy4KClNvLCBpbiBzdW1tYXJ5LCB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSB1c2VkIGluIGEgY3JpdGljYWwgVENQIHN0YXRlIG1hY2hpbmUsIHdoaWNoIGNvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IGFja25vd2xlZGdlbWVudHMsIGRhdGEgY29ycnVwdGlvbiwgb3IgY29ubmVjdGlvbiBkcm9wcy4gVGhpcyBpcyB0ZXh0Ym9vayBLTVNBTiBtYXRlcmlhbCwgc28gbGV0JiMzOTtzIGdldCBhIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBnb2luZyBBU0FQISBUaGUgcGF0Y2ggKnNob3VsZCogZml4IHRoaXMgYnkgcmVzdHJpY3RpbmcgdGhlIHBhcnNpbmcgb2YgRFNTIG9wdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlc3RyaWN0cyB0aGUgcGFyc2luZyBvZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGluIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb2Nlc3NlZCBpZiBjZXJ0YWluIG90aGVyIG9wdGlvbnMgKGluY2x1ZGluZyBhbm90aGVyIGBNUFRDUE9QVF9EU1NgKSBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQuXG5cbkJlZm9yZSB0aGlzIHBhdGNoLCBpZiBhIFRDUCBwYWNrZXQgY29udGFpbmVkIG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMsIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgdnVsbmVyYWJpbGl0eSBjb3VsZCBiZSB0cmlnZ2VyZWQuIFRoZSBgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgbXBfb3B0YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGZ1bmN0aW9ucyBsaWtlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zKClgLiBPbmx5IGl0cyBgc3RhdHVzYCBmaWVsZCAod2hpY2ggY29udGFpbnMgYml0ZmllbGRzIGxpa2UgYHVzZV9hY2tgIGFuZCBgdXNlX21hcGApIGlzIHplcm9lZCwgbGVhdmluZyBkYXRhIGZpZWxkcyBsaWtlIGBkYXRhX2Fja2AgYW5kIGBkYXRhX3NlcWAgdW5pbml0aWFsaXplZC5cblxuSWYgYSB2YWxpZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gd2FzIHBhcnNlZCBmaXJzdCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDBgKSwgaXQgd291bGQgc2V0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgIGJ1dCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQuIElmIGEgc2Vjb25kLCBtYWxmb3JtZWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGZvbGxvd2VkIChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMWAgYnV0IGFuIGludmFsaWQgYG9wc2l6ZWApLCBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYml0ZmllbGQgdG8gYHVzZV9hY2sgPSAxYCBidXQgYnJlYWsgZWFybHkgYmVmb3JlIHBvcHVsYXRpbmcgdGhlIGBkYXRhX2Fja2AgZmllbGQuXG5cblRoZSBjYWxsZXIgd291bGQgdGhlbiBzZWUgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIHNldCAoZnJvbSB0aGUgZmlyc3Qgb3B0aW9uKSBhbmQgcmVhZCB0aGUgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkgZnJvbSBgZGF0YV9hY2tgIChkdWUgdG8gdGhlIGNvcnJ1cHRlZCBgdXNlX2FjayA9IDFgIGJpdGZpZWxkIGZyb20gdGhlIHNlY29uZCBvcHRpb24pLiBUaGlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdvdWxkIHRoZW4gYmUgdXNlZCBpbiBjb250cm9sIGZsb3cgKGUuZy4sIHVwZGF0aW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIgYG1zay1cdTAwM2VzbmRfdW5hYCBpbiBgYWNrX3VwZGF0ZV9tc2soKWApIG9yIGNvcGllZCBpbnRvIHNrYiBleHRlbnNpb25zLlxuXG5TdGFuZGFyZCBLQVNBTiBkb2VzIG5vdCBkZXRlY3QgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBjYXRjaCB0aGlzIGV4YWN0IGNsYXNzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVzdHJpY3RzIHRoZSBwYXJzaW5nIG9mIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gaW4gYG1wdGNwX3BhcnNlX29wdGlvbigpYCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvY2Vzc2VkIGlmIGNlcnRhaW4gb3RoZXIgb3B0aW9ucyAoaW5jbHVkaW5nIGFub3RoZXIgYE1QVENQT1BUX0RTU2ApIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZC5cblxuQmVmb3JlIHRoaXMgcGF0Y2gsIGlmIGEgVENQIHBhY2tldCBjb250YWluZWQgbXVsdGlwbGUgYE1QVENQT1BUX0RTU2Agb3B0aW9ucywgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCB2dWxuZXJhYmlsaXR5IGNvdWxkIGJlIHRyaWdnZXJlZC4gVGhlIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHRgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gZnVuY3Rpb25zIGxpa2UgYG1wdGNwX2luY29taW5nX29wdGlvbnMoKWAuIE9ubHkgaXRzIGBzdGF0dXNgIGZpZWxkICh3aGljaCBjb250YWlucyBiaXRmaWVsZHMgbGlrZSBgdXNlX2Fja2AgYW5kIGB1c2VfbWFwYCkgaXMgemVyb2VkLCBsZWF2aW5nIGRhdGEgZmllbGRzIGxpa2UgYGRhdGFfYWNrYCBhbmQgYGRhdGFfc2VxYCB1bmluaXRpYWxpemVkLlxuXG5JZiBhIHZhbGlkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiB3YXMgcGFyc2VkIGZpcnN0IChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMGApLCBpdCB3b3VsZCBzZXQgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGluIGBtcF9vcHQuc3Vib3B0aW9uc2AgYnV0IGxlYXZlIGBkYXRhX2Fja2AgdW5pbml0aWFsaXplZC4gSWYgYSBzZWNvbmQsIG1hbGZvcm1lZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gZm9sbG93ZWQgKGUuZy4sIHdpdGggYHVzZV9hY2sgPSAxYCBidXQgYW4gaW52YWxpZCBgb3BzaXplYCksIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgd291bGQgb3ZlcndyaXRlIHRoZSBiaXRmaWVsZCB0byBgdXNlX2FjayA9IDFgIGJ1dCBicmVhayBlYXJseSBiZWZvcmUgcG9wdWxhdGluZyB0aGUgYGRhdGFfYWNrYCBmaWVsZC5cblxuVGhlIGNhbGxlciB3b3VsZCB0aGVuIHNlZSB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgc2V0IChmcm9tIHRoZSBmaXJzdCBvcHRpb24pIGFuZCByZWFkIHRoZSB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSBmcm9tIGBkYXRhX2Fja2AgKGR1ZSB0byB0aGUgY29ycnVwdGVkIGB1c2VfYWNrID0gMWAgYml0ZmllbGQgZnJvbSB0aGUgc2Vjb25kIG9wdGlvbikuIFRoaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgd291bGQgdGhlbiBiZSB1c2VkIGluIGNvbnRyb2wgZmxvdyAoZS5nLiwgdXBkYXRpbmcgdGhlIHNlcXVlbmNlIG51bWJlciBgbXNrLVx1MDAzZXNuZF91bmFgIGluIGBhY2tfdXBkYXRlX21zaygpYCkgb3IgY29waWVkIGludG8gc2tiIGV4dGVuc2lvbnMuXG5cblN0YW5kYXJkIEtBU0FOIGRvZXMgbm90IGRldGVjdCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGNhdGNoIHRoaXMgZXhhY3QgY2xhc3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjIzLjA5MDQzNTU2NloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3MDI2NTY2NTE2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNUFRDUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1wdGNwX2dldF9vcHRpb25zXCIsXG4gICAgXCJtcHRjcF9pbmNvbWluZ19vcHRpb25zXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXN0cmljdHMgdGhlIHBhcnNpbmcgb2YgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9jZXNzZWQgaWYgY2VydGFpbiBvdGhlciBvcHRpb25zIChpbmNsdWRpbmcgYW5vdGhlciBgTVBUQ1BPUFRfRFNTYCkgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkLlxcblxcbkJlZm9yZSB0aGlzIHBhdGNoLCBpZiBhIFRDUCBwYWNrZXQgY29udGFpbmVkIG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMsIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgdnVsbmVyYWJpbGl0eSBjb3VsZCBiZSB0cmlnZ2VyZWQuIFRoZSBgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgbXBfb3B0YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGZ1bmN0aW9ucyBsaWtlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zKClgLiBPbmx5IGl0cyBgc3RhdHVzYCBmaWVsZCAod2hpY2ggY29udGFpbnMgYml0ZmllbGRzIGxpa2UgYHVzZV9hY2tgIGFuZCBgdXNlX21hcGApIGlzIHplcm9lZCwgbGVhdmluZyBkYXRhIGZpZWxkcyBsaWtlIGBkYXRhX2Fja2AgYW5kIGBkYXRhX3NlcWAgdW5pbml0aWFsaXplZC5cXG5cXG5JZiBhIHZhbGlkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiB3YXMgcGFyc2VkIGZpcnN0IChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMGApLCBpdCB3b3VsZCBzZXQgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGluIGBtcF9vcHQuc3Vib3B0aW9uc2AgYnV0IGxlYXZlIGBkYXRhX2Fja2AgdW5pbml0aWFsaXplZC4gSWYgYSBzZWNvbmQsIG1hbGZvcm1lZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gZm9sbG93ZWQgKGUuZy4sIHdpdGggYHVzZV9hY2sgPSAxYCBidXQgYW4gaW52YWxpZCBgb3BzaXplYCksIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgd291bGQgb3ZlcndyaXRlIHRoZSBiaXRmaWVsZCB0byBgdXNlX2FjayA9IDFgIGJ1dCBicmVhayBlYXJseSBiZWZvcmUgcG9wdWxhdGluZyB0aGUgYGRhdGFfYWNrYCBmaWVsZC5cXG5cXG5UaGUgY2FsbGVyIHdvdWxkIHRoZW4gc2VlIHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBzZXQgKGZyb20gdGhlIGZpcnN0IG9wdGlvbikgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5IGZyb20gYGRhdGFfYWNrYCAoZHVlIHRvIHRoZSBjb3JydXB0ZWQgYHVzZV9hY2sgPSAxYCBiaXRmaWVsZCBmcm9tIHRoZSBzZWNvbmQgb3B0aW9uKS4gVGhpcyB1bmluaXRpYWxpemVkIG1lbW9yeSB3b3VsZCB0aGVuIGJlIHVzZWQgaW4gY29udHJvbCBmbG93IChlLmcuLCB1cGRhdGluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIGBtc2stXFx1MDAzZXNuZF91bmFgIGluIGBhY2tfdXBkYXRlX21zaygpYCkgb3IgY29waWVkIGludG8gc2tiIGV4dGVuc2lvbnMuXFxuXFxuU3RhbmRhcmQgS0FTQU4gZG9lcyBub3QgZGV0ZWN0IHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5LiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyBleGFjdCBjbGFzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiB0cnVlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgcGFyc2luZyBvZiBNUFRDUCBvcHRpb25zLCBzcGVjaWZpY2FsbHkgcmVzdHJpY3RpbmcgdGhlIGNvbWJpbmF0aW9ucyBvZiBEU1Mgb3B0aW9ucyB3aXRoIG90aGVyIG9wdGlvbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBNUFRDUCBvcHRpb24gcGFyc2luZyBsb2dpYy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6MjMuMDkwNDQwNjc2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MTk4NDM5NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA1NTdmYjZlOTU4YjI1N2Q4Mjg1ZDI1OTQ3Y2MyNWVjNWE1NTIwMzY2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gQXVnIDEwIDEyOjQxOjIyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL25ldC9tcHRjcC9vcHRpb25zLmMgYi9uZXQvbXB0Y3Avb3B0aW9ucy5jXFxuaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDRcXG4tLS0gYS9uZXQvbXB0Y3Avb3B0aW9ucy5jXFxuKysrIGIvbmV0L21wdGNwL29wdGlvbnMuY1xcbkBAIC0xNTMsNiArMTUzLDEzIEBAIHN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiBcXHRcXHRicmVhaztcXG4gXFxuIFxcdGNhc2UgTVBUQ1BPUFRfRFNTOlxcbitcXHRcXHQvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqL1xcbitcXHRcXHRpZiAoKG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyBcXHUwMDI2IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcbiBcXHRcXHRwcl9kZWJ1ZyhcXFwiRFNTXFxcXG5cXFwiKTtcXG4gXFx0XFx0cHRyKys7XFxuIFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MToyMy41MTE1Nzk1OTJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo0MDA3OTA0Nzc4MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNUFRDUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1wdGNwX2dldF9vcHRpb25zXCIsXG4gICAgXCJtcHRjcF9pbmNvbWluZ19vcHRpb25zXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHBhcnNpbmcgb2YgTVBUQ1Agb3B0aW9ucywgc3BlY2lmaWNhbGx5IHJlc3RyaWN0aW5nIHRoZSBjb21iaW5hdGlvbnMgb2YgRFNTIG9wdGlvbnMgd2l0aCBvdGhlciBvcHRpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgTVBUQ1Agb3B0aW9uIHBhcnNpbmcgbG9naWMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDU1N2ZiNmU5NThiMjU3ZDgyODVkMjU5NDdjYzI1ZWM1YTU1MjAzNjZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAxMCAxMjo0MToyMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9tcHRjcC9vcHRpb25zLmMgYi9uZXQvbXB0Y3Avb3B0aW9ucy5jXG5pbmRleCBjNjY0MDIzZDM3YmE4Li43ZWMxOGZhMWJlZjYzIDEwMDY0NFxuLS0tIGEvbmV0L21wdGNwL29wdGlvbnMuY1xuKysrIGIvbmV0L21wdGNwL29wdGlvbnMuY1xuQEAgLTE1Myw2ICsxNTMsMTMgQEAgc3RhdGljIHZvaWQgbXB0Y3BfcGFyc2Vfb3B0aW9uKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG4gXHRcdGJyZWFrO1xuIFxuIFx0Y2FzZSBNUFRDUE9QVF9EU1M6XG4rXHRcdC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG4rXHRcdGlmICgobXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHxcbitcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcbitcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcbitcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMClcbitcdFx0XHRicmVhaztcbitcbiBcdFx0cHJfZGVidWcoXCJEU1NcXG5cIik7XG4gXHRcdHB0cisrO1xuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6MjMuNTExNTgxMzgyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDUzMzE5MTU3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1QVENQIERTUyBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgdHdlYWtzIGBuZXQvbXB0Y3Avb3B0aW9ucy5jYC4gU3BlY2lmaWNhbGx5LCBpdCBzZWVtcyB0byBiZSBhZGRpbmcgYSBjaGVjayB3aXRoaW4gYG1wdGNwX3BhcnNlX29wdGlvbmAgZm9yIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24uIFRoYXQncyBnb29kLCB3ZSBuZWVkIHRvIGhhbmRsZSBEU1MgcHJvcGVybHkuIE5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBjb25kaXRpb24gaXQncyBpbnRyb2R1Y2luZy4gSXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggaXMgZGVzaWduZWQgdG8gYmUgdmVyeSBzdHJpY3Q6IGlmIHRoZSBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgIGZpZWxkLCB3aGljaCBjb250YWlucyB0aGUgc3ViLW9wdGlvbnMgKndpdGhpbiogdGhlIERTUyBvcHRpb24sIGNvbnRhaW5zIGFueXRoaW5nICpvdGhlciB0aGFuKiBgQUREX0FERFJgLCBgUk1fQUREUmAsIGBQUklPYCwgb3IgYEZBSUxgLCB0aGUgRFNTIG9wdGlvbiBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLCBhcyB0aGUgY29kZSBicmVha3Mgb3V0IG9mIHBhcnNpbmcuXG5cbkVzc2VudGlhbGx5LCB0aGUgbG9naWMgc2VlbXMgdG8gYmUgc2F5aW5nLCBcIklmIHlvdSdyZSB1c2luZyBEU1MsIHlvdSAqbXVzdCogdXNlIG9ubHkgdGhlc2Ugc3BlY2lmaWMgc3ViLW9wdGlvbnMsIGFuZCBub3RoaW5nIGVsc2UuXCIgSSBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB3aHkgdGhpcyByZXN0cmljdGlvbiBpcyBiZWluZyBpbXBvc2VkLiBJcyB0aGlzIGEgZGVsaWJlcmF0ZSBkZXNpZ24gY2hvaWNlIHJlbGF0ZWQgdG8gc2VjdXJpdHksIGNvbXBhdGliaWxpdHksIG9yIHNvbWUgb3RoZXIgaW50ZXJuYWwgcmVxdWlyZW1lbnQ/IE9yIGlzIHRoaXMgYSBwb3RlbnRpYWwgYnVnIHRoYXQgd2lsbCBjYXVzZSBpc3N1ZXMgd2l0aCBtb3JlIGFkdmFuY2VkIG9yIGZ1dHVyZSBEU1MgZXh0ZW5zaW9ucz8gSSdtIGdvaW5nIHRvIG5lZWQgdG8gcmV2aWV3IHRoZSBjb250ZXh0IGFuZCB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIGFkZGVkIGNoZWNrIHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgaW1wbGljYXRpb25zLiBMZXQgbWUgZ28gYmFjayB0byBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBhbmQgc2VlIHdoYXQncyBhY3R1YWxseSBoYXBwZW5pbmcgYXJvdW5kIHRoaXMgY29kZSBzbmlwcGV0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDIwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAyLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6MjguMDQ0Nzc2MzUxWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1ODE5MzM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1wdGNwX3BhcnNlX29wdGlvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmM9MTg9c3RhdGljIGJvb2wgbXB0Y3BfY2FwX2ZsYWdfc2hhMjU2KHU4IGZsYWdzKVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYy0yMi1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjIzOnN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMjQtXFx0XFx0XFx0ICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IG9wc2l6ZSxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmM9MzY2PXZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAwLVxcdFxcdFxcdGlmIChvcGNvZGUgPT0gVENQT1BUX01QVENQKVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6NDAxOlxcdFxcdFxcdFxcdG1wdGNwX3BhcnNlX29wdGlvbihza2IsIHB0ciwgb3BzaXplLCBtcF9vcHQpO1xcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAyLVxcdFxcdFxcdHB0ciArPSBvcHNpemUgLSAyO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MToyOC4wOTA2MDMwNzZaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzM4MTY5OTkzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBwcmVzZW50ZWQgYXMgaWYgaXQncyBteSBvd24uXG5cbioqQW5hbHl6aW5nIHRoZSBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBGdW5jdGlvbioqXG5cblJpZ2h0LCBzbyBJJ20gbG9va2luZyBhdCBgbXB0Y3BfcGFyc2Vfb3B0aW9uYC4gSXQncyBjbGVhcmx5IGEgY3JpdGljYWwgcGFydCBvZiB0aGUgTVBUQ1Agb3B0aW9uIHByb2Nlc3NpbmcsIGFzIGl0J3MgZGlyZWN0bHkgY2FsbGVkIGJ5IGBtcHRjcF9nZXRfb3B0aW9uc2AuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBhY2Nlc3NpYmlsaXR5IG9mIGBtcHRjcF9nZXRfb3B0aW9uc2AuIElzIHRoaXMgc29tZXRoaW5nIHRoYXQncyBleHBvcnRlZCwgYWNjZXNzaWJsZSBmcm9tIG90aGVyIG1vZHVsZXMsIG9yIGlzIGl0IGEgbG9jYWwsIGludGVybmFsIGZ1bmN0aW9uPyBUaGF0IGRpc3RpbmN0aW9uIG1hdHRlcnMgYmVjYXVzZSBpdCB0ZWxscyBtZSBob3cgd2lkZWx5IHRoaXMgZnVuY3Rpb25hbGl0eSBpcyB1c2VkIGFuZCBpZiBpdCBpcyBhbiBhcmVhIHRoYXQgY291bGQgaW50cm9kdWNlIGV4dGVybmFsIGRlcGVuZGVuY2llcywgaWYgdGhlcmUgaXMgYW4gaXNzdWUuIExldCdzIGRpZyBkZWVwZXIgYW5kIHNlZSBpZiB0aGF0J3Mgc3RhdGljIG9yIGV4cG9ydGVkLCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjcwMSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjMxLjQyODc3NTI0OVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Nzc2NDA0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtcHRjcF9nZXRfb3B0aW9uc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbXB0Y3AvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmM9MjM9c3RhdGljIHZvaWQgbXB0Y3BfcGFyc2Vfb3B0aW9uKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTM2NS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjM2Njp2b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L21wdGNwL29wdGlvbnMuYy0zNjctXFx0XFx0ICAgICAgIHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTExNDA9Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2Ni1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNjc6XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNjgtXFxuLS1cXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaD05MTg9c3RydWN0IHNvY2sgKm1wdGNwX3NrX2Nsb25lX2luaXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxcbi0tXFxubmV0L21wdGNwL3Byb3RvY29sLmgtOTIxLVxcdFxcdFxcdFxcdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpO1xcbm5ldC9tcHRjcC9wcm90b2NvbC5oOjkyMjp2b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L21wdGNwL3Byb3RvY29sLmgtOTIzLVxcdFxcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KTtcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9MTQ3PXN0YXRpYyBpbnQgc3ViZmxvd19jaGVja19yZXEoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLFxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy0xNjctXFxubmV0L21wdGNwL3N1YmZsb3cuYzoxNjg6XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTE2OS1cXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9MjY1PWludCBtcHRjcF9zdWJmbG93X2luaXRfY29va2llX3JlcShzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsXFxuLS1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTI3NS1cXHRzdWJmbG93X2luaXRfcmVxKHJlcSwgc2tfbGlzdGVuZXIpO1xcbm5ldC9tcHRjcC9zdWJmbG93LmM6Mjc2OlxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL3N1YmZsb3cuYy0yNzctXFxuLS1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jPTUyNj1zdGF0aWMgdm9pZCBzdWJmbG93X2ZpbmlzaF9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmMtNTQ0LVxcbm5ldC9tcHRjcC9zdWJmbG93LmM6NTQ1OlxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL3N1YmZsb3cuYy01NDYtXFx0aWYgKHN1YmZsb3ctXFx1MDAzZXJlcXVlc3RfbXB0Y3ApIHtcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9ODA2PXN0YXRpYyBzdHJ1Y3Qgc29jayAqc3ViZmxvd19zeW5fcmVjdl9zb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzayxcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmMtODQ2LVxcdFxcdCAqL1xcbm5ldC9tcHRjcC9zdWJmbG93LmM6ODQ3OlxcdFxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL3N1YmZsb3cuYy04NDgtXFx0XFx0aWYgKCEobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNlxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy04NTItXFx0fSBlbHNlIGlmIChzdWJmbG93X3JlcS1cXHUwMDNlbXBfam9pbikge1xcbm5ldC9tcHRjcC9zdWJmbG93LmM6ODUzOlxcdFxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL3N1YmZsb3cuYy04NTQtXFx0XFx0aWYgKCEobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfTVBKX0FDSykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjMxLjQ3NjU0ODE5NFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzMzcyOTY2NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZSwgd2l0aCBhICoqYm9sZGVkIGhlYWRlcioqOlxuXG4qKkFuYWx5emluZyBNUFRDUCBPcHRpb24gSGFuZGxpbmcgXHUwMDI2IENvbmZpZ3VyYXRpb24qKlxuXG5SaWdodCwgc28gYG1wdGNwX2dldF9vcHRpb25zYCBpcyB1bmRlbmlhYmx5IHRoZSBmdW5jdGlvbiBoYW5kbGluZyBpbmNvbWluZyBNUFRDUCBvcHRpb25zLiBUaGF0J3MgZ29vZCwgdGhhdCdzIHdoYXQgd2UgZXhwZWN0LiBUaGUgcGF0Y2ggaXRzZWxmIGlzIG1ha2luZyBjaGFuZ2VzIHRvIGhvdyB3ZSBwYXJzZSB0aG9zZSBNUFRDUCBvcHRpb25zLiBGdW5jdGlvbmFsbHksIHRoaXMgaXMgdGhlIGNydXggb2YgdGhlIG1vZGlmaWNhdGlvbi4gQmVmb3JlIEkgZGlnIHRvbyBkZWVwbHkgaW50byB0aGUgY29kZSBhbmQgdGhlIHBhdGNoIGl0c2VsZiwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzeXN0ZW0gdG8gZW5zdXJlIHRoZSBNUFRDUCBmdW5jdGlvbmFsaXR5IGlzIGFjdGl2ZSwgYW5kIGNvbmZpcm0gdGhlIHJlbGV2YW50IHNldHRpbmdzLiBUaGF0IHNlZW1zIGxpa2UgYSBsb2dpY2FsIGZpcnN0IHN0ZXAgYmVmb3JlIEkgZGl2ZSBpbnRvIHRoZSBuaXR0eS1ncml0dHkgb2YgdGhlIHBhcnNpbmcgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzg4NywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjM0LjgxMzg0ODA0N1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Njk1MjM0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgTVBUQ1BcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L21wdGNwL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L21wdGNwL0tjb25maWctMS1cXG5uZXQvbXB0Y3AvS2NvbmZpZzoyOmNvbmZpZyBNUFRDUFxcbm5ldC9tcHRjcC9LY29uZmlnLTMtXFx0Ym9vbCBcXFwiTVBUQ1A6IE11bHRpcGF0aCBUQ1BcXFwiXFxuLS1cXG5uZXQvbXB0Y3AvS2NvbmZpZz0xNj1jb25maWcgSU5FVF9NUFRDUF9ESUFHXFxuLS1cXG5uZXQvbXB0Y3AvS2NvbmZpZy0xOS1cXG5uZXQvbXB0Y3AvS2NvbmZpZzoyMDpjb25maWcgTVBUQ1BfSVBWNlxcbm5ldC9tcHRjcC9LY29uZmlnLTIxLVxcdGJvb2wgXFxcIk1QVENQOiBJUHY2IHN1cHBvcnQgZm9yIE11bHRpcGF0aCBUQ1BcXFwiXFxuLS1cXG5uZXQvbXB0Y3AvS2NvbmZpZy0yNC1cXG5uZXQvbXB0Y3AvS2NvbmZpZzoyNTpjb25maWcgTVBUQ1BfS1VOSVRfVEVTVFxcbm5ldC9tcHRjcC9LY29uZmlnLTI2LVxcdHRyaXN0YXRlIFxcXCJUaGlzIGJ1aWxkcyB0aGUgTVBUQ1AgS1VuaXQgdGVzdHNcXFwiIGlmICFLVU5JVF9BTExfVEVTVFNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6MzQuODYwODA0NjQyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzMwNDA0MzY3NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1QVENQIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHdlJ3JlIHdvcmtpbmcgd2l0aCBpcyBkZWZpbml0ZWx5IGBNUFRDUGAuIEdpdmVuIHRoYXQsIEkgbmVlZCB0byBwaW5wb2ludCB3aGVyZSB0aGUgaW50ZXJlc3RpbmcgbG9naWMgcmVzaWRlcy4gTXkgZ3V0IHRlbGxzIG1lIGVpdGhlciBgbXB0Y3BfZ2V0X29wdGlvbnNgIG9yIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBpcyB0aGUgZnVuY3Rpb24gdG8gZXhhbWluZS4gTGV0J3Mgc3RhcnQgd2l0aCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AuIFRoYXQgc2VlbXMgbGlrZSB0aGUgbG9naWNhbCBlbnRyeSBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhpcyBoYW5kbGVzIGluY29taW5nIHRyYWZmaWMsIGRvZXNuJ3QgaXQ/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjQzNDksIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTozOC4xNjQ4NTEwNjhaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1OTk5MDQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1wdGNwX2luY29taW5nX29wdGlvbnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L21wdGNwL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jPTEwNjA9c3RhdGljIHZvaWQgYWNrX3VwZGF0ZV9tc2soc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTA4NS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjEwODY6XFx0LyogdGhpcyBhc3N1bWVzIG1wdGNwX2luY29taW5nX29wdGlvbnMoKSBpcyBpbnZva2VkIGFmdGVyIHRjcF9hY2soKSAqL1xcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTA4Ny1cXHRpZiAoYWZ0ZXI2NChtc2stXFx1MDAzZXduZF9lbmQsIHNuZF9ueHQpKVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYz0xMTE5PXN0YXRpYyBib29sIGFkZF9hZGRyX2htYWNfdmFsaWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTEzOS0gKi9cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNDA6Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNDEte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTozOC4yMTA4NTcyMjRaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQwNjUyMjgyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuYWx5emluZyB0aGF0IHF1ZXN0aW9uOlxuXG4qKkFuYWx5emluZyB0aGUgQ2FsbCBTaXRlcyBvZiBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB3aGVyZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgaXMgYWN0dWFsbHkgdXNlZC4gVGhhdCBmdW5jdGlvbiBjYWxsIGlzIHByZXR0eSBjcml0aWNhbCBpbiB0aGUgTVBUQ1Agc3RhY2ssIHNvIHVuZGVyc3RhbmRpbmcgaXRzIGNhbGwgc2l0ZXMgaXMgZnVuZGFtZW50YWwgdG8gZmlndXJpbmcgb3V0IGhvdyBvcHRpb25zIGdldCBoYW5kbGVkIHdoZW4gYSBuZXcgTVBUQ1AgY29ubmVjdGlvbiBpcyBiZWluZyBzZXQgdXAuIFRoaXMgd2lsbCBoZWxwIHRvIGFuYWx5emUgbmV0d29yayBiZWhhdmlvdXIuIEknbGwgbmVlZCB0byBqdW1wIGludG8gdGhlIGNvZGUgYW5kIHN0YXJ0IHNlYXJjaGluZy4gUHJvYmFibHkgdXNpbmcgYGdyZXBgIG9yIGEgc2ltaWxhciB0b29sIHRvIGZpbmQgYWxsIGluc3RhbmNlcyBvZiB0aGF0IGZ1bmN0aW9uIG5hbWUuIEknbGwgbmVlZCB0byBiZSBtaW5kZnVsIG9mIHBvdGVudGlhbCBtYWNyb3Mgb3IgaW5kaXJlY3QgY2FsbHMgYXMgd2VsbC4gVGhlIGdvYWwgaXNuJ3QganVzdCBhIGxpdGVyYWwgc3RyaW5nIG1hdGNoOyBJIG5lZWQgdG8gdW5kZXJzdGFuZCAqaG93KiBpdCdzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBNUFRDUCBmcmFtZXdvcmsgdG8gdW5kZXJzdGFuZCBob3cgdGhlIG9wdGlvbnMgYXJlIHByb2Nlc3NlZC4gSSBuZWVkIHRvIG5vdGUgdGhlIGNvbnRleHQgYXJvdW5kIGVhY2ggY2FsbCAtIHRoZSBhcmd1bWVudHMgcGFzc2VkLCB3aGF0IG90aGVyIGZ1bmN0aW9ucyBpdCdzIGludGVyYWN0aW5nIHdpdGgsIGFuZCB3aGF0IHRoZSBvdmVyYWxsIG9iamVjdGl2ZSBvZiB0aGUgY29kZSBzZWdtZW50IGFwcGVhcnMgdG8gYmUuIEJhc2VkIG9uIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBJIGNhbiBnYWluIGEgc29saWQgbWVudGFsIG1vZGVsIG9mIHRoZSBvcHRpb24gbmVnb3RpYXRpb24gcHJvY2Vzcy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDc3OCwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjQxLjYxNzM4MjIwOVoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc2MDA3MTAxNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtcHRjcF9pbmNvbWluZ19vcHRpb25zXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL25ldC9tcHRjcC5oPTE1Nj1pbnQgbXB0Y3BfZXN0YWJsaXNoZWRfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5pbmNsdWRlL25ldC9tcHRjcC5oLTE1OC1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgbXB0Y3Bfb3V0X29wdGlvbnMgKm9wdHMpO1xcbmluY2x1ZGUvbmV0L21wdGNwLmg6MTU5OmJvb2wgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpO1xcbmluY2x1ZGUvbmV0L21wdGNwLmgtMTYwLVxcbi0tXFxuaW5jbHVkZS9uZXQvbXB0Y3AuaD0yNjY9c3RhdGljIGlubGluZSBib29sIG1wdGNwX3N5bmFja19vcHRpb25zKGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcXG4tLVxcbmluY2x1ZGUvbmV0L21wdGNwLmgtMjcyLVxcbmluY2x1ZGUvbmV0L21wdGNwLmg6MjczOnN0YXRpYyBpbmxpbmUgYm9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzayxcXG5pbmNsdWRlL25ldC9tcHRjcC5oLTI3NC1cXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvaXB2NC90Y3BfaW5wdXQuYz00ODg0PXZvaWQgdGNwX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTQ4OTAtXFx0LyogbXB0Y3AgY2FuJ3QgdGVsbCB1cyB0byBpZ25vcmUgcmVzZXQgcGt0cyxcXG5uZXQvaXB2NC90Y3BfaW5wdXQuYzo0ODkxOlxcdCAqIHNvIGp1c3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpLlxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTQ4OTItXFx0ICovXFxubmV0L2lwdjQvdGNwX2lucHV0LmMtNDg5My1cXHRpZiAoc2tfaXNfbXB0Y3Aoc2spKVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjQ4OTQ6XFx0XFx0bXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzaywgc2tiKTtcXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODk1LVxcbi0tXFxubmV0L2lwdjQvdGNwX2lucHV0LmM9NTYwNz1zdGF0aWMgdm9pZCB0Y3BfZGF0YV9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy01NjE2LVxcdCAqL1xcbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjU2MTc6XFx0aWYgKHNrX2lzX21wdGNwKHNrKSBcXHUwMDI2XFx1MDAyNiAhbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzaywgc2tiKSkge1xcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTU2MTgtXFx0XFx0X19rZnJlZV9za2Ioc2tiKTtcXG4tLVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jPTcxNTI9dGNwX3Jjdl9zdGF0ZV9wcm9jZXNzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTczNzktXFx0XFx0XFx0ICovXFxubmV0L2lwdjQvdGNwX2lucHV0LmM6NzM4MDpcXHRcXHRcXHRpZiAoc2tfaXNfbXB0Y3Aoc2spIFxcdTAwMjZcXHUwMDI2ICFtcHRjcF9pbmNvbWluZ19vcHRpb25zKHNrLCBza2IpKVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTczODEtXFx0XFx0XFx0XFx0Z290byBkaXNjYXJkO1xcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYz0xMDYwPXN0YXRpYyB2b2lkIGFja191cGRhdGVfbXNrKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTEwODUtXFxubmV0L21wdGNwL29wdGlvbnMuYzoxMDg2OlxcdC8qIHRoaXMgYXNzdW1lcyBtcHRjcF9pbmNvbWluZ19vcHRpb25zKCkgaXMgaW52b2tlZCBhZnRlciB0Y3BfYWNrKCkgKi9cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTEwODctXFx0aWYgKGFmdGVyNjQobXNrLVxcdTAwM2V3bmRfZW5kLCBzbmRfbnh0KSlcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmM9MTExOT1zdGF0aWMgYm9vbCBhZGRfYWRkcl9obWFjX3ZhbGlkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExMzktICovXFxubmV0L21wdGNwL29wdGlvbnMuYzoxMTQwOmJvb2wgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXFxubmV0L21wdGNwL29wdGlvbnMuYy0xMTQxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6NDMuMzc3NDU5MDM2WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxMzI5MDY1NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gbG9va2luZyBpbnRvIHRoaXMgTVBUQ1AgY2hhbmdlLCBhbmQgbXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGFuZCBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFyZSB0aGUga2V5IGZ1bmN0aW9ucyB0byBmb2N1cyBvbi4gU2luY2UgdGhlIGFjdHVhbCBtb2RpZmljYXRpb24gaXMgd2l0aGluIGBtcHRjcF9wYXJzZV9vcHRpb25gLCB3aGljaCBpcyB1bmZvcnR1bmF0ZWx5IHN0YXRpYywgdGhlIGJlc3QgZW50cnkgcG9pbnQgdG8gdW5kZXJzdGFuZCB0aGUgd2lkZXIgaW1wbGljYXRpb25zIHdpbGwgYmUgYG1wdGNwX2dldF9vcHRpb25zYCwgYXMgaXQncyB0aGUgY2xvc2VzdCBub24tc3RhdGljIGZ1bmN0aW9uLlxuXG5GaXJzdCwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgdGhhdCBtaWdodCBpbXBhY3QgdGhpcyBiZWhhdmlvdXIuIFdlIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUgTVBUQ1AgaXMgZW5hYmxlZCwgb2J2aW91c2x5LlxuXG5Ob3csIGl0IHNlZW1zIGxpa2UgdGhpcyBjaGFuZ2Ugc3BlY2lmaWNhbGx5IHJlc3RyaWN0cyB0aGUgYmVoYXZpb3VyIG9mIERTUyBvcHRpb25zIHdoZW4gY29tYmluZWQgd2l0aCBvdGhlciBNUFRDUCBvcHRpb25zLiBUaGVyZWZvcmUsIGl0IGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UuXG5cbkxldCBtZSBjaXJjbGUgYmFjayBhbmQgbWV0aWN1bG91c2x5IHJldmlldyBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFuZCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgaW4gbW9yZSBkZXRhaWwsIG5vdyB0aGF0IEkgaGF2ZSBhIGJldHRlciBpZGVhIG9mIHRoZSBjb250ZXh0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MDA1LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjQ3LjUxMDM2Nzg5OFoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDcwOTU3OTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibXB0Y3BfZ2V0X29wdGlvbnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jPTIzPXN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYy0zNjUtXFxubmV0L21wdGNwL29wdGlvbnMuYzozNjY6dm9pZCBtcHRjcF9nZXRfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY3LVxcdFxcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYz0xMTQwPWJvb2wgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNjYtXFxubmV0L21wdGNwL29wdGlvbnMuYzoxMTY3OlxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL29wdGlvbnMuYy0xMTY4LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTo0Ny41NTc0OTA4OTNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI0MTMwMTQzMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgTVBUQ1AgT3B0aW9uIEhhbmRsaW5nKipcblxuT2theSwgc28gYG1wdGNwX2dldF9vcHRpb25zYCBpcyBpbmRlZWQgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRob3NlIG9wdGlvbnMsIGFuZCBpbXBvcnRhbnRseSwgaXQncyAqbm90KiBzdGF0aWMsIG1ha2luZyBpdCBhY2Nlc3NpYmxlIGFzIEkgc3VzcGVjdGVkLiBUaGF0J3MgYSBrZXkgcGllY2Ugb2YgdGhlIHB1enpsZS4gSSdsbCBtYWtlIHN1cmUgdG8ga2VlcCBib3RoIGBtcHRjcF9nZXRfb3B0aW9uc2AgYW5kIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBpbiBzaGFycCBmb2N1cyBoZXJlLCB0aGV5J3JlIHRoZSBjb3JlIHN5bWJvbHMgSSBuZWVkIHRvIHVuZGVyc3RhbmQuIEdpdmVuIHRoZSBjb250ZXh0LCBteSBjb25maWcgaXMsIG5hdHVyYWxseSwgYE1QVENQYC5cblxuTm93LCBsZXQncyBzdGVwIGJhY2sgZm9yIGEgbW9tZW50LiBCZWZvcmUgZGl2aW5nIGRlZXBlciBpbnRvIHRoZSBzcGVjaWZpY3Mgb2Ygb3B0aW9uIHBhcnNpbmcsIEkgd2FudCB0byBjb25maXJtIC0gYXJlIHRoZXJlIGFueSBjcml0aWNhbCBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgYW55IGxvdy1sZXZlbCBmdW5jdGlvbnMgb3IgZXh0ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYE1QVENQYCByZWxpZXMgdXBvbj8gSSBuZWVkIHRvIGJ1aWxkIGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgYXJjaGl0ZWN0dXJhbCBsYW5kc2NhcGUgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgZGV0YWlsZWQgYW5hbHlzaXMgb2YgdGhlIHBhcnNpbmcgbG9naWMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY2MTcsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTo1MS43OTg3OTUwODRaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Mjk0MzA2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBNUFRDUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbXB0Y3AvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbXB0Y3AvS2NvbmZpZy0xLVxcbm5ldC9tcHRjcC9LY29uZmlnOjI6Y29uZmlnIE1QVENQXFxubmV0L21wdGNwL0tjb25maWctMy1cXHRib29sIFxcXCJNUFRDUDogTXVsdGlwYXRoIFRDUFxcXCJcXG4tLVxcbm5ldC9tcHRjcC9LY29uZmlnPTE2PWNvbmZpZyBJTkVUX01QVENQX0RJQUdcXG4tLVxcbm5ldC9tcHRjcC9LY29uZmlnLTE5LVxcbm5ldC9tcHRjcC9LY29uZmlnOjIwOmNvbmZpZyBNUFRDUF9JUFY2XFxubmV0L21wdGNwL0tjb25maWctMjEtXFx0Ym9vbCBcXFwiTVBUQ1A6IElQdjYgc3VwcG9ydCBmb3IgTXVsdGlwYXRoIFRDUFxcXCJcXG4tLVxcbm5ldC9tcHRjcC9LY29uZmlnLTI0LVxcbm5ldC9tcHRjcC9LY29uZmlnOjI1OmNvbmZpZyBNUFRDUF9LVU5JVF9URVNUXFxubmV0L21wdGNwL0tjb25maWctMjYtXFx0dHJpc3RhdGUgXFxcIlRoaXMgYnVpbGRzIHRoZSBNUFRDUCBLVW5pdCB0ZXN0c1xcXCIgaWYgIUtVTklUX0FMTF9URVNUU1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTo1MS44NDQwOTQ5NFoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDM0MTYwNjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgTVBUQ1AgS2NvbmZpZyoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCBjcmFjayBvcGVuIHRoZSBgbmV0L21wdGNwL0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBNdWx0cGF0aCBUQ1AgY29uZmlndXJhdGlvbiBvcHRpb25zIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsLiBUaGlzIGNvbmZpZyBmaWxlIGlzIHRoZSBoZWFydCBvZiB0aGUgbWF0dGVyIHdoZW4gaXQgY29tZXMgdG8gZW5hYmxpbmcgYW5kIGN1c3RvbWl6aW5nIE1QVENQJ3MgYmVoYXZpb3IuIEknbSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gc2VlaW5nIHdoYXQgbGV2ZWwgb2YgY29udHJvbCBpdCBwcm92aWRlcyBvdmVyIGRpZmZlcmVudCBmZWF0dXJlcyDigJMgdGhpbmdzIGxpa2UgcGF0aCBtYW5hZ2VtZW50LCBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtcyAoYW5kIHRoZSBwb3RlbnRpYWwgdG8gYWRkIGN1c3RvbSBvbmVzKSwgc3ViZmxvdyBlc3RhYmxpc2htZW50LCBhbmQgaG93IGl0IGhhbmRsZXMgZGlmZmVyZW50IG5ldHdvcmsgZW52aXJvbm1lbnRzLiBJJ20gZXhwZWN0aW5nIHRvIHNlZSBhIHN0cnVjdHVyZWQgYnJlYWtkb3duIG9mIGRlcGVuZGVuY2llcyBhbmQgZGVmYXVsdCB2YWx1ZXMsIHdoaWNoIGhlbHBzIHVuZGVyc3RhbmQgaG93IHRoZSBkaWZmZXJlbnQgcGllY2VzIG9mIE1QVENQIGZpdCB0b2dldGhlci4gQXJlIHRoZXJlIGFueSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXM/IEFyZSBhbnkgZmVhdHVyZXMgZXhwZXJpbWVudGFsIGFuZCB0aHVzIGJlaGluZCBhIGNvbmZpZyBmbGFnPyBJJ20gaG9waW5nIGl0IGNsZWFybHkgbWFwcyBvdXQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgdmFyaW91cyBNUFRDUCBjb21wb25lbnRzIGFuZCB0aGVpciByZXNwZWN0aXZlIGNvbXBpbGUtdGltZSBzZXR0aW5ncy4gSXQncyB0aW1lIHRvIHNlZSB3aGF0IHRoaXMgS2NvbmZpZyBmaWxlIGhvbGRzIVxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTM2LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6NTcuODc4MjU3ODY1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY3MzAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9tcHRjcC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0XFxuICAgMjpcXHRjb25maWcgTVBUQ1BcXG4gICAzOlxcdFxcdGJvb2wgXFxcIk1QVENQOiBNdWx0aXBhdGggVENQXFxcIlxcbiAgIDQ6XFx0XFx0ZGVwZW5kcyBvbiBJTkVUXFxuICAgNTpcXHRcXHRzZWxlY3QgU0tCX0VYVEVOU0lPTlNcXG4gICA2OlxcdFxcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NlxcbiAgIDc6XFx0XFx0c2VsZWN0IENSWVBUT19MSUJfVVRJTFNcXG4gICA4OlxcdFxcdGhlbHBcXG4gICA5OlxcdFxcdCAgTXVsdGlwYXRoIFRDUCAoTVBUQ1ApIGNvbm5lY3Rpb25zIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBvdmVyIG11bHRpcGxlXFxuICAxMDpcXHRcXHQgIHN1YmZsb3dzIGluIG9yZGVyIHRvIHV0aWxpemUgbXVsdGlwbGUgbmV0d29yayBwYXRocy4gRWFjaCBzdWJmbG93XFxuICAxMTpcXHRcXHQgIHVzZXMgdGhlIFRDUCBwcm90b2NvbCwgYW5kIFRDUCBvcHRpb25zIGNhcnJ5IGhlYWRlciBpbmZvcm1hdGlvbiBmb3JcXG4gIDEyOlxcdFxcdCAgTVBUQ1AuXFxuICAxMzpcXHRcXG4gIDE0OlxcdGlmIE1QVENQXFxuICAxNTpcXHRcXG4gIDE2OlxcdGNvbmZpZyBJTkVUX01QVENQX0RJQUdcXG4gIDE3OlxcdFxcdGRlcGVuZHMgb24gSU5FVF9ESUFHXFxuICAxODpcXHRcXHRkZWZfdHJpc3RhdGUgSU5FVF9ESUFHXFxuICAxOTpcXHRcXG4gIDIwOlxcdGNvbmZpZyBNUFRDUF9JUFY2XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjU3Ljg3ODMyODEyNVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NjM2Mjg5OTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTVBUQ1AgQ29uZmlndXJhdGlvbiBDaGFuZ2UqKlxuXG5Pa2F5LCBzbyB0aGlzIG1vZGlmaWNhdGlvbiByZWFsbHkgaGluZ2VzIG9uIHRoZSBgSU5FVGAgc3RhbmRhcmQsIHdoaWNoIEkgYWxyZWFkeSB1bmRlcnN0YW5kLiBUaGUgY29yZSBvZiB0aGlzIHNlZW1zIHRvIGJlIGRyaXZlbiBieSBjaGFuZ2VzIHRvIGBNUFRDUGAgY29uZmlndXJhdGlvbiBvbmx5LiBJIGNhbiBpZ25vcmUgdGhlIG90aGVycyBmb3Igbm93LlxuXG5MZXQncyBkaWcgYSBiaXQgZGVlcGVyLiBJIHNlZSBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBpcyBzdGF0aWMsIHNvIHRoZSBjcml0aWNhbCBmdW5jdGlvbiBoZXJlIGlzIGBtcHRjcF9nZXRfb3B0aW9uc2AsIHdoaWNoIGNhbGxzIHRoZSBmb3JtZXIuIFRoZSByZWFsIG1lYXQgb2YgdGhlIGNoYW5nZSBpcyB3aXRoaW4gYG1wdGNwX3BhcnNlX29wdGlvbmAsIHdoaWNoIGlzIHVzZWQgYnkgYG1wdGNwX2dldF9vcHRpb25zYC5cblxuSXQgc2VlbXMgdGhpcyBwYXRjaCAqcmVzdHJpY3RzKiBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBNUFRDUCBvcHRpb25zLiBJbiBteSB2aWV3LCB0aGF0J3MgYSBjbGFzc2ljIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgZGlyZWN0bHkgaW1wYWN0cyBob3cgdGhlIG9wdGlvbnMgYXJlIHBhcnNlZCBhbmQgcHJvY2Vzc2VkLiBJdCdzIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nLlxuXG5HaXZlbiB0aGF0LCBJJ20gZ29pbmcgdG8gc2V0OlxuXG4qICAgYFdvcnRoRnV6emluZzogdHJ1ZWAgLSBiZWNhdXNlIHRoaXMgY2hhbmdlIGhhcyBkaXJlY3QgZnVuY3Rpb25hbCBpbXBsaWNhdGlvbnMuXG4qICAgYEZvY3VzU3ltYm9sczogW1wibXB0Y3BfZ2V0X29wdGlvbnNcIiwgXCJtcHRjcF9pbmNvbWluZ19vcHRpb25zXCJdYCAtIHNpbmNlIHRoZSBjaGFuZ2UgaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBwYXJzaW5nLCBJIHdhbnQgdG8ga2VlcCBhbiBleWUgb24gdGhlc2UgcGFyc2luZyBmdW5jdGlvbnMuXG4qICAgYEVuYWJsZUNvbmZpZ3M6IFtcIk1QVENQXCJdYCAtIHRvIGxpbWl0IG15IGZvY3VzIHRvIHRoZSBhZmZlY3RlZCBjb25maWd1cmF0aW9uLlxuKiAgIGBSZWFzb25pbmc6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBwYXJzaW5nIG9mIE1QVENQIG9wdGlvbnMsIHNwZWNpZmljYWxseSByZXN0cmljdGluZyB0aGUgY29tYmluYXRpb25zIG9mIERTUyBvcHRpb25zIHdpdGggb3RoZXIgb3B0aW9ucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIE1QVENQIG9wdGlvbiBwYXJzaW5nIGxvZ2ljLlwiYCAtIEkgbmVlZCB0byBqdXN0aWZ5IG15IGFwcHJvYWNoLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NjYwLCJPdXRwdXRUb2tlbnMiOjkxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjA2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MDMuNTE0NjIwMzFaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjAwNDEwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTVBUQ1BcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtcHRjcF9nZXRfb3B0aW9uc1wiLFxuICAgIFwibXB0Y3BfaW5jb21pbmdfb3B0aW9uc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBwYXJzaW5nIG9mIE1QVENQIG9wdGlvbnMsIHNwZWNpZmljYWxseSByZXN0cmljdGluZyB0aGUgY29tYmluYXRpb25zIG9mIERTUyBvcHRpb25zIHdpdGggb3RoZXIgb3B0aW9ucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIE1QVENQIG9wdGlvbiBwYXJzaW5nIGxvZ2ljLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1QVENQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibXB0Y3BfZ2V0X29wdGlvbnNcIixcbiAgICBcIm1wdGNwX2luY29taW5nX29wdGlvbnNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgcGFyc2luZyBvZiBNUFRDUCBvcHRpb25zLCBzcGVjaWZpY2FsbHkgcmVzdHJpY3RpbmcgdGhlIGNvbWJpbmF0aW9ucyBvZiBEU1Mgb3B0aW9ucyB3aXRoIG90aGVyIG9wdGlvbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBNUFRDUCBvcHRpb24gcGFyc2luZyBsb2dpYy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MDMuNTkwNjMxNTAyWiIsIlNlcSI6MjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjk3NjU0NTk0NzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MjowMy41OTExMzY0NzJaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MjI5NzY0OTQ4MTQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXN0cmljdHMgdGhlIHBhcnNpbmcgb2YgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9jZXNzZWQgaWYgY2VydGFpbiBvdGhlciBvcHRpb25zIChpbmNsdWRpbmcgYW5vdGhlciBgTVBUQ1BPUFRfRFNTYCkgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkLlxcblxcbkJlZm9yZSB0aGlzIHBhdGNoLCBpZiBhIFRDUCBwYWNrZXQgY29udGFpbmVkIG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMsIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgdnVsbmVyYWJpbGl0eSBjb3VsZCBiZSB0cmlnZ2VyZWQuIFRoZSBgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgbXBfb3B0YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGZ1bmN0aW9ucyBsaWtlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zKClgLiBPbmx5IGl0cyBgc3RhdHVzYCBmaWVsZCAod2hpY2ggY29udGFpbnMgYml0ZmllbGRzIGxpa2UgYHVzZV9hY2tgIGFuZCBgdXNlX21hcGApIGlzIHplcm9lZCwgbGVhdmluZyBkYXRhIGZpZWxkcyBsaWtlIGBkYXRhX2Fja2AgYW5kIGBkYXRhX3NlcWAgdW5pbml0aWFsaXplZC5cXG5cXG5JZiBhIHZhbGlkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiB3YXMgcGFyc2VkIGZpcnN0IChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMGApLCBpdCB3b3VsZCBzZXQgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGluIGBtcF9vcHQuc3Vib3B0aW9uc2AgYnV0IGxlYXZlIGBkYXRhX2Fja2AgdW5pbml0aWFsaXplZC4gSWYgYSBzZWNvbmQsIG1hbGZvcm1lZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gZm9sbG93ZWQgKGUuZy4sIHdpdGggYHVzZV9hY2sgPSAxYCBidXQgYW4gaW52YWxpZCBgb3BzaXplYCksIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgd291bGQgb3ZlcndyaXRlIHRoZSBiaXRmaWVsZCB0byBgdXNlX2FjayA9IDFgIGJ1dCBicmVhayBlYXJseSBiZWZvcmUgcG9wdWxhdGluZyB0aGUgYGRhdGFfYWNrYCBmaWVsZC5cXG5cXG5UaGUgY2FsbGVyIHdvdWxkIHRoZW4gc2VlIHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBzZXQgKGZyb20gdGhlIGZpcnN0IG9wdGlvbikgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5IGZyb20gYGRhdGFfYWNrYCAoZHVlIHRvIHRoZSBjb3JydXB0ZWQgYHVzZV9hY2sgPSAxYCBiaXRmaWVsZCBmcm9tIHRoZSBzZWNvbmQgb3B0aW9uKS4gVGhpcyB1bmluaXRpYWxpemVkIG1lbW9yeSB3b3VsZCB0aGVuIGJlIHVzZWQgaW4gY29udHJvbCBmbG93IChlLmcuLCB1cGRhdGluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIGBtc2stXFx1MDAzZXNuZF91bmFgIGluIGBhY2tfdXBkYXRlX21zaygpYCkgb3IgY29waWVkIGludG8gc2tiIGV4dGVuc2lvbnMuXFxuXFxuU3RhbmRhcmQgS0FTQU4gZG9lcyBub3QgZGV0ZWN0IHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5LiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyBleGFjdCBjbGFzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA1NTdmYjZlOTU4YjI1N2Q4Mjg1ZDI1OTQ3Y2MyNWVjNWE1NTIwMzY2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTAgMTI6NDE6MjIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvbXB0Y3Avb3B0aW9ucy5jIGIvbmV0L21wdGNwL29wdGlvbnMuY1xuaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDRcbi0tLSBhL25ldC9tcHRjcC9vcHRpb25zLmNcbisrKyBiL25ldC9tcHRjcC9vcHRpb25zLmNcbkBAIC0xNTMsNiArMTUzLDEzIEBAIHN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgTVBUQ1BPUFRfRFNTOlxuK1x0XHQvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqL1xuK1x0XHRpZiAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8XG4rXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8XG4rXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfUFJJTyB8XG4rXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApXG4rXHRcdFx0YnJlYWs7XG4rXG4gXHRcdHByX2RlYnVnKFwiRFNTXFxuXCIpO1xuIFx0XHRwdHIrKztcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjAzLjU5MTEzNzQyMloiLCJTZXEiOjIzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2NjQwNTY3ODg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFBhdGNoIFJlc3RyaWN0aW5nIERTUyBPcHRpb24gUGFyc2luZyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggaW4gYG5ldC9tcHRjcC9vcHRpb25zLmNgLiBJdCdzIHRvdWNoaW5nIHRoZSBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBmdW5jdGlvbiwgc3BlY2lmaWNhbGx5IGFkZGluZyBhIHJlc3RyaWN0aW9uIGZvciB0aGUgYE1QVENQT1BUX0RTU2AgY2FzZS4gVGhlIGFkZGVkIGNoZWNrIGlzIGZpbHRlcmluZyB3aGljaCBzdWJvcHRpb25zIGFyZSB2YWxpZCBhbG9uZ3NpZGUgRFNTLiBJdCBsb29rcyBsaWtlIGl04oCZcyBhbGxvd2luZyBEU1MgdG8gb25seSB3b3JrIHdpdGggdGhlIGBBRERfQUREUmAsIGBSTV9BRERSYCwgYFBSSU9gLCBhbmQgYEZBSUxgIHN1Ym9wdGlvbnMuIElmICphbnkqIG90aGVyIHN1Ym9wdGlvbiBpcyBzZXQsIHRoZSBzd2l0Y2gganVzdCBicmVha3MsIGFuZCBEU1MgcGFyc2luZyBpcyBza2lwcGVkLlxuXG5NeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgZG9lcyB0aGlzIGludHJvZHVjZSBhIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2U/IElmIHRoZSBEU1MgcGFyc2luZyBpcyBieXBhc3NlZCwgYXJlIHRoZXJlIGZpZWxkcyB3aXRoaW4gYG1wX29wdGAgdGhhdCBtaWdodCBub3QgZ2V0IHByb3Blcmx5IGluaXRpYWxpemVkPyBUaGF0J3MgYSBjbGFzc2ljIHNvdXJjZSBvZiBwcm9ibGVtcywgYW5kIHNvbWV0aGluZyBJIGFsd2F5cyBoYXZlIHRvIGJlIGNhcmVmdWwgYWJvdXQuXG5cblJpZ2h0LCBJIG5lZWQgdG8gcmVtaW5kIG15c2VsZiBob3cgdGhpcyB3aG9sZSB0aGluZyB3b3Jrcy4gYG1wdGNwX3BhcnNlX29wdGlvbmAgaXMgcGFyc2luZyBvcHRpb25zIGZyb20gYW4gYHNrYmAsIGFuZCBpdCB1c2VzIHRoZSBmdW5jdGlvbiB0byBwb3B1bGF0ZSB0aGUgYG1wX29wdGAgc3RydWN0dXJlLiBPa2F5LCBzbyBJIHNob3VsZCBiZSB0YWtpbmcgYSBjbG9zZXIgbG9vayBhdCBib3RoIGBtcHRjcF9wYXJzZV9vcHRpb25gIGFuZCB0aGUgYG1wX29wdGAgc3RydWN0dXJlIGRlZmluaXRpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBzdXBwb3NlZCB0byBiZSBpbml0aWFsaXplZCB3aGVuLCBhbmQgd2hhdCB0aGUgY29uc2VxdWVuY2VzIGFyZSBpZiBEU1MgcGFyc2luZyBkb2Vzbid0IGhhcHBlbiBpbiBhIHBhcnRpY3VsYXIgc2NlbmFyaW8uIEknbGwgbmVlZCB0byB0cmFjZSB0aGUgZGF0YSBmbG93IHRvIGJlIHN1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMTcsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyODMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MjoxMC4yMzE3MDgwMDZaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY3MzIwNTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1wdGNwX3BhcnNlX29wdGlvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmM9MTg9c3RhdGljIGJvb2wgbXB0Y3BfY2FwX2ZsYWdfc2hhMjU2KHU4IGZsYWdzKVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYy0yMi1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjIzOnN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMjQtXFx0XFx0XFx0ICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IG9wc2l6ZSxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmM9MzY2PXZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAwLVxcdFxcdFxcdGlmIChvcGNvZGUgPT0gVENQT1BUX01QVENQKVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6NDAxOlxcdFxcdFxcdFxcdG1wdGNwX3BhcnNlX29wdGlvbihza2IsIHB0ciwgb3BzaXplLCBtcF9vcHQpO1xcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAyLVxcdFxcdFxcdHB0ciArPSBvcHNpemUgLSAyO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MjoxMC4yOTkwMzMxNzlaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjU2MTI4Mzg0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkFuYWx5emluZyBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFuZCBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBidXNpbmVzcy4gSSBpbW1lZGlhdGVseSByZWNvZ25pemUgdGhlc2UgYXMgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHRoZSBNUFRDUCBvcHRpb24gbmVnb3RpYXRpb24gYW5kIHBhcnNpbmcgcHJvY2Vzcy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgdGhlIGZsb3cuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSByZWxhdGUsIHNwZWNpZmljYWxseTpcblxuKiAgICoqYG1wdGNwX2dldF9vcHRpb25zYCoqOiBJcyB0aGlzIGEgdG9wLWxldmVsIGRpc3BhdGNoZXI/IERvZXMgaXQgYWN0IGFzIGFuIGVudHJ5IHBvaW50LCBwZXJoYXBzIGNhbGxlZCBkdXJpbmcgY29ubmVjdGlvbiBzZXR1cCBvciB3aGVuIHJlY2VpdmluZyBhbiBNUFRDUC1zcGVjaWZpYyBUQ1Agb3B0aW9uPyBNeSBpbW1lZGlhdGUgZ3Vlc3MgaXMgdGhpcyBpcyBsaWtlbHkgaW52b2tlZCB3aXRoaW4gdGhlIFRDUCBzdGFjayBvciBNUFRDUCBsYXllciB0byByZXRyaWV2ZSBhbmQgcHJlcGFyZSB0aGUgZGF0YSB3aXRoaW4gdGhlIG9wdGlvbiBmaWVsZC5cblxuKiAgICoqYG1wdGNwX3BhcnNlX29wdGlvbmAqKjogVGhpcyBpcyBkZWZpbml0ZWx5IHdoZXJlIHRoZSBoZWF2eSBsaWZ0aW5nIGhhcHBlbnMuIFRoaXMgaXMgdGhlIGRlY29kZXIuIEknbSBpbWFnaW5pbmcgYSBzd2l0Y2ggb3Igc2VyaWVzIG9mIGBpZi9lbHNlYCBzdGF0ZW1lbnRzIHRoYXQgY2hlY2sgdGhlIG9wdGlvbiBraW5kIGFuZCB0aGVuIHVucGFjayB0aGUgYXBwcm9wcmlhdGUgZGF0YSBzdHJ1Y3R1cmUuIEknbGwgbmVlZCB0byBsb29rIGF0IHRoZSBkZXRhaWxzIHdpdGhpbiB0aGUga2VybmVsLiBJIGNhbiBzdGFydCBieSB0aGlua2luZyBhYm91dCB3aGF0J3MgaW52b2x2ZWQgaW4gdGhpcyBmdW5jdGlvbi4gVGhpcyBpcyBtb3N0IGxpa2VseTogQ2hlY2tpbmcgb3B0aW9uIHR5cGUsIHBhcnNpbmcgaXRzIGNvbnRlbnQsIHZhbGlkYXRpbmcgaXRzIHNpemUsIGhhbmRsaW5nIGFueSBwb3RlbnRpYWwgZXJyb3JzIHRoYXQgbWF5IGFyaXNlLlxuXG5JJ2xsIGJlIGxvb2tpbmcgZm9yIHdoZXJlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLCBhbmQgaG93IHRoZXkgaW50ZXJhY3QuIEFyZSB0aGV5IHBhcnQgb2YgdGhlIFNZTi9TWU4tQUNLL0FDSyBoYW5kbGluZz8gQXJlIHRoZXkgY2FsbGVkIG9ubHkgZHVyaW5nIHRoZSBpbml0aWFsIGhhbmRzaGFrZSwgb3IgYXJlIHRoZXkgaW52b2tlZCBsYXRlciB0byBoYW5kbGUgbWlkLWNvbm5lY3Rpb24gbW9kaWZpY2F0aW9ucywgc3VjaCBhcyBhZGRpbmcgbmV3IHN1YmZsb3dzPyBXaGF0IHNvcnQgb2YgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB0aGV5IHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8/XG5cbkknbGwgYWxzbyBoYXZlIHRvIGtlZXAgaW4gbWluZCBwb3NzaWJsZSBzZWN1cml0eSBpbXBsaWNhdGlvbnMgYW5kIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgd2l0aGluIHRoaXMgb3B0aW9uIHByb2Nlc3NpbmcuIEFyZSB0aGVyZSBhbnkgZWRnZSBjYXNlcyBvciB1bnVzdWFsIHBheWxvYWRzIHRoYXQgY291bGQgbGVhZCB0byBidWZmZXIgb3ZlcmZsb3dzIG9yIGRlbmlhbC1vZi1zZXJ2aWNlPyBUaW1lIHRvIGRpZyBpbiFcblxuXG4iLCJJbnB1dFRva2VucyI6Mjg5NCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjE2Ljg2MDMxODg2OVoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDA2OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNjYsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzY2OlxcdHZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gMzY3OlxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxcbiAzNjg6XFx0e1xcbiAzNjk6XFx0XFx0Y29uc3Qgc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7XFxuIDM3MDpcXHRcXHRjb25zdCB1bnNpZ25lZCBjaGFyICpwdHI7XFxuIDM3MTpcXHRcXHRpbnQgbGVuZ3RoO1xcbiAzNzI6XFx0XFxuIDM3MzpcXHRcXHQvKiBFbnN1cmUgdGhhdCBjYXN0aW5nIHRoZSB3aG9sZSBzdGF0dXMgdG8gdTMyIGlzIGVmZmljaWVudCBhbmQgc2FmZSAqL1xcbiAzNzQ6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZl9maWVsZChzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCwgc3RhdHVzKSAhPSBzaXplb2YodTMyKSk7XFxuIDM3NTpcXHRcXHRCVUlMRF9CVUdfT04oIUlTX0FMSUdORUQob2Zmc2V0b2Yoc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQsIHN0YXR1cyksXFxuIDM3NjpcXHRcXHRcXHRcXHRcXHQgc2l6ZW9mKHUzMikpKTtcXG4gMzc3OlxcdFxcdCoodTMyICopXFx1MDAyNm1wX29wdC1cXHUwMDNlc3RhdHVzID0gMDtcXG4gMzc4OlxcdFxcbiAzNzk6XFx0XFx0bGVuZ3RoID0gKHRoLVxcdTAwM2Vkb2ZmICogNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7XFxuIDM4MDpcXHRcXHRwdHIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSh0aCArIDEpO1xcbiAzODE6XFx0XFxuIDM4MjpcXHRcXHR3aGlsZSAobGVuZ3RoIFxcdTAwM2UgMCkge1xcbiAzODM6XFx0XFx0XFx0aW50IG9wY29kZSA9ICpwdHIrKztcXG4gMzg0OlxcdFxcdFxcdGludCBvcHNpemU7XFxuIDM4NTpcXHRcXG4gMzg2OlxcdFxcdFxcdHN3aXRjaCAob3Bjb2RlKSB7XFxuIDM4NzpcXHRcXHRcXHRjYXNlIFRDUE9QVF9FT0w6XFxuIDM4ODpcXHRcXHRcXHRcXHRyZXR1cm47XFxuIDM4OTpcXHRcXHRcXHRjYXNlIFRDUE9QVF9OT1A6XFx0LyogUmVmOiBSRkMgNzkzIHNlY3Rpb24gMy4xICovXFxuIDM5MDpcXHRcXHRcXHRcXHRsZW5ndGgtLTtcXG4gMzkxOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAzOTI6XFx0XFx0XFx0ZGVmYXVsdDpcXG4gMzkzOlxcdFxcdFxcdFxcdGlmIChsZW5ndGggXFx1MDAzYyAyKVxcbiAzOTQ6XFx0XFx0XFx0XFx0XFx0cmV0dXJuO1xcbiAzOTU6XFx0XFx0XFx0XFx0b3BzaXplID0gKnB0cisrO1xcbiAzOTY6XFx0XFx0XFx0XFx0aWYgKG9wc2l6ZSBcXHUwMDNjIDIpIC8qIFxcXCJzaWxseSBvcHRpb25zXFxcIiAqL1xcbiAzOTc6XFx0XFx0XFx0XFx0XFx0cmV0dXJuO1xcbiAzOTg6XFx0XFx0XFx0XFx0aWYgKG9wc2l6ZSBcXHUwMDNlIGxlbmd0aClcXG4gMzk5OlxcdFxcdFxcdFxcdFxcdHJldHVybjtcXHQvKiBkb24ndCBwYXJzZSBwYXJ0aWFsIG9wdGlvbnMgKi9cXG4gNDAwOlxcdFxcdFxcdFxcdGlmIChvcGNvZGUgPT0gVENQT1BUX01QVENQKVxcbiA0MDE6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcGFyc2Vfb3B0aW9uKHNrYiwgcHRyLCBvcHNpemUsIG1wX29wdCk7XFxuIDQwMjpcXHRcXHRcXHRcXHRwdHIgKz0gb3BzaXplIC0gMjtcXG4gNDAzOlxcdFxcdFxcdFxcdGxlbmd0aCAtPSBvcHNpemU7XFxuIDQwNDpcXHRcXHRcXHR9XFxuIDQwNTpcXHRcXHR9XFxuIDQwNjpcXHR9XFxuIDQwNzpcXHRcXG4gNDA4OlxcdGJvb2wgbXB0Y3Bfc3luX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiA0MDk6XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgc3RydWN0IG1wdGNwX291dF9vcHRpb25zICpvcHRzKVxcbiA0MTA6XFx0e1xcbiA0MTE6XFx0XFx0c3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyA9IG1wdGNwX3N1YmZsb3dfY3R4KHNrKTtcXG4gNDEyOlxcdFxcbiA0MTM6XFx0XFx0Lyogd2Ugd2lsbCB1c2Ugc25kX2lzbiB0byBkZXRlY3QgZmlyc3QgcGt0IFtyZV10cmFuc21pc3Npb25cXG4gNDE0OlxcdFxcdCAqIGluIG1wdGNwX2VzdGFibGlzaGVkX29wdGlvbnNfbXAoKVxcbiA0MTU6XFx0XFx0ICovXFxuIDQxNjpcXHRcXHRzdWJmbG93LVxcdTAwM2VzbmRfaXNuID0gVENQX1NLQl9DQihza2IpLVxcdTAwM2VlbmRfc2VxO1xcbiA0MTc6XFx0XFx0aWYgKHN1YmZsb3ctXFx1MDAzZXJlcXVlc3RfbXB0Y3ApIHtcXG4gNDE4OlxcdFxcdFxcdGlmICh1bmxpa2VseShzdWJmbG93X3NpbXVsdGFuZW91c19jb25uZWN0KHNrKSkpIHtcXG4gNDE5OlxcdFxcdFxcdFxcdFdBUk5fT05fT05DRSghbXB0Y3BfdHJ5X2ZhbGxiYWNrKHNrLCBNUFRDUF9NSUJfU0lNVUxUQ09OTkZBTExCQUNLKSk7XFxuIDQyMDpcXHRcXG4gNDIxOlxcdFxcdFxcdFxcdC8qIEVuc3VyZSBtcHRjcF9maW5pc2hfY29ubmVjdCgpIHdpbGwgbm90IHByb2Nlc3MgdGhlXFxuIDQyMjpcXHRcXHRcXHRcXHQgKiBNUEMgaGFuZHNoYWtlLlxcbiA0MjM6XFx0XFx0XFx0XFx0ICovXFxuIDQyNDpcXHRcXHRcXHRcXHRzdWJmbG93LVxcdTAwM2VyZXF1ZXN0X21wdGNwID0gMDtcXG4gNDI1OlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNDI2OlxcdFxcdFxcdH1cXG4gNDI3OlxcdFxcbiA0Mjg6XFx0XFx0XFx0b3B0cy1cXHUwMDNlc3Vib3B0aW9ucyA9IE9QVElPTl9NUFRDUF9NUENfU1lOO1xcbiA0Mjk6XFx0XFx0XFx0b3B0cy1cXHUwMDNlY3N1bV9yZXFkID0gbXB0Y3BfaXNfY2hlY2tzdW1fZW5hYmxlZChzb2NrX25ldChzaykpO1xcbiA0MzA6XFx0XFx0XFx0b3B0cy1cXHUwMDNlYWxsb3dfam9pbl9pZDAgPSBtcHRjcF9hbGxvd19qb2luX2lkMChzb2NrX25ldChzaykpO1xcbiA0MzE6XFx0XFx0XFx0KnNpemUgPSBUQ1BPTEVOX01QVENQX01QQ19TWU47XFxuIDQzMjpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNDMzOlxcdFxcdH0gZWxzZSBpZiAoc3ViZmxvdy1cXHUwMDNlcmVxdWVzdF9qb2luKSB7XFxuIDQzNDpcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVtb3RlX3Rva2VuPSV1LCBub25jZT0ldVxcXFxuXFxcIiwgc3ViZmxvdy1cXHUwMDNlcmVtb3RlX3Rva2VuLFxcbiA0MzU6XFx0XFx0XFx0XFx0IHN1YmZsb3ctXFx1MDAzZWxvY2FsX25vbmNlKTtcXG4gNDM2OlxcdFxcdFxcdG9wdHMtXFx1MDAzZXN1Ym9wdGlvbnMgPSBPUFRJT05fTVBUQ1BfTVBKX1NZTjtcXG4gNDM3OlxcdFxcdFxcdG9wdHMtXFx1MDAzZWpvaW5faWQgPSBzdWJmbG93LVxcdTAwM2Vsb2NhbF9pZDtcXG4gNDM4OlxcdFxcdFxcdG9wdHMtXFx1MDAzZXRva2VuID0gc3ViZmxvdy1cXHUwMDNlcmVtb3RlX3Rva2VuO1xcbiA0Mzk6XFx0XFx0XFx0b3B0cy1cXHUwMDNlbm9uY2UgPSBzdWJmbG93LVxcdTAwM2Vsb2NhbF9ub25jZTtcXG4gNDQwOlxcdFxcdFxcdG9wdHMtXFx1MDAzZWJhY2t1cCA9IHN1YmZsb3ctXFx1MDAzZXJlcXVlc3RfYmt1cDtcXG4gNDQxOlxcdFxcdFxcdCpzaXplID0gVENQT0xFTl9NUFRDUF9NUEpfU1lOO1xcbiA0NDI6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDQ0MzpcXHRcXHR9XFxuIDQ0NDpcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDQ0NTpcXHR9XFxuIDQ0NjpcXHRcXG4gNDQ3OlxcdHN0YXRpYyB2b2lkIGNsZWFyXzNyZGFja19yZXRyYW5zbWlzc2lvbihzdHJ1Y3Qgc29jayAqc2spXFxuIDQ0ODpcXHR7XFxuIDQ0OTpcXHRcXHRzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7XFxuIDQ1MDpcXHRcXG4gNDUxOlxcdFxcdHNrX3N0b3BfdGltZXIoc2ssIFxcdTAwMjZpY3NrLVxcdTAwM2VpY3NrX2RlbGFja190aW1lcik7XFxuIDQ1MjpcXHRcXHRpY3NrLVxcdTAwM2VpY3NrX2Fjay5hdG8gPSAwO1xcbiA0NTM6XFx0XFx0aWNzay1cXHUwMDNlaWNza19hY2sucGVuZGluZyBcXHUwMDI2PSB+KElDU0tfQUNLX1NDSEVEIHwgSUNTS19BQ0tfVElNRVIpO1xcbiA0NTQ6XFx0fVxcbiA0NTU6XFx0XFxuIDQ1NjpcXHRzdGF0aWMgYm9vbCBtcHRjcF9lc3RhYmxpc2hlZF9vcHRpb25zX21wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gNDU3OlxcdFxcdFxcdFxcdFxcdFxcdCBib29sIHNuZF9kYXRhX2Zpbl9lbmFibGUsIGludCAqc2l6ZSxcXG4gNDU4OlxcdFxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbXB0Y3Bfb3V0X29wdGlvbnMgKm9wdHMpXFxuIDQ1OTpcXHR7XFxuIDQ2MDpcXHRcXHRzdHJ1Y3QgbXB0Y3Bfc3ViZmxvd19jb250ZXh0ICpzdWJmbG93ID0gbXB0Y3Bfc3ViZmxvd19jdHgoc2spO1xcbiA0NjE6XFx0XFx0c3RydWN0IG1wdGNwX3NvY2sgKm1zayA9IG1wdGNwX3NrKHN1YmZsb3ctXFx1MDAzZWNvbm4pO1xcbiA0NjI6XFx0XFx0c3RydWN0IG1wdGNwX2V4dCAqbXBleHQ7XFxuIDQ2MzpcXHRcXHR1bnNpZ25lZCBpbnQgZGF0YV9sZW47XFxuIDQ2NDpcXHRcXHR1OCBsZW47XFxuIDQ2NTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MTYuODYwNDYxMDk5WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4OTUzODM4OTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW5uZXIgbW9ub2xvZ3VlOlxuXG4qKk1QVENQIE9wdGlvbiBIYW5kbGluZzogQSBRdWljayBNZW50YWwgQ2hlY2sqKlxuXG5SaWdodCwgYG1wdGNwX2dldF9vcHRpb25zYCBpcyBzdGFydGluZyBieSB6ZXJvaW5nIG91dCBgbXBfb3B0LVx1MDAzZXN0YXR1c2AuIFRoYXQncyBzdGFuZGFyZCBwcmFjdGljZSwgYSBnb29kIGluaXRpYWwgY2xlYXJpbmcgb2YgdGhlIHNsYXRlIGJlZm9yZSB3ZSBkaXZlIGludG8gcGFyc2luZyBhbnl0aGluZy4gSXQncyBhIGZ1bmRhbWVudGFsIGRlZmVuc2l2ZSBwcm9ncmFtbWluZyBtb3ZlIOKAkyBlbnN1cmluZyBhIGNsZWFuIHN0YXRlIGFuZCBwcmV2ZW50aW5nIHVuZXhwZWN0ZWQgY2Fycnktb3ZlciB2YWx1ZXMgZnJvbSBwcmV2aW91cyBvcGVyYXRpb25zLiBNYWtlcyBwZXJmZWN0IHNlbnNlLlxuXG5Ob3csIGxldCBtZSBqdXN0IGJyaW5nIHVwIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZGAgaW4gbXkgaGVhZC4uLiB5ZWFoLCBva2F5LCBnb3QgaXQuIFRoaXMgc3RydWN0IGlzIHdoZXJlIGFsbCB0aGUgaW5jb21pbmcgTVBUQ1Agb3B0aW9uIGRhdGEgaXMgc3RvcmVkLCBjYXRlZ29yaXplZCwgYW5kIG1hbmFnZWQuIEknbSBtZW50YWxseSByZXZpZXdpbmcgaXRzIG1lbWJlcnMg4oCTIHRoZSBmbGFncywgdGhlIGFkZHJlc3NlcywgdGhlIGNhcGFiaWxpdGllcy4gQSBxdWljayByZWZyZXNoIG9uIHdoYXQgZmllbGRzIGFyZSByZWxldmFudCB0byB0aGUgY3VycmVudCBvcHRpb24gbmVnb3RpYXRpb24gaXMgYWx3YXlzIGJlbmVmaWNpYWwuIE5lZWQgdG8gc3RheSBzaGFycCB0byBhZGRyZXNzIHN1YnRsZSBudWFuY2VzIGluIHRoZSBtZXNzYWdlLiBOb3csIEkgY2FuIGNvbnRpbnVlIHdpdGggY29uZmlkZW5jZSFcblxuXG4iLCJJbnB1dFRva2VucyI6NTAzMCwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MjAuNzU1ODQ4MzA2WiIsIlNlcSI6MjgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMDEzODU3NjI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIFxcXFx7XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbXB0Y3AvcHJvdG9jb2wuaD0xMzg9c3RhdGljIGlubGluZSBib29sIGJlZm9yZTY0KF9fdTY0IHNlcTEsIF9fdTY0IHNlcTIpXFxuLS1cXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC0xNDQtXFxubmV0L21wdGNwL3Byb3RvY29sLmg6MTQ1OnN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIHtcXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC0xNDYtXFx0dTY0XFx0c25kcl9rZXk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjIzLjc2OTcxMTA4NFoiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjMwNTgxNDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkncmUgbXkgb3duOlxuXG4qKkFuYWx5emluZyB0aGUgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBTdHJ1Y3R1cmUqKlxuXG5BbHJpZ2h0LCBsZXQncyBwdWxsIHVwIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZGAuIEkndmUgc2VlbiB0aGlzIGJlZm9yZSwgb2YgY291cnNlLCBidXQgaXQncyBhbHdheXMgZ29vZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgc3BlY2lmaWNzLCBlc3BlY2lhbGx5IHdoZW4gY29uc2lkZXJpbmcgZWRnZSBjYXNlcy4gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIGhvdyBNdWx0aXBhdGggVENQIChNUFRDUCkgaGFuZGxlcyBvcHRpb24gbmVnb3RpYXRpb24gb24gYSByZWNlaXZlZCBwYWNrZXQsIHNvIEkgbmVlZCBhIHNvbGlkIHVuZGVyc3RhbmRpbmcgb2YgZWFjaCBmaWVsZCBhbmQgaXRzIGltcGxpY2F0aW9ucy5cblxuSSdsbCBiZSBsb29raW5nIGNsb3NlbHkgYXQgdGhlIGJpdGZpZWxkcywgdGhlIHNpemUgb2YgZWFjaCBtZW1iZXIsIGFuZCB3aGF0IGVhY2ggZmllbGQgc2lnbmlmaWVzIGluIHRoZSBNUFRDUCBwcm90b2NvbC4gSSdsbCBuZWVkIHRvIGtub3cgdGhpcyBsaWtlIHRoZSBiYWNrIG9mIG15IGhhbmQuIEkgd2lsbCBhbmFseXplIHRoZSBzdHJ1Y3R1cmUsIGFuZCBpdCBpcyBjcnVjaWFsIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGN1cnJlbnQgTVBUQ1AgaW1wbGVtZW50YXRpb24uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBpbmZvcm0gbXkgd29yaywgYW5kIGlzIGVzc2VudGlhbCBmb3IgaW1wbGVtZW50aW5nIG5ldyBmZWF0dXJlcyBvciBkZWJ1Z2dpbmcgZXhpc3Rpbmcgb25lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6NTQxMywiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjI3LjQwMDI5NTYwOFoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTk1ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL3Byb3RvY29sLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMTQ1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTQ1OlxcdHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIHtcXG4gMTQ2OlxcdFxcdHU2NFxcdHNuZHJfa2V5O1xcbiAxNDc6XFx0XFx0dTY0XFx0cmN2cl9rZXk7XFxuIDE0ODpcXHRcXHR1NjRcXHRkYXRhX2FjaztcXG4gMTQ5OlxcdFxcdHU2NFxcdGRhdGFfc2VxO1xcbiAxNTA6XFx0XFx0dTMyXFx0c3ViZmxvd19zZXE7XFxuIDE1MTpcXHRcXHR1MTZcXHRkYXRhX2xlbjtcXG4gMTUyOlxcdFxcdF9fc3VtMTZcXHRjc3VtO1xcbiAxNTM6XFx0XFx0c3RydWN0X2dyb3VwKHN0YXR1cyxcXG4gMTU0OlxcdFxcdFxcdHUxNiBzdWJvcHRpb25zO1xcbiAxNTU6XFx0XFx0XFx0dTE2IHVzZV9tYXA6MSxcXG4gMTU2OlxcdFxcdFxcdCAgICBkc242NDoxLFxcbiAxNTc6XFx0XFx0XFx0ICAgIGRhdGFfZmluOjEsXFxuIDE1ODpcXHRcXHRcXHQgICAgdXNlX2FjazoxLFxcbiAxNTk6XFx0XFx0XFx0ICAgIGFjazY0OjEsXFxuIDE2MDpcXHRcXHRcXHQgICAgbXBjX21hcDoxLFxcbiAxNjE6XFx0XFx0XFx0ICAgIHJlc2V0X3JlYXNvbjo0LFxcbiAxNjI6XFx0XFx0XFx0ICAgIHJlc2V0X3RyYW5zaWVudDoxLFxcbiAxNjM6XFx0XFx0XFx0ICAgIGVjaG86MSxcXG4gMTY0OlxcdFxcdFxcdCAgICBiYWNrdXA6MSxcXG4gMTY1OlxcdFxcdFxcdCAgICBkZW55X2pvaW5faWQwOjEsXFxuIDE2NjpcXHRcXHRcXHQgICAgX191bnVzZWQ6MjtcXG4gMTY3OlxcdFxcdCk7XFxuIDE2ODpcXHRcXHR1OFxcdGpvaW5faWQ7XFxuIDE2OTpcXHRcXHR1MzJcXHR0b2tlbjtcXG4gMTcwOlxcdFxcdHUzMlxcdG5vbmNlO1xcbiAxNzE6XFx0XFx0dTY0XFx0dGhtYWM7XFxuIDE3MjpcXHRcXHR1OFxcdGhtYWNbTVBUQ1BPUFRfSE1BQ19MRU5dO1xcbiAxNzM6XFx0XFx0c3RydWN0IG1wdGNwX2FkZHJfaW5mbyBhZGRyO1xcbiAxNzQ6XFx0XFx0c3RydWN0IG1wdGNwX3JtX2xpc3Qgcm1fbGlzdDtcXG4gMTc1OlxcdFxcdHU2NFxcdGFobWFjO1xcbiAxNzY6XFx0XFx0dTY0XFx0ZmFpbF9zZXE7XFxuIDE3NzpcXHR9O1xcbiAxNzg6XFx0XFxuIDE3OTpcXHRzdGF0aWMgaW5saW5lIF9fYmUzMiBtcHRjcF9vcHRpb24odTggc3Vib3B0LCB1OCBsZW4sIHU4IG5pYiwgdTggZmllbGQpXFxuIDE4MDpcXHR7XFxuIDE4MTpcXHRcXHRyZXR1cm4gaHRvbmwoKFRDUE9QVF9NUFRDUCBcXHUwMDNjXFx1MDAzYyAyNCkgfCAobGVuIFxcdTAwM2NcXHUwMDNjIDE2KSB8IChzdWJvcHQgXFx1MDAzY1xcdTAwM2MgMTIpIHxcXG4gMTgyOlxcdFxcdFxcdCAgICAgKChuaWIgXFx1MDAyNiAweEYpIFxcdTAwM2NcXHUwMDNjIDgpIHwgZmllbGQpO1xcbiAxODM6XFx0fVxcbiAxODQ6XFx0XFxuIDE4NTpcXHRlbnVtIG1wdGNwX3BtX3N0YXR1cyB7XFxuIDE4NjpcXHRcXHRNUFRDUF9QTV9BRERfQUREUl9SRUNFSVZFRCxcXG4gMTg3OlxcdFxcdE1QVENQX1BNX0FERF9BRERSX1NFTkRfQUNLLFxcbiAxODg6XFx0XFx0TVBUQ1BfUE1fUk1fQUREUl9SRUNFSVZFRCxcXG4gMTg5OlxcdFxcdE1QVENQX1BNX0VTVEFCTElTSEVELFxcbiAxOTA6XFx0XFx0TVBUQ1BfUE1fU1VCRkxPV19FU1RBQkxJU0hFRCxcXG4gMTkxOlxcdFxcdE1QVENQX1BNX0FMUkVBRFlfRVNUQUJMSVNIRUQsXFx0LyogcGVyc2lzdGVudCBzdGF0dXMsIHNldCBhZnRlciBFU1RBQkxJU0hFRCBldmVudCAqL1xcbiAxOTI6XFx0XFx0TVBUQ1BfUE1fTVBDX0VORFBPSU5UX0FDQ09VTlRFRCAvKiBwZXJzaXN0ZW50IHN0YXR1cywgc2V0IGFmdGVyIE1QQyBsb2NhbCBhZGRyZXNzIGlzXFxuIDE5MzpcXHRcXHRcXHRcXHRcXHRcXHQgKiBhY2NvdW50ZWQgaW50IGlkX2F2YWlsX2JpdG1hcFxcbiAxOTQ6XFx0XFx0XFx0XFx0XFx0XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjI3LjQwMDUxODgxOVoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NDU2MzgyNDE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBQYXJzaW5nIExvZ2ljKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgbXB0Y3BfZ2V0X29wdGlvbnNgIGZ1bmN0aW9uLCBhbmQgaXQgemVyb2VzIG91dCBgbXBfb3B0LVx1MDAzZXN0YXR1c2AsIHdoaWNoIGluY2x1ZGVzIHRoZSBgc3Vib3B0aW9uc2AgZmllbGQgYW5kIGJpdGZpZWxkcy4gVGhlbiwgdGhpcyBwYXRjaCBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBjYXVnaHQgbXkgZXllLiBTcGVjaWZpY2FsbHksIHRoZSBEU1MgY2FzZS4gSXQgY2hlY2tzIGlmIGBtcF9vcHQtXHUwMDNlc3Vib3B0aW9uc2AgaGFzIGFueSBiaXRzIHNldCBvdGhlciB0aGFuIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBgT1BUSU9OX01QVENQX1BSSU9gLCBvciBgT1BUSU9OX01QVENQX0ZBSUxgLiBJZiBpdCBkb2VzLCBpdCBqdXN0IGJyZWFrcyBvdXQgb2YgdGhlIGBzd2l0Y2hgIHN0YXRlbWVudCwgd2hpY2ggc2VlbXMuLi5vZGQuXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMsIFwiSGFuZyBvbiwgd291bGRuJ3QgYG1wX29wdC1cdTAwM2VzdWJvcHRpb25zYCBuZWVkIHRvIGJlIHplcm8gaW4gdGhlIGZpcnN0IHBsYWNlIGZvciB0aGlzIGNoZWNrIHRvIHdvcms/XCIgQnV0IHRoZW4gSSByZW1lbWJlcmVkLCBgbXB0Y3BfZ2V0X29wdGlvbnNgICpkb2VzKiB6ZXJvIGl0IG91dCByaWdodCBhdCB0aGUgc3RhcnQ6IGAqKHUzMiAqKVx1MDAyNm1wX29wdC1cdTAwM2VzdGF0dXMgPSAwO2AuIFNvLCB0aGF0IGJpdCB3b3Jrcy5cblxuQnV0IG5vdyBJJ20gc2VlaW5nIGEgcG90ZW50aWFsIGZsYXcuIElmIGBtcHRjcF9wYXJzZV9vcHRpb25gIGJyZWFrcyBiZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIGl0ICp3b24ndCogc2V0IGBPUFRJT05fTVBUQ1BfRFNTYCBpbiBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgLiBBbmQgY3JpdGljYWxseSwgaXQgd29uJ3QgcG9wdWxhdGUgYWxsIHRoZSBvdGhlciBmaWVsZHMgcmVsYXRlZCB0byB0aGUgRFNTIG9wdGlvbiBsaWtlIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGBkYXRhX2xlbmAsIGFuZCBgY3N1bWAuIFNvLCB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyBnb2luZyB0byBjaGVjayBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgIGFuZCBzZWUgdGhhdCBgT1BUSU9OX01QVENQX0RTU2AgaXNuJ3Qgc2V0LiBFZmZlY3RpdmVseSwgdGhlIERTUyBvcHRpb24gd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLiBJcyB0aGlzIGJ5IGRlc2lnbiBvciBhIHN1YnRsZSBidWc/XG5cbkFoLCByaWdodCwgYG1wX29wdGAgaXMgdHlwaWNhbGx5IGEgbG9jYWwgdmFyaWFibGUsIGxpa2UgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkYCwgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gVGhlIGNvbnNlcXVlbmNlcyBvZiB0aGUgZGVzY3JpYmVkIGxvZ2ljIGNvdWxkIGJlIGludGVyZXN0aW5nLiBJJ2QgYmV0dGVyIGRvdWJsZS1jaGVjayB0aGUgY2FsbGVycyBvZiBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFuZCBmb2xsb3cgdGhlIGZsb3cgdG8gc2VlIGhvdyB0aGlzIERTUyBpbmZvcm1hdGlvbiBpcyBiZWluZyBoYW5kbGVkIGZ1cnRoZXIgdXBzdHJlYW0uIFRoaXMgbG9va3MgbGlrZSBhIHBvdGVudGlhbCBhcmVhIGZvciBmdXJ0aGVyIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY0NzgsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MjozNC44NTY5MDM2NjZaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NTYwMTQ4OTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibXB0Y3BfZ2V0X29wdGlvbnNcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L21wdGNwL29wdGlvbnMuYz0yMz1zdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY1LVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6MzY2OnZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTM2Ny1cXHRcXHQgICAgICAgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgKm1wX29wdClcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmM9MTE0MD1ib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYy0xMTY2LVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6MTE2NzpcXHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFxcdTAwMjZtcF9vcHQpO1xcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2OC1cXG4tLVxcbm5ldC9tcHRjcC9wcm90b2NvbC5oPTkxOD1zdHJ1Y3Qgc29jayAqbXB0Y3Bfc2tfY2xvbmVfaW5pdChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC05MjEtXFx0XFx0XFx0XFx0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7XFxubmV0L21wdGNwL3Byb3RvY29sLmg6OTIyOnZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC05MjMtXFx0XFx0ICAgICAgIHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpO1xcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYz0xNDc9c3RhdGljIGludCBzdWJmbG93X2NoZWNrX3JlcShzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsXFxuLS1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTE2Ny1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjE2ODpcXHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFxcdTAwMjZtcF9vcHQpO1xcbm5ldC9tcHRjcC9zdWJmbG93LmMtMTY5LVxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYz0yNjU9aW50IG1wdGNwX3N1YmZsb3dfaW5pdF9jb29raWVfcmVxKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmMtMjc1LVxcdHN1YmZsb3dfaW5pdF9yZXEocmVxLCBza19saXN0ZW5lcik7XFxubmV0L21wdGNwL3N1YmZsb3cuYzoyNzY6XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTI3Ny1cXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9NTI2PXN0YXRpYyB2b2lkIHN1YmZsb3dfZmluaXNoX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy01NDQtXFxubmV0L21wdGNwL3N1YmZsb3cuYzo1NDU6XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTU0Ni1cXHRpZiAoc3ViZmxvdy1cXHUwMDNlcmVxdWVzdF9tcHRjcCkge1xcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYz04MDY9c3RhdGljIHN0cnVjdCBzb2NrICpzdWJmbG93X3N5bl9yZWN2X3NvY2soY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy04NDYtXFx0XFx0ICovXFxubmV0L21wdGNwL3N1YmZsb3cuYzo4NDc6XFx0XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg0OC1cXHRcXHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2XFxuLS1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg1Mi1cXHR9IGVsc2UgaWYgKHN1YmZsb3dfcmVxLVxcdTAwM2VtcF9qb2luKSB7XFxubmV0L21wdGNwL3N1YmZsb3cuYzo4NTM6XFx0XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg1NC1cXHRcXHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9NUEpfQUNLKSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MzcuNDEyOTI2NDUyWiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxOTU1OTQwNDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2Agc2l0dWF0aW9uLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBzZWUgd2hhdCdzIGFjdHVhbGx5ICppbiogdGhpcyB0aGluZy4gV2hhdCdzIHRoZSBjb250ZXh0PyBJcyBpdCByZWxhdGVkIHRvIHRoZSBjb3JlIE1QLVRDUCBuZWdvdGlhdGlvbiBvciBtb3JlIGRvd25zdHJlYW0/IFdoYXQga2luZCBvZiBvcHRpb25zIGFyZSB3ZSB0YWxraW5nIGFib3V0IGhlcmU/IEkgbmVlZCB0byBxdWlja2x5IGRldGVybWluZSBpZiB3ZSdyZSBsb29raW5nIGF0IHN0YW5kYXJkIE1QLVRDUCBvcHRpb25zIGxpa2UgYE1QX0NBUEFCTEVgLCBgTVBfSk9JTmAsIGV0Yy4sIG9yIHNvbWV0aGluZyBtb3JlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHRoYXQgbWlnaHQgYmUgZmxvd2luZyB0aHJvdWdoIHRoZSBNUFRDUCBsYXllci4gSSBpbW1lZGlhdGVseSB0aGluayBhYm91dCBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uLiBJcyB0aGVyZSBhIGRlZmluZWQgc3RydWN0dXJlPyBBcmUgdGhlcmUgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3Mgb3Igb3RoZXIgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIEkgc2hvdWxkIGJlIGxvb2tpbmcgZm9yPyBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGNvdWxkIGJlIGNydWNpYWwgZm9yIG92ZXJhbGwgc3lzdGVtIHN0YWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugc28gSSBhbSBpbnRlcmVzdGVkIGluIGxvb2tpbmcgYXQgdGhlIGRldGFpbHMuIFdlIHNob3VsZCBjaGVjayB0aGlzIHRob3JvdWdobHkuIExldCdzIHN0YXJ0IGRpZ2dpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjgyNTYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0Mjo0MS42MDg1MjM3ODdaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM4NDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTE0MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTE0MDpcXHRib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjExNDE6XFx0e1xcbjExNDI6XFx0XFx0c3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyA9IG1wdGNwX3N1YmZsb3dfY3R4KHNrKTtcXG4xMTQzOlxcdFxcdHN0cnVjdCBtcHRjcF9zb2NrICptc2sgPSBtcHRjcF9zayhzdWJmbG93LVxcdTAwM2Vjb25uKTtcXG4xMTQ0OlxcdFxcdHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtcXG4xMTQ1OlxcdFxcdHN0cnVjdCBtcHRjcF9leHQgKm1wZXh0O1xcbjExNDY6XFx0XFxuMTE0NzpcXHRcXHRpZiAoX19tcHRjcF9jaGVja19mYWxsYmFjayhtc2spKSB7XFxuMTE0ODpcXHRcXHRcXHQvKiBLZWVwIGl0IHNpbXBsZSBhbmQgdW5jb25kaXRpb25hbGx5IHRyaWdnZXIgc2VuZCBkYXRhIGNsZWFudXAgYW5kXFxuMTE0OTpcXHRcXHRcXHQgKiBwZW5kaW5nIHF1ZXVlIHNwb29saW5nLiBXZSB3aWxsIG5lZWQgdG8gYWNxdWlyZSB0aGUgZGF0YSBsb2NrXFxuMTE1MDpcXHRcXHRcXHQgKiBmb3IgbW9yZSBhY2N1cmF0ZSBjaGVja3MsIGFuZCBvbmNlIHRoZSBsb2NrIGlzIGFjcXVpcmVkLCBzdWNoXFxuMTE1MTpcXHRcXHRcXHQgKiBoZWxwZXJzIGFyZSBjaGVhcC5cXG4xMTUyOlxcdFxcdFxcdCAqL1xcbjExNTM6XFx0XFx0XFx0bXB0Y3BfZGF0YV9sb2NrKHN1YmZsb3ctXFx1MDAzZWNvbm4pO1xcbjExNTQ6XFx0XFx0XFx0aWYgKHNrX3N0cmVhbV9tZW1vcnlfZnJlZShzaykpXFxuMTE1NTpcXHRcXHRcXHRcXHRfX21wdGNwX2NoZWNrX3B1c2goc3ViZmxvdy1cXHUwMDNlY29ubiwgc2spO1xcbjExNTY6XFx0XFxuMTE1NzpcXHRcXHRcXHQvKiBvbiBmYWxsYmFjayB3ZSBqdXN0IG5lZWQgdG8gaWdub3JlIHRoZSBtc2stbGV2ZWwgc25kX3VuYSwgYXNcXG4xMTU4OlxcdFxcdFxcdCAqIHRoaXMgaXMgcmVhbGx5IHBsYWluIFRDUFxcbjExNTk6XFx0XFx0XFx0ICovXFxuMTE2MDpcXHRcXHRcXHRfX21wdGNwX3NuZF91bmFfdXBkYXRlKG1zaywgUkVBRF9PTkNFKG1zay1cXHUwMDNlc25kX254dCkpO1xcbjExNjE6XFx0XFxuMTE2MjpcXHRcXHRcXHRfX21wdGNwX2RhdGFfYWNrZWQoc3ViZmxvdy1cXHUwMDNlY29ubik7XFxuMTE2MzpcXHRcXHRcXHRtcHRjcF9kYXRhX3VubG9jayhzdWJmbG93LVxcdTAwM2Vjb25uKTtcXG4xMTY0OlxcdFxcdFxcdHJldHVybiB0cnVlO1xcbjExNjU6XFx0XFx0fVxcbjExNjY6XFx0XFxuMTE2NzpcXHRcXHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFxcdTAwMjZtcF9vcHQpO1xcbjExNjg6XFx0XFxuMTE2OTpcXHRcXHQvKiBUaGUgc3ViZmxvdyBjYW4gYmUgaW4gY2xvc2Ugc3RhdGUgb25seSBpZiBjaGVja19mdWxseV9lc3RhYmxpc2hlZCgpXFxuMTE3MDpcXHRcXHQgKiBqdXN0IHNlbnQgYSByZXNldC4gSWYgc28sIHRlbGwgdGhlIGNhbGxlciB0byBpZ25vcmUgdGhlIGN1cnJlbnQgcGFja2V0LlxcbjExNzE6XFx0XFx0ICovXFxuMTE3MjpcXHRcXHRpZiAoIWNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkKG1zaywgc2ssIHN1YmZsb3csIHNrYiwgXFx1MDAyNm1wX29wdCkpXFxuMTE3MzpcXHRcXHRcXHRyZXR1cm4gc2stXFx1MDAzZXNrX3N0YXRlICE9IFRDUF9DTE9TRTtcXG4xMTc0OlxcdFxcbjExNzU6XFx0XFx0aWYgKHVubGlrZWx5KG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1MpKSB7XFxuMTE3NjpcXHRcXHRcXHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0ZBU1RDTE9TRSkgXFx1MDAyNlxcdTAwMjZcXG4xMTc3OlxcdFxcdFxcdCAgICBSRUFEX09OQ0UobXNrLVxcdTAwM2Vsb2NhbF9rZXkpID09IG1wX29wdC5yY3ZyX2tleSkge1xcbjExNzg6XFx0XFx0XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXJjdl9mYXN0Y2xvc2UsIHRydWUpO1xcbjExNzk6XFx0XFx0XFx0XFx0bXB0Y3Bfc2NoZWR1bGVfd29yaygoc3RydWN0IHNvY2sgKiltc2spO1xcbjExODA6XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX01QRkFTVENMT1NFUlgpO1xcbjExODE6XFx0XFx0XFx0fVxcbjExODI6XFx0XFxuMTE4MzpcXHRcXHRcXHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0FERF9BRERSKSBcXHUwMDI2XFx1MDAyNlxcbjExODQ6XFx0XFx0XFx0ICAgIGFkZF9hZGRyX2htYWNfdmFsaWQobXNrLCBcXHUwMDI2bXBfb3B0KSkge1xcbjExODU6XFx0XFx0XFx0XFx0aWYgKCFtcF9vcHQuZWNobykge1xcbjExODY6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcG1fYWRkX2FkZHJfcmVjZWl2ZWQoc2ssIFxcdTAwMjZtcF9vcHQuYWRkcik7XFxuMTE4NzpcXHRcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfQUREQUREUik7XFxuMTE4ODpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbjExODk6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcG1fYWRkX2FkZHJfZWNob2VkKG1zaywgXFx1MDAyNm1wX29wdC5hZGRyKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6NDEuNjA4NzczMjU3WiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgyNDIxMDIxNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBpbiBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEluIHRoZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgZnVuY3Rpb24sIGBtcF9vcHRgLCB0aGUgc3RydWN0IGhvbGRpbmcgdGhlIHJlY2VpdmVkIE1QVENQIG9wdGlvbnMsIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suIE15IGltbWVkaWF0ZSBjb25jZXJuPyBJdCdzICpub3QqIGluaXRpYWxpemVkLiBOb3csIGBtcHRjcF9nZXRfb3B0aW9uc2AgZG9lcyB6ZXJvIG91dCBgbXBfb3B0LnN0YXR1c2AsIGluY2x1ZGluZyB0aGUgYHN1Ym9wdGlvbnNgIGZpZWxkLCB3aGljaCBpcyBnb29kLiBCdXQgd2FpdOKApiBpdCAqb25seSogemVyb3MgYHN0YXR1c2AhIEl0IHVzZXMgYSByYXRoZXIgY3J1ZGUgY2FzdCB0byBhIHUzMiBwb2ludGVyIHRvIGFjaGlldmUgdGhpcy5cblxuVGhlIHJlYWwgcHJvYmxlbSBsaWVzIGluIGhvdyB0aGUgY29kZSBoYW5kbGVzIGBNUFRDUE9QVF9EU1NgLiBgbXB0Y3BfZ2V0X29wdGlvbnNgIHRoZW4gcHJvY2VlZHMgdG8gcGFyc2UgdGhlc2Ugb3B0aW9ucy4gSWYgaXQgZW5jb3VudGVycyBhIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiwgaXQgc2V0cyBgT1BUSU9OX01QVENQX0RTU2AgaW4gYG1wX29wdC5zdWJvcHRpb25zYCBhbmQgcG9wdWxhdGVzIHRoZSByZWxldmFudCBkYXRhIGZpZWxkcyDigJMgYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgZXRjLlxuXG5UaGUgY3JpdGljYWwgdGhpbmcsIHRoZSBuZXcgY2hlY2sgaW4gYG1wdGNwX3BhcnNlX29wdGlvbmAsIGlzIHdoYXQgbWFrZXMgdGhpcyByZWFsbHkgdHJpY2t5LiBJZiwgYW5kIHRoaXMgaXMgdGhlIGNydXgsIHRoZSBwYXJzaW5nIG9mIGBNUFRDUE9QVF9EU1NgIGJyZWFrcyBvdXQgZHVlIHRvIHRoaXMgbmV3LCByZXN0cmljdGl2ZSBjaGVjay4uLlxuXG5gYGBjXG5cdGNhc2UgTVBUQ1BPUFRfRFNTOlxuXHRcdC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG5cdFx0aWYgKChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfFxuXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8XG5cdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcblx0XHRcdFx0XHQgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKVxuXHRcdFx0YnJlYWs7XG5gYGBcblxuLi4udGhlbiBgT1BUSU9OX01QVENQX0RTU2AgKmlzIG5vdCogc2V0IGluIGBtcF9vcHQuc3Vib3B0aW9uc2AuIFRoYXQgaXMsIGlmIHRoZSBEU1Mgb3B0aW9uIGlzIHByZXNlbnQgYWxvbmcgd2l0aCBvdGhlciBkaXNhbGxvd2VkIG9wdGlvbnMsIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBub3Qgc2V0LlxuXG5UaGUgY29kZSB0aGVuIGNoZWNrczpcblxuYGBgY1xuXHRpZiAodW5saWtlbHkobXBfb3B0LnN1Ym9wdGlvbnMgIT0gT1BUSU9OX01QVENQX0RTUykpIHtcbmBgYFxuXG5TbywgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbid0IHNldCwgdGhpcyBgaWZgIGNvbmRpdGlvbiB3aWxsIGJlIHRydWUsIG1lYW5pbmcgd2UgZW50ZXIgdGhpcyBibG9jayBvZiBjb2RlLlxuXG5IZXJlJ3Mgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZyDigJMgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbid0IHNldCwgYXJlIHdlIHJlYWRpbmcgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeT8gSSBuZWVkIHRvIHZlcmlmeSB3aGF0IGZpZWxkcyBhcmUgcmVhZCB3aXRoaW4gdGhhdCBcInVubGlrZWx5XCIgYmxvY2suIFRoYXQncyB3aGVyZSB0aGUgcG90ZW50aWFsIGxpZXMgZm9yIGEgc2VyaW91cyB2dWxuZXJhYmlsaXR5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDY5LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDE5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6NDkuODUwODc4MTEzWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3ODA2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNzUsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNzU6XFx0XFx0aWYgKHVubGlrZWx5KG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1MpKSB7XFxuMTE3NjpcXHRcXHRcXHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0ZBU1RDTE9TRSkgXFx1MDAyNlxcdTAwMjZcXG4xMTc3OlxcdFxcdFxcdCAgICBSRUFEX09OQ0UobXNrLVxcdTAwM2Vsb2NhbF9rZXkpID09IG1wX29wdC5yY3ZyX2tleSkge1xcbjExNzg6XFx0XFx0XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXJjdl9mYXN0Y2xvc2UsIHRydWUpO1xcbjExNzk6XFx0XFx0XFx0XFx0bXB0Y3Bfc2NoZWR1bGVfd29yaygoc3RydWN0IHNvY2sgKiltc2spO1xcbjExODA6XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX01QRkFTVENMT1NFUlgpO1xcbjExODE6XFx0XFx0XFx0fVxcbjExODI6XFx0XFxuMTE4MzpcXHRcXHRcXHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0FERF9BRERSKSBcXHUwMDI2XFx1MDAyNlxcbjExODQ6XFx0XFx0XFx0ICAgIGFkZF9hZGRyX2htYWNfdmFsaWQobXNrLCBcXHUwMDI2bXBfb3B0KSkge1xcbjExODU6XFx0XFx0XFx0XFx0aWYgKCFtcF9vcHQuZWNobykge1xcbjExODY6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcG1fYWRkX2FkZHJfcmVjZWl2ZWQoc2ssIFxcdTAwMjZtcF9vcHQuYWRkcik7XFxuMTE4NzpcXHRcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfQUREQUREUik7XFxuMTE4ODpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbjExODk6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcG1fYWRkX2FkZHJfZWNob2VkKG1zaywgXFx1MDAyNm1wX29wdC5hZGRyKTtcXG4xMTkwOlxcdFxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9FQ0hPQUREKTtcXG4xMTkxOlxcdFxcdFxcdFxcdH1cXG4xMTkyOlxcdFxcbjExOTM6XFx0XFx0XFx0XFx0aWYgKG1wX29wdC5hZGRyLnBvcnQpXFxuMTE5NDpcXHRcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfUE9SVEFERCk7XFxuMTE5NTpcXHRcXHRcXHR9XFxuMTE5NjpcXHRcXG4xMTk3OlxcdFxcdFxcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9STV9BRERSKVxcbjExOTg6XFx0XFx0XFx0XFx0bXB0Y3BfcG1fcm1fYWRkcl9yZWNlaXZlZChtc2ssIFxcdTAwMjZtcF9vcHQucm1fbGlzdCk7XFxuMTE5OTpcXHRcXG4xMjAwOlxcdFxcdFxcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9QUklPKSB7XFxuMTIwMTpcXHRcXHRcXHRcXHRtcHRjcF9wbV9tcF9wcmlvX3JlY2VpdmVkKHNrLCBtcF9vcHQuYmFja3VwKTtcXG4xMjAyOlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFBSSU9SWCk7XFxuMTIwMzpcXHRcXHRcXHR9XFxuMTIwNDpcXHRcXG4xMjA1OlxcdFxcdFxcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9GQUlMKSB7XFxuMTIwNjpcXHRcXHRcXHRcXHRtcHRjcF9wbV9tcF9mYWlsX3JlY2VpdmVkKHNrLCBtcF9vcHQuZmFpbF9zZXEpO1xcbjEyMDc6XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX01QRkFJTFJYKTtcXG4xMjA4OlxcdFxcdFxcdH1cXG4xMjA5OlxcdFxcbjEyMTA6XFx0XFx0XFx0aWYgKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX1JTVCkge1xcbjEyMTE6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfc2VlbiA9IDE7XFxuMTIxMjpcXHRcXHRcXHRcXHRzdWJmbG93LVxcdTAwM2VyZXNldF9yZWFzb24gPSBtcF9vcHQucmVzZXRfcmVhc29uO1xcbjEyMTM6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfdHJhbnNpZW50ID0gbXBfb3B0LnJlc2V0X3RyYW5zaWVudDtcXG4xMjE0OlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFJTVFJYKTtcXG4xMjE1OlxcdFxcdFxcdH1cXG4xMjE2OlxcdFxcbjEyMTc6XFx0XFx0XFx0aWYgKCEobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfRFNTKSlcXG4xMjE4OlxcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbjEyMTk6XFx0XFx0fVxcbjEyMjA6XFx0XFxuMTIyMTpcXHRcXHQvKiB3ZSBjYW4ndCB3YWl0IGZvciByZWN2bXNnKCkgdG8gdXBkYXRlIHRoZSBhY2tfc2VxLCBvdGhlcndpc2VcXG4xMjIyOlxcdFxcdCAqIG1vbm9kaXJlY3Rpb25hbCBmbG93cyB3aWxsIHN0dWNrXFxuMTIyMzpcXHRcXHQgKi9cXG4xMjI0OlxcdFxcdGlmIChtcF9vcHQudXNlX2FjaylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6NDkuODUxMDU3NzgzWiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMTMzMTI5MjQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgT3B0aW9uIEhhbmRsaW5nIExvZ2ljKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIGNvZGUgYW5kIG15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRoaXM6IElmIGBPUFRJT05fTVBUQ1BfRFNTYCBpc24ndCBzZXQsIHRoZW4gaXQgY2hlY2tzIGEgYnVuY2ggb2Ygb3RoZXIgb3B0aW9ucywgbGlrZSBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAsIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBhbmQgc28gb24uIEluIGVhY2ggb2YgdGhlc2UgY2FzZXMsIGl0J3MgcmVhZGluZyBmaWVsZHMgZnJvbSBgbXBfb3B0YCDigJMgYHJjdnJfa2V5YCwgYGFkZHJgLCBgcm1fbGlzdGAsIGV0Yy4g4oCTICphZnRlciogYXNzdW1pbmcgYG1wdGNwX3BhcnNlX29wdGlvbmAgaGFzIGFscmVhZHkgcG9wdWxhdGVkIHRoZW0sIHdoaWNoIGlzIHRoZSBrZXkgaGVyZS5cblxuVGhlbiBjb21lcyB0aGlzIGNvbmRpdGlvbmFsOiBpZiBgIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUylgIHdoaWNoIG1lYW5zIFwiaWYgRFNTIGlzbid0IHNldCwgcmV0dXJuIHRydWVcIiBhbmQganVzdCBzdG9wcy4gV2FpdC4uLiB0aGF0IGxvb2tzIHN1c3BpY2lvdXMsIGJlY2F1c2UgaWYgRFNTICppc24ndCogc2V0LCBpdCAqaW1tZWRpYXRlbHkqIHJldHVybnMgd2l0aG91dCB0b3VjaGluZyB0aGUgRFNTIGZpZWxkcywgYXMgaXQgc2hvdWxkLlxuXG5CdXQsIGlmIGBPUFRJT05fTVBUQ1BfRFNTYCAqaXMqIHNldCwgdGhlbiBpdCBnb2VzIG9uIHRvIHJlYWQgYSB3aG9sZSBidW5jaCBvZiBEU1Mtc3BlY2lmaWMgZmllbGRzIGxpa2UgYHVzZV9hY2tgLCBgZGF0YV9hY2tgLCBgZGF0YV9zZXFgLCBldGMuIEFnYWluLCB0aGUgYXNzdW1wdGlvbiBpcyB0aGF0IGBtcHRjcF9wYXJzZV9vcHRpb25gIHBvcHVsYXRlZCB0aG9zZSBmaWVsZHMuIEkgbmVlZCB0byBiZSBzdXJlIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIHRob3NlIGZpZWxkcyBhcmUgcG9wdWxhdGVkIGhvbGRzIHRydWUuXG5cbk5vdywgSSByZW1lbWJlciBzZWVpbmcgc29tZXRoaW5nIGFib3V0IHRoZSBgTVBUQ1BPUFRfRFNTYCBjYXNlIGluIHRoZSBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBmdW5jdGlvbi4gQWgsIGhlcmUgaXQgaXM6IHRoZSBwYXRjaCBpbmNsdWRlcyBhIGNvbnN0cmFpbnQ6IGlmIGBtcF9vcHQtXHUwMDNlc3Vib3B0aW9uc2AgaGFzIGFueSBvcHRpb24gKm90aGVyIHRoYW4qIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBgT1BUSU9OX01QVENQX1BSSU9gLCBvciBgT1BUSU9OX01QVENQX0ZBSUxgIHNldCwgdGhlbiBpdCBicmVha3Mgb3V0LiBUaGF0IG1lYW5zLCBpbnNpZGUgdGhlIERTUyBjYXNlIGluIHRoZSBwYXJzZXIsIGlmIGFueXRoaW5nIGVsc2UsICpsaWtlKiBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAgaXMgc2V0LCB0aGUgcGFyc2VyIGp1c3QgYmFpbHMgb3V0LiBUaGlzIGlzIGdvb2QgYmVjYXVzZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2Agd2lsbCByZXR1cm4gYHRydWVgIGF0IGxpbmUgMTIxOC5cblxuU28sICppZiogYW55IG9mIHRob3NlIG90aGVyIG9wdGlvbiBiaXRzICphcmUqIHNldCBhbG9uZyB3aXRoIERTUywgdGhlIERTUyBwYXJzaW5nICp3b24ndCogaGFwcGVuLCBhbmQgdGhlIGNvZGUgd29uJ3QgcmVhZCBhbnkgdW5pbml0aWFsaXplZCBEU1MgZmllbGRzLiBSaWdodD9cblxuT2theSwgc28gSSB0aGluayB0aGUgdnVsbmVyYWJsZSByZWFkIGlzIHByb3RlY3RlZCBieSB0aGUgYG1wdGNwX3BhcnNlX29wdGlvbmAgY29uc3RyYWludC5cblxuSnVzdCB0byBiZSBzdXJlLCBpcyB0aGVyZSBhbnkgb3RoZXIgbG9jYXRpb24gaW4gdGhpcyBjb2RlIHdoZXJlIGBtcF9vcHRgIGlzIHJlYWQ/IEl0IGlzIHdvcnRoIGNoZWNraW5nIHRoZSBjYWxsIHRvIGBjaGVja19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHNrLCBzdWJmbG93LCBza2IsIFx1MDAyNm1wX29wdClgLiBUaGF0J3MgdGhlIG5leHQgc3RlcC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MzUsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2NzYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0Mjo1OS45ODQxODkxNTRaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3Njg0MjIyMjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L21wdGNwL29wdGlvbnMuYz04OTA9Ym9vbCBtcHRjcF9zeW5hY2tfb3B0aW9ucyhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIHVuc2lnbmVkIGludCAqc2l6ZSxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtOTE4LVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6OTE5OnN0YXRpYyBib29sIGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIHN0cnVjdCBzb2NrICpzc2ssXFxubmV0L21wdGNwL29wdGlvbnMuYy05MjAtXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTExNDA9Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2OC1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNjk6XFx0LyogVGhlIHN1YmZsb3cgY2FuIGJlIGluIGNsb3NlIHN0YXRlIG9ubHkgaWYgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE3MC1cXHQgKiBqdXN0IHNlbnQgYSByZXNldC4gSWYgc28sIHRlbGwgdGhlIGNhbGxlciB0byBpZ25vcmUgdGhlIGN1cnJlbnQgcGFja2V0Llxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE3MS1cXHQgKi9cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNzI6XFx0aWYgKCFjaGVja19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHNrLCBzdWJmbG93LCBza2IsIFxcdTAwMjZtcF9vcHQpKVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE3My1cXHRcXHRyZXR1cm4gc2stXFx1MDAzZXNrX3N0YXRlICE9IFRDUF9DTE9TRTtcXG4tLVxcbm5ldC9tcHRjcC9wbS5jPTYwNT12b2lkIG1wdGNwX3BtX2Z1bGx5X2VzdGFibGlzaGVkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIGNvbnN0IHN0cnVjdCBzb2NrICpzc2spXFxuLS1cXG5uZXQvbXB0Y3AvcG0uYy02MTQtXFx0LyogbXB0Y3BfcG1fZnVsbHlfZXN0YWJsaXNoZWQoKSBjYW4gYmUgaW52b2tlZCBieSBtdWx0aXBsZVxcbm5ldC9tcHRjcC9wbS5jOjYxNTpcXHQgKiByYWNpbmcgcGF0aHMgLSBhY2NlcHQoKSBhbmQgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxcbm5ldC9tcHRjcC9wbS5jLTYxNi1cXHQgKiBiZSBzdXJlIHRvIHNlcnZlIHRoaXMgZXZlbnQgb25seSBvbmNlLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MzowMi43NTI2MTgxNThaIiwiU2VxIjozOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUzODYxNTkyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgSSdtIHJlYWR5LiBIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIHRoZXNlIGFyZSBteSB0aG91Z2h0cywga2VlcGluZyBpbiBtaW5kIEknbSBkZWFsaW5nIHdpdGggYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkV4YW1pbmluZyBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoZSBsb2dpYyBvZiBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IgaW4gZGV0YWlsLiBJJ20gaW1tZWRpYXRlbHkgZm9jdXNpbmcgb24gd2hhdCB0aGUgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gdmFsaWRhdGUgYW5kIHVuZGVyIHdoYXQgY29uZGl0aW9ucy4gV2hhdCBkYXRhIGlzIGl0IGNvbnN1bWluZyBhbmQgd2hhdCBpcyB0aGUgZXhwZWN0ZWQgb3V0Y29tZSBiYXNlZCBvbiB0aGF0IGlucHV0PyBJIG5lZWQgdG8gdGhpbmsgdGhyb3VnaCBhbnkgZWRnZSBjYXNlcyBhbmQgcG90ZW50aWFsIGZhaWx1cmUgc2NlbmFyaW9zIHRoZSBmdW5jdGlvbiBtaWdodCBoYW5kbGUuIEFyZSB0aGVyZSBhbnkgaW1wbGljaXQgYXNzdW1wdGlvbnMgYmFrZWQgaW50byB0aGlzIGxvZ2ljIHRoYXQgSSBuZWVkIHRvIHN1cmZhY2U/IEknbSBhbHJlYWR5IGFudGljaXBhdGluZyBwb3RlbnRpYWwgZGVidWdnaW5nIHN0ZXBzIHNob3VsZCBJIGhhdmUgdG8gYW5hbHl6ZSBhIGRvd25zdHJlYW0gZXJyb3Igd2hlcmUgaXQgcGxheXMgYSByb2xlLiBJJ20gZ29pbmcgdG8gY2FyZWZ1bGx5IHJlYWQgZXZlcnkgbGluZSBvZiB0aGlzIGZ1bmN0aW9uLCB0YWtpbmcgdGhlIHRpbWUgdG8gcGFyc2UgZWFjaCBjb21wb25lbnQgZm9yIHRoZSBwdXJwb3NlIG9mIGlkZW50aWZ5aW5nIGFueSBwb3NzaWJsZSBnYXBzIG9yIGluY29uc2lzdGVuY2llcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMyMTEsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MzowNi4yOTEyMzg1NzJaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgxODMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTE5LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgOTE5OlxcdHN0YXRpYyBib29sIGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIHN0cnVjdCBzb2NrICpzc2ssXFxuIDkyMDpcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyxcXG4gOTIxOlxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiA5MjI6XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpXFxuIDkyMzpcXHR7XFxuIDkyNDpcXHRcXHQvKiBoZXJlIHdlIGNhbiBwcm9jZXNzIE9vTywgaW4td2luZG93IHBrdHMsIG9ubHkgaW4tc2VxdWVuY2UgNHRoIGFja1xcbiA5MjU6XFx0XFx0ICogd2lsbCBtYWtlIHRoZSBzdWJmbG93IGZ1bGx5IGVzdGFibGlzaGVkXFxuIDkyNjpcXHRcXHQgKi9cXG4gOTI3OlxcdFxcdGlmIChsaWtlbHkoUkVBRF9PTkNFKHN1YmZsb3ctXFx1MDAzZWZ1bGx5X2VzdGFibGlzaGVkKSkpIHtcXG4gOTI4OlxcdFxcdFxcdC8qIG9uIHBhc3NpdmUgc29ja2V0cywgY2hlY2sgZm9yIDNyZCBhY2sgcmV0cmFuc21pc3Npb25cXG4gOTI5OlxcdFxcdFxcdCAqIG5vdGUgdGhhdCBtc2sgaXMgYWx3YXlzIHNldCBieSBzdWJmbG93X3N5bl9yZWN2X3NvY2soKVxcbiA5MzA6XFx0XFx0XFx0ICogZm9yIG1wX2pvaW4gc3ViZmxvd3NcXG4gOTMxOlxcdFxcdFxcdCAqL1xcbiA5MzI6XFx0XFx0XFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cXHUwMDNlc2VxID09IHN1YmZsb3ctXFx1MDAzZXNzbl9vZmZzZXQgKyAxIFxcdTAwMjZcXHUwMDI2XFxuIDkzMzpcXHRcXHRcXHQgICAgVENQX1NLQl9DQihza2IpLVxcdTAwM2VlbmRfc2VxID09IFRDUF9TS0JfQ0Ioc2tiKS1cXHUwMDNlc2VxIFxcdTAwMjZcXHUwMDI2XFxuIDkzNDpcXHRcXHRcXHQgICAgc3ViZmxvdy1cXHUwMDNlbXBfam9pbiBcXHUwMDI2XFx1MDAyNiAobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OU19NUFRDUF9NUEopIFxcdTAwMjZcXHUwMDI2XFxuIDkzNTpcXHRcXHRcXHQgICAgIXN1YmZsb3ctXFx1MDAzZXJlcXVlc3Rfam9pbilcXG4gOTM2OlxcdFxcdFxcdFxcdHRjcF9zZW5kX2Fjayhzc2spO1xcbiA5Mzc6XFx0XFx0XFx0Z290byBjaGVja19ub3RpZnk7XFxuIDkzODpcXHRcXHR9XFxuIDkzOTpcXHRcXG4gOTQwOlxcdFxcdC8qIHdlIG11c3QgcHJvY2VzcyBPb08gcGFja2V0cyBiZWZvcmUgdGhlIGZpcnN0IHN1YmZsb3cgaXMgZnVsbHlcXG4gOTQxOlxcdFxcdCAqIGVzdGFibGlzaGVkLiBPb08gcGFja2V0cyBhcmUgaW5zdGVhZCBhIHByb3RvY29sIHZpb2xhdGlvblxcbiA5NDI6XFx0XFx0ICogZm9yIE1QX0pPSU4gc3ViZmxvd3MgYXMgdGhlIHBlZXIgbXVzdCBub3Qgc2VuZCBhbnkgZGF0YVxcbiA5NDM6XFx0XFx0ICogYmVmb3JlIHJlY2VpdmluZyB0aGUgZm9ydGggYWNrIC0gY2ZyLiBSRkMgODY4NCBzZWN0aW9uIDMuMi5cXG4gOTQ0OlxcdFxcdCAqL1xcbiA5NDU6XFx0XFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cXHUwMDNlc2VxICE9IHN1YmZsb3ctXFx1MDAzZXNzbl9vZmZzZXQgKyAxKSB7XFxuIDk0NjpcXHRcXHRcXHRpZiAoc3ViZmxvdy1cXHUwMDNlbXBfam9pbilcXG4gOTQ3OlxcdFxcdFxcdFxcdGdvdG8gcmVzZXQ7XFxuIDk0ODpcXHRcXHRcXHRpZiAoc3ViZmxvdy1cXHUwMDNlaXNfbXB0Zm8gXFx1MDAyNlxcdTAwMjYgbXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX01QQ19BQ0spXFxuIDk0OTpcXHRcXHRcXHRcXHRnb3RvIHNldF9mdWxseV9lc3RhYmxpc2hlZDtcXG4gOTUwOlxcdFxcdFxcdHJldHVybiBzdWJmbG93LVxcdTAwM2VtcF9jYXBhYmxlO1xcbiA5NTE6XFx0XFx0fVxcbiA5NTI6XFx0XFxuIDk1MzpcXHRcXHRpZiAoc3ViZmxvdy1cXHUwMDNlcmVtb3RlX2tleV92YWxpZCBcXHUwMDI2XFx1MDAyNlxcbiA5NTQ6XFx0XFx0ICAgICgoKG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9EU1MpIFxcdTAwMjZcXHUwMDI2IG1wX29wdC1cXHUwMDNldXNlX2FjaykgfHxcXG4gOTU1OlxcdFxcdCAgICAgKChtcF9vcHQtXFx1MDAzZXN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfQUREX0FERFIpIFxcdTAwMjZcXHUwMDI2XFxuIDk1NjpcXHRcXHQgICAgICAoIW1wX29wdC1cXHUwMDNlZWNobyB8fCBzdWJmbG93LVxcdTAwM2VtcF9qb2luKSkpKSB7XFxuIDk1NzpcXHRcXHRcXHQvKiBzdWJmbG93cyBhcmUgZnVsbHkgZXN0YWJsaXNoZWQgYXMgc29vbiBhcyB3ZSBnZXQgYW55XFxuIDk1ODpcXHRcXHRcXHQgKiBhZGRpdGlvbmFsIGFjaywgaW5jbHVkaW5nIEFERF9BRERSLlxcbiA5NTk6XFx0XFx0XFx0ICovXFxuIDk2MDpcXHRcXHRcXHRnb3RvIHNldF9mdWxseV9lc3RhYmxpc2hlZDtcXG4gOTYxOlxcdFxcdH1cXG4gOTYyOlxcdFxcbiA5NjM6XFx0XFx0LyogSWYgdGhlIGZpcnN0IGVzdGFibGlzaGVkIHBhY2tldCBkb2VzIG5vdCBjb250YWluIE1QX0NBUEFCTEUgKyBkYXRhXFxuIDk2NDpcXHRcXHQgKiB0aGVuIGZhbGxiYWNrIHRvIFRDUC4gRmFsbGJhY2sgc2NlbmFyaW9zIHJlcXVpcmVzIGEgcmVzZXQgZm9yXFxuIDk2NTpcXHRcXHQgKiBNUF9KT0lOIHN1YmZsb3dzLlxcbiA5NjY6XFx0XFx0ICovXFxuIDk2NzpcXHRcXHRpZiAoIShtcF9vcHQtXFx1MDAzZXN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05TX01QVENQX01QQykpIHtcXG4gOTY4OlxcdFxcdFxcdGlmIChzdWJmbG93LVxcdTAwM2VtcF9qb2luKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MzowNi4yOTE0MjMzOTJaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTQ3MzU0OTExNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1QVENQIERTUyBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBjaGVja19mdWxseV9lc3RhYmxpc2hlZGAgZnVuY3Rpb24uIEl0IHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2g7IGl0J3MgY2hlY2tpbmcgYG1wX29wdC1cdTAwM2VzdWJvcHRpb25zYC4gQW5kLCBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgc2V0IHdpdGhpbiB0aG9zZSBzdWJvcHRpb25zLCBpdCdzIGNoZWNraW5nIGBtcF9vcHQtXHUwMDNldXNlX2Fja2AuIFRoaXMgc2VlbXMgbG9naWNhbCwgYnV0IGl0IGltbWVkaWF0ZWx5IHJhaXNlcyBhIGNvbmNlcm46IGlmIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBwcmVzZW50LCBzaG91bGRuJ3QgYG1wdGNwX3BhcnNlX29wdGlvbmAgaGF2ZSAqZ3VhcmFudGVlZCogdGhhdCBgdXNlX2Fja2AgaXMgcG9wdWxhdGVkPyBUaGUgbG9naWMgc2VlbXMgdG8gcmVseSBvbiB0aGF0IGFzc3VtcHRpb24uXG5cblRoZW4sIHRoZSByZWQgZmxhZyB3ZW50IHVwLiBXaGF0IGlmIGBtcHRjcF9wYXJzZV9vcHRpb25gIGVuY291bnRlcnMgYSBtYWxmb3JtZWQgcGFja2V0IGNvbnRhaW5pbmcgYE1QVENQT1BUX0RTU2A/IElzIHRoZXJlIGFueSBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcgaW4gcGxhY2UgdG8gaGFuZGxlIHRoYXQgY2FzZT8gVGhpcyBjb3VsZCBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvciBvciwgd29yc2UsIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBpZiB0aGUgY29kZSBwcm9jZWVkcyB3aXRoIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgZGF0YS4gV2UgKmFic29sdXRlbHkqIGNhbid0IGxldCB0aGF0IGhhcHBlbi4gVGhlcmVmb3JlLCBJIG5lZWQgdG8gZGlnIGludG8gYG1wdGNwX3BhcnNlX29wdGlvbmAgdG8gdmVyaWZ5IHByZWNpc2VseSBob3cgaXQgaGFuZGxlcyB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGFuZCB0aGUgc3Vic2VxdWVudCBwb3B1bGF0aW9uIG9mIGB1c2VfYWNrYC4gSSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb2RlIGlzIHJvYnVzdCBhbmQgaGFuZGxlcyBpbnZhbGlkIGlucHV0IGdyYWNlZnVsbHkuIFRoaXMgbmVlZHMgdG8gYmUgY2hlY2tlZCwgcmlnaHQgbm93LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDM3MCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQzOjExLjc2NDk3NDY0NloiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjc4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNTUsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTU1OlxcdFxcdGNhc2UgTVBUQ1BPUFRfRFNTOlxcbiAxNTY6XFx0XFx0XFx0LyogQ2FuIGJlIHVzZWQgd2l0aCBhIHJlc3RyaWN0ZWQgbnVtYmVyIG9mIG90aGVyIG9wdGlvbnMgKi9cXG4gMTU3OlxcdFxcdFxcdGlmICgobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfFxcbiAxNTg6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcXG4gMTU5OlxcdFxcdFxcdFxcdFxcdFxcdCAgICBPUFRJT05fTVBUQ1BfUFJJTyB8XFxuIDE2MDpcXHRcXHRcXHRcXHRcXHRcXHQgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKVxcbiAxNjE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2MjpcXHRcXG4gMTYzOlxcdFxcdFxcdHByX2RlYnVnKFxcXCJEU1NcXFxcblxcXCIpO1xcbiAxNjQ6XFx0XFx0XFx0cHRyKys7XFxuIDE2NTpcXHRcXG4gMTY2OlxcdFxcdFxcdGZsYWdzID0gKCpwdHIrKykgXFx1MDAyNiBNUFRDUF9EU1NfRkxBR19NQVNLO1xcbiAxNjc6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2Vkc242NCA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19EU042NCkgIT0gMDtcXG4gMTY4OlxcdFxcdFxcdG1wX29wdC1cXHUwMDNldXNlX21hcCA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19IQVNfTUFQKSAhPSAwO1xcbiAxNjk6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VhY2s2NCA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19BQ0s2NCkgIT0gMDtcXG4gMTcwOlxcdFxcdFxcdG1wX29wdC1cXHUwMDNldXNlX2FjayA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19IQVNfQUNLKTtcXG4gMTcxOlxcdFxcbiAxNzI6XFx0XFx0XFx0ZXhwZWN0ZWRfb3BzaXplID0gVENQT0xFTl9NUFRDUF9EU1NfQkFTRTtcXG4gMTczOlxcdFxcbiAxNzQ6XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNldXNlX2Fjaykge1xcbiAxNzU6XFx0XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNlYWNrNjQpXFxuIDE3NjpcXHRcXHRcXHRcXHRcXHRleHBlY3RlZF9vcHNpemUgKz0gVENQT0xFTl9NUFRDUF9EU1NfQUNLNjQ7XFxuIDE3NzpcXHRcXHRcXHRcXHRlbHNlXFxuIDE3ODpcXHRcXHRcXHRcXHRcXHRleHBlY3RlZF9vcHNpemUgKz0gVENQT0xFTl9NUFRDUF9EU1NfQUNLMzI7XFxuIDE3OTpcXHRcXHRcXHR9XFxuIDE4MDpcXHRcXG4gMTgxOlxcdFxcdFxcdGlmIChtcF9vcHQtXFx1MDAzZXVzZV9tYXApIHtcXG4gMTgyOlxcdFxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZGF0YV9maW4gPSAoZmxhZ3MgXFx1MDAyNiBNUFRDUF9EU1NfREFUQV9GSU4pICE9IDA7XFxuIDE4MzpcXHRcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2Vkc242NClcXG4gMTg0OlxcdFxcdFxcdFxcdFxcdGV4cGVjdGVkX29wc2l6ZSArPSBUQ1BPTEVOX01QVENQX0RTU19NQVA2NDtcXG4gMTg1OlxcdFxcdFxcdFxcdGVsc2VcXG4gMTg2OlxcdFxcdFxcdFxcdFxcdGV4cGVjdGVkX29wc2l6ZSArPSBUQ1BPTEVOX01QVENQX0RTU19NQVAzMjtcXG4gMTg3OlxcdFxcdFxcdH1cXG4gMTg4OlxcdFxcbiAxODk6XFx0XFx0XFx0cHJfZGVidWcoXFxcImRhdGFfZmluPSVkIGRzbjY0PSVkIHVzZV9tYXA9JWQgYWNrNjQ9JWQgdXNlX2Fjaz0lZFxcXFxuXFxcIixcXG4gMTkwOlxcdFxcdFxcdFxcdCBtcF9vcHQtXFx1MDAzZWRhdGFfZmluLCBtcF9vcHQtXFx1MDAzZWRzbjY0LFxcbiAxOTE6XFx0XFx0XFx0XFx0IG1wX29wdC1cXHUwMDNldXNlX21hcCwgbXBfb3B0LVxcdTAwM2VhY2s2NCxcXG4gMTkyOlxcdFxcdFxcdFxcdCBtcF9vcHQtXFx1MDAzZXVzZV9hY2spO1xcbiAxOTM6XFx0XFxuIDE5NDpcXHRcXHRcXHQvKiBBbHdheXMgcGFyc2UgYW55IGNzdW0gcHJlc2VuY2UgY29tYmluYXRpb24sIHdlIHdpbGwgZW5mb3JjZVxcbiAxOTU6XFx0XFx0XFx0ICogUkZDIDg2ODQgU2VjdGlvbiAzLjMuMCBjaGVja3MgbGF0ZXIgaW4gc3ViZmxvd19kYXRhX3JlYWR5XFxuIDE5NjpcXHRcXHRcXHQgKi9cXG4gMTk3OlxcdFxcdFxcdGlmIChvcHNpemUgIT0gZXhwZWN0ZWRfb3BzaXplIFxcdTAwMjZcXHUwMDI2XFxuIDE5ODpcXHRcXHRcXHQgICAgb3BzaXplICE9IGV4cGVjdGVkX29wc2l6ZSArIFRDUE9MRU5fTVBUQ1BfRFNTX0NIRUNLU1VNKVxcbiAxOTk6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDIwMDpcXHRcXG4gMjAxOlxcdFxcdFxcdG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyB8PSBPUFRJT05fTVBUQ1BfRFNTO1xcbiAyMDI6XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNldXNlX2Fjaykge1xcbiAyMDM6XFx0XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNlYWNrNjQpIHtcXG4gMjA0OlxcdFxcdFxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZGF0YV9hY2sgPSBnZXRfdW5hbGlnbmVkX2JlNjQocHRyKTtcXG4gMjA1OlxcdFxcdFxcdFxcdFxcdHB0ciArPSA4O1xcbiAyMDY6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4gMjA3OlxcdFxcdFxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZGF0YV9hY2sgPSBnZXRfdW5hbGlnbmVkX2JlMzIocHRyKTtcXG4gMjA4OlxcdFxcdFxcdFxcdFxcdHB0ciArPSA0O1xcbiAyMDk6XFx0XFx0XFx0XFx0fVxcbiAyMTA6XFx0XFxuIDIxMTpcXHRcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwiZGF0YV9hY2s9JWxsdVxcXFxuXFxcIiwgbXBfb3B0LVxcdTAwM2VkYXRhX2Fjayk7XFxuIDIxMjpcXHRcXHRcXHR9XFxuIDIxMzpcXHRcXG4gMjE0OlxcdFxcdFxcdGlmIChtcF9vcHQtXFx1MDAzZXVzZV9tYXApIHtcXG4gMjE1OlxcdFxcdFxcdFxcdGlmIChtcF9vcHQtXFx1MDAzZWRzbjY0KSB7XFxuIDIxNjpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWRhdGFfc2VxID0gZ2V0X3VuYWxpZ25lZF9iZTY0KHB0cik7XFxuIDIxNzpcXHRcXHRcXHRcXHRcXHRwdHIgKz0gODtcXG4gMjE4OlxcdFxcdFxcdFxcdH0gZWxzZSB7XFxuIDIxOTpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWRhdGFfc2VxID0gZ2V0X3VuYWxpZ25lZF9iZTMyKHB0cik7XFxuIDIyMDpcXHRcXHRcXHRcXHRcXHRwdHIgKz0gNDtcXG4gMjIxOlxcdFxcdFxcdFxcdH1cXG4gMjIyOlxcdFxcbiAyMjM6XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VzdWJmbG93X3NlcSA9IGdldF91bmFsaWduZWRfYmUzMihwdHIpO1xcbiAyMjQ6XFx0XFx0XFx0XFx0cHRyICs9IDQ7XFxuIDIyNTpcXHRcXG4gMjI2OlxcdFxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZGF0YV9sZW4gPSBnZXRfdW5hbGlnbmVkX2JlMTYocHRyKTtcXG4gMjI3OlxcdFxcdFxcdFxcdHB0ciArPSAyO1xcbiAyMjg6XFx0XFxuIDIyOTpcXHRcXHRcXHRcXHRpZiAob3BzaXplID09IGV4cGVjdGVkX29wc2l6ZSArIFRDUE9MRU5fTVBUQ1BfRFNTX0NIRUNLU1VNKSB7XFxuIDIzMDpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZXN1Ym9wdGlvbnMgfD0gT1BUSU9OX01QVENQX0NTVU1SRVFEO1xcbiAyMzE6XFx0XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2Vjc3VtID0gZ2V0X3VuYWxpZ25lZCgoX19mb3JjZSBfX3N1bTE2ICopcHRyKTtcXG4gMjMyOlxcdFxcdFxcdFxcdFxcdHB0ciArPSAyO1xcbiAyMzM6XFx0XFx0XFx0XFx0fVxcbiAyMzQ6XFx0XFxuIDIzNTpcXHRcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwiZGF0YV9zZXE9JWxsdSBzdWJmbG93X3NlcT0ldSBkYXRhX2xlbj0ldSBjc3VtPSVkOiV1XFxcXG5cXFwiLFxcbiAyMzY6XFx0XFx0XFx0XFx0XFx0IG1wX29wdC1cXHUwMDNlZGF0YV9zZXEsIG1wX29wdC1cXHUwMDNlc3ViZmxvd19zZXEsXFxuIDIzNzpcXHRcXHRcXHRcXHRcXHQgbXBfb3B0LVxcdTAwM2VkYXRhX2xlbiwgISEobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0NTVU1SRVFEKSxcXG4gMjM4OlxcdFxcdFxcdFxcdFxcdCBtcF9vcHQtXFx1MDAzZWNzdW0pO1xcbiAyMzk6XFx0XFx0XFx0fVxcbiAyNDA6XFx0XFxuIDI0MTpcXHRcXHRcXHRicmVhaztcXG4gMjQyOlxcdFxcbiAyNDM6XFx0XFx0Y2FzZSBNUFRDUE9QVF9BRERfQUREUjpcXG4gMjQ0OlxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZWNobyA9ICgqcHRyKyspIFxcdTAwMjYgTVBUQ1BfQUREUl9FQ0hPO1xcbiAyNDU6XFx0XFx0XFx0aWYgKCFtcF9vcHQtXFx1MDAzZWVjaG8pIHtcXG4gMjQ2OlxcdFxcdFxcdFxcdGlmIChvcHNpemUgPT0gVENQT0xFTl9NUFRDUF9BRERfQUREUiB8fFxcbiAyNDc6XFx0XFx0XFx0XFx0ICAgIG9wc2l6ZSA9PSBUQ1BPTEVOX01QVENQX0FERF9BRERSX1BPUlQpXFxuIDI0ODpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWFkZHIuZmFtaWx5ID0gQUZfSU5FVDtcXG4gMjQ5OlxcdCNpZiBJU19FTkFCTEVEKENPTkZJR19NUFRDUF9JUFY2KVxcbiAyNTA6XFx0XFx0XFx0XFx0ZWxzZSBpZiAob3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFI2IHx8XFxuIDI1MTpcXHRcXHRcXHRcXHRcXHQgb3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFI2X1BPUlQpXFxuIDI1MjpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWFkZHIuZmFtaWx5ID0gQUZfSU5FVDY7XFxuIDI1MzpcXHQjZW5kaWZcXG4gMjU0OlxcdFxcdFxcdFxcdGVsc2VcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDM6MTEuNzY1MTAzNzU2WiIsIlNlcSI6NDMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyOTY4NTExNDMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk1QVENQIERTUyBPcHRpb24gUGFyc2luZzogUG90ZW50aWFsIEZsYXcqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBtcHRjcF9wYXJzZV9vcHRpb25gIGZ1bmN0aW9uIGFuZCBzb21ldGhpbmcncyBidWdnaW5nIG1lLiBTcGVjaWZpY2FsbHksIEknbSBub3RpY2luZyB0aGUgb3JkZXIgb2Ygb3BlcmF0aW9ucyB3aGVuIGhhbmRsaW5nIHRoZSBEU1MgKERhdGEgU2VxdWVuY2UgU2l6ZSkgb3B0aW9uLiBJdCBsb29rcyBsaWtlIGl0J3Mgc2V0dGluZyB0aGUgYG1wX29wdC1cdTAwM2Vkc242NGAsIGBtcF9vcHQtXHUwMDNldXNlX21hcGAsIGBtcF9vcHQtXHUwMDNlYWNrNjRgLCBhbmQgYG1wX29wdC1cdTAwM2V1c2VfYWNrYCBmbGFncyAqYmVmb3JlKiBpdCBhY3R1YWxseSB2YWxpZGF0ZXMgdGhlIG9wdGlvbiBzaXplIChgb3BzaXplYCkuXG5cblRoZSBjb2RlIHB1bGxzIHRoZSBmbGFncywgc2V0cyB0aGUgYml0ZmllbGRzIGluIGBtcF9vcHRgLCBhbmQgKnRoZW4qIGNoZWNrcyBgb3BzaXplYC4gSWYgdGhlIHNpemUgaXMgaW5jb3JyZWN0LCB0aGUgZnVuY3Rpb24gYnJlYWtzIG91dCBvZiB0aGUgcGFyc2luZyBsb29wLiBUaGlzIG1lYW5zIHRoYXQgaWYgYG9wc2l6ZWAgaXMgd3JvbmcsIGFuZCB0aGUgRFNTIG9wdGlvbiBpcyBpbnZhbGlkLCB0aG9zZSBmbGFncyBsaWtlIGBtcF9vcHQtXHUwMDNldXNlX2Fja2AgY291bGQgYmUgc2V0IHRvIDEsIGJ1dCB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgaW4gYG1wX29wdC1cdTAwM2VzdWJvcHRpb25zYCB3b3VsZCAqbm90KiBiZSBzZXQuXG5cblNpbmNlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCAqb25seSogY2hlY2tzIGBtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTU2AgdG8gZGV0ZXJtaW5lIGlmIERTUyBmaWVsZHMgc2hvdWxkIGJlIHByb2Nlc3NlZCwgaXQgd291bGQgaWdub3JlIGFueSBEU1MgaW5mb3JtYXRpb24gaWYgdGhlIG9wdGlvbiBzaXplIGlzIGludmFsaWQuIFRoYXQgc2VlbXMuLi4gb2theSwgZnVuY3Rpb25hbGx5LCBidXQgaXQgZGlkIG1ha2UgbWUgd29uZGVyIGlmIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IG1pZ2h0IGJlIGEgcG90ZW50aWFsIGlzc3VlIGhlcmUuXG5cbk5vdywgdGhhdCBwYXRjaCBhZGRzIGEgY2hlY2s6XG5gYGBjXG4gICAgICAgIGNhc2UgTVBUQ1BPUFRfRFNTOlxuICAgICAgICAgICAgICAgIC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG4gICAgICAgICAgICAgICAgaWYgKChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTl9NUFRDUF9QUklPIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5gYGBcblxuVGhpcyBuZXcgY2hlY2sgaXMgZXZlbiBtb3JlIGNvbmNlcm5pbmcuIElmIHRoaXMgYnJlYWtzLCB0aGUgb3B0aW9uIGdldHMgZHJvcHBlZCBiZWZvcmUgc2V0dGluZyAqYW55KiBvZiB0aGUgRFNTIGZpZWxkcy4gU28sIHBvdGVudGlhbGx5LCB3ZSBjb3VsZCBoYXZlIGFuIGludmFsaWQgc2l0dWF0aW9uLCB3aGVyZSBhbiBgbXBfb3B0YCBzdHJ1Y3R1cmUgZ2V0cyB1c2VkIGRvd25zdHJlYW0gYW5kIHNvbWUgZmllbGRzIGFyZSB1bmluaXRpYWxpemVkLiBBbmQgSSB0aGluayB0aGF0J3Mgd2hlcmUgSSBuZWVkIHRvIGNoZWNrLlxuXG5MZXQgbWUgdHJhY2UgYmFjayB0byBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFnYWluLiBPa2F5LCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgZGVjbGFyZXMgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtgIG9uIHRoZSBzdGFjaywgd2hpY2ggaXMgZ29vZC4gSXQgY2FsbHMgYG1wdGNwX2dldF9vcHRpb25zYCwgcGFzc2luZyB0aGlzIHN0cnVjdC4gQ3J1Y2lhbGx5LCBgbXB0Y3BfZ2V0X29wdGlvbnNgICp6ZXJvZXMqIGBtcF9vcHQuc3RhdHVzYCBhdCB0aGUgYmVnaW5uaW5nLiBUaGF0J3MgZ29vZDsgYW55IGZsYWdzIG5vdCBzZXQgYnkgYSB2YWxpZCBvcHRpb24gc2hvdWxkIGJlIGNsZWFyZWQuIEFuZCBhZnRlciB6ZXJvaW5nIHRoaXMgc3RydWN0LCBpdCBzdGFydHMgcGFyc2luZyBvcHRpb25zLiBJZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGlzIHBhcnNlZCBjb3JyZWN0bHksIHRoZW4gYG1wX29wdC5kYXRhX2Fja2AsIGBtcF9vcHQuZGF0YV9zZXFgLCBldGMuIGFyZSBwb3B1bGF0ZWQuIEJ1dCBpZiBpdCdzIG5vdCBwYXJzZWQgY29ycmVjdGx5LCB0aG9zZSBmaWVsZHMgcmVtYWluICp1bmluaXRpYWxpemVkKi5cblxuSG93ZXZlciwgKmJlZm9yZSogdGhvc2UgYGRhdGFfYWNrYC9gZGF0YV9zZXFgIGZpZWxkcyBhcmUgcmVhZCwgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGNoZWNrcyBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgc2V0IGluIGBtcF9vcHQuc3Vib3B0aW9uc2AuIElmIGl0J3Mgbm90IHNldCwgaXQgZG9lc24ndCB0cnkgdG8gYWNjZXNzIHRoZW0uIFNvIHRoZSB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgKm9ubHkqIHVzZWQgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHNldC4gT2theSwgdGhhdCBzb3VuZHMgbGlrZSBpdCBzaG91bGQgYmUgc2FmZS4gSSBzdGlsbCBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IHRoaXMgaXMgdHJ1ZSBpbiBhbGwgY2FzZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NTY3LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Nzc5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDM6MjQuNzMzNjE4MTg2WiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4MjcyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyMTAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEyMTA6XFx0XFx0XFx0aWYgKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX1JTVCkge1xcbjEyMTE6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfc2VlbiA9IDE7XFxuMTIxMjpcXHRcXHRcXHRcXHRzdWJmbG93LVxcdTAwM2VyZXNldF9yZWFzb24gPSBtcF9vcHQucmVzZXRfcmVhc29uO1xcbjEyMTM6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfdHJhbnNpZW50ID0gbXBfb3B0LnJlc2V0X3RyYW5zaWVudDtcXG4xMjE0OlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFJTVFJYKTtcXG4xMjE1OlxcdFxcdFxcdH1cXG4xMjE2OlxcdFxcbjEyMTc6XFx0XFx0XFx0aWYgKCEobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfRFNTKSlcXG4xMjE4OlxcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbjEyMTk6XFx0XFx0fVxcbjEyMjA6XFx0XFxuMTIyMTpcXHRcXHQvKiB3ZSBjYW4ndCB3YWl0IGZvciByZWN2bXNnKCkgdG8gdXBkYXRlIHRoZSBhY2tfc2VxLCBvdGhlcndpc2VcXG4xMjIyOlxcdFxcdCAqIG1vbm9kaXJlY3Rpb25hbCBmbG93cyB3aWxsIHN0dWNrXFxuMTIyMzpcXHRcXHQgKi9cXG4xMjI0OlxcdFxcdGlmIChtcF9vcHQudXNlX2FjaylcXG4xMjI1OlxcdFxcdFxcdGFja191cGRhdGVfbXNrKG1zaywgc2ssIFxcdTAwMjZtcF9vcHQpO1xcbjEyMjY6XFx0XFx0cndpbl91cGRhdGUobXNrLCBzaywgc2tiKTtcXG4xMjI3OlxcdFxcbjEyMjg6XFx0XFx0LyogWmVyby1kYXRhLWxlbmd0aCBwYWNrZXRzIGFyZSBkcm9wcGVkIGJ5IHRoZSBjYWxsZXIgYW5kIG5vdFxcbjEyMjk6XFx0XFx0ICogcHJvcGFnYXRlZCB0byB0aGUgTVBUQ1AgbGF5ZXIsIHNvIHRoZSBza2IgZXh0ZW5zaW9uIGRvZXMgbm90XFxuMTIzMDpcXHRcXHQgKiBuZWVkIHRvIGJlIGFsbG9jYXRlZCBvciBwb3B1bGF0ZWQuIERBVEFfRklOIGluZm9ybWF0aW9uLCBpZlxcbjEyMzE6XFx0XFx0ICogcHJlc2VudCwgbmVlZHMgdG8gYmUgdXBkYXRlZCBoZXJlIGJlZm9yZSB0aGUgc2tiIGlzIGZyZWVkLlxcbjEyMzI6XFx0XFx0ICovXFxuMTIzMzpcXHRcXHRpZiAoVENQX1NLQl9DQihza2IpLVxcdTAwM2VzZXEgPT0gVENQX1NLQl9DQihza2IpLVxcdTAwM2VlbmRfc2VxKSB7XFxuMTIzNDpcXHRcXHRcXHRpZiAobXBfb3B0LmRhdGFfZmluIFxcdTAwMjZcXHUwMDI2IG1wX29wdC5kYXRhX2xlbiA9PSAxIFxcdTAwMjZcXHUwMDI2XFxuMTIzNTpcXHRcXHRcXHQgICAgbXB0Y3BfdXBkYXRlX3Jjdl9kYXRhX2Zpbihtc2ssIG1wX29wdC5kYXRhX3NlcSwgbXBfb3B0LmRzbjY0KSlcXG4xMjM2OlxcdFxcdFxcdFxcdG1wdGNwX3NjaGVkdWxlX3dvcmsoKHN0cnVjdCBzb2NrICopbXNrKTtcXG4xMjM3OlxcdFxcbjEyMzg6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuMTIzOTpcXHRcXHR9XFxuMTI0MDpcXHRcXG4xMjQxOlxcdFxcdG1wZXh0ID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX01QVENQKTtcXG4xMjQyOlxcdFxcdGlmICghbXBleHQpXFxuMTI0MzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuMTI0NDpcXHRcXG4xMjQ1OlxcdFxcdG1lbXNldChtcGV4dCwgMCwgc2l6ZW9mKCptcGV4dCkpO1xcbjEyNDY6XFx0XFxuMTI0NzpcXHRcXHRpZiAobGlrZWx5KG1wX29wdC51c2VfbWFwKSkge1xcbjEyNDg6XFx0XFx0XFx0aWYgKG1wX29wdC5tcGNfbWFwKSB7XFxuMTI0OTpcXHRcXHRcXHRcXHQvKiB0aGlzIGlzIGFuIE1QX0NBUEFCTEUgY2FycnlpbmcgTVBUQ1AgZGF0YVxcbjEyNTA6XFx0XFx0XFx0XFx0ICogd2Uga25vdyB0aGlzIG1hcCB0aGUgZmlyc3QgY2h1bmsgb2YgZGF0YVxcbjEyNTE6XFx0XFx0XFx0XFx0ICovXFxuMTI1MjpcXHRcXHRcXHRcXHRtcHRjcF9jcnlwdG9fa2V5X3NoYShzdWJmbG93LVxcdTAwM2VyZW1vdGVfa2V5LCBOVUxMLFxcbjEyNTM6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2bXBleHQtXFx1MDAzZWRhdGFfc2VxKTtcXG4xMjU0OlxcdFxcdFxcdFxcdG1wZXh0LVxcdTAwM2VkYXRhX3NlcSsrO1xcbjEyNTU6XFx0XFx0XFx0XFx0bXBleHQtXFx1MDAzZXN1YmZsb3dfc2VxID0gMTtcXG4xMjU2OlxcdFxcdFxcdFxcdG1wZXh0LVxcdTAwM2Vkc242NCA9IDE7XFxuMTI1NzpcXHRcXHRcXHRcXHRtcGV4dC1cXHUwMDNlbXBjX21hcCA9IDE7XFxuMTI1ODpcXHRcXHRcXHRcXHRtcGV4dC1cXHUwMDNlZGF0YV9maW4gPSAwO1xcbjEyNTk6XFx0XFx0XFx0fSBlbHNlIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDM6MjQuNzMzODAzNDg2WiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE5OTA5NTYwMDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkRTUyBPcHRpb24gUGFyc2luZzogQSBEZWVwIERpdmUgaW50byBQb3RlbnRpYWwgVnVsbmVyYWJpbGl0aWVzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIGFib3V0IGhvdyB0aGUgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGFuZCByZWxhdGVkIGRhdGEuIFNwZWNpZmljYWxseSwgdGhlIGZ1bmN0aW9uJ3MgbG9naWMgc2VlbXMgdG8gcmV0dXJuIGVhcmx5IGlmIGBPUFRJT05fTVBUQ1BfRFNTYCBpc24ndCBzZXQsIHdoaWNoIGFwcGVhcnMgdG8gYmUgYSBzYWZlZ3VhcmQgYWdhaW5zdCB1bmluaXRpYWxpemVkIHJlYWRzLiBJZiBgT1BUSU9OX01QVENQX0RTU2AgKmlzKiBzZXQsIHRoZW4gaXQgcHJvY2VlZHMgdG8gYWNjZXNzIGZpZWxkcyBsaWtlIGB1c2VfYWNrYCwgYGRhdGFfZmluYCwgYW5kIGBkYXRhX2xlbmAuXG5cbk15IGNvbmNlcm4gcmV2b2x2ZWQgYXJvdW5kIGhvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBtaWdodCBiZSBoYW5kbGVkIHdpdGhpbiBhIHNpbmdsZSBwYWNrZXQuIElmIG11bHRpcGxlIGBEU1NgIG9wdGlvbnMgZXhpc3QsIHRoZSBjdXJyZW50IHBhdGNoJ3MgZWFybHktZXhpdCBjaGVjayBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBiYXNlZCBvbiBvdGhlciBzZXQgc3Vib3B0aW9ucyBtaWdodCBjYXVzZSB0aGUgc2Vjb25kIGBEU1NgIHBhcnNpbmcgdG8gZmFpbC4gVGhpcyBjb3VsZCBsZWFkIHRvIGEgc2NlbmFyaW8gd2hlcmUgYE9QVElPTl9NUFRDUF9EU1NgIGlzbid0IHNldCwgYW5kIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCB1bmV4cGVjdGVkbHkgcmV0dXJucywgc2tpcHBpbmcgdGhlIGNydWNpYWwgRFNTIGZpZWxkIGluaXRpYWxpemF0aW9uLiBIb3dldmVyLCBvbiBmdXJ0aGVyIHJldmlldywgaWYgYSBgRFNTYCBvcHRpb24gaXMgcGFyc2VkIGFuZCB0aGVuIGEgYEZBU1RDTE9TRWAgb3B0aW9uLCB0aGUgY29kZSBzaG91bGQgc3RpbGwgaGFuZGxlIHRoZSBgRFNTYCBvcHRpb24gZGF0YSBjb3JyZWN0bHkuIFRoZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgY2hlY2tzIHNob3VsZCBwcmV2ZW50IHVuaW5pdGlhbGl6ZWQgcmVhZHMgb2YgdGhlIG5vdyBwb3B1bGF0ZWQgZGF0YS5cblxuQW5vdGhlciBwb3RlbnRpYWwgaXNzdWUgSSBjb25zaWRlcmVkIHdhcyBhIGBEU1NgIG9wdGlvbiBmYWlsaW5nIGVhcmx5IGluIGBtcHRjcF9wYXJzZV9vcHRpb25gLCBzcGVjaWZpY2FsbHkgaWYgYG9wc2l6ZWAgaXNuJ3Qgd2hhdCdzIGV4cGVjdGVkLiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIHBhcnNlciB3b3VsZCBicmVhayBlYXJseSwgYE9QVElPTl9NUFRDUF9EU1NgIHdvdWxkIG5vdCBiZSBzZXQsIGJ1dCBvdGhlciBzZWVtaW5nbHkgaW5pdGlhbGlzZWQgdmFyaWFibGVzIGNvdWxkIGhhdmUgYmVlbiBzZXQuIEhvd2V2ZXIsIGEgcXVpY2sgY2hlY2sgb2YgdGhlIGNvZGUgaW4gYG1wdGNwX2luY29taW5nX29wdGlvbnNgIHNob3dzIHRoYXQgdGhlIHJvdXRpbmUgd2lsbCByZXR1cm4gZWFybHkgaWYgaXQgZmluZHMgYE9QVElPTl9NUFRDUF9EU1NgIGlzIG5vdCBzZXQsIG1lYW5pbmcgbm8gdW5pbml0aWFsaXplZCByZWFkcyBoZXJlIGVpdGhlci5cblxuVGhlIGNlbnRyYWwgcXVlc3Rpb24gYmVjYW1lOiBJcyB0aGVyZSBhIHBhdGggd2hlcmUgYE9QVElPTl9NUFRDUF9EU1NgICppcyogc2V0LCBidXQgKnNvbWUqIG9mIHRoZSByZWxhdGVkIGZpZWxkcyByZW1haW4gdW5pbml0aWFsaXplZD8gSSBoYWQgdG8gdHJhY2UgdGhlIGluaXRpYWxpemF0aW9uIGxvZ2ljIHdpdGhpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYC4gSWYgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBpcyBwYXJzZWQgYW5kIHRoZSBvcHRpb24gc2l6ZSBpcyB2YWxpZCwgdGhlbiBgT1BUSU9OX01QVENQX0RTU2AgZ2V0cyBzZXQuIFdpdGhpbiB0aGF0IG9wdGlvbiBwYXJzaW5nIHJvdXRpbmUsIHRoZSBmaWVsZHMgYXJlIGNvbmRpdGlvbmFsbHkgcG9wdWxhdGVkIGJhc2VkIG9uIHdoZXRoZXIgYHVzZV9hY2tgIG9yIGB1c2VfbWFwYCBhcmUgc2V0LiBJZiBgdXNlX2Fja2AgaXMgdHJ1ZSwgaXQgcG9wdWxhdGVzIGBkYXRhX2Fja2A7IGlmIGB1c2VfbWFwYCBpcyB0cnVlLCB0aGVuIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGBkYXRhX2xlbmAsIGFuZCBgY3N1bWAgZ2V0IHBvcHVsYXRlZC4gQ29udmVyc2VseSwgaWYgZWl0aGVyIG9mIHRob3NlIGlzIGZhbHNlLCB0aGUgcmVzcGVjdGl2ZSBmaWVsZCByZW1haW5zIHVuaW5pdGlhbGl6ZWQuXG5cblRoZW4sIEkgbG9va2VkIGF0IGhvdyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgdXNlcyB0aG9zZSBmaWVsZHMuIEl0IHNlZW1zIHRoYXQgYHVzZV9hY2tgIGlzIGNoZWNrZWQgKmJlZm9yZSogYGRhdGFfYWNrYCBpcyBhY2Nlc3NlZCwgd2hpY2ggYXBwZWFycyBzYWZlLiBIb3dldmVyLCB0aGUgc3Vic2VxdWVudCB1c2Ugb2YgYG1wX29wdC5kYXRhX2ZpbmAsIGBtcF9vcHQuZGF0YV9sZW5gLCBhbmQgYG1wX29wdC5kYXRhX3NlcWAgcmFpc2VkIGFuIGltbWVkaWF0ZSBmbGFnLiBJIHF1ZXN0aW9uZWQgd2hldGhlciBgdXNlX21hcGAgd2FzIGFsc28gY2hlY2tlZCBiZWZvcmUgdGhlc2UgdmFsdWVzIHdlcmUgYWNjZXNzZWQuXG5cblRoYXQncyB3aGVuIEkgcmVhbGl6ZWQgdGhhdCBgZGF0YV9maW5gIGlzIGxpbmtlZCB0byBgdXNlX21hcGAhIGBtcF9vcHQuZGF0YV9maW5gIGlzIGFjdHVhbGx5IGEgYml0ZmllbGQsIGNsZWFyZWQgYnkgYG1wdGNwX2dldF9vcHRpb25zYCwgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsIGJlIHplcm8gaWYgYHVzZV9tYXBgIGlzIGZhbHNlLiBUaGVyZWZvcmUsIHRoZSBjb2RlIGBtcF9vcHQuZGF0YV9maW4gXHUwMDI2XHUwMDI2IC4uLmAgd2lsbCBldmFsdWF0ZSB0byBmYWxzZSwgbWVhbmluZyB0aGUgdW5pbml0aWFsaXplZCBgZGF0YV9sZW5gIGFuZCBgZGF0YV9zZXFgIGFyZSBub3QgcmVhZC4gRnVydGhlciBjb2RlIGNoZWNrcyBpbiB0aGUgXCJsaWtlbHlcIiBwYXRoLCB3aGVyZSBgdXNlX21hcGAgKmlzKiB0cnVlLCBzaG93IHRoYXQgZmllbGRzIGxpa2UgYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgYGRhdGFfbGVuYCwgYW5kIGBjc3VtYCBhcmUgY29ycmVjdGx5IGNoZWNrZWQgcHJpb3IgdG8gYW55IGFjY2Vzc2VzLlxuXG5UaGUgY29kZSBzZWVtcyByb2J1c3QuIEknbGwgbmVlZCB0byBkb3VibGUgY2hlY2sgb3RoZXIgYXJlYXMsIHNwZWNpZmljYWxseSB0aGUgYGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkYCBzZWN0aW9uLiBCdXQsIHNvIGZhciwgaXQgc2VlbXMgdGhhdCB0aGVyZSdzIG5vIG9idmlvdXMgcGF0aCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhlIGNoZWNrcyBpbiBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgYW5kIHRoZSBjb25kaXRpb25hbCBsb2dpYyBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBhcHBlYXIgdG8gcHJvdmlkZSBhZGVxdWF0ZSBwcm90ZWN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTAyMSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2NTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0Mzo0NC42NDMzNjc2MjdaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIyMjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTUzLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgOTUzOlxcdFxcdGlmIChzdWJmbG93LVxcdTAwM2VyZW1vdGVfa2V5X3ZhbGlkIFxcdTAwMjZcXHUwMDI2XFxuIDk1NDpcXHRcXHQgICAgKCgobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0RTUykgXFx1MDAyNlxcdTAwMjYgbXBfb3B0LVxcdTAwM2V1c2VfYWNrKSB8fFxcbiA5NTU6XFx0XFx0ICAgICAoKG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9BRERfQUREUikgXFx1MDAyNlxcdTAwMjZcXG4gOTU2OlxcdFxcdCAgICAgICghbXBfb3B0LVxcdTAwM2VlY2hvIHx8IHN1YmZsb3ctXFx1MDAzZW1wX2pvaW4pKSkpIHtcXG4gOTU3OlxcdFxcdFxcdC8qIHN1YmZsb3dzIGFyZSBmdWxseSBlc3RhYmxpc2hlZCBhcyBzb29uIGFzIHdlIGdldCBhbnlcXG4gOTU4OlxcdFxcdFxcdCAqIGFkZGl0aW9uYWwgYWNrLCBpbmNsdWRpbmcgQUREX0FERFIuXFxuIDk1OTpcXHRcXHRcXHQgKi9cXG4gOTYwOlxcdFxcdFxcdGdvdG8gc2V0X2Z1bGx5X2VzdGFibGlzaGVkO1xcbiA5NjE6XFx0XFx0fVxcbiA5NjI6XFx0XFxuIDk2MzpcXHRcXHQvKiBJZiB0aGUgZmlyc3QgZXN0YWJsaXNoZWQgcGFja2V0IGRvZXMgbm90IGNvbnRhaW4gTVBfQ0FQQUJMRSArIGRhdGFcXG4gOTY0OlxcdFxcdCAqIHRoZW4gZmFsbGJhY2sgdG8gVENQLiBGYWxsYmFjayBzY2VuYXJpb3MgcmVxdWlyZXMgYSByZXNldCBmb3JcXG4gOTY1OlxcdFxcdCAqIE1QX0pPSU4gc3ViZmxvd3MuXFxuIDk2NjpcXHRcXHQgKi9cXG4gOTY3OlxcdFxcdGlmICghKG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTlNfTVBUQ1BfTVBDKSkge1xcbiA5Njg6XFx0XFx0XFx0aWYgKHN1YmZsb3ctXFx1MDAzZW1wX2pvaW4pXFxuIDk2OTpcXHRcXHRcXHRcXHRnb3RvIHJlc2V0O1xcbiA5NzA6XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlbXBfY2FwYWJsZSA9IDA7XFxuIDk3MTpcXHRcXHRcXHRpZiAoIW1wdGNwX3RyeV9mYWxsYmFjayhzc2ssIE1QVENQX01JQl9NUENBUEFCTEVEQVRBRkFMTEJBQ0spKSB7XFxuIDk3MjpcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc3NrKSwgTVBUQ1BfTUlCX0ZBTExCQUNLRkFJTEVEKTtcXG4gOTczOlxcdFxcdFxcdFxcdGdvdG8gcmVzZXQ7XFxuIDk3NDpcXHRcXHRcXHR9XFxuIDk3NTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDk3NjpcXHRcXHR9XFxuIDk3NzpcXHRcXG4gOTc4OlxcdFxcdGlmICh1bmxpa2VseSghUkVBRF9PTkNFKG1zay1cXHUwMDNlcG0uc2VydmVyX3NpZGUpKSlcXG4gOTc5OlxcdFxcdFxcdHByX3dhcm5fb25jZShcXFwiYm9ndXMgbXBjIG9wdGlvbiBvbiBlc3RhYmxpc2hlZCBjbGllbnQgc2tcXFwiKTtcXG4gOTgwOlxcdFxcbiA5ODE6XFx0c2V0X2Z1bGx5X2VzdGFibGlzaGVkOlxcbiA5ODI6XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNlZGVueV9qb2luX2lkMClcXG4gOTgzOlxcdFxcdFxcdFdSSVRFX09OQ0UobXNrLVxcdTAwM2VwbS5yZW1vdGVfZGVueV9qb2luX2lkMCwgdHJ1ZSk7XFxuIDk4NDpcXHRcXG4gOTg1OlxcdFxcdG1wdGNwX2RhdGFfbG9jaygoc3RydWN0IHNvY2sgKiltc2spO1xcbiA5ODY6XFx0XFx0X19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkKG1zaywgc3ViZmxvdywgbXBfb3B0KTtcXG4gOTg3OlxcdFxcdG1wdGNwX2RhdGFfdW5sb2NrKChzdHJ1Y3Qgc29jayAqKW1zayk7XFxuIDk4ODpcXHRcXG4gOTg5OlxcdGNoZWNrX25vdGlmeTpcXG4gOTkwOlxcdFxcdC8qIGlmIHRoZSBzdWJmbG93IGlzIG5vdCBhbHJlYWR5IGxpbmtlZCBpbnRvIHRoZSBjb25uX2xpc3QsIHdlIGNhbid0XFxuIDk5MTpcXHRcXHQgKiBub3RpZnkgdGhlIFBNOiB0aGlzIHN1YmZsb3cgaXMgc3RpbGwgb24gdGhlIGxpc3RlbmVyIHF1ZXVlXFxuIDk5MjpcXHRcXHQgKiBhbmQgdGhlIFBNIHBvc3NpYmx5IGFjcXVpcmluZyB0aGUgc3ViZmxvdyBsb2NrIGNvdWxkIHJhY2Ugd2l0aFxcbiA5OTM6XFx0XFx0ICogdGhlIGxpc3RlbmVyIGNsb3NlXFxuIDk5NDpcXHRcXHQgKi9cXG4gOTk1OlxcdFxcdGlmIChsaWtlbHkoc3ViZmxvdy1cXHUwMDNlcG1fbm90aWZpZWQpIHx8IGxpc3RfZW1wdHkoXFx1MDAyNnN1YmZsb3ctXFx1MDAzZW5vZGUpKVxcbiA5OTY6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDk5NzpcXHRcXG4gOTk4OlxcdFxcdHN1YmZsb3ctXFx1MDAzZXBtX25vdGlmaWVkID0gMTtcXG4gOTk5OlxcdFxcdGlmIChzdWJmbG93LVxcdTAwM2VtcF9qb2luKSB7XFxuMTAwMDpcXHRcXHRcXHRjbGVhcl8zcmRhY2tfcmV0cmFuc21pc3Npb24oc3NrKTtcXG4xMDAxOlxcdFxcdFxcdG1wdGNwX3BtX3N1YmZsb3dfZXN0YWJsaXNoZWQobXNrKTtcXG4xMDAyOlxcdFxcdH0gZWxzZSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQzOjQ0LjY0MzU5MzUxN1oiLCJTZXEiOjQ3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDUyNjQ1NjAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyBjb2RlIHNuaXBwZXQsIGRpc3RpbGxlZCBpbnRvIGEgZmlyc3QtcGVyc29uIHN1bW1hcnksIGtlZXBpbmcgaW4gbWluZCBteSBleHBlcnQgdW5kZXJzdGFuZGluZzpcblxuKipBbmFseXppbmcgdGhlIFN1YmZsb3cgRXN0YWJsaXNobWVudCBDaGVjayoqXG5cblJpZ2h0LCBzbyBJJ20gbG9va2luZyBhdCBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgdGhlIGNvbmRpdGlvbnMgYXJvdW5kIHRoZSBNdWx0aWhvbWVkIFRDUCAoTVBUQ1ApIERhdGEgU2VxdWVuY2UgU3luY2hyb25pemF0aW9uIChEU1MpIG9wdGlvbiBhbmQgdGhlIGhhbmRsaW5nIG9mIGpvaW4gSURzLiBJIHNlZSB0aGF0IHRoZSBjb2RlIHNwZWNpZmljYWxseSBjaGVja3MgYG1wX29wdC1cdTAwM2V1c2VfYWNrYCAqb25seSogaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIGVuYWJsZWQuIFRoYXQncyBnb29kOyBpdCdzIGEgY29uZGl0aW9uYWwgZGVwZW5kZW5jeSwgd2hpY2ggaXMgZXhwZWN0ZWQuIFRoZSBBQ0sgdXNhZ2UgbGlrZWx5IGluZm9ybXMgaG93IERTUyBzeW5jaHJvbml6YXRpb24gaXMgbWFuYWdlZC5cblxuTmV4dCwgSSBzZWUgYSBjaGVjayBmb3IgYG1wX29wdC1cdTAwM2VkZW55X2pvaW5faWQwYC4gQWgsIHRoYXQncyBhIGJpdGZpZWxkIHdpdGhpbiBgc3RhdHVzYC4gS25vd2luZyB0aGF0IGBzdGF0dXNgIGlzIGxpa2VseSBhIHN0cnVjdHVyZSwgSSBxdWlja2x5IGluZmVyIHRoYXQgdGhpcyBiaXRmaWVsZCwgYW5kIHRoZXJlZm9yZSB0aGUgZW50aXJlIGBzdGF0dXNgIHN0cnVjdHVyZSwgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gemVybyBlbHNld2hlcmUuIFRoaXMgaXMgc3RhbmRhcmQgcHJhY3RpY2UgdG8gZW5zdXJlIHByZWRpY3RhYmxlIHN0YXJ0aW5nIHZhbHVlcy4gQSBiaXRmaWVsZCBzcGVjaWZpY2FsbHkgdGFyZ2V0cyB3aGV0aGVyIGpvaW5zIHdpdGggSUQgMCBzaG91bGQgYmUgZGVuaWVkIChvciwgYXQgbGVhc3QsIHdoZXRoZXIgdGhleSBjb250cmlidXRlIHRvIHRoZSAqZnVsbHkgZXN0YWJsaXNoZWQqIHN0YXR1cykuIEludGVyZXN0aW5nLlxuXG5GaW5hbGx5LCB0aGUgY29kZSB0aGVuIGNhbGxzIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQobXNrLCBzdWJmbG93LCBtcF9vcHQpO2AuIFRoYXQncyB0aGUgY29yZSBvZiB0aGUgbG9naWMsIHRoZSBjZW50cmFsIGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB0aGUgc3ViZmxvdydzIGVzdGFibGlzaG1lbnQgc3RhdHVzLiBUaGUgYXJndW1lbnRzIG1ha2Ugc2Vuc2U6IGBtc2tgIGlzIHByb2JhYmx5IHNvbWUga2luZCBvZiBtYXNrIHJlcHJlc2VudGluZyB0aGUgcmVsZXZhbnQgY3JpdGVyaWEsIGBzdWJmbG93YCBpcyBvYnZpb3VzbHkgdGhlIHN1YmZsb3cgaW4gcXVlc3Rpb24sIGFuZCBgbXBfb3B0YCBwcm92aWRlcyB0aGUgTVBUQ1Agb3B0aW9ucy4gSSBuZWVkIHRvIGRpZyBpbnRvIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRgIHRvIHVuZGVyc3RhbmQgdGhlIGFjdHVhbCBkZWNpc2lvbi1tYWtpbmcgcHJvY2Vzcy4gSSdtIGd1ZXNzaW5nIHRoYXQgZnVuY3Rpb24gd2lsbCB1c2UgdGhlc2UgcGFyYW1ldGVycyB0byBjaGVjayBmb3IgdGhpbmdzIGxpa2UgYWNrcywgc2VxdWVuY2UgbnVtYmVycywgYW5kIHBvdGVudGlhbGx5IGpvaW4gSURzIHRvIGRlY2lkZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBmdWxseSBlc3RhYmxpc2hlZCwgYW5kIGNhbiBiZSBjb25zaWRlcmVkIGFjdGl2ZSBpbiB0aGUgTVBUQ1AgZmxvdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI0OTUsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQzOjUwLjY5NjI0MjU2OVoiLCJTZXEiOjQ4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzY4OTQ1MTIzOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L21wdGNwL29wdGlvbnMuYz05MTk9c3RhdGljIGJvb2wgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zaywgc3RydWN0IHNvY2sgKnNzayxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtOTg1LVxcdG1wdGNwX2RhdGFfbG9jaygoc3RydWN0IHNvY2sgKiltc2spO1xcbm5ldC9tcHRjcC9vcHRpb25zLmM6OTg2OlxcdF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHN1YmZsb3csIG1wX29wdCk7XFxubmV0L21wdGNwL29wdGlvbnMuYy05ODctXFx0bXB0Y3BfZGF0YV91bmxvY2soKHN0cnVjdCBzb2NrICopbXNrKTtcXG4tLVxcbm5ldC9tcHRjcC9wcm90b2NvbC5jPTM1NTg9c3RydWN0IHNvY2sgKm1wdGNwX3NrX2Nsb25lX2luaXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxcbi0tXFxubmV0L21wdGNwL3Byb3RvY29sLmMtMzYzMC1cXHRpZiAobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX01QQ19BQ0spXFxubmV0L21wdGNwL3Byb3RvY29sLmM6MzYzMTpcXHRcXHRfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQobXNrLCBzdWJmbG93LCBtcF9vcHQpO1xcbm5ldC9tcHRjcC9wcm90b2NvbC5jLTM2MzItXFx0YmhfdW5sb2NrX3NvY2sobnNrKTtcXG4tLVxcbm5ldC9tcHRjcC9wcm90b2NvbC5oPTgwNz12b2lkIG1wdGNwX2dldF9hdmFpbGFibGVfc2NoZWR1bGVycyhjaGFyICpidWYsIHNpemVfdCBtYXhsZW4pO1xcbm5ldC9tcHRjcC9wcm90b2NvbC5oOjgwODp2b2lkIF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLFxcbm5ldC9tcHRjcC9wcm90b2NvbC5oLTgwOS1cXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyxcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9NzgwPXZvaWQgbXB0Y3Bfc3ViZmxvd19kcm9wX2N0eChzdHJ1Y3Qgc29jayAqc3NrKVxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy03OTYtXFxubmV0L21wdGNwL3N1YmZsb3cuYzo3OTc6dm9pZCBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTc5OC1cXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDM6NTQuMzg1NzA0MzM3WiIsIlNlcSI6NDksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY3OTY1OTQxNzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGFrZSBvbiB1bmRlcnN0YW5kaW5nIHRoaXMgYF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZGAgY29uY2VwdCwgZXhwbGFpbmVkIGFzIGlmIGl0J3MgbXkgb3duIHRob3VnaHQgcHJvY2VzczpcblxuKipNeSBEZWVwIERpdmUgaW50byBgX19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkYCoqXG5cbkFscmlnaHQsIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCB0aGlzIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRgIGZ1bmN0aW9uIHJlcHJlc2VudHMuIEl0IHNvdW5kcyBsaWtlIGEgY3JpdGljYWwgcG9pbnQgaW4gdGhlIE11bHRpUGF0aCBUQ1AgKE1QVENQKSBjb25uZWN0aW9uIGxpZmVjeWNsZSwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gaXRzIHN1YmZsb3dzLiBJJ20gYWxyZWFkeSB2aXN1YWxpemluZyB0aGUgTVBUQ1AgY29udHJvbCBwbGFuZSBhbmQgZGF0YSBwbGFuZSBpbnRlcmFjdGlvbnMgaW4gbXkgbWluZC4uLiBub3csIGxldCdzIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBmaXRzIGludG8gdGhlIHBpY3R1cmUuXG5cbk15IGluaXRpYWwgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gbGlrZWx5IHNpZ25hbHMgdGhhdCBhIHNwZWNpZmljIHN1YmZsb3csIHdpdGhpbiBhbiBvdmVyYWxsIE1QVENQIGNvbm5lY3Rpb24sIGhhcyBjb21wbGV0ZWQgaXRzIG5lY2Vzc2FyeSBoYW5kc2hha2luZyBvciBpbml0aWFsIHNldHVwIHBoYXNlLiBJdCdzIGVzc2VudGlhbGx5IHNheWluZywgXCJIZXksIHRoaXMgc3ViZmxvdyBpcyBub3cgcmVhZHkgdG8gY2FycnkgcmVhbCBkYXRhIVwiIFRoaW5rIG9mIGl0IGxpa2UgYSBncmVlbiBsaWdodCwgYSBnby1haGVhZCBzaWduYWwgZm9yIHRoYXQgcGFydGljdWxhciBwYXRoLlxuXG5HaXZlbiBteSB1bmRlcnN0YW5kaW5nIG9mIE1QVENQLCBJJ20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUgc3ViZmxvdydzIFRDUCBoYW5kc2hha2UgKGxpa2VseSBhIDMtd2F5IGhhbmRzaGFrZSkgaGFzIGJlZW4gY29tcGxldGVkLCBhbmQgcGVyaGFwcyBhZnRlciBhbnkgTVBUQ1Atc3BlY2lmaWMgc2lnbmFsaW5nIHJlcXVpcmVkIGZvciB0aGF0IHN1YmZsb3cgaXMgZG9uZS4gTWF5YmUgaXQgaW52b2x2ZXMgdGhlIGV4Y2hhbmdlIG9mIHNvbWUgTVBUQ1Agb3B0aW9ucyBvciBmbGFncy4gSSdtIHdvbmRlcmluZyBpZiBpdCBhbHNvIGludm9sdmVzIGFsbG9jYXRpbmcgc3BlY2lmaWMgcmVzb3VyY2VzIG9yIHVwZGF0aW5nIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyB0byB0cmFjayB0aGUgc3ViZmxvdydzIHN0YXRlLlxuXG5JdCdzIHRlbXB0aW5nIHRvIHRoaW5rIGFib3V0IHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcy4gQSBmdWxseSBlc3RhYmxpc2hlZCBzdWJmbG93IHJlcHJlc2VudHMgYSByZWxpYWJsZSBkYXRhIHBhdGguIFdoYXQgaGFwcGVucyBpZiB0aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZD8gSSBuZWVkIHRvIHRoaW5rIGFib3V0IGVycm9yIGNvbmRpdGlvbnMgYW5kIGhvdyB0aGUgTVBUQ1Agc3RhY2sgaGFuZGxlcyBzdWJmbG93IGZhaWx1cmVzIG9yIHJldHJhbnNtaXNzaW9ucy4gQWxzbywgSSdtIGFscmVhZHkgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGZ1bmN0aW9uIGNhbGwgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG92ZXJhbGwgTVBUQ1AgY29ubmVjdGlvbi4gQXJlIHRoZXJlIGRpZmZlcmVudCBhY3Rpb25zIG9yIGNhbGxiYWNrcyB0cmlnZ2VyZWQgYnkgdGhpcyBgX19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkYCBmdW5jdGlvbiBkZXBlbmRpbmcgb24gb3RoZXIgTVBUQ1AgcGFyYW1ldGVycyBvciB0aGUgc3RhdGUgb2Ygb3RoZXIgc3ViZmxvd3MgaW4gdGhlIGNvbm5lY3Rpb24/XG5cbkknbSBhbHNvIGN1cmlvdXMgYWJvdXQgd2hvIGNhbGxzIHRoaXMgZnVuY3Rpb24uIElzIGl0IHRoZSBNUFRDUCBzdGFjayBpbnRlcm5hbGx5LCBhZnRlciByZWNlaXZpbmcgY2VydGFpbiBwYWNrZXRzIG9yIGFja25vd2xlZGdpbmcgY2VydGFpbiBzaWduYWxzPyBPciBpcyB0aGlzIGZ1bmN0aW9uIHRyaWdnZXJlZCBpbiBzb21lIHdheSBmcm9tIGEgbG93ZXIgbGF5ZXIuIEFyZSB0aGVyZSBhbnkgY29uZGl0aW9ucyB0aGF0IGNhbiBwcmV2ZW50IHRoZSBmdW5jdGlvbiBmcm9tIGJlaW5nIGNhbGxlZD8gVGhlIHNvdXJjZSBjb2RlIHdpbGwgaG9wZWZ1bGx5IHNob3cgbWUhIFRpbWUgdG8gZGlnIGluIVxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzU1MCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ0OjAxLjE4MjMwMTA5NVoiLCJTZXEiOjUwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzk4NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL3N1YmZsb3cuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA3OTcsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA3OTc6XFx0dm9pZCBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcXG4gNzk4OlxcdFxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfc3ViZmxvd19jb250ZXh0ICpzdWJmbG93LFxcbiA3OTk6XFx0XFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpXFxuIDgwMDpcXHR7XFxuIDgwMTpcXHRcXHRzdWJmbG93X3NldF9yZW1vdGVfa2V5KG1zaywgc3ViZmxvdywgbXBfb3B0KTtcXG4gODAyOlxcdFxcdFdSSVRFX09OQ0Uoc3ViZmxvdy1cXHUwMDNlZnVsbHlfZXN0YWJsaXNoZWQsIHRydWUpO1xcbiA4MDM6XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZWZ1bGx5X2VzdGFibGlzaGVkLCB0cnVlKTtcXG4gODA0OlxcdH1cXG4gODA1OlxcdFxcbiA4MDY6XFx0c3RhdGljIHN0cnVjdCBzb2NrICpzdWJmbG93X3N5bl9yZWN2X3NvY2soY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxcbiA4MDc6XFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiA4MDg6XFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsXFxuIDgwOTpcXHRcXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBkc3RfZW50cnkgKmRzdCxcXG4gODEwOlxcdFxcdFxcdFxcdFxcdFxcdCAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxX3VuaGFzaCxcXG4gODExOlxcdFxcdFxcdFxcdFxcdFxcdCAgYm9vbCAqb3duX3JlcSxcXG4gODEyOlxcdFxcdFxcdFxcdFxcdFxcdCAgdm9pZCAoKm9wdF9jaGlsZF9pbml0KShzdHJ1Y3Qgc29jayAqbmV3c2ssXFxuIDgxMzpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgY29uc3Qgc3RydWN0IHNvY2sgKnNrKSlcXG4gODE0OlxcdHtcXG4gODE1OlxcdFxcdHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKmxpc3RlbmVyID0gbXB0Y3Bfc3ViZmxvd19jdHgoc2spO1xcbiA4MTY6XFx0XFx0c3RydWN0IG1wdGNwX3N1YmZsb3dfcmVxdWVzdF9zb2NrICpzdWJmbG93X3JlcTtcXG4gODE3OlxcdFxcdHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtcXG4gODE4OlxcdFxcdGJvb2wgZmFsbGJhY2ssIGZhbGxiYWNrX2lzX2ZhdGFsO1xcbiA4MTk6XFx0XFx0ZW51bSBza19yc3RfcmVhc29uIHJlYXNvbjtcXG4gODIwOlxcdFxcdHN0cnVjdCBtcHRjcF9zb2NrICpvd25lcjtcXG4gODIxOlxcdFxcdHN0cnVjdCBzb2NrICpjaGlsZDtcXG4gODIyOlxcdFxcbiA4MjM6XFx0XFx0cHJfZGVidWcoXFxcImxpc3RlbmVyPSVwLCByZXE9JXAsIGNvbm49JXBcXFxcblxcXCIsIGxpc3RlbmVyLCByZXEsIGxpc3RlbmVyLVxcdTAwM2Vjb25uKTtcXG4gODI0OlxcdFxcbiA4MjU6XFx0XFx0LyogQWZ0ZXIgY2hpbGQgY3JlYXRpb24gd2UgbXVzdCBsb29rIGZvciBNUEMgZXZlbiB3aGVuIG9wdGlvbnNcXG4gODI2OlxcdFxcdCAqIGFyZSBub3QgcGFyc2VkXFxuIDgyNzpcXHRcXHQgKi9cXG4gODI4OlxcdFxcdG1wX29wdC5zdWJvcHRpb25zID0gMDtcXG4gODI5OlxcdFxcbiA4MzA6XFx0XFx0LyogaG9wZWZ1bGx5IHRlbXBvcmFyeSBoYW5kbGluZyBmb3IgTVBfSk9JTitzeW5jb29raWUgKi9cXG4gODMxOlxcdFxcdHN1YmZsb3dfcmVxID0gbXB0Y3Bfc3ViZmxvd19yc2socmVxKTtcXG4gODMyOlxcdFxcdGZhbGxiYWNrX2lzX2ZhdGFsID0gdGNwX3JzayhyZXEpLVxcdTAwM2Vpc19tcHRjcCBcXHUwMDI2XFx1MDAyNiBzdWJmbG93X3JlcS1cXHUwMDNlbXBfam9pbjtcXG4gODMzOlxcdFxcdGZhbGxiYWNrID0gIXRjcF9yc2socmVxKS1cXHUwMDNlaXNfbXB0Y3A7XFxuIDgzNDpcXHRcXHRpZiAoZmFsbGJhY2spXFxuIDgzNTpcXHRcXHRcXHRnb3RvIGNyZWF0ZV9jaGlsZDtcXG4gODM2OlxcdFxcbiA4Mzc6XFx0XFx0LyogaWYgdGhlIHNrIGlzIE1QX0NBUEFCTEUsIHdlIHRyeSB0byBmZXRjaCB0aGUgY2xpZW50IGtleSAqL1xcbiA4Mzg6XFx0XFx0aWYgKHN1YmZsb3dfcmVxLVxcdTAwM2VtcF9jYXBhYmxlKSB7XFxuIDgzOTpcXHRcXHRcXHQvKiB3ZSBjYW4gcmVjZWl2ZSBhbmQgYWNjZXB0IGFuIGluLXdpbmRvdywgb3V0LW9mLW9yZGVyIHBrdCxcXG4gODQwOlxcdFxcdFxcdCAqIHdoaWNoIG1heSBub3QgY2FycnkgdGhlIE1QX0NBUEFCTEUgb3B0IGV2ZW4gb24gbXB0Y3AgZW5hYmxlZFxcbiA4NDE6XFx0XFx0XFx0ICogcGF0aHM6IGFsd2F5cyB0cnkgdG8gZXh0cmFjdCB0aGUgcGVlciBrZXksIGFuZCBmYWxsYmFja1xcbiA4NDI6XFx0XFx0XFx0ICogZm9yIHBhY2tldHMgbWlzc2luZyBpdC5cXG4gODQzOlxcdFxcdFxcdCAqIEV2ZW4gT29PIERTUyBwYWNrZXRzIGNvbWluZyBsZWdpdGx5IGFmdGVyIGRyb3BwZWQgb3JcXG4gODQ0OlxcdFxcdFxcdCAqIHJlb3JkZXJlZCBNUEMgd2lsbCBjYXVzZSBmYWxsYmFjaywgYnV0IHdlIGRvbid0IGhhdmUgb3RoZXJcXG4gODQ1OlxcdFxcdFxcdCAqIG9wdGlvbnMuXFxuIDg0NjpcXHRcXHRcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6MDEuMTgyNDQyMjQ0WiIsIlNlcSI6NTEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE1MTU5NDcwNzYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBQb3RlbnRpYWwgVW5pbml0aWFsaXplZCBNZW1vcnkgUmVhZHMgaW4gTVBUQ1AgT3B0aW9uIFByb2Nlc3NpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24gc3lzdGVtYXRpY2FsbHkuIEknbSBmb2N1c2luZyBvbiBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgd2l0aGluIHRoZSBNUFRDUCBvcHRpb24gaGFuZGxpbmcgbG9naWMsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGRpZmZlcmVudCBvcHRpb24gdHlwZXMuXG5cbk15IGluaXRpYWwgY29uY2VybiB3YXMgYXJvdW5kIGBzdWJmbG93X3NldF9yZW1vdGVfa2V5YCwgd2hpY2ggdXNlcyBgc25kcl9rZXlgIG9yIGByY3ZyX2tleWAuICBUaG9zZSBrZXlzIGFyZSBwb3B1bGF0ZWQgZHVyaW5nIHBhcnNpbmcgb2YgYE1QVENQT1BUX01QQ0FQQUJMRWAgb3IgYE1QVENQT1BUX01QSk9JTmAsIGFuZCBpZiBgT1BUSU9OX01QVENQX01QQ19BQ0tgIGlzIHNldCwgYHNuZHJfa2V5YCBpcyB1c2VkLiBCdXQgZG9lcyB0aGlzIHBhdGNoIGFmZmVjdCB0aG9zZT8gTm8uIFRoaXMgcGF0Y2ggb25seSBhZmZlY3RzIGBNUFRDUE9QVF9EU1NgLlxuXG5UaGUgY29kZSBzbmlwcGV0IGluIHF1ZXN0aW9uIGRlYWxzIHdpdGggYE1QVENQT1BUX0RTU2AuIFRoZSBgYnJlYWtgIHN0YXRlbWVudCB3aXRoaW4gdGhhdCBjYXNlIGlzIHdoYXQgSSBuZWVkIHRvIGZvY3VzIG9uLiBJdCBicmVha3MgaWYgYW55IHN1Yi1vcHRpb24gaXMgc2V0ICpvdGhlciogdGhhbiBgQUREX0FERFJgLCBgUk1fQUREUmAsIGBQUklPYCwgb3IgYEZBSUxgLlxuXG5NeSBpbW1lZGlhdGUgdGhvdWdodDogd2hhdCBpZiBgTVBUQ1BPUFRfQUREX0FERFJgIGlzIHNldCBidXQgYE1QVENQT1BUX0RTU2AgaXNuJ3Q/IExvb2tpbmcgYXQgdGhlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBmdW5jdGlvbiwgdGhhdCdzIGZpbmUuIFRoZSBgbXBfb3B0LmFkZHJgIGlzIHBvcHVsYXRlZCBjb3JyZWN0bHkgYnkgdGhlIGBNUFRDUE9QVF9BRERfQUREUmAgcGFyc2luZyBsb2dpYyAqYmVmb3JlKiBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgaXMgY2FsbGVkLiBTbyBubyBwcm9ibGVtcyB0aGVyZS5cblxuTm93LCB0byB0aGUgY29yZSBvZiB0aGUgY29uY2VybjogSWYgYE1QVENQT1BUX0RTU2AgYnJlYWtzIGVhcmx5LCB0aGUgZmllbGRzIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGBkYXRhX2xlbmAsIGBjc3VtYCwgYW5kIGBkYXRhX2Fja2Agd2lsbCByZW1haW4gdW5pbml0aWFsaXplZC4gSG93ZXZlciwgdGhvc2UgZmllbGRzIGFyZSBvbmx5IHJlYWQgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHNldCEgR29vZC5cblxuQSBuZXcgc2NlbmFyaW8gY29tZXMgdG8gbWluZDogV2hhdCBpZiBgTVBUQ1BPUFRfRFNTYCAqc3VjY2VlZHMqIGluIHBhcnNpbmcgZmlyc3QsIGFuZCB0aGVuIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGlzIHBhcnNlZD8gTm93LCBgbXBfb3B0LnN1Ym9wdGlvbnNgIHdvdWxkIGNvbnRhaW4gKmJvdGgqIGBPUFRJT05fTVBUQ1BfRFNTYCBhbmQgYE9QVElPTl9NUFRDUF9GQVNUQ0xPU0VgLiAgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIHdpbGwgc2VlIHRoYXQgYG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1NgLCBhbmQgYE9QVElPTl9NUFRDUF9GQVNUQ0xPU0VgIHdpbGwgYmUgcHJvY2Vzc2VkLiAgSSBzZWUsIGByY3ZyX2tleWAgaXMgcG9wdWxhdGVkIGJ5IGBNUFRDUE9QVF9GQVNUQ0xPU0VgLCB3aGljaCBpcyB0aGVuIHJlYWQuIFRoZSBzdWJzZXF1ZW50IGNoZWNrIGAhKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfRFNTKWAgZmFpbHMsIGFuZCB3ZSBwcm9jZWVkIHRvIHByb2Nlc3NpbmcgdGhlIERTUyBmaWVsZHMgd2hpY2ggd2VyZSBzZXQgYnkgRFNTIHNvIG5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMuXG5cblNvLCBsZXQncyBsb29rIGF0IGBNUFRDUE9QVF9GQVNUQ0xPU0VgLi4uIFNwZWNpZmljYWxseSwgd2hhdCBpZiB0aGUgYG9wc2l6ZWAgY2hlY2sgZmFpbHMgaW4gYE1QVENQT1BUX0ZBU1RDTE9TRWAgYW5kIHRoZSBicmVhayBpcyBoaXQ/IEluIHRoYXQgc2NlbmFyaW8sIGBPUFRJT05fTVBUQ1BfRkFTVENMT1NFYCBpc24ndCBzZXQuIFRodXMsIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCB3b24ndCBldmVuIHRyeSB0byBwcm9jZXNzIGl0LlxuXG5TbywgdGhlIGtleSBpcyB0byBlbnN1cmUgdGhhdCBhbGwgcmVhZCBmaWVsZHMgaGF2ZSB0aGVpciBjb3JyZXNwb25kaW5nIG9wdGlvbiBmbGFnIHNldC4gQmFzZWQgb24gdGhpcyBhbmFseXNpcywgSSdtIG5vdCBzZWVpbmcgYW55IGltbWVkaWF0ZSBjYXNlcyB3aGVyZSBhIGZpZWxkIGlzIHJlYWQgd2l0aG91dCBpdHMgYXNzb2NpYXRlZCBgT1BUSU9OX01QVENQXypgIGZsYWcgYmVpbmcgc2V0LiBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBhZ2Fpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjQ5OTYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDA0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6MTYuMzQxOTE3Mjc1WiIsIlNlcSI6NTIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4Nzk4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNzYsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNzY6XFx0XFx0XFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9GQVNUQ0xPU0UpIFxcdTAwMjZcXHUwMDI2XFxuMTE3NzpcXHRcXHRcXHQgICAgUkVBRF9PTkNFKG1zay1cXHUwMDNlbG9jYWxfa2V5KSA9PSBtcF9vcHQucmN2cl9rZXkpIHtcXG4xMTc4OlxcdFxcdFxcdFxcdFdSSVRFX09OQ0UobXNrLVxcdTAwM2VyY3ZfZmFzdGNsb3NlLCB0cnVlKTtcXG4xMTc5OlxcdFxcdFxcdFxcdG1wdGNwX3NjaGVkdWxlX3dvcmsoKHN0cnVjdCBzb2NrICopbXNrKTtcXG4xMTgwOlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBU1RDTE9TRVJYKTtcXG4xMTgxOlxcdFxcdFxcdH1cXG4xMTgyOlxcdFxcbjExODM6XFx0XFx0XFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9BRERfQUREUikgXFx1MDAyNlxcdTAwMjZcXG4xMTg0OlxcdFxcdFxcdCAgICBhZGRfYWRkcl9obWFjX3ZhbGlkKG1zaywgXFx1MDAyNm1wX29wdCkpIHtcXG4xMTg1OlxcdFxcdFxcdFxcdGlmICghbXBfb3B0LmVjaG8pIHtcXG4xMTg2OlxcdFxcdFxcdFxcdFxcdG1wdGNwX3BtX2FkZF9hZGRyX3JlY2VpdmVkKHNrLCBcXHUwMDI2bXBfb3B0LmFkZHIpO1xcbjExODc6XFx0XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX0FEREFERFIpO1xcbjExODg6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4xMTg5OlxcdFxcdFxcdFxcdFxcdG1wdGNwX3BtX2FkZF9hZGRyX2VjaG9lZChtc2ssIFxcdTAwMjZtcF9vcHQuYWRkcik7XFxuMTE5MDpcXHRcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfRUNIT0FERCk7XFxuMTE5MTpcXHRcXHRcXHRcXHR9XFxuMTE5MjpcXHRcXG4xMTkzOlxcdFxcdFxcdFxcdGlmIChtcF9vcHQuYWRkci5wb3J0KVxcbjExOTQ6XFx0XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX1BPUlRBREQpO1xcbjExOTU6XFx0XFx0XFx0fVxcbjExOTY6XFx0XFxuMTE5NzpcXHRcXHRcXHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfUk1fQUREUilcXG4xMTk4OlxcdFxcdFxcdFxcdG1wdGNwX3BtX3JtX2FkZHJfcmVjZWl2ZWQobXNrLCBcXHUwMDI2bXBfb3B0LnJtX2xpc3QpO1xcbjExOTk6XFx0XFxuMTIwMDpcXHRcXHRcXHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfUFJJTykge1xcbjEyMDE6XFx0XFx0XFx0XFx0bXB0Y3BfcG1fbXBfcHJpb19yZWNlaXZlZChzaywgbXBfb3B0LmJhY2t1cCk7XFxuMTIwMjpcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBQUklPUlgpO1xcbjEyMDM6XFx0XFx0XFx0fVxcbjEyMDQ6XFx0XFxuMTIwNTpcXHRcXHRcXHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfRkFJTCkge1xcbjEyMDY6XFx0XFx0XFx0XFx0bXB0Y3BfcG1fbXBfZmFpbF9yZWNlaXZlZChzaywgbXBfb3B0LmZhaWxfc2VxKTtcXG4xMjA3OlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBSUxSWCk7XFxuMTIwODpcXHRcXHRcXHR9XFxuMTIwOTpcXHRcXG4xMjEwOlxcdFxcdFxcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9SU1QpIHtcXG4xMjExOlxcdFxcdFxcdFxcdHN1YmZsb3ctXFx1MDAzZXJlc2V0X3NlZW4gPSAxO1xcbjEyMTI6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfcmVhc29uID0gbXBfb3B0LnJlc2V0X3JlYXNvbjtcXG4xMjEzOlxcdFxcdFxcdFxcdHN1YmZsb3ctXFx1MDAzZXJlc2V0X3RyYW5zaWVudCA9IG1wX29wdC5yZXNldF90cmFuc2llbnQ7XFxuMTIxNDpcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBSU1RSWCk7XFxuMTIxNTpcXHRcXHRcXHR9XFxuMTIxNjpcXHRcXG4xMjE3OlxcdFxcdFxcdGlmICghKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0RTUykpXFxuMTIxODpcXHRcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4xMjE5OlxcdFxcdH1cXG4xMjIwOlxcdFxcbjEyMjE6XFx0XFx0Lyogd2UgY2FuJ3Qgd2FpdCBmb3IgcmVjdm1zZygpIHRvIHVwZGF0ZSB0aGUgYWNrX3NlcSwgb3RoZXJ3aXNlXFxuMTIyMjpcXHRcXHQgKiBtb25vZGlyZWN0aW9uYWwgZmxvd3Mgd2lsbCBzdHVja1xcbjEyMjM6XFx0XFx0ICovXFxuMTIyNDpcXHRcXHRpZiAobXBfb3B0LnVzZV9hY2spXFxuMTIyNTpcXHRcXHRcXHRhY2tfdXBkYXRlX21zayhtc2ssIHNrLCBcXHUwMDI2bXBfb3B0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6MTYuMzQyMTA3MjM0WiIsIlNlcSI6NTMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3ODAwMTQ5NjU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk1QVENQIE9wdGlvbiBQcm9jZXNzaW5nIERlZXAgRGl2ZSoqXG5cbk9rYXksIHNvIEknbSBkaXZpbmcgaW50byB0aGlzIG5ldyBjaGVjayBmb3IgYE1QVENQT1BUX0RTU2AgYW5kIHRyeWluZyB0byBzdXNzIG91dCBhbnkgcG90ZW50aWFsIGlzc3Vlcy4gU3BlY2lmaWNhbGx5LCB0aGlzIG5ldyByZXN0cmljdGlvbjpcblxuYGBgY1xuXHRjYXNlIE1QVENQT1BUX0RTUzpcblx0XHQvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqL1xuXHRcdGlmICgobXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHxcblx0XHRcdFx0XHQgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfFxuXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfUFJJTyB8XG5cdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMClcblx0XHRcdGJyZWFrO1xuYGBgXG5cbkkgd2FzIGluaXRpYWxseSBjb25jZXJuZWQgdGhhdCBpZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGJyZWFrcyBlYXJseSBiZWNhdXNlIG9mIHRoZSBhYm92ZSBjaGVjaywgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIG1pZ2h0IG5vdCBiZSBzZXQsIHBvdGVudGlhbGx5IGxlYXZpbmcgYG1wX29wdC1cdTAwM2V1c2VfYWNrYCBzZXQgZnJvbSBhICpwcmV2aW91cyogRFNTLCBsZWFkaW5nIHRvIHVuaW5pdGlhbGl6ZWQgcmVhZHMuXG5cblNvLCBsZXQncyBleHBsb3JlIHRoaXMgc3RlcC1ieS1zdGVwOlxuXG4qICAgKipTY2VuYXJpbyAxOiBEU1MsIEZhc3RDbG9zZSwgRFNTOioqIEknbSB2aXN1YWxpemluZyBhIHBhY2tldCB3aXRoIHR3byBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLiBJZiB0aGUgZmlyc3QgRFNTIGdvZXMgdGhyb3VnaCwgc2V0cyB0aGUgZmxhZywgc2V0cyBgdXNlX2Fja2AgYW5kIHBvcHVsYXRlcyBgZGF0YV9hY2tgLCBhbmQgdGhlbiBhIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGNvbWVzIGFsb25nLCBpdCB3aWxsIHNldCBpdHMgZmxhZy4gTm93LCB0aGUgc2Vjb25kIERTUyBlbmNvdW50ZXJzIHRoZSBuZXcgY2hlY2ssIGJyZWFrcywgYW5kIHNpbmNlIHRoZSBmaXJzdCBEU1MgYWxyZWFkeSBzZXQgYE9QVElPTl9NUFRDUF9EU1NgLCB0aGUgaW5jb21pbmcgb3B0aW9ucyB3aWxsIHByb2Nlc3MgdGhlIGZpcnN0IERTUydzIHBvcHVsYXRlZCBmaWVsZHMuIFRoaXMgaXMgZmluZSwgbm8gdW5pbml0aWFsaXplZCByZWFkcyBoZXJlLlxuXG4qICAgKipTY2VuYXJpbyAyOiBGYXN0Q2xvc2UsIERTUzoqKiBJZiBgTVBUQ1BPUFRfRkFTVENMT1NFYCBpcyBmaXJzdCwgaXQgd2lsbCBzZXQgaXRzIGZsYWcuIFRoZW4gdGhlIHNlY29uZCBgTVBUQ1BPUFRfRFNTYCBoaXRzIHRoZSBuZXcgY2hlY2ssIGJyZWFrcy4gU28gYE9QVElPTl9NUFRDUF9EU1NgIGlzIG5vdCBzZXQsIG1lYW5pbmcgdGhlIERTUyBmaWVsZHMgYXJlbid0IGV2ZW4gcHJvY2Vzc2VkLiBBZ2Fpbiwgbm8gcHJvYmxlbXMuXG5cbiogICAqKlNjZW5hcmlvIDM6IERTUyAob3BzaXplIGJyZWFrcyksIEZhc3RDbG9zZToqKiBOb3csIHdoYXQgaWYgdGhlIGZpcnN0IGBNUFRDUE9QVF9EU1NgIGhhcyBhbiBpbnZhbGlkIGBvcHNpemVgIGFuZCBicmVha3MgdGhlcmU/IEFsdGhvdWdoIGBtcF9vcHQtXHUwMDNldXNlX2Fja2AgZ2V0cyBzZXQgdG8gYDFgIGJ5IERTUywgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGRvZXNuJ3QgZ2V0IHNldC4gVGhlbiB0aGUgYE1QVENQT1BUX0ZBU1RDTE9TRWAgY29tZXMuIFRoZSBtYWluIGZ1bmN0aW9uIHdpbGwgY2hlY2sgdGhhdCBgT1BUSU9OX01QVENQX0RTU2AgaXMgKm5vdCogc2V0IGFuZCByZXR1cm4gZWFybHksIHNraXBwaW5nIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgcmVhZC5cblxuKiAgICoqU2NlbmFyaW8gNDogRFNTIChvcHNpemUgYnJlYWtzKSwgRFNTICh2YWxpZCk6KiogV2hhdCBpZiB0aGUgZmlyc3QgRFNTIGJyZWFrcywgYnV0IHRoZW4gYSAqdmFsaWQqIHNlY29uZCBgTVBUQ1BPUFRfRFNTYCBmb2xsb3dzPyBPa2F5LCBzbyB0aGUgZmlyc3QgRFNTIHNldHMgYG1wX29wdC1cdTAwM2V1c2VfYWNrYCBhbmQgdGhlIHNlY29uZCBEU1Mgd2lsbCBvdmVyd3JpdGUgYG1wX29wdC1cdTAwM2V1c2VfYWNrID0gMGAgKG9yIHdoYXRldmVyIHRoZSBzZWNvbmQgRFNTIG5lZWRzKS4gVGhlbiB0aGUgc2Vjb25kIERTUyBvcHRpb24gc2V0cyBgT1BUSU9OX01QVENQX0RTU2AgZmxhZy4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbiogICAqKlNjZW5hcmlvIDU6IERTUyAodmFsaWQpLCBEU1MgKG9wc2l6ZSBicmVha3MpOioqIFRoZSBmaXJzdCBEU1MgdmFsaWRhdGVzLiBJdCBzZXRzIGBPUFRJT05fTVBUQ1BfRFNTYCwgc2V0cyBgdXNlX2FjayA9IDBgLiBUaGUgc2Vjb25kIERTUyBicmVha3MgYmVjYXVzZSBvZiBpdHMgb3BzaXplLCBidXQgaXQncyAqYWxyZWFkeSogc2V0IGB1c2VfYWNrID0gMWAuIEhlcmUsIHRoZSBmdW5jdGlvbiBjaGVja3MgdGhlIGV4aXN0ZW5jZSBvZiBgT1BUSU9OX01QVENQX0RTU2AsIGFuZCBzaW5jZSBpdCAqaXMqIHNldCwgaXQncyBnb2luZyB0byBhdHRlbXB0IHRvIHJlYWQgYGRhdGFfYWNrYCBidXQgYGRhdGFfYWNrYCB3YXNuJ3QgcG9wdWxhdGVkIGJ5IHRoZSBEU1MgZHVlIHRvIGl0cyBlYXJseSBleGl0ISAqVGhpcyBpcyB0aGUgY2FzZSEqXG5cbkkgbmVlZCB0byBjb25maXJtIGlmIHRoaXMgc2NlbmFyaW8gaXMgYWN0dWFsbHkgcG9zc2libGUuIElmIGl0IGlzLCB0aGVuIHdlICpkZWZpbml0ZWx5KiBoYXZlIGEgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgaXNzdWUgd2hlbiBwcm9jZXNzaW5nIE1QVENQIG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3NzI3LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTM2OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ0OjM0LjE0MjI2MDMwM1oiLCJTZXEiOjU0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTE2NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjYsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNjY6XFx0XFx0XFx0ZmxhZ3MgPSAoKnB0cisrKSBcXHUwMDI2IE1QVENQX0RTU19GTEFHX01BU0s7XFxuIDE2NzpcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWRzbjY0ID0gKGZsYWdzIFxcdTAwMjYgTVBUQ1BfRFNTX0RTTjY0KSAhPSAwO1xcbiAxNjg6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2V1c2VfbWFwID0gKGZsYWdzIFxcdTAwMjYgTVBUQ1BfRFNTX0hBU19NQVApICE9IDA7XFxuIDE2OTpcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWFjazY0ID0gKGZsYWdzIFxcdTAwMjYgTVBUQ1BfRFNTX0FDSzY0KSAhPSAwO1xcbiAxNzA6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2V1c2VfYWNrID0gKGZsYWdzIFxcdTAwMjYgTVBUQ1BfRFNTX0hBU19BQ0spO1xcbiAxNzE6XFx0XFxuIDE3MjpcXHRcXHRcXHRleHBlY3RlZF9vcHNpemUgPSBUQ1BPTEVOX01QVENQX0RTU19CQVNFO1xcbiAxNzM6XFx0XFxuIDE3NDpcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2V1c2VfYWNrKSB7XFxuIDE3NTpcXHRcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2VhY2s2NClcXG4gMTc2OlxcdFxcdFxcdFxcdFxcdGV4cGVjdGVkX29wc2l6ZSArPSBUQ1BPTEVOX01QVENQX0RTU19BQ0s2NDtcXG4gMTc3OlxcdFxcdFxcdFxcdGVsc2VcXG4gMTc4OlxcdFxcdFxcdFxcdFxcdGV4cGVjdGVkX29wc2l6ZSArPSBUQ1BPTEVOX01QVENQX0RTU19BQ0szMjtcXG4gMTc5OlxcdFxcdFxcdH1cXG4gMTgwOlxcdFxcbiAxODE6XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNldXNlX21hcCkge1xcbiAxODI6XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VkYXRhX2ZpbiA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19EQVRBX0ZJTikgIT0gMDtcXG4gMTgzOlxcdFxcdFxcdFxcdGlmIChtcF9vcHQtXFx1MDAzZWRzbjY0KVxcbiAxODQ6XFx0XFx0XFx0XFx0XFx0ZXhwZWN0ZWRfb3BzaXplICs9IFRDUE9MRU5fTVBUQ1BfRFNTX01BUDY0O1xcbiAxODU6XFx0XFx0XFx0XFx0ZWxzZVxcbiAxODY6XFx0XFx0XFx0XFx0XFx0ZXhwZWN0ZWRfb3BzaXplICs9IFRDUE9MRU5fTVBUQ1BfRFNTX01BUDMyO1xcbiAxODc6XFx0XFx0XFx0fVxcbiAxODg6XFx0XFxuIDE4OTpcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwiZGF0YV9maW49JWQgZHNuNjQ9JWQgdXNlX21hcD0lZCBhY2s2ND0lZCB1c2VfYWNrPSVkXFxcXG5cXFwiLFxcbiAxOTA6XFx0XFx0XFx0XFx0IG1wX29wdC1cXHUwMDNlZGF0YV9maW4sIG1wX29wdC1cXHUwMDNlZHNuNjQsXFxuIDE5MTpcXHRcXHRcXHRcXHQgbXBfb3B0LVxcdTAwM2V1c2VfbWFwLCBtcF9vcHQtXFx1MDAzZWFjazY0LFxcbiAxOTI6XFx0XFx0XFx0XFx0IG1wX29wdC1cXHUwMDNldXNlX2Fjayk7XFxuIDE5MzpcXHRcXG4gMTk0OlxcdFxcdFxcdC8qIEFsd2F5cyBwYXJzZSBhbnkgY3N1bSBwcmVzZW5jZSBjb21iaW5hdGlvbiwgd2Ugd2lsbCBlbmZvcmNlXFxuIDE5NTpcXHRcXHRcXHQgKiBSRkMgODY4NCBTZWN0aW9uIDMuMy4wIGNoZWNrcyBsYXRlciBpbiBzdWJmbG93X2RhdGFfcmVhZHlcXG4gMTk2OlxcdFxcdFxcdCAqL1xcbiAxOTc6XFx0XFx0XFx0aWYgKG9wc2l6ZSAhPSBleHBlY3RlZF9vcHNpemUgXFx1MDAyNlxcdTAwMjZcXG4gMTk4OlxcdFxcdFxcdCAgICBvcHNpemUgIT0gZXhwZWN0ZWRfb3BzaXplICsgVENQT0xFTl9NUFRDUF9EU1NfQ0hFQ0tTVU0pXFxuIDE5OTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMjAwOlxcdFxcbiAyMDE6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIHw9IE9QVElPTl9NUFRDUF9EU1M7XFxuIDIwMjpcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2V1c2VfYWNrKSB7XFxuIDIwMzpcXHRcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2VhY2s2NCkge1xcbiAyMDQ6XFx0XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VkYXRhX2FjayA9IGdldF91bmFsaWduZWRfYmU2NChwdHIpO1xcbiAyMDU6XFx0XFx0XFx0XFx0XFx0cHRyICs9IDg7XFxuIDIwNjpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbiAyMDc6XFx0XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VkYXRhX2FjayA9IGdldF91bmFsaWduZWRfYmUzMihwdHIpO1xcbiAyMDg6XFx0XFx0XFx0XFx0XFx0cHRyICs9IDQ7XFxuIDIwOTpcXHRcXHRcXHRcXHR9XFxuIDIxMDpcXHRcXG4gMjExOlxcdFxcdFxcdFxcdHByX2RlYnVnKFxcXCJkYXRhX2Fjaz0lbGx1XFxcXG5cXFwiLCBtcF9vcHQtXFx1MDAzZWRhdGFfYWNrKTtcXG4gMjEyOlxcdFxcdFxcdH1cXG4gMjEzOlxcdFxcbiAyMTQ6XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNldXNlX21hcCkge1xcbiAyMTU6XFx0XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNlZHNuNjQpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6MzQuMTQyNDU2ODYzWiIsIlNlcSI6NTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwNTExNTI3NzMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBIYW5kbGluZyoqXG5cblllcyEgT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJZiB0aGUgZmlyc3QgTVBUQ1AgRFNTIG9wdGlvbiBpcyB2YWxpZCAobWVhbmluZyBgdXNlX2Fja2AgaXMgaW5pdGlhbGx5IHNldCB0byAwKSwgaXQgc2V0cyBgT1BUSU9OX01QVENQX0RTU2Agd2l0aGluIGBtcF9vcHQtXHUwMDNlc3Vib3B0aW9uc2AuIE5vdywgdGhlIHNlY29uZCBNUFRDUCBEU1Mgb3B0aW9uIGNvbWVzIGFsb25nLCBidXQgdGhpcyB0aW1lIGl0J3MgaW52YWxpZCBkdWUgdG8gdGhlIG9wc2l6ZSwgYW5kIGB1c2VfYWNrYCBzaG91bGQgYmUgMS4gQnV0IGRvZXMgaXQ/IEkgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhlIGxvZ2ljLlxuXG5Mb29raW5nIGF0IHRoYXQgYGNhc2UgTVBUQ1BPUFRfRFNTYCBzZWN0aW9uLCBpdCBpbmNsdWRlcyBhIGNydWNpYWwgY2hlY2s6XG5cbmBgYGNcblx0Y2FzZSBNUFRDUE9QVF9EU1M6XG5cdFx0LyogQ2FuIGJlIHVzZWQgd2l0aCBhIHJlc3RyaWN0ZWQgbnVtYmVyIG9mIG90aGVyIG9wdGlvbnMgKi9cblx0XHRpZiAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8XG5cdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcblx0XHRcdFx0XHQgICAgT1BUSU9OX01QVENQX1BSSU8gfFxuXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApXG5cdFx0XHRicmVhaztcbmBgYFxuXG5IZXJlJ3Mgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4gSWYgdGhlICpmaXJzdCogRFNTIG9wdGlvbiBzZXQgYE9QVElPTl9NUFRDUF9EU1NgLCB0aGVuIGBtcF9vcHQtXHUwMDNlc3Vib3B0aW9uc2Agd2lsbCBpbmRlZWQgaGF2ZSB0aGF0IGJpdCBzZXQuIEFuZCBiZWNhdXNlIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyAqbm90KiBpbiB0aGUgYWxsb3dlZCBsaXN0IGRlZmluZWQgYnkgdGhlIGJpdHdpc2UgTk9UIG9wZXJhdGlvbiwgdGhlIGJpdHdpc2UgQU5EIHdpbGwgcmVzdWx0IGluIGEgbm9uLXplcm8gdmFsdWUuIFNwZWNpZmljYWxseSwgYmVjYXVzZSBgT1BUSU9OX01QVENQX0RTU2AgaXMgcHJlc2VudCwgYG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiB+QUxMT1dFRGAgd2lsbCBhbHdheXMgYmUgbm9uLXplcm8hIFRoaXMgbWVhbnMgdGhlIHNlY29uZCBEU1Mgb3B0aW9uIHdpbGwgYnJlYWsgZWFybHkhXG5cbkNydWNpYWxseSwgaXQgd29uJ3QgZXZlbiAqcmVhY2gqIHRoZSBwYXJ0IHdoZXJlIGl0IG1pZ2h0IHJlYWQgYGZsYWdzYCBvciBvdmVyd3JpdGUgYG1wX29wdC1cdTAwM2V1c2VfYWNrYC4gVGhpcyBtZWFucyB0aGUgbmV3IGNoZWNrIHByZXZlbnRzIHRoZSBzZWNvbmQsIGludmFsaWQgTVBUQ1AgRFNTIG9wdGlvbiBmcm9tIGVycm9uZW91c2x5IGNoYW5naW5nIHRoZSBhY2sgZmxhZy4gVGhpcyBpcyBhIHZlcnkgZ29vZCB0aGluZy4gSXQgcHJldmVudHMgYSBwb3RlbnRpYWwgb3ZlcndyaXRlIG9mIGEgY3J1Y2lhbCBmbGFnLlxuXG5JIHNob3VsZCBwcm9iYWJseSBjb25maXJtIG15IHVuZGVyc3RhbmRpbmcgb2YgYE9QVElPTl9NUFRDUF9EU1NgLCBidXQgSSdtIHByZXR0eSBjb25maWRlbnQgd2l0aCB0aGUgbG9naWMgbm93LlxuXG5cbiIsIklucHV0VG9rZW5zIjozMDg2NCwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ0OjQ0LjY1Mzk4ODE1NVoiLCJTZXEiOjU2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMyODE3NzEyOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCIjZGVmaW5lIE9QVElPTl9NUFRDUF9EU1NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9tcHRjcC9wcm90b2NvbC5oLTMwLSNkZWZpbmUgT1BUSU9OX01QVENQX1JTVFxcdEJJVCgxMClcXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaDozMTojZGVmaW5lIE9QVElPTl9NUFRDUF9EU1NcXHRCSVQoMTEpXFxubmV0L21wdGNwL3Byb3RvY29sLmgtMzItI2RlZmluZSBPUFRJT05fTVBUQ1BfRkFJTFxcdEJJVCgxMilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6NDYuOTgyMTY5NTY0WiIsIlNlcSI6NTcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE2MjE0MDA4NzgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIHRoZSBNUFRDUCBEU1Mgb3B0aW9uLCBhbmQgSSB0aGluayBJJ3ZlIGdvdCBhIGhhbmRsZSBvbiB3aGF0J3MgZ29pbmcgb24uIExldCdzIGJyZWFrIGl0IGRvd24uIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBgQklUKDExKWAsIGFuZCB0aGUgYWxsb3dlZCBtYXNrLCBhcyBJIHNlZSBpdCwgb25seSBhbGxvd3MgYE9QVElPTl9NUFRDUF9BRERfQUREUmAsIGBPUFRJT05fTVBUQ1BfUk1fQUREUmAsIGBPUFRJT05fTVBUQ1BfUFJJT2AsIGFuZCBgT1BUSU9OX01QVENQX0ZBSUxgLiAgU28sIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyAqbm90KiBpbiB0aGUgYWxsb3dlZCBtYXNrLiBUaGUgY29kZSBpcyBjaGVja2luZyB0byBzZWUgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIGFscmVhZHkgc2V0IGFuZCB0aGF0IHRoZSBuZXh0IERTUyB3aWxsIGJyZWFrIGVhcmx5IGJlZm9yZSBwb3RlbnRpYWxseSBvdmVyd3JpdGluZyBgbXBfb3B0LVx1MDAzZXVzZV9hY2tgIVxuXG5NeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgdGhpcyB3YXMgYSBwb3RlbnRpYWwgYnVnIGZpeC4gSWYgYSBzZWNvbmQgYE1QVENQT1BUX0RTU2Agd2FzIHByZXNlbnQsIGl0IGNvdWxkIG92ZXJ3cml0ZSBgdXNlX2Fja2AgYW5kIGNhdXNlIGFuIGVhcmx5IGJyZWFrLiBIb3dldmVyLCB0aGlzIGNvdWxkIGxlYWQgdG8gYGRhdGFfYWNrYCBiZWluZyB1bmluaXRpYWxpemVkIGFuZCBjYXVzZSB0aGUgY29kZSB0byBicmVhay4gUmVhZGluZyB0aGUgcGF0Y2gsIGl0IHNlZW1zIHRvIHByZXZlbnQgbXVsdGlwbGUgYE1QVENQT1BUX0RTU2Agb3B0aW9ucyBmcm9tIGJlaW5nIHBhcnNlZC4gVGhpcyBpbmNsdWRlcyBub3QgcGFyc2luZyBgTVBUQ1BPUFRfRFNTYCBpZiBvdGhlciBvcHRpb25zIGxpa2UgYEZBU1RDTE9TRWAsIGBNUENgLCBvciBgTVBKYCBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQuXG5cblRoZW4gaXQgY2xpY2tlZC4gSWYgYSBzZWNvbmQgYE1QVENQT1BUX0RTU2AgKmNvdWxkKiBvdmVyd3JpdGUgYHVzZV9hY2tgIGFuZCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQsIHRoZW4gdGhpcyBwYXRjaCBpcyBwcmV2ZW50aW5nIGFuICp1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkKiEgQnJpbGxpYW50LiBJIG5lZWQgdG8gdmVyaWZ5IHRoaXMgdGhvdWdodC5cblxuTGV0J3Mgd2FsayB0aHJvdWdoIHRoZSBzY2VuYXJpbyAqYmVmb3JlKiB0aGUgcGF0Y2g6XG5cbjEuICAqKkZpcnN0IGBNUFRDUE9QVF9EU1NgKio6IFRoaXMgaXMgdmFsaWQuIGBtcHRjcF9wYXJzZV9vcHRpb25gIHNldHMgYG1wX29wdC1cdTAwM2V1c2VfYWNrID0gMGAsIGBtcF9vcHQtXHUwMDNldXNlX21hcCA9IDFgLiBgb3BzaXplYCBpcyBjb3JyZWN0LiBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgIG5vdyBpbmNsdWRlcyBgT1BUSU9OX01QVENQX0RTU2AuIGBtcF9vcHQtXHUwMDNlZGF0YV9zZXFgLCBgc3ViZmxvd19zZXFgLCBhbmQgYGRhdGFfbGVuYCBhcmUgcG9wdWxhdGVkIGFzIGl0IHNob3VsZC5cblxuMi4gICoqU2Vjb25kIGBNUFRDUE9QVF9EU1NgKio6IFRoaXMgaGFzIGFuIGludmFsaWQgYG9wc2l6ZWAuIGBtcHRjcF9wYXJzZV9vcHRpb25gIHdvdWxkIHRyeSBhbmQgc2V0IGBtcF9vcHQtXHUwMDNldXNlX2FjayA9IDFgLCBhbmQgYG1wX29wdC1cdTAwM2V1c2VfbWFwID0gMGAsIGJ1dCBpbXBvcnRhbnRseSwgaXQgYnJlYWtzIGVhcmx5LiBTbyBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgICpzdGlsbCogaGFzIGBPUFRJT05fTVBUQ1BfRFNTYCBmcm9tIHRoZSBmaXJzdCBvcHRpb24sIEJVVCBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYCAqd2FzIG5ldmVyKiBwb3B1bGF0ZWQsIGJlY2F1c2UgdGhlIHBhcnNpbmcgYnJva2UuXG5cbk5vdywgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGlzIGNhbGxlZC4gSXQgY2hlY2tzIGBtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTU2AuIFRydWUuIFRoZW4gaXQgY2hlY2tzIGBtcF9vcHQudXNlX2Fja2AuIEl0J3MgMSwgZnJvbSB0aGUgYnJva2VuIHBhcnNlLiBUaGVuLCAqY3J1Y2lhbGx5KiwgaXQgY2FsbHMgYGFja191cGRhdGVfbXNrKG1zaywgc2ssIFx1MDAyNm1wX29wdClgLiBBbmQgaW5zaWRlIHRoYXQgZnVuY3Rpb24sIGl0IHRyaWVzIHRvIHJlYWQgYG1wX29wdC1cdTAwM2VkYXRhX2Fja2AhXG5cbkhlcmVpbiBsaWVzIHRoZSBjcnV4LiBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYCB3YXMgTkVWRVIgcG9wdWxhdGVkIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGJyZWFrISBJdCdzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBzdHJhaWdodCBmcm9tIHRoZSBzdGFjay4gVGhlIHBhdGNoIGVmZmVjdGl2ZWx5IHByZXZlbnRzIHRoaXMgdW5pbml0aWFsaXplZCByZWFkIGJ5IGhhbHRpbmcgcGFyc2Ugd2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlIERTUyBwYWNrZXRzISBZZXMsIGl0IHByZXZlbnRzIHRoZSB1bmluaXRpYWxpemVkIHJlYWQuIFRoaXMgbWFrZXMgcGVyZmVjdCBzZW5zZSFcblxuXG4iLCJJbnB1dFRva2VucyI6MzE3OTYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDU6MDMuMTk2MTgxMzQ3WiIsIlNlcSI6NTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5NjkyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwODMsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEwODM6XFx0XFx0aWYgKGFmdGVyNjQobmV3X3duZF9lbmQsIG1zay1cXHUwMDNld25kX2VuZCkpXFxuMTA4NDpcXHRcXHRcXHRXUklURV9PTkNFKG1zay1cXHUwMDNld25kX2VuZCwgbmV3X3duZF9lbmQpO1xcbjEwODU6XFx0XFxuMTA4NjpcXHRcXHQvKiB0aGlzIGFzc3VtZXMgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpIGlzIGludm9rZWQgYWZ0ZXIgdGNwX2FjaygpICovXFxuMTA4NzpcXHRcXHRpZiAoYWZ0ZXI2NChtc2stXFx1MDAzZXduZF9lbmQsIHNuZF9ueHQpKVxcbjEwODg6XFx0XFx0XFx0X19tcHRjcF9jaGVja19wdXNoKHNrLCBzc2spO1xcbjEwODk6XFx0XFxuMTA5MDpcXHRcXHRpZiAoYWZ0ZXI2NChuZXdfc25kX3VuYSwgb2xkX3NuZF91bmEpKSB7XFxuMTA5MTpcXHRcXHRcXHRfX21wdGNwX3NuZF91bmFfdXBkYXRlKG1zaywgbmV3X3NuZF91bmEpO1xcbjEwOTI6XFx0XFx0XFx0X19tcHRjcF9kYXRhX2Fja2VkKHNrKTtcXG4xMDkzOlxcdFxcdH1cXG4xMDk0OlxcdFxcdG1zay1cXHUwMDNlbGFzdF9hY2tfcmVjdiA9IHRjcF9qaWZmaWVzMzI7XFxuMTA5NTpcXHRcXHRtcHRjcF9kYXRhX3VubG9jayhzayk7XFxuMTA5NjpcXHRcXG4xMDk3OlxcdFxcdHRyYWNlX2Fja191cGRhdGVfbXNrKG1wX29wdC1cXHUwMDNlZGF0YV9hY2ssXFxuMTA5ODpcXHRcXHRcXHRcXHQgICAgIG9sZF9zbmRfdW5hLCBuZXdfc25kX3VuYSxcXG4xMDk5OlxcdFxcdFxcdFxcdCAgICAgbmV3X3duZF9lbmQsIFJFQURfT05DRShtc2stXFx1MDAzZXduZF9lbmQpKTtcXG4xMTAwOlxcdH1cXG4xMTAxOlxcdFxcbjExMDI6XFx0Ym9vbCBtcHRjcF91cGRhdGVfcmN2X2RhdGFfZmluKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIHU2NCBkYXRhX2Zpbl9zZXEsIGJvb2wgdXNlXzY0Yml0KVxcbjExMDM6XFx0e1xcbjExMDQ6XFx0XFx0LyogU2tpcCBpZiBEQVRBX0ZJTiB3YXMgYWxyZWFkeSByZWNlaXZlZC5cXG4xMTA1OlxcdFxcdCAqIElmIHVwZGF0aW5nIHNpbXVsdGFuZW91c2x5IHdpdGggdGhlIHJlY3Ztc2cgbG9vcCwgdmFsdWVzXFxuMTEwNjpcXHRcXHQgKiBzaG91bGQgbWF0Y2guIElmIHRoZXkgbWlzbWF0Y2gsIHRoZSBwZWVyIGlzIG1pc2JlaGF2aW5nIGFuZFxcbjExMDc6XFx0XFx0ICogd2Ugd2lsbCBwcmVmZXIgdGhlIG1vc3QgcmVjZW50IGluZm9ybWF0aW9uLlxcbjExMDg6XFx0XFx0ICovXFxuMTEwOTpcXHRcXHRpZiAoUkVBRF9PTkNFKG1zay1cXHUwMDNlcmN2X2RhdGFfZmluKSlcXG4xMTEwOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4xMTExOlxcdFxcbjExMTI6XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXJjdl9kYXRhX2Zpbl9zZXEsXFxuMTExMzpcXHRcXHRcXHQgICBtcHRjcF9leHBhbmRfc2VxKFJFQURfT05DRShtc2stXFx1MDAzZWFja19zZXEpLCBkYXRhX2Zpbl9zZXEsIHVzZV82NGJpdCkpO1xcbjExMTQ6XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXJjdl9kYXRhX2ZpbiwgMSk7XFxuMTExNTpcXHRcXG4xMTE2OlxcdFxcdHJldHVybiB0cnVlO1xcbjExMTc6XFx0fVxcbjExMTg6XFx0XFxuMTExOTpcXHRzdGF0aWMgYm9vbCBhZGRfYWRkcl9obWFjX3ZhbGlkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXFxuMTEyMDpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxcbjExMjE6XFx0e1xcbjExMjI6XFx0XFx0dTY0IGhtYWMgPSAwO1xcbjExMjM6XFx0XFxuMTEyNDpcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2VlY2hvKVxcbjExMjU6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuMTEyNjpcXHRcXG4xMTI3OlxcdFxcdGhtYWMgPSBhZGRfYWRkcl9nZW5lcmF0ZV9obWFjKFJFQURfT05DRShtc2stXFx1MDAzZXJlbW90ZV9rZXkpLFxcbjExMjg6XFx0XFx0XFx0XFx0XFx0ICAgICAgUkVBRF9PTkNFKG1zay1cXHUwMDNlbG9jYWxfa2V5KSxcXG4xMTI5OlxcdFxcdFxcdFxcdFxcdCAgICAgIFxcdTAwMjZtcF9vcHQtXFx1MDAzZWFkZHIpO1xcbjExMzA6XFx0XFxuMTEzMTpcXHRcXHRwcl9kZWJ1ZyhcXFwibXNrPSVwLCBhaG1hYz0lbGx1LCBtcF9vcHQtXFx1MDAzZWFobWFjPSVsbHVcXFxcblxcXCIsXFxuMTEzMjpcXHRcXHRcXHQgbXNrLCBobWFjLCBtcF9vcHQtXFx1MDAzZWFobWFjKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDU6MDMuMTk2MzgwOTk3WiIsIlNlcSI6NTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc2NjA4NDIxMDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEZWJ1Z2dpbmcgYGFja191cGRhdGVfbXNrYCAtIEluaXRpYWwgSW5xdWlyeSoqXG5cbkFscmlnaHQsIGJlZm9yZSBJIGRpdmUgdG9vIGRlZXAgaW50byB0aGUgcHJvYmxlbSBhdCBoYW5kLCBJIG5lZWQgdG8gdGFrZSBhIHN0ZXAgYmFjayBhbmQgZ3JvdW5kIG15c2VsZi4gTXkgZmlyc3QgaW5zdGluY3QsIGJhc2VkIG9uIHRoZSBpbmNvbXBsZXRlIGNvbnRleHQsIGlzIHRvIGltbWVkaWF0ZWx5IGNoZWNrIHRoZSBlbnRyeSBwb2ludCwgdGhlIGluaXRpYWwgc2V0dXAgb2YgdGhlIGZ1bmN0aW9uLiBJIG5lZWQgdG8gc2VlIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24sIHRoZSBoZWFkLCB0byBrbm93IHdoYXTigJlzIGdvaW5nIG9uIGF0IHRoZSBvdXRzZXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgcGFyYW1ldGVycyBpdCB0YWtlcywgd2hhdCBpbml0aWFsaXphdGlvbnMgaXQgZG9lcywgYW5kIHdoYXQgdGhlIGZsb3cgb2YgdGhlIGNvZGUgaXMgZnJvbSB0aGUgYmVnaW5uaW5nLiBJJ20gZm9jdXNpbmcgb24gdGhhdCBzdGFydGluZyBwb2ludCwgYGFja191cGRhdGVfbXNrYCwgdG8gZ2V0IHRoZSBiaWcgcGljdHVyZS4gVGhpcyBpcyB0aGUgY3JpdGljYWwgc3RhcnRpbmcgcG9pbnQgdG8gdW5kZXJzdGFuZGluZyB3aHkgSSdtIGhlcmUuIFRoaXMgaW5pdGlhbCBjaGVjayB3aWxsIGdpdmUgbWUgY3J1Y2lhbCBjb250ZXh0IGZvciBmdXJ0aGVyIHRyb3VibGVzaG9vdGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQzNTEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ1OjEwLjg1NzIyNjE1NFoiLCJTZXEiOjYwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDUyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDUwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMDUwOlxcdFxcdFxcdHJldHVybjtcXG4xMDUxOlxcdFxcbjEwNTI6XFx0XFx0LyogU29tZSBvdGhlciBzdWJmbG93IGdyZXcgdGhlIG1wdGNwLWxldmVsIHJ3aW4gc2luY2UgcmN2X3d1cCxcXG4xMDUzOlxcdFxcdCAqIHJlc3luYy5cXG4xMDU0OlxcdFxcdCAqL1xcbjEwNTU6XFx0XFx0dHAtXFx1MDAzZXJjdl93bmQgKz0gbXB0Y3BfcmN2X3duZCAtIHN1YmZsb3ctXFx1MDAzZXJjdl93bmRfc2VudDtcXG4xMDU2OlxcdFxcdHRjcF91cGRhdGVfbWF4X3Jjdl93bmRfc2VxKHRwKTtcXG4xMDU3OlxcdFxcdHN1YmZsb3ctXFx1MDAzZXJjdl93bmRfc2VudCA9IG1wdGNwX3Jjdl93bmQ7XFxuMTA1ODpcXHR9XFxuMTA1OTpcXHRcXG4xMDYwOlxcdHN0YXRpYyB2b2lkIGFja191cGRhdGVfbXNrKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXFxuMTA2MTpcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgc29jayAqc3NrLFxcbjEwNjI6XFx0XFx0XFx0XFx0ICAgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgKm1wX29wdClcXG4xMDYzOlxcdHtcXG4xMDY0OlxcdFxcdHU2NCBuZXdfd25kX2VuZCwgbmV3X3NuZF91bmEsIHNuZF9ueHQgPSBSRUFEX09OQ0UobXNrLVxcdTAwM2VzbmRfbnh0KTtcXG4xMDY1OlxcdFxcdHN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKW1zaztcXG4xMDY2OlxcdFxcdHU2NCBvbGRfc25kX3VuYTtcXG4xMDY3OlxcdFxcbjEwNjg6XFx0XFx0bXB0Y3BfZGF0YV9sb2NrKHNrKTtcXG4xMDY5OlxcdFxcbjEwNzA6XFx0XFx0LyogYXZvaWQgYWNrIGV4cGFuc2lvbiBvbiB1cGRhdGUgY29uZmxpY3QsIHRvIHJlZHVjZSB0aGUgcmlzayBvZlxcbjEwNzE6XFx0XFx0ICogd3JvbmdseSBleHBhbmRpbmcgdG8gYSBmdXR1cmUgYWNrIHNlcXVlbmNlIG51bWJlciwgd2hpY2ggaXMgd2F5XFxuMTA3MjpcXHRcXHQgKiBtb3JlIGRhbmdlcm91cyB0aGFuIG1pc3NpbmcgYW4gYWNrXFxuMTA3MzpcXHRcXHQgKi9cXG4xMDc0OlxcdFxcdG9sZF9zbmRfdW5hID0gbXNrLVxcdTAwM2VzbmRfdW5hO1xcbjEwNzU6XFx0XFx0bmV3X3NuZF91bmEgPSBtcHRjcF9leHBhbmRfc2VxKG9sZF9zbmRfdW5hLCBtcF9vcHQtXFx1MDAzZWRhdGFfYWNrLCBtcF9vcHQtXFx1MDAzZWFjazY0KTtcXG4xMDc2OlxcdFxcbjEwNzc6XFx0XFx0LyogQUNLIGZvciBkYXRhIG5vdCBldmVuIHNlbnQgeWV0PyBJZ25vcmUuKi9cXG4xMDc4OlxcdFxcdGlmICh1bmxpa2VseShhZnRlcjY0KG5ld19zbmRfdW5hLCBzbmRfbnh0KSkpXFxuMTA3OTpcXHRcXHRcXHRuZXdfc25kX3VuYSA9IG9sZF9zbmRfdW5hO1xcbjEwODA6XFx0XFxuMTA4MTpcXHRcXHRuZXdfd25kX2VuZCA9IG5ld19zbmRfdW5hICsgdGNwX3NrKHNzayktXFx1MDAzZXNuZF93bmQ7XFxuMTA4MjpcXHRcXG4xMDgzOlxcdFxcdGlmIChhZnRlcjY0KG5ld193bmRfZW5kLCBtc2stXFx1MDAzZXduZF9lbmQpKVxcbjEwODQ6XFx0XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXduZF9lbmQsIG5ld193bmRfZW5kKTtcXG4xMDg1OlxcdFxcbjEwODY6XFx0XFx0LyogdGhpcyBhc3N1bWVzIG1wdGNwX2luY29taW5nX29wdGlvbnMoKSBpcyBpbnZva2VkIGFmdGVyIHRjcF9hY2soKSAqL1xcbjEwODc6XFx0XFx0aWYgKGFmdGVyNjQobXNrLVxcdTAwM2V3bmRfZW5kLCBzbmRfbnh0KSlcXG4xMDg4OlxcdFxcdFxcdF9fbXB0Y3BfY2hlY2tfcHVzaChzaywgc3NrKTtcXG4xMDg5OlxcdFxcbjEwOTA6XFx0XFx0aWYgKGFmdGVyNjQobmV3X3NuZF91bmEsIG9sZF9zbmRfdW5hKSkge1xcbjEwOTE6XFx0XFx0XFx0X19tcHRjcF9zbmRfdW5hX3VwZGF0ZShtc2ssIG5ld19zbmRfdW5hKTtcXG4xMDkyOlxcdFxcdFxcdF9fbXB0Y3BfZGF0YV9hY2tlZChzayk7XFxuMTA5MzpcXHRcXHR9XFxuMTA5NDpcXHRcXHRtc2stXFx1MDAzZWxhc3RfYWNrX3JlY3YgPSB0Y3BfamlmZmllczMyO1xcbjEwOTU6XFx0XFx0bXB0Y3BfZGF0YV91bmxvY2soc2spO1xcbjEwOTY6XFx0XFxuMTA5NzpcXHRcXHR0cmFjZV9hY2tfdXBkYXRlX21zayhtcF9vcHQtXFx1MDAzZWRhdGFfYWNrLFxcbjEwOTg6XFx0XFx0XFx0XFx0ICAgICBvbGRfc25kX3VuYSwgbmV3X3NuZF91bmEsXFxuMTA5OTpcXHRcXHRcXHRcXHQgICAgIG5ld193bmRfZW5kLCBSRUFEX09OQ0UobXNrLVxcdTAwM2V3bmRfZW5kKSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ1OjEwLjg1NzM3Mjc4NFoiLCJTZXEiOjYxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MjQ5ODY4NDM3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipVbmluaXRpYWxpemVkIE1lbW9yeSBWdWxuZXJhYmlsaXR5IGluIE1QVENQIERTUyBPcHRpb24gUGFyc2luZyoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBkaXNzZWN0aW5nIHRoaXMgY29kZSwgYW5kIGl0J3MgbG9va2luZyBsaWtlIHdlIGhhdmUgYSBjbGFzc2ljIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLiAgU3BlY2lmaWNhbGx5LCBpdCBzZWVtcyB0aGF0IGlmIGEgcGFja2V0IGNvbnRhaW5zIG11bHRpcGxlIE1QVENQIERTUyBvcHRpb25zLCBhbmQgdGhlIHNlY29uZCBvbmUgaXMgbWFsZm9ybWVkLCB3ZSBjYW4gZW5kIHVwIHJlYWRpbmcgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkuICBcblxuSGVyZSdzIHRoZSBnaXN0OiBgYWNrX3VwZGF0ZV9tc2tgIHJlYWRzIGBtcF9vcHQtXHUwMDNlZGF0YV9hY2tgIHRvIHVwZGF0ZSBgbXNrLVx1MDAzZXNuZF91bmFgLiAgSWYgYG1wX29wdC1cdTAwM2VkYXRhX2Fja2AgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdlIGNhbiBhY2tub3dsZWRnZSBpbnZhbGlkIGRhdGEsIG9yIGV2ZW4gd29yc2UsIHVzZSBhIGNvbXBsZXRlbHkgcmFuZG9tIHZhbHVlLiAgVGhlIHByb2JsZW0gYXJpc2VzIGluIGhvdyB3ZSBwYXJzZSBNUFRDUCBvcHRpb25zLiAgYG1wdGNwX2dldF9vcHRpb25zYCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBvcHRpb25zLCBhbmQgc2V0cyBmbGFncyBvbiBhIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHRgIHN0cnVjdHVyZSB0aGF0IGxpdmVzIG9uIHRoZSAqc3RhY2sqLiAgQ3J1Y2lhbGx5LCBub3QgYWxsIGZpZWxkcyBvZiB0aGlzIHN0cnVjdCBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybzsgb25seSB0aGUgYHN0YXR1c2AgZmllbGQgaXMgZXhwbGljaXRseSBjbGVhcmVkLlxuXG5MZXQncyBsb29rIGF0IGEgc2NlbmFyaW8gd2l0aCB0d28gRFNTIG9wdGlvbnM6IHRoZSBmaXJzdCBpcyBcImdvb2RcIiwgYnV0IHRoZSBzZWNvbmQgaXMgbWFsZm9ybWVkIChlLmcuLCBhIHdyb25nIHNpemUpLiBUaGUgZmlyc3QgRFNTIHdpbGwgY29ycmVjdGx5IHNldCBgT1BUSU9OX01QVENQX0RTU2AgYW5kIG1pZ2h0IHNldCBgdXNlX2FjayA9IDBgLiBUaGUgc2Vjb25kLCBtYWxmb3JtZWQgRFNTIG1pZ2h0IHNldCBgdXNlX2FjayA9IDFgIG9yIG90aGVyIGZsYWcsIGJ1dCBicmVhayBlYXJseSwgd2l0aG91dCBldmVyIGluaXRpYWxpemluZyBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYC4gIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCAqc3RpbGwqIHNlZXMgYE9QVElPTl9NUFRDUF9EU1NgIHNldCBieSB0aGUgZmlyc3QgRFNTIG9wdGlvbiwgc28gdGhlIGZ1bmN0aW9uIHRoZW4gZ29lcyB0byB1c2UgdGhlIHBvdGVudGlhbGx5IG1vZGlmaWVkIGJpdGZpZWxkcywgYnV0IHRoZXNlIGJpdGZpZWxkcyBtYXkgaW5zdHJ1Y3QgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgZnJvbSB0aGUgdW5pbml0aWFsaXplZCBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYCBmaWVsZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhbHVlIGlzIHRoZW4gdXNlZCBpbiBhIGNyaXRpY2FsIHVwZGF0ZTogaXQncyB1c2VkIHRvIG1vZGlmeSBgbXNrLVx1MDAzZXNuZF91bmFgIHdoaWNoIGxlYWRzIHRvIGluY29ycmVjdCBhY2tub3dsZWRnZW1lbnQgb2YgZGF0YS4gVGhpcyBpcyB3aGVyZSB0aGlzIGdvZXMgZnJvbSBiYWQgdG8gcmVhbGx5IGJhZCFcblxuTm93LCBkb2VzIHRoaXMgbGVhayB0byB1c2VyIHNwYWNlPyBObywgaXQncyBhbiBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lIGlzc3VlLiBCdXQsIGlzIGl0IGNhdWdodCBieSBLQVNBTj8gTm8sIHRoYXQgaXMgbm90IEtBU0FOJ3Mgam9iLiBCdXQgS01TQU4gZG9lcyEgIEtNU0FOIHNwZWNpZmljYWxseSBjYXRjaGVzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzISBJZiBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYCBpcyB1bmluaXRpYWxpemVkLCBLTVNBTiB3aWxsIHRyaWdnZXIgYSB3YXJuaW5nLlxuXG5Mb29raW5nIG1vcmUgY2xvc2VseSBhdCB0aGUgY29kZSwgaXQgdHVybnMgb3V0IHRoYXQgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtgIGlzIGRlY2xhcmVkIG9uIHRoZSBzdGFjayBpbiBzZXZlcmFsIGtleSBmdW5jdGlvbnMgbGlrZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AsIGBzdWJmbG93X2NoZWNrX3JlcWAsIGBtcHRjcF9zdWJmbG93X2luaXRfY29va2llX3JlcWAsIGV0Yy4gSW4gYWxsIHRoZXNlIGNhc2VzLCBgbXBfb3B0YCBpcyB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gIFNvIGl0J3Mgbm90IGp1c3QgYSBzaW5nbGUgY29kZSBwYXRoLlxuXG5UaGUgcGF0Y2gncyBmaXggaW52b2x2ZXMgcmVzdHJpY3Rpbmcgd2hlbiBgTVBUQ1BPUFRfRFNTYCBjYW4gYmUgcGFyc2VkLiBJZiBpdCBkZXRlY3RzIGEgRFNTIG9wdGlvbiBhZnRlciBvdGhlciBzcGVjaWZpYyBvcHRpb25zLCBpdCBhYm9ydHMgcGFyc2luZyBpbW1lZGlhdGVseS4gIFRoaXMgcHJldmVudHMgdGhlIGNvcnJ1cHRlZCBiaXRmaWVsZHMuIFRoZXJlZm9yZSwgdGhlIHBhdGNoIHdpbGwgZml4IGEgYnVnIHdoZXJlIGFuIGludmFsaWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGNvdWxkIGNvcnJ1cHQgZmxhZ3Mgd2l0aG91dCBwb3B1bGF0aW5nIGRhdGEgZmllbGRzLCByZXN1bHRpbmcgaW4gdW5pbml0aWFsaXplZCBkYXRhIHJlYWRzLlxuXG5TbywgaW4gc3VtbWFyeSwgd2UncmUgdGFsa2luZyBhYm91dCB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSB1c2VkIGluIGEgY3JpdGljYWwgVENQIHN0YXRlIG1hY2hpbmUsIHdoaWNoIGNvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IGFja25vd2xlZGdlbWVudHMsIGRhdGEgY29ycnVwdGlvbiwgb3IgY29ubmVjdGlvbiBkcm9wcy4gVGhpcyBpcyB0ZXh0Ym9vayBLTVNBTiBtYXRlcmlhbCwgc28gbGV0J3MgZ2V0IGEgS01TQU4gZnV6emluZyBzZXNzaW9uIGdvaW5nIEFTQVAhIFRoZSBwYXRjaCAqc2hvdWxkKiBmaXggdGhpcyBieSByZXN0cmljdGluZyB0aGUgcGFyc2luZyBvZiBEU1Mgb3B0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzU1MDgsIk91dHB1dFRva2VucyI6NDY1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mzg4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ1OjUzLjM1NjA2MDA0N1oiLCJTZXEiOjYyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVzdHJpY3RzIHRoZSBwYXJzaW5nIG9mIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gaW4gYG1wdGNwX3BhcnNlX29wdGlvbigpYCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvY2Vzc2VkIGlmIGNlcnRhaW4gb3RoZXIgb3B0aW9ucyAoaW5jbHVkaW5nIGFub3RoZXIgYE1QVENQT1BUX0RTU2ApIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZC5cXG5cXG5CZWZvcmUgdGhpcyBwYXRjaCwgaWYgYSBUQ1AgcGFja2V0IGNvbnRhaW5lZCBtdWx0aXBsZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLCBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHZ1bG5lcmFiaWxpdHkgY291bGQgYmUgdHJpZ2dlcmVkLiBUaGUgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdGAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBpbiBmdW5jdGlvbnMgbGlrZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpYC4gT25seSBpdHMgYHN0YXR1c2AgZmllbGQgKHdoaWNoIGNvbnRhaW5zIGJpdGZpZWxkcyBsaWtlIGB1c2VfYWNrYCBhbmQgYHVzZV9tYXBgKSBpcyB6ZXJvZWQsIGxlYXZpbmcgZGF0YSBmaWVsZHMgbGlrZSBgZGF0YV9hY2tgIGFuZCBgZGF0YV9zZXFgIHVuaW5pdGlhbGl6ZWQuXFxuXFxuSWYgYSB2YWxpZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gd2FzIHBhcnNlZCBmaXJzdCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDBgKSwgaXQgd291bGQgc2V0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgIGJ1dCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQuIElmIGEgc2Vjb25kLCBtYWxmb3JtZWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGZvbGxvd2VkIChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMWAgYnV0IGFuIGludmFsaWQgYG9wc2l6ZWApLCBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYml0ZmllbGQgdG8gYHVzZV9hY2sgPSAxYCBidXQgYnJlYWsgZWFybHkgYmVmb3JlIHBvcHVsYXRpbmcgdGhlIGBkYXRhX2Fja2AgZmllbGQuXFxuXFxuVGhlIGNhbGxlciB3b3VsZCB0aGVuIHNlZSB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgc2V0IChmcm9tIHRoZSBmaXJzdCBvcHRpb24pIGFuZCByZWFkIHRoZSB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSBmcm9tIGBkYXRhX2Fja2AgKGR1ZSB0byB0aGUgY29ycnVwdGVkIGB1c2VfYWNrID0gMWAgYml0ZmllbGQgZnJvbSB0aGUgc2Vjb25kIG9wdGlvbikuIFRoaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgd291bGQgdGhlbiBiZSB1c2VkIGluIGNvbnRyb2wgZmxvdyAoZS5nLiwgdXBkYXRpbmcgdGhlIHNlcXVlbmNlIG51bWJlciBgbXNrLVxcdTAwM2VzbmRfdW5hYCBpbiBgYWNrX3VwZGF0ZV9tc2soKWApIG9yIGNvcGllZCBpbnRvIHNrYiBleHRlbnNpb25zLlxcblxcblN0YW5kYXJkIEtBU0FOIGRvZXMgbm90IGRldGVjdCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGNhdGNoIHRoaXMgZXhhY3QgY2xhc3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVzdHJpY3RzIHRoZSBwYXJzaW5nIG9mIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gaW4gYG1wdGNwX3BhcnNlX29wdGlvbigpYCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvY2Vzc2VkIGlmIGNlcnRhaW4gb3RoZXIgb3B0aW9ucyAoaW5jbHVkaW5nIGFub3RoZXIgYE1QVENQT1BUX0RTU2ApIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZC5cXG5cXG5CZWZvcmUgdGhpcyBwYXRjaCwgaWYgYSBUQ1AgcGFja2V0IGNvbnRhaW5lZCBtdWx0aXBsZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLCBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHZ1bG5lcmFiaWxpdHkgY291bGQgYmUgdHJpZ2dlcmVkLiBUaGUgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdGAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBpbiBmdW5jdGlvbnMgbGlrZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpYC4gT25seSBpdHMgYHN0YXR1c2AgZmllbGQgKHdoaWNoIGNvbnRhaW5zIGJpdGZpZWxkcyBsaWtlIGB1c2VfYWNrYCBhbmQgYHVzZV9tYXBgKSBpcyB6ZXJvZWQsIGxlYXZpbmcgZGF0YSBmaWVsZHMgbGlrZSBgZGF0YV9hY2tgIGFuZCBgZGF0YV9zZXFgIHVuaW5pdGlhbGl6ZWQuXFxuXFxuSWYgYSB2YWxpZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gd2FzIHBhcnNlZCBmaXJzdCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDBgKSwgaXQgd291bGQgc2V0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgIGJ1dCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQuIElmIGEgc2Vjb25kLCBtYWxmb3JtZWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGZvbGxvd2VkIChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMWAgYnV0IGFuIGludmFsaWQgYG9wc2l6ZWApLCBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYml0ZmllbGQgdG8gYHVzZV9hY2sgPSAxYCBidXQgYnJlYWsgZWFybHkgYmVmb3JlIHBvcHVsYXRpbmcgdGhlIGBkYXRhX2Fja2AgZmllbGQuXFxuXFxuVGhlIGNhbGxlciB3b3VsZCB0aGVuIHNlZSB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgc2V0IChmcm9tIHRoZSBmaXJzdCBvcHRpb24pIGFuZCByZWFkIHRoZSB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSBmcm9tIGBkYXRhX2Fja2AgKGR1ZSB0byB0aGUgY29ycnVwdGVkIGB1c2VfYWNrID0gMWAgYml0ZmllbGQgZnJvbSB0aGUgc2Vjb25kIG9wdGlvbikuIFRoaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgd291bGQgdGhlbiBiZSB1c2VkIGluIGNvbnRyb2wgZmxvdyAoZS5nLiwgdXBkYXRpbmcgdGhlIHNlcXVlbmNlIG51bWJlciBgbXNrLVxcdTAwM2VzbmRfdW5hYCBpbiBgYWNrX3VwZGF0ZV9tc2soKWApIG9yIGNvcGllZCBpbnRvIHNrYiBleHRlbnNpb25zLlxcblxcblN0YW5kYXJkIEtBU0FOIGRvZXMgbm90IGRldGVjdCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGNhdGNoIHRoaXMgZXhhY3QgY2xhc3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowvxrql[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-10 12:23:56 +0000 UTC FinishedAt: 2026-08-10 12:45:54 +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": "fcaeecb8b0cd44f77d03b28de0671258d4db18f8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MPTCP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "fcaeecb8b0cd44f77d03b28de0671258d4db18f8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MPTCP" ], "series_id": "61aa9e41-29c0-4079-8b1e-000255c141d1" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "mptcp_get_options", "mptcp_incoming_options" ], "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+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01QVENQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bXB0Y3BfZ2V0X29wdGlvbnMmIzM0OywKICAgICYjMzQ7bXB0Y3BfaW5jb21pbmdfb3B0aW9ucyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlc3RyaWN0cyB0aGUgcGFyc2luZyBvZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGluIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb2Nlc3NlZCBpZiBjZXJ0YWluIG90aGVyIG9wdGlvbnMgKGluY2x1ZGluZyBhbm90aGVyIGBNUFRDUE9QVF9EU1NgKSBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQuXG5cbkJlZm9yZSB0aGlzIHBhdGNoLCBpZiBhIFRDUCBwYWNrZXQgY29udGFpbmVkIG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMsIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgdnVsbmVyYWJpbGl0eSBjb3VsZCBiZSB0cmlnZ2VyZWQuIFRoZSBgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgbXBfb3B0YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGZ1bmN0aW9ucyBsaWtlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zKClgLiBPbmx5IGl0cyBgc3RhdHVzYCBmaWVsZCAod2hpY2ggY29udGFpbnMgYml0ZmllbGRzIGxpa2UgYHVzZV9hY2tgIGFuZCBgdXNlX21hcGApIGlzIHplcm9lZCwgbGVhdmluZyBkYXRhIGZpZWxkcyBsaWtlIGBkYXRhX2Fja2AgYW5kIGBkYXRhX3NlcWAgdW5pbml0aWFsaXplZC5cblxuSWYgYSB2YWxpZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gd2FzIHBhcnNlZCBmaXJzdCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDBgKSwgaXQgd291bGQgc2V0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgIGJ1dCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQuIElmIGEgc2Vjb25kLCBtYWxmb3JtZWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGZvbGxvd2VkIChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMWAgYnV0IGFuIGludmFsaWQgYG9wc2l6ZWApLCBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYml0ZmllbGQgdG8gYHVzZV9hY2sgPSAxYCBidXQgYnJlYWsgZWFybHkgYmVmb3JlIHBvcHVsYXRpbmcgdGhlIGBkYXRhX2Fja2AgZmllbGQuXG5cblRoZSBjYWxsZXIgd291bGQgdGhlbiBzZWUgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIHNldCAoZnJvbSB0aGUgZmlyc3Qgb3B0aW9uKSBhbmQgcmVhZCB0aGUgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkgZnJvbSBgZGF0YV9hY2tgIChkdWUgdG8gdGhlIGNvcnJ1cHRlZCBgdXNlX2FjayA9IDFgIGJpdGZpZWxkIGZyb20gdGhlIHNlY29uZCBvcHRpb24pLiBUaGlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdvdWxkIHRoZW4gYmUgdXNlZCBpbiBjb250cm9sIGZsb3cgKGUuZy4sIHVwZGF0aW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIgYG1zay1cdTAwM2VzbmRfdW5hYCBpbiBgYWNrX3VwZGF0ZV9tc2soKWApIG9yIGNvcGllZCBpbnRvIHNrYiBleHRlbnNpb25zLlxuXG5TdGFuZGFyZCBLQVNBTiBkb2VzIG5vdCBkZXRlY3QgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBjYXRjaCB0aGlzIGV4YWN0IGNsYXNzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgcGFyc2luZyBvZiBNUFRDUCBvcHRpb25zLCBzcGVjaWZpY2FsbHkgcmVzdHJpY3RpbmcgdGhlIGNvbWJpbmF0aW9ucyBvZiBEU1Mgb3B0aW9ucyB3aXRoIG90aGVyIG9wdGlvbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBNUFRDUCBvcHRpb24gcGFyc2luZyBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDU1N2ZiNmU5NThiMjU3ZDgyODVkMjU5NDdjYzI1ZWM1YTU1MjAzNjZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAxMCAxMjo0MToyMiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvbXB0Y3Avb3B0aW9ucy5jIGIvbmV0L21wdGNwL29wdGlvbnMuY1xuaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDRcbi0tLSBhL25ldC9tcHRjcC9vcHRpb25zLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9tcHRjcC9vcHRpb25zLmNcbkBAIC0xNTMsNiAmIzQzOzE1MywxMyBAQCBzdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiBcdFx0YnJlYWs7XG4gXG4gXHRjYXNlIE1QVENQT1BUX0RTUzpcbiYjNDM7XHRcdC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG4mIzQzO1x0XHRpZiAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8XG4mIzQzO1x0XHRcdFx0XHQgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfFxuJiM0MztcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcbiYjNDM7XHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcbiBcdFx0cHJfZGVidWcoXCYjMzQ7RFNTXFxuXCYjMzQ7KTtcbiBcdFx0cHRyJiM0MzsmIzQzOztcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TVBUQ1AmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttcHRjcF9nZXRfb3B0aW9ucyYjMzQ7LAogICAgJiMzNDttcHRjcF9pbmNvbWluZ19vcHRpb25zJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBwYXJzaW5nIG9mIE1QVENQIG9wdGlvbnMsIHNwZWNpZmljYWxseSByZXN0cmljdGluZyB0aGUgY29tYmluYXRpb25zIG9mIERTUyBvcHRpb25zIHdpdGggb3RoZXIgb3B0aW9ucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIE1QVENQIG9wdGlvbiBwYXJzaW5nIGxvZ2ljLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNTU3ZmI2ZTk1OGIyNTdkODI4NWQyNTk0N2NjMjVlYzVhNTUyMDM2NgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gQXVnIDEwIDEyOjQxOjIyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L21wdGNwL29wdGlvbnMuYyBiL25ldC9tcHRjcC9vcHRpb25zLmMKaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDQKLS0tIGEvbmV0L21wdGNwL29wdGlvbnMuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvbXB0Y3Avb3B0aW9ucy5jCkBAIC0xNTMsNiAmIzQzOzE1MywxMyBAQCBzdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJYnJlYWs7CiAKIAljYXNlIE1QVENQT1BUX0RTUzoKJiM0MzsJCS8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovCiYjNDM7CQlpZiAoKG1wX29wdC0mZ3Q7c3Vib3B0aW9ucyAmYW1wOyB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8CiYjNDM7CQkJCQkgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfAomIzQzOwkJCQkJICAgIE9QVElPTl9NUFRDUF9QUklPIHwKJiM0MzsJCQkJCSAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CiAJCXByX2RlYnVnKCYjMzQ7RFNTXG4mIzM0Oyk7CiAJCXB0ciYjNDM7JiM0Mzs7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAyMAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDEwMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1QVENQIERTUyBPcHRpb24gSGFuZGxpbmcqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCB0d2Vha3MgYG5ldC9tcHRjcC9vcHRpb25zLmNgLiBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRvIGJlIGFkZGluZyBhIGNoZWNrIHdpdGhpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBmb3IgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbi4gVGhhdCYjMzk7cyBnb29kLCB3ZSBuZWVkIHRvIGhhbmRsZSBEU1MgcHJvcGVybHkuIE5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBjb25kaXRpb24gaXQmIzM5O3MgaW50cm9kdWNpbmcuIEl0IGxvb2tzIGxpa2UgdGhlIHBhdGNoIGlzIGRlc2lnbmVkIHRvIGJlIHZlcnkgc3RyaWN0OiBpZiB0aGUgYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AgZmllbGQsIHdoaWNoIGNvbnRhaW5zIHRoZSBzdWItb3B0aW9ucyAqd2l0aGluKiB0aGUgRFNTIG9wdGlvbiwgY29udGFpbnMgYW55dGhpbmcgKm90aGVyIHRoYW4qIGBBRERfQUREUmAsIGBSTV9BRERSYCwgYFBSSU9gLCBvciBgRkFJTGAsIHRoZSBEU1Mgb3B0aW9uIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQsIGFzIHRoZSBjb2RlIGJyZWFrcyBvdXQgb2YgcGFyc2luZy4KCkVzc2VudGlhbGx5LCB0aGUgbG9naWMgc2VlbXMgdG8gYmUgc2F5aW5nLCAmIzM0O0lmIHlvdSYjMzk7cmUgdXNpbmcgRFNTLCB5b3UgKm11c3QqIHVzZSBvbmx5IHRoZXNlIHNwZWNpZmljIHN1Yi1vcHRpb25zLCBhbmQgbm90aGluZyBlbHNlLiYjMzQ7IEkgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gd2h5IHRoaXMgcmVzdHJpY3Rpb24gaXMgYmVpbmcgaW1wb3NlZC4gSXMgdGhpcyBhIGRlbGliZXJhdGUgZGVzaWduIGNob2ljZSByZWxhdGVkIHRvIHNlY3VyaXR5LCBjb21wYXRpYmlsaXR5LCBvciBzb21lIG90aGVyIGludGVybmFsIHJlcXVpcmVtZW50PyBPciBpcyB0aGlzIGEgcG90ZW50aWFsIGJ1ZyB0aGF0IHdpbGwgY2F1c2UgaXNzdWVzIHdpdGggbW9yZSBhZHZhbmNlZCBvciBmdXR1cmUgRFNTIGV4dGVuc2lvbnM/IEkmIzM5O20gZ29pbmcgdG8gbmVlZCB0byByZXZpZXcgdGhlIGNvbnRleHQgYW5kIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgYWRkZWQgY2hlY2sgdG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbnMuIExldCBtZSBnbyBiYWNrIHRvIGBtcHRjcF9wYXJzZV9vcHRpb25gIGFuZCBzZWUgd2hhdCYjMzk7cyBhY3R1YWxseSBoYXBwZW5pbmcgYXJvdW5kIHRoaXMgY29kZSBzbmlwcGV0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21wdGNwX3BhcnNlX29wdGlvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9vcHRpb25zLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYz0xOD1zdGF0aWMgYm9vbCBtcHRjcF9jYXBfZmxhZ19zaGEyNTYodTggZmxhZ3MpXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYy0yMi1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MjM6c3RhdGljIHZvaWQgbXB0Y3BfcGFyc2Vfb3B0aW9uKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTI0LVx0XHRcdCAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBvcHNpemUsXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYz0zNjY9dm9pZCBtcHRjcF9nZXRfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAwLVx0XHRcdGlmIChvcGNvZGUgPT0gVENQT1BUX01QVENQKVxubmV0L21wdGNwL29wdGlvbnMuYzo0MDE6XHRcdFx0XHRtcHRjcF9wYXJzZV9vcHRpb24oc2tiLCBwdHIsIG9wc2l6ZSwgbXBfb3B0KTtcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAyLVx0XHRcdHB0ciAmIzQzOz0gb3BzaXplIC0gMjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzAxCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogNDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBwcmVzZW50ZWQgYXMgaWYgaXQmIzM5O3MgbXkgb3duLgoKKipBbmFseXppbmcgdGhlIGBtcHRjcF9wYXJzZV9vcHRpb25gIEZ1bmN0aW9uKioKClJpZ2h0LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYG1wdGNwX3BhcnNlX29wdGlvbmAuIEl0JiMzOTtzIGNsZWFybHkgYSBjcml0aWNhbCBwYXJ0IG9mIHRoZSBNUFRDUCBvcHRpb24gcHJvY2Vzc2luZywgYXMgaXQmIzM5O3MgZGlyZWN0bHkgY2FsbGVkIGJ5IGBtcHRjcF9nZXRfb3B0aW9uc2AuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBhY2Nlc3NpYmlsaXR5IG9mIGBtcHRjcF9nZXRfb3B0aW9uc2AuIElzIHRoaXMgc29tZXRoaW5nIHRoYXQmIzM5O3MgZXhwb3J0ZWQsIGFjY2Vzc2libGUgZnJvbSBvdGhlciBtb2R1bGVzLCBvciBpcyBpdCBhIGxvY2FsLCBpbnRlcm5hbCBmdW5jdGlvbj8gVGhhdCBkaXN0aW5jdGlvbiBtYXR0ZXJzIGJlY2F1c2UgaXQgdGVsbHMgbWUgaG93IHdpZGVseSB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgdXNlZCBhbmQgaWYgaXQgaXMgYW4gYXJlYSB0aGF0IGNvdWxkIGludHJvZHVjZSBleHRlcm5hbCBkZXBlbmRlbmNpZXMsIGlmIHRoZXJlIGlzIGFuIGlzc3VlLiBMZXQmIzM5O3MgZGlnIGRlZXBlciBhbmQgc2VlIGlmIHRoYXQmIzM5O3Mgc3RhdGljIG9yIGV4cG9ydGVkLCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcHRjcF9nZXRfb3B0aW9ucyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9tcHRjcC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYz0yMz1zdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTM2NS1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MzY2OnZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY3LVx0XHQgICAgICAgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgKm1wX29wdClcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTExNDA9Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNjYtXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNjc6XHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFx1MDAyNm1wX29wdCk7XG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNjgtXG4tLVxubmV0L21wdGNwL3Byb3RvY29sLmg9OTE4PXN0cnVjdCBzb2NrICptcHRjcF9za19jbG9uZV9pbml0KGNvbnN0IHN0cnVjdCBzb2NrICpzayxcbi0tXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC05MjEtXHRcdFx0XHQgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKTtcbm5ldC9tcHRjcC9wcm90b2NvbC5oOjkyMjp2b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC05MjMtXHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KTtcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jPTE0Nz1zdGF0aWMgaW50IHN1YmZsb3dfY2hlY2tfcmVxKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTE2Ny1cbm5ldC9tcHRjcC9zdWJmbG93LmM6MTY4Olx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xubmV0L21wdGNwL3N1YmZsb3cuYy0xNjktXG4tLVxubmV0L21wdGNwL3N1YmZsb3cuYz0yNjU9aW50IG1wdGNwX3N1YmZsb3dfaW5pdF9jb29raWVfcmVxKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTI3NS1cdHN1YmZsb3dfaW5pdF9yZXEocmVxLCBza19saXN0ZW5lcik7XG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjI3NjpcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9zdWJmbG93LmMtMjc3LVxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmM9NTI2PXN0YXRpYyB2b2lkIHN1YmZsb3dfZmluaXNoX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtNTQ0LVxubmV0L21wdGNwL3N1YmZsb3cuYzo1NDU6XHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFx1MDAyNm1wX29wdCk7XG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTU0Ni1cdGlmIChzdWJmbG93LVx1MDAzZXJlcXVlc3RfbXB0Y3ApIHtcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jPTgwNj1zdGF0aWMgc3RydWN0IHNvY2sgKnN1YmZsb3dfc3luX3JlY3Zfc29jayhjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXG4tLVxubmV0L21wdGNwL3N1YmZsb3cuYy04NDYtXHRcdCAqL1xubmV0L21wdGNwL3N1YmZsb3cuYzo4NDc6XHRcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9zdWJmbG93LmMtODQ4LVx0XHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjZcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg1Mi1cdH0gZWxzZSBpZiAoc3ViZmxvd19yZXEtXHUwMDNlbXBfam9pbikge1xubmV0L21wdGNwL3N1YmZsb3cuYzo4NTM6XHRcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9zdWJmbG93LmMtODU0LVx0XHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX01QSl9BQ0spKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM4ODcKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZSwgd2l0aCBhICoqYm9sZGVkIGhlYWRlcioqOgoKKipBbmFseXppbmcgTVBUQ1AgT3B0aW9uIEhhbmRsaW5nICZhbXA7IENvbmZpZ3VyYXRpb24qKgoKUmlnaHQsIHNvIGBtcHRjcF9nZXRfb3B0aW9uc2AgaXMgdW5kZW5pYWJseSB0aGUgZnVuY3Rpb24gaGFuZGxpbmcgaW5jb21pbmcgTVBUQ1Agb3B0aW9ucy4gVGhhdCYjMzk7cyBnb29kLCB0aGF0JiMzOTtzIHdoYXQgd2UgZXhwZWN0LiBUaGUgcGF0Y2ggaXRzZWxmIGlzIG1ha2luZyBjaGFuZ2VzIHRvIGhvdyB3ZSBwYXJzZSB0aG9zZSBNUFRDUCBvcHRpb25zLiBGdW5jdGlvbmFsbHksIHRoaXMgaXMgdGhlIGNydXggb2YgdGhlIG1vZGlmaWNhdGlvbi4gQmVmb3JlIEkgZGlnIHRvbyBkZWVwbHkgaW50byB0aGUgY29kZSBhbmQgdGhlIHBhdGNoIGl0c2VsZiwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzeXN0ZW0gdG8gZW5zdXJlIHRoZSBNUFRDUCBmdW5jdGlvbmFsaXR5IGlzIGFjdGl2ZSwgYW5kIGNvbmZpcm0gdGhlIHJlbGV2YW50IHNldHRpbmdzLiBUaGF0IHNlZW1zIGxpa2UgYSBsb2dpY2FsIGZpcnN0IHN0ZXAgYmVmb3JlIEkgZGl2ZSBpbnRvIHRoZSBuaXR0eS1ncml0dHkgb2YgdGhlIHBhcnNpbmcgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTVBUQ1AmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbXB0Y3AvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3AvS2NvbmZpZy0xLVxubmV0L21wdGNwL0tjb25maWc6Mjpjb25maWcgTVBUQ1Bcbm5ldC9tcHRjcC9LY29uZmlnLTMtXHRib29sIFwmIzM0O01QVENQOiBNdWx0aXBhdGggVENQXCYjMzQ7XG4tLVxubmV0L21wdGNwL0tjb25maWc9MTY9Y29uZmlnIElORVRfTVBUQ1BfRElBR1xuLS1cbm5ldC9tcHRjcC9LY29uZmlnLTE5LVxubmV0L21wdGNwL0tjb25maWc6MjA6Y29uZmlnIE1QVENQX0lQVjZcbm5ldC9tcHRjcC9LY29uZmlnLTIxLVx0Ym9vbCBcJiMzNDtNUFRDUDogSVB2NiBzdXBwb3J0IGZvciBNdWx0aXBhdGggVENQXCYjMzQ7XG4tLVxubmV0L21wdGNwL0tjb25maWctMjQtXG5uZXQvbXB0Y3AvS2NvbmZpZzoyNTpjb25maWcgTVBUQ1BfS1VOSVRfVEVTVFxubmV0L21wdGNwL0tjb25maWctMjYtXHR0cmlzdGF0ZSBcJiMzNDtUaGlzIGJ1aWxkcyB0aGUgTVBUQ1AgS1VuaXQgdGVzdHNcJiMzNDsgaWYgIUtVTklUX0FMTF9URVNUU1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQzNDkKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1QVENQIENvbmZpZ3VyYXRpb24qKgoKT2theSwgc28gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB3ZSYjMzk7cmUgd29ya2luZyB3aXRoIGlzIGRlZmluaXRlbHkgYE1QVENQYC4gR2l2ZW4gdGhhdCwgSSBuZWVkIHRvIHBpbnBvaW50IHdoZXJlIHRoZSBpbnRlcmVzdGluZyBsb2dpYyByZXNpZGVzLiBNeSBndXQgdGVsbHMgbWUgZWl0aGVyIGBtcHRjcF9nZXRfb3B0aW9uc2Agb3IgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGlzIHRoZSBmdW5jdGlvbiB0byBleGFtaW5lLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AuIFRoYXQgc2VlbXMgbGlrZSB0aGUgbG9naWNhbCBlbnRyeSBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhpcyBoYW5kbGVzIGluY29taW5nIHRyYWZmaWMsIGRvZXNuJiMzOTt0IGl0PwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcHRjcF9pbmNvbWluZ19vcHRpb25zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L21wdGNwLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTEwNjA9c3RhdGljIHZvaWQgYWNrX3VwZGF0ZV9tc2soc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTEwODUtXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjEwODY6XHQvKiB0aGlzIGFzc3VtZXMgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpIGlzIGludm9rZWQgYWZ0ZXIgdGNwX2FjaygpICovXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTEwODctXHRpZiAoYWZ0ZXI2NChtc2stXHUwMDNld25kX2VuZCwgc25kX254dCkpXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYz0xMTE5PXN0YXRpYyBib29sIGFkZF9hZGRyX2htYWNfdmFsaWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExMzktICovXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNDA6Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE0MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3NzgKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhhdCBxdWVzdGlvbjoKCioqQW5hbHl6aW5nIHRoZSBDYWxsIFNpdGVzIG9mIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB3aGVyZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgaXMgYWN0dWFsbHkgdXNlZC4gVGhhdCBmdW5jdGlvbiBjYWxsIGlzIHByZXR0eSBjcml0aWNhbCBpbiB0aGUgTVBUQ1Agc3RhY2ssIHNvIHVuZGVyc3RhbmRpbmcgaXRzIGNhbGwgc2l0ZXMgaXMgZnVuZGFtZW50YWwgdG8gZmlndXJpbmcgb3V0IGhvdyBvcHRpb25zIGdldCBoYW5kbGVkIHdoZW4gYSBuZXcgTVBUQ1AgY29ubmVjdGlvbiBpcyBiZWluZyBzZXQgdXAuIFRoaXMgd2lsbCBoZWxwIHRvIGFuYWx5emUgbmV0d29yayBiZWhhdmlvdXIuIEkmIzM5O2xsIG5lZWQgdG8ganVtcCBpbnRvIHRoZSBjb2RlIGFuZCBzdGFydCBzZWFyY2hpbmcuIFByb2JhYmx5IHVzaW5nIGBncmVwYCBvciBhIHNpbWlsYXIgdG9vbCB0byBmaW5kIGFsbCBpbnN0YW5jZXMgb2YgdGhhdCBmdW5jdGlvbiBuYW1lLiBJJiMzOTtsbCBuZWVkIHRvIGJlIG1pbmRmdWwgb2YgcG90ZW50aWFsIG1hY3JvcyBvciBpbmRpcmVjdCBjYWxscyBhcyB3ZWxsLiBUaGUgZ29hbCBpc24mIzM5O3QganVzdCBhIGxpdGVyYWwgc3RyaW5nIG1hdGNoOyBJIG5lZWQgdG8gdW5kZXJzdGFuZCAqaG93KiBpdCYjMzk7cyBiZWluZyB1c2VkIHdpdGhpbiB0aGUgTVBUQ1AgZnJhbWV3b3JrIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBvcHRpb25zIGFyZSBwcm9jZXNzZWQuIEkgbmVlZCB0byBub3RlIHRoZSBjb250ZXh0IGFyb3VuZCBlYWNoIGNhbGwgLSB0aGUgYXJndW1lbnRzIHBhc3NlZCwgd2hhdCBvdGhlciBmdW5jdGlvbnMgaXQmIzM5O3MgaW50ZXJhY3Rpbmcgd2l0aCwgYW5kIHdoYXQgdGhlIG92ZXJhbGwgb2JqZWN0aXZlIG9mIHRoZSBjb2RlIHNlZ21lbnQgYXBwZWFycyB0byBiZS4gQmFzZWQgb24gdGhlIHN1cnJvdW5kaW5nIGNvZGUsIEkgY2FuIGdhaW4gYSBzb2xpZCBtZW50YWwgbW9kZWwgb2YgdGhlIG9wdGlvbiBuZWdvdGlhdGlvbiBwcm9jZXNzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcHRjcF9pbmNvbWluZ19vcHRpb25zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L21wdGNwLmg9MTU2PWludCBtcHRjcF9lc3RhYmxpc2hlZF9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcbi0tXG5pbmNsdWRlL25ldC9tcHRjcC5oLTE1OC1cdFx0XHQgICAgICBzdHJ1Y3QgbXB0Y3Bfb3V0X29wdGlvbnMgKm9wdHMpO1xuaW5jbHVkZS9uZXQvbXB0Y3AuaDoxNTk6Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7XG5pbmNsdWRlL25ldC9tcHRjcC5oLTE2MC1cbi0tXG5pbmNsdWRlL25ldC9tcHRjcC5oPTI2Nj1zdGF0aWMgaW5saW5lIGJvb2wgbXB0Y3Bfc3luYWNrX29wdGlvbnMoY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLFxuLS1cbmluY2x1ZGUvbmV0L21wdGNwLmgtMjcyLVxuaW5jbHVkZS9uZXQvbXB0Y3AuaDoyNzM6c3RhdGljIGlubGluZSBib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLFxuaW5jbHVkZS9uZXQvbXB0Y3AuaC0yNzQtXHRcdFx0XHRcdCAgc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvaXB2NC90Y3BfaW5wdXQuYz00ODg0PXZvaWQgdGNwX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODkwLVx0LyogbXB0Y3AgY2FuJiMzOTt0IHRlbGwgdXMgdG8gaWdub3JlIHJlc2V0IHBrdHMsXG5uZXQvaXB2NC90Y3BfaW5wdXQuYzo0ODkxOlx0ICogc28ganVzdCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBtcHRjcF9pbmNvbWluZ19vcHRpb25zKCkuXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODkyLVx0ICovXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODkzLVx0aWYgKHNrX2lzX21wdGNwKHNrKSlcbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjQ4OTQ6XHRcdG1wdGNwX2luY29taW5nX29wdGlvbnMoc2ssIHNrYik7XG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODk1LVxuLS1cbm5ldC9pcHY0L3RjcF9pbnB1dC5jPTU2MDc9c3RhdGljIHZvaWQgdGNwX2RhdGFfcXVldWUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTU2MTYtXHQgKi9cbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjU2MTc6XHRpZiAoc2tfaXNfbXB0Y3Aoc2spIFx1MDAyNlx1MDAyNiAhbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzaywgc2tiKSkge1xubmV0L2lwdjQvdGNwX2lucHV0LmMtNTYxOC1cdFx0X19rZnJlZV9za2Ioc2tiKTtcbi0tXG5uZXQvaXB2NC90Y3BfaW5wdXQuYz03MTUyPXRjcF9yY3Zfc3RhdGVfcHJvY2VzcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4tLVxubmV0L2lwdjQvdGNwX2lucHV0LmMtNzM3OS1cdFx0XHQgKi9cbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjczODA6XHRcdFx0aWYgKHNrX2lzX21wdGNwKHNrKSBcdTAwMjZcdTAwMjYgIW1wdGNwX2luY29taW5nX29wdGlvbnMoc2ssIHNrYikpXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy03MzgxLVx0XHRcdFx0Z290byBkaXNjYXJkO1xuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmM9MTA2MD1zdGF0aWMgdm9pZCBhY2tfdXBkYXRlX21zayhzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTA4NS1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MTA4NjpcdC8qIHRoaXMgYXNzdW1lcyBtcHRjcF9pbmNvbWluZ19vcHRpb25zKCkgaXMgaW52b2tlZCBhZnRlciB0Y3BfYWNrKCkgKi9cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTA4Ny1cdGlmIChhZnRlcjY0KG1zay1cdTAwM2V3bmRfZW5kLCBzbmRfbnh0KSlcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTExMTk9c3RhdGljIGJvb2wgYWRkX2FkZHJfaG1hY192YWxpZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTEzOS0gKi9cbm5ldC9tcHRjcC9vcHRpb25zLmM6MTE0MDpib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxubmV0L21wdGNwL29wdGlvbnMuYy0xMTQxLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjAwNQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDEyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1QVENQIE9wdGlvbiBIYW5kbGluZyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGxvb2tpbmcgaW50byB0aGlzIE1QVENQIGNoYW5nZSwgYW5kIG15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBhbmQgYG1wdGNwX2dldF9vcHRpb25zYCBhcmUgdGhlIGtleSBmdW5jdGlvbnMgdG8gZm9jdXMgb24uIFNpbmNlIHRoZSBhY3R1YWwgbW9kaWZpY2F0aW9uIGlzIHdpdGhpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCwgd2hpY2ggaXMgdW5mb3J0dW5hdGVseSBzdGF0aWMsIHRoZSBiZXN0IGVudHJ5IHBvaW50IHRvIHVuZGVyc3RhbmQgdGhlIHdpZGVyIGltcGxpY2F0aW9ucyB3aWxsIGJlIGBtcHRjcF9nZXRfb3B0aW9uc2AsIGFzIGl0JiMzOTtzIHRoZSBjbG9zZXN0IG5vbi1zdGF0aWMgZnVuY3Rpb24uCgpGaXJzdCwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgdGhhdCBtaWdodCBpbXBhY3QgdGhpcyBiZWhhdmlvdXIuIFdlIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUgTVBUQ1AgaXMgZW5hYmxlZCwgb2J2aW91c2x5LgoKTm93LCBpdCBzZWVtcyBsaWtlIHRoaXMgY2hhbmdlIHNwZWNpZmljYWxseSByZXN0cmljdHMgdGhlIGJlaGF2aW91ciBvZiBEU1Mgb3B0aW9ucyB3aGVuIGNvbWJpbmVkIHdpdGggb3RoZXIgTVBUQ1Agb3B0aW9ucy4gVGhlcmVmb3JlLCBpdCBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLgoKTGV0IG1lIGNpcmNsZSBiYWNrIGFuZCBtZXRpY3Vsb3VzbHkgcmV2aWV3IGBtcHRjcF9nZXRfb3B0aW9uc2AgYW5kIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBpbiBtb3JlIGRldGFpbCwgbm93IHRoYXQgSSBoYXZlIGEgYmV0dGVyIGlkZWEgb2YgdGhlIGNvbnRleHQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21wdGNwX2dldF9vcHRpb25zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTIzPXN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY1LVxubmV0L21wdGNwL29wdGlvbnMuYzozNjY6dm9pZCBtcHRjcF9nZXRfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxubmV0L21wdGNwL29wdGlvbnMuYy0zNjctXHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmM9MTE0MD1ib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2Ni1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MTE2NzpcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2OC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjYxNwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDY4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKgoKT2theSwgc28gYG1wdGNwX2dldF9vcHRpb25zYCBpcyBpbmRlZWQgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRob3NlIG9wdGlvbnMsIGFuZCBpbXBvcnRhbnRseSwgaXQmIzM5O3MgKm5vdCogc3RhdGljLCBtYWtpbmcgaXQgYWNjZXNzaWJsZSBhcyBJIHN1c3BlY3RlZC4gVGhhdCYjMzk7cyBhIGtleSBwaWVjZSBvZiB0aGUgcHV6emxlLiBJJiMzOTtsbCBtYWtlIHN1cmUgdG8ga2VlcCBib3RoIGBtcHRjcF9nZXRfb3B0aW9uc2AgYW5kIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBpbiBzaGFycCBmb2N1cyBoZXJlLCB0aGV5JiMzOTtyZSB0aGUgY29yZSBzeW1ib2xzIEkgbmVlZCB0byB1bmRlcnN0YW5kLiBHaXZlbiB0aGUgY29udGV4dCwgbXkgY29uZmlnIGlzLCBuYXR1cmFsbHksIGBNUFRDUGAuCgpOb3csIGxldCYjMzk7cyBzdGVwIGJhY2sgZm9yIGEgbW9tZW50LiBCZWZvcmUgZGl2aW5nIGRlZXBlciBpbnRvIHRoZSBzcGVjaWZpY3Mgb2Ygb3B0aW9uIHBhcnNpbmcsIEkgd2FudCB0byBjb25maXJtIC0gYXJlIHRoZXJlIGFueSBjcml0aWNhbCBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgYW55IGxvdy1sZXZlbCBmdW5jdGlvbnMgb3IgZXh0ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYE1QVENQYCByZWxpZXMgdXBvbj8gSSBuZWVkIHRvIGJ1aWxkIGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgYXJjaGl0ZWN0dXJhbCBsYW5kc2NhcGUgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgZGV0YWlsZWQgYW5hbHlzaXMgb2YgdGhlIHBhcnNpbmcgbG9naWMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNUFRDUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9LY29uZmlnLTEtXG5uZXQvbXB0Y3AvS2NvbmZpZzoyOmNvbmZpZyBNUFRDUFxubmV0L21wdGNwL0tjb25maWctMy1cdGJvb2wgXCYjMzQ7TVBUQ1A6IE11bHRpcGF0aCBUQ1BcJiMzNDtcbi0tXG5uZXQvbXB0Y3AvS2NvbmZpZz0xNj1jb25maWcgSU5FVF9NUFRDUF9ESUFHXG4tLVxubmV0L21wdGNwL0tjb25maWctMTktXG5uZXQvbXB0Y3AvS2NvbmZpZzoyMDpjb25maWcgTVBUQ1BfSVBWNlxubmV0L21wdGNwL0tjb25maWctMjEtXHRib29sIFwmIzM0O01QVENQOiBJUHY2IHN1cHBvcnQgZm9yIE11bHRpcGF0aCBUQ1BcJiMzNDtcbi0tXG5uZXQvbXB0Y3AvS2NvbmZpZy0yNC1cbm5ldC9tcHRjcC9LY29uZmlnOjI1OmNvbmZpZyBNUFRDUF9LVU5JVF9URVNUXG5uZXQvbXB0Y3AvS2NvbmZpZy0yNi1cdHRyaXN0YXRlIFwmIzM0O1RoaXMgYnVpbGRzIHRoZSBNUFRDUCBLVW5pdCB0ZXN0c1wmIzM0OyBpZiAhS1VOSVRfQUxMX1RFU1RTXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcxMzYKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgTVBUQ1AgS2NvbmZpZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MgYW5kIGNyYWNrIG9wZW4gdGhlIGBuZXQvbXB0Y3AvS2NvbmZpZ2AgZmlsZS4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgdGhlIE11bHRwYXRoIFRDUCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXZhaWxhYmxlIGluIHRoZSBrZXJuZWwuIFRoaXMgY29uZmlnIGZpbGUgaXMgdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIgd2hlbiBpdCBjb21lcyB0byBlbmFibGluZyBhbmQgY3VzdG9taXppbmcgTVBUQ1AmIzM5O3MgYmVoYXZpb3IuIEkmIzM5O20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIHNlZWluZyB3aGF0IGxldmVsIG9mIGNvbnRyb2wgaXQgcHJvdmlkZXMgb3ZlciBkaWZmZXJlbnQgZmVhdHVyZXMg4oCTIHRoaW5ncyBsaWtlIHBhdGggbWFuYWdlbWVudCwgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobXMgKGFuZCB0aGUgcG90ZW50aWFsIHRvIGFkZCBjdXN0b20gb25lcyksIHN1YmZsb3cgZXN0YWJsaXNobWVudCwgYW5kIGhvdyBpdCBoYW5kbGVzIGRpZmZlcmVudCBuZXR3b3JrIGVudmlyb25tZW50cy4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIGEgc3RydWN0dXJlZCBicmVha2Rvd24gb2YgZGVwZW5kZW5jaWVzIGFuZCBkZWZhdWx0IHZhbHVlcywgd2hpY2ggaGVscHMgdW5kZXJzdGFuZCBob3cgdGhlIGRpZmZlcmVudCBwaWVjZXMgb2YgTVBUQ1AgZml0IHRvZ2V0aGVyLiBBcmUgdGhlcmUgYW55IGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcz8gQXJlIGFueSBmZWF0dXJlcyBleHBlcmltZW50YWwgYW5kIHRodXMgYmVoaW5kIGEgY29uZmlnIGZsYWc/IEkmIzM5O20gaG9waW5nIGl0IGNsZWFybHkgbWFwcyBvdXQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgdmFyaW91cyBNUFRDUCBjb21wb25lbnRzIGFuZCB0aGVpciByZXNwZWN0aXZlIGNvbXBpbGUtdGltZSBzZXR0aW5ncy4gSXQmIzM5O3MgdGltZSB0byBzZWUgd2hhdCB0aGlzIEtjb25maWcgZmlsZSBob2xkcyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3AvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdFxuICAgMjpcdGNvbmZpZyBNUFRDUFxuICAgMzpcdFx0Ym9vbCBcJiMzNDtNUFRDUDogTXVsdGlwYXRoIFRDUFwmIzM0O1xuICAgNDpcdFx0ZGVwZW5kcyBvbiBJTkVUXG4gICA1Olx0XHRzZWxlY3QgU0tCX0VYVEVOU0lPTlNcbiAgIDY6XHRcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NlxuICAgNzpcdFx0c2VsZWN0IENSWVBUT19MSUJfVVRJTFNcbiAgIDg6XHRcdGhlbHBcbiAgIDk6XHRcdCAgTXVsdGlwYXRoIFRDUCAoTVBUQ1ApIGNvbm5lY3Rpb25zIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBvdmVyIG11bHRpcGxlXG4gIDEwOlx0XHQgIHN1YmZsb3dzIGluIG9yZGVyIHRvIHV0aWxpemUgbXVsdGlwbGUgbmV0d29yayBwYXRocy4gRWFjaCBzdWJmbG93XG4gIDExOlx0XHQgIHVzZXMgdGhlIFRDUCBwcm90b2NvbCwgYW5kIFRDUCBvcHRpb25zIGNhcnJ5IGhlYWRlciBpbmZvcm1hdGlvbiBmb3JcbiAgMTI6XHRcdCAgTVBUQ1AuXG4gIDEzOlx0XG4gIDE0Olx0aWYgTVBUQ1BcbiAgMTU6XHRcbiAgMTY6XHRjb25maWcgSU5FVF9NUFRDUF9ESUFHXG4gIDE3Olx0XHRkZXBlbmRzIG9uIElORVRfRElBR1xuICAxODpcdFx0ZGVmX3RyaXN0YXRlIElORVRfRElBR1xuICAxOTpcdFxuICAyMDpcdGNvbmZpZyBNUFRDUF9JUFY2XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc2NjAKCQkJCQkJCW91dHB1dDogOTEKCQkJCQkJCXRob3VnaHRzOiAyMDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNUFRDUCBDb25maWd1cmF0aW9uIENoYW5nZSoqCgpPa2F5LCBzbyB0aGlzIG1vZGlmaWNhdGlvbiByZWFsbHkgaGluZ2VzIG9uIHRoZSBgSU5FVGAgc3RhbmRhcmQsIHdoaWNoIEkgYWxyZWFkeSB1bmRlcnN0YW5kLiBUaGUgY29yZSBvZiB0aGlzIHNlZW1zIHRvIGJlIGRyaXZlbiBieSBjaGFuZ2VzIHRvIGBNUFRDUGAgY29uZmlndXJhdGlvbiBvbmx5LiBJIGNhbiBpZ25vcmUgdGhlIG90aGVycyBmb3Igbm93LgoKTGV0JiMzOTtzIGRpZyBhIGJpdCBkZWVwZXIuIEkgc2VlIGBtcHRjcF9wYXJzZV9vcHRpb25gIGlzIHN0YXRpYywgc28gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uIGhlcmUgaXMgYG1wdGNwX2dldF9vcHRpb25zYCwgd2hpY2ggY2FsbHMgdGhlIGZvcm1lci4gVGhlIHJlYWwgbWVhdCBvZiB0aGUgY2hhbmdlIGlzIHdpdGhpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCwgd2hpY2ggaXMgdXNlZCBieSBgbXB0Y3BfZ2V0X29wdGlvbnNgLgoKSXQgc2VlbXMgdGhpcyBwYXRjaCAqcmVzdHJpY3RzKiBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBNUFRDUCBvcHRpb25zLiBJbiBteSB2aWV3LCB0aGF0JiMzOTtzIGEgY2xhc3NpYyBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IGRpcmVjdGx5IGltcGFjdHMgaG93IHRoZSBvcHRpb25zIGFyZSBwYXJzZWQgYW5kIHByb2Nlc3NlZC4gSXQmIzM5O3MgYSBwcmltZSB0YXJnZXQgZm9yIGZ1enppbmcuCgpHaXZlbiB0aGF0LCBJJiMzOTttIGdvaW5nIHRvIHNldDoKCiogICBgV29ydGhGdXp6aW5nOiB0cnVlYCAtIGJlY2F1c2UgdGhpcyBjaGFuZ2UgaGFzIGRpcmVjdCBmdW5jdGlvbmFsIGltcGxpY2F0aW9ucy4KKiAgIGBGb2N1c1N5bWJvbHM6IFsmIzM0O21wdGNwX2dldF9vcHRpb25zJiMzNDssICYjMzQ7bXB0Y3BfaW5jb21pbmdfb3B0aW9ucyYjMzQ7XWAgLSBzaW5jZSB0aGUgY2hhbmdlIGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgcGFyc2luZywgSSB3YW50IHRvIGtlZXAgYW4gZXllIG9uIHRoZXNlIHBhcnNpbmcgZnVuY3Rpb25zLgoqICAgYEVuYWJsZUNvbmZpZ3M6IFsmIzM0O01QVENQJiMzNDtdYCAtIHRvIGxpbWl0IG15IGZvY3VzIHRvIHRoZSBhZmZlY3RlZCBjb25maWd1cmF0aW9uLgoqICAgYFJlYXNvbmluZzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHBhcnNpbmcgb2YgTVBUQ1Agb3B0aW9ucywgc3BlY2lmaWNhbGx5IHJlc3RyaWN0aW5nIHRoZSBjb21iaW5hdGlvbnMgb2YgRFNTIG9wdGlvbnMgd2l0aCBvdGhlciBvcHRpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgTVBUQ1Agb3B0aW9uIHBhcnNpbmcgbG9naWMuJiMzNDtgIC0gSSBuZWVkIHRvIGp1c3RpZnkgbXkgYXBwcm9hY2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNUFRDUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21wdGNwX2dldF9vcHRpb25zJiMzNDssCiAgICAmIzM0O21wdGNwX2luY29taW5nX29wdGlvbnMmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHBhcnNpbmcgb2YgTVBUQ1Agb3B0aW9ucywgc3BlY2lmaWNhbGx5IHJlc3RyaWN0aW5nIHRoZSBjb21iaW5hdGlvbnMgb2YgRFNTIG9wdGlvbnMgd2l0aCBvdGhlciBvcHRpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgTVBUQ1Agb3B0aW9uIHBhcnNpbmcgbG9naWMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01QVENQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bXB0Y3BfZ2V0X29wdGlvbnMmIzM0OywKICAgICYjMzQ7bXB0Y3BfaW5jb21pbmdfb3B0aW9ucyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgcGFyc2luZyBvZiBNUFRDUCBvcHRpb25zLCBzcGVjaWZpY2FsbHkgcmVzdHJpY3RpbmcgdGhlIGNvbWJpbmF0aW9ucyBvZiBEU1Mgb3B0aW9ucyB3aXRoIG90aGVyIG9wdGlvbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBNUFRDUCBvcHRpb24gcGFyc2luZyBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4zbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXN0cmljdHMgdGhlIHBhcnNpbmcgb2YgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9jZXNzZWQgaWYgY2VydGFpbiBvdGhlciBvcHRpb25zIChpbmNsdWRpbmcgYW5vdGhlciBgTVBUQ1BPUFRfRFNTYCkgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkLlxuXG5CZWZvcmUgdGhpcyBwYXRjaCwgaWYgYSBUQ1AgcGFja2V0IGNvbnRhaW5lZCBtdWx0aXBsZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLCBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHZ1bG5lcmFiaWxpdHkgY291bGQgYmUgdHJpZ2dlcmVkLiBUaGUgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdGAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBpbiBmdW5jdGlvbnMgbGlrZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpYC4gT25seSBpdHMgYHN0YXR1c2AgZmllbGQgKHdoaWNoIGNvbnRhaW5zIGJpdGZpZWxkcyBsaWtlIGB1c2VfYWNrYCBhbmQgYHVzZV9tYXBgKSBpcyB6ZXJvZWQsIGxlYXZpbmcgZGF0YSBmaWVsZHMgbGlrZSBgZGF0YV9hY2tgIGFuZCBgZGF0YV9zZXFgIHVuaW5pdGlhbGl6ZWQuXG5cbklmIGEgdmFsaWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIHdhcyBwYXJzZWQgZmlyc3QgKGUuZy4sIHdpdGggYHVzZV9hY2sgPSAwYCksIGl0IHdvdWxkIHNldCB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgaW4gYG1wX29wdC5zdWJvcHRpb25zYCBidXQgbGVhdmUgYGRhdGFfYWNrYCB1bmluaXRpYWxpemVkLiBJZiBhIHNlY29uZCwgbWFsZm9ybWVkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBmb2xsb3dlZCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDFgIGJ1dCBhbiBpbnZhbGlkIGBvcHNpemVgKSwgYG1wdGNwX3BhcnNlX29wdGlvbigpYCB3b3VsZCBvdmVyd3JpdGUgdGhlIGJpdGZpZWxkIHRvIGB1c2VfYWNrID0gMWAgYnV0IGJyZWFrIGVhcmx5IGJlZm9yZSBwb3B1bGF0aW5nIHRoZSBgZGF0YV9hY2tgIGZpZWxkLlxuXG5UaGUgY2FsbGVyIHdvdWxkIHRoZW4gc2VlIHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBzZXQgKGZyb20gdGhlIGZpcnN0IG9wdGlvbikgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5IGZyb20gYGRhdGFfYWNrYCAoZHVlIHRvIHRoZSBjb3JydXB0ZWQgYHVzZV9hY2sgPSAxYCBiaXRmaWVsZCBmcm9tIHRoZSBzZWNvbmQgb3B0aW9uKS4gVGhpcyB1bmluaXRpYWxpemVkIG1lbW9yeSB3b3VsZCB0aGVuIGJlIHVzZWQgaW4gY29udHJvbCBmbG93IChlLmcuLCB1cGRhdGluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIGBtc2stXHUwMDNlc25kX3VuYWAgaW4gYGFja191cGRhdGVfbXNrKClgKSBvciBjb3BpZWQgaW50byBza2IgZXh0ZW5zaW9ucy5cblxuU3RhbmRhcmQgS0FTQU4gZG9lcyBub3QgZGV0ZWN0IHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5LiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyBleGFjdCBjbGFzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNTU3ZmI2ZTk1OGIyNTdkODI4NWQyNTk0N2NjMjVlYzVhNTUyMDM2NgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gQXVnIDEwIDEyOjQxOjIyIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L21wdGNwL29wdGlvbnMuYyBiL25ldC9tcHRjcC9vcHRpb25zLmMKaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDQKLS0tIGEvbmV0L21wdGNwL29wdGlvbnMuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvbXB0Y3Avb3B0aW9ucy5jCkBAIC0xNTMsNiAmIzQzOzE1MywxMyBAQCBzdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJYnJlYWs7CiAKIAljYXNlIE1QVENQT1BUX0RTUzoKJiM0MzsJCS8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovCiYjNDM7CQlpZiAoKG1wX29wdC0mZ3Q7c3Vib3B0aW9ucyAmYW1wOyB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8CiYjNDM7CQkJCQkgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfAomIzQzOwkJCQkJICAgIE9QVElPTl9NUFRDUF9QUklPIHwKJiM0MzsJCQkJCSAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CiAJCXByX2RlYnVnKCYjMzQ7RFNTXG4mIzM0Oyk7CiAJCXB0ciYjNDM7JiM0Mzs7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMTcKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyODMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUGF0Y2ggUmVzdHJpY3RpbmcgRFNTIE9wdGlvbiBQYXJzaW5nKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGluIGBuZXQvbXB0Y3Avb3B0aW9ucy5jYC4gSXQmIzM5O3MgdG91Y2hpbmcgdGhlIGBtcHRjcF9wYXJzZV9vcHRpb25gIGZ1bmN0aW9uLCBzcGVjaWZpY2FsbHkgYWRkaW5nIGEgcmVzdHJpY3Rpb24gZm9yIHRoZSBgTVBUQ1BPUFRfRFNTYCBjYXNlLiBUaGUgYWRkZWQgY2hlY2sgaXMgZmlsdGVyaW5nIHdoaWNoIHN1Ym9wdGlvbnMgYXJlIHZhbGlkIGFsb25nc2lkZSBEU1MuIEl0IGxvb2tzIGxpa2UgaXTigJlzIGFsbG93aW5nIERTUyB0byBvbmx5IHdvcmsgd2l0aCB0aGUgYEFERF9BRERSYCwgYFJNX0FERFJgLCBgUFJJT2AsIGFuZCBgRkFJTGAgc3Vib3B0aW9ucy4gSWYgKmFueSogb3RoZXIgc3Vib3B0aW9uIGlzIHNldCwgdGhlIHN3aXRjaCBqdXN0IGJyZWFrcywgYW5kIERTUyBwYXJzaW5nIGlzIHNraXBwZWQuCgpNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgZG9lcyB0aGlzIGludHJvZHVjZSBhIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2U/IElmIHRoZSBEU1MgcGFyc2luZyBpcyBieXBhc3NlZCwgYXJlIHRoZXJlIGZpZWxkcyB3aXRoaW4gYG1wX29wdGAgdGhhdCBtaWdodCBub3QgZ2V0IHByb3Blcmx5IGluaXRpYWxpemVkPyBUaGF0JiMzOTtzIGEgY2xhc3NpYyBzb3VyY2Ugb2YgcHJvYmxlbXMsIGFuZCBzb21ldGhpbmcgSSBhbHdheXMgaGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0LgoKUmlnaHQsIEkgbmVlZCB0byByZW1pbmQgbXlzZWxmIGhvdyB0aGlzIHdob2xlIHRoaW5nIHdvcmtzLiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBpcyBwYXJzaW5nIG9wdGlvbnMgZnJvbSBhbiBgc2tiYCwgYW5kIGl0IHVzZXMgdGhlIGZ1bmN0aW9uIHRvIHBvcHVsYXRlIHRoZSBgbXBfb3B0YCBzdHJ1Y3R1cmUuIE9rYXksIHNvIEkgc2hvdWxkIGJlIHRha2luZyBhIGNsb3NlciBsb29rIGF0IGJvdGggYG1wdGNwX3BhcnNlX29wdGlvbmAgYW5kIHRoZSBgbXBfb3B0YCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBzdXBwb3NlZCB0byBiZSBpbml0aWFsaXplZCB3aGVuLCBhbmQgd2hhdCB0aGUgY29uc2VxdWVuY2VzIGFyZSBpZiBEU1MgcGFyc2luZyBkb2VzbiYjMzk7dCBoYXBwZW4gaW4gYSBwYXJ0aWN1bGFyIHNjZW5hcmlvLiBJJiMzOTtsbCBuZWVkIHRvIHRyYWNlIHRoZSBkYXRhIGZsb3cgdG8gYmUgc3VyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bXB0Y3BfcGFyc2Vfb3B0aW9uJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTE4PXN0YXRpYyBib29sIG1wdGNwX2NhcF9mbGFnX3NoYTI1Nih1OCBmbGFncylcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTIyLVxubmV0L21wdGNwL29wdGlvbnMuYzoyMzpzdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC9tcHRjcC9vcHRpb25zLmMtMjQtXHRcdFx0ICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IG9wc2l6ZSxcbi0tXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTM2Nj12b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYy00MDAtXHRcdFx0aWYgKG9wY29kZSA9PSBUQ1BPUFRfTVBUQ1ApXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjQwMTpcdFx0XHRcdG1wdGNwX3BhcnNlX29wdGlvbihza2IsIHB0ciwgb3BzaXplLCBtcF9vcHQpO1xubmV0L21wdGNwL29wdGlvbnMuYy00MDItXHRcdFx0cHRyICYjNDM7PSBvcHNpemUgLSAyO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODk0CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBtcHRjcF9nZXRfb3B0aW9uc2AgYW5kIGBtcHRjcF9wYXJzZV9vcHRpb25gIGJ1c2luZXNzLiBJIGltbWVkaWF0ZWx5IHJlY29nbml6ZSB0aGVzZSBhcyB0aGUgY29yZSBmdW5jdGlvbnMgaW52b2x2ZWQgaW4gdGhlIE1QVENQIG9wdGlvbiBuZWdvdGlhdGlvbiBhbmQgcGFyc2luZyBwcm9jZXNzLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZmlndXJlIG91dCB0aGUgZmxvdy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIHJlbGF0ZSwgc3BlY2lmaWNhbGx5OgoKKiAgICoqYG1wdGNwX2dldF9vcHRpb25zYCoqOiBJcyB0aGlzIGEgdG9wLWxldmVsIGRpc3BhdGNoZXI/IERvZXMgaXQgYWN0IGFzIGFuIGVudHJ5IHBvaW50LCBwZXJoYXBzIGNhbGxlZCBkdXJpbmcgY29ubmVjdGlvbiBzZXR1cCBvciB3aGVuIHJlY2VpdmluZyBhbiBNUFRDUC1zcGVjaWZpYyBUQ1Agb3B0aW9uPyBNeSBpbW1lZGlhdGUgZ3Vlc3MgaXMgdGhpcyBpcyBsaWtlbHkgaW52b2tlZCB3aXRoaW4gdGhlIFRDUCBzdGFjayBvciBNUFRDUCBsYXllciB0byByZXRyaWV2ZSBhbmQgcHJlcGFyZSB0aGUgZGF0YSB3aXRoaW4gdGhlIG9wdGlvbiBmaWVsZC4KCiogICAqKmBtcHRjcF9wYXJzZV9vcHRpb25gKio6IFRoaXMgaXMgZGVmaW5pdGVseSB3aGVyZSB0aGUgaGVhdnkgbGlmdGluZyBoYXBwZW5zLiBUaGlzIGlzIHRoZSBkZWNvZGVyLiBJJiMzOTttIGltYWdpbmluZyBhIHN3aXRjaCBvciBzZXJpZXMgb2YgYGlmL2Vsc2VgIHN0YXRlbWVudHMgdGhhdCBjaGVjayB0aGUgb3B0aW9uIGtpbmQgYW5kIHRoZW4gdW5wYWNrIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHN0cnVjdHVyZS4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IHRoZSBkZXRhaWxzIHdpdGhpbiB0aGUga2VybmVsLiBJIGNhbiBzdGFydCBieSB0aGlua2luZyBhYm91dCB3aGF0JiMzOTtzIGludm9sdmVkIGluIHRoaXMgZnVuY3Rpb24uIFRoaXMgaXMgbW9zdCBsaWtlbHk6IENoZWNraW5nIG9wdGlvbiB0eXBlLCBwYXJzaW5nIGl0cyBjb250ZW50LCB2YWxpZGF0aW5nIGl0cyBzaXplLCBoYW5kbGluZyBhbnkgcG90ZW50aWFsIGVycm9ycyB0aGF0IG1heSBhcmlzZS4KCkkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHdoZXJlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLCBhbmQgaG93IHRoZXkgaW50ZXJhY3QuIEFyZSB0aGV5IHBhcnQgb2YgdGhlIFNZTi9TWU4tQUNLL0FDSyBoYW5kbGluZz8gQXJlIHRoZXkgY2FsbGVkIG9ubHkgZHVyaW5nIHRoZSBpbml0aWFsIGhhbmRzaGFrZSwgb3IgYXJlIHRoZXkgaW52b2tlZCBsYXRlciB0byBoYW5kbGUgbWlkLWNvbm5lY3Rpb24gbW9kaWZpY2F0aW9ucywgc3VjaCBhcyBhZGRpbmcgbmV3IHN1YmZsb3dzPyBXaGF0IHNvcnQgb2YgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB0aGV5IHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8/CgpJJiMzOTtsbCBhbHNvIGhhdmUgdG8ga2VlcCBpbiBtaW5kIHBvc3NpYmxlIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBhbmQgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyB3aXRoaW4gdGhpcyBvcHRpb24gcHJvY2Vzc2luZy4gQXJlIHRoZXJlIGFueSBlZGdlIGNhc2VzIG9yIHVudXN1YWwgcGF5bG9hZHMgdGhhdCBjb3VsZCBsZWFkIHRvIGJ1ZmZlciBvdmVyZmxvd3Mgb3IgZGVuaWFsLW9mLXNlcnZpY2U/IFRpbWUgdG8gZGlnIGluIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9tcHRjcC9vcHRpb25zLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNjYsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzNjY6XHR2b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG4gMzY3Olx0XHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuIDM2ODpcdHtcbiAzNjk6XHRcdGNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpO1xuIDM3MDpcdFx0Y29uc3QgdW5zaWduZWQgY2hhciAqcHRyO1xuIDM3MTpcdFx0aW50IGxlbmd0aDtcbiAzNzI6XHRcbiAzNzM6XHRcdC8qIEVuc3VyZSB0aGF0IGNhc3RpbmcgdGhlIHdob2xlIHN0YXR1cyB0byB1MzIgaXMgZWZmaWNpZW50IGFuZCBzYWZlICovXG4gMzc0Olx0XHRCVUlMRF9CVUdfT04oc2l6ZW9mX2ZpZWxkKHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkLCBzdGF0dXMpICE9IHNpemVvZih1MzIpKTtcbiAzNzU6XHRcdEJVSUxEX0JVR19PTighSVNfQUxJR05FRChvZmZzZXRvZihzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCwgc3RhdHVzKSxcbiAzNzY6XHRcdFx0XHRcdCBzaXplb2YodTMyKSkpO1xuIDM3NzpcdFx0Kih1MzIgKilcdTAwMjZtcF9vcHQtXHUwMDNlc3RhdHVzID0gMDtcbiAzNzg6XHRcbiAzNzk6XHRcdGxlbmd0aCA9ICh0aC1cdTAwM2Vkb2ZmICogNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7XG4gMzgwOlx0XHRwdHIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSh0aCAmIzQzOyAxKTtcbiAzODE6XHRcbiAzODI6XHRcdHdoaWxlIChsZW5ndGggXHUwMDNlIDApIHtcbiAzODM6XHRcdFx0aW50IG9wY29kZSA9ICpwdHImIzQzOyYjNDM7O1xuIDM4NDpcdFx0XHRpbnQgb3BzaXplO1xuIDM4NTpcdFxuIDM4NjpcdFx0XHRzd2l0Y2ggKG9wY29kZSkge1xuIDM4NzpcdFx0XHRjYXNlIFRDUE9QVF9FT0w6XG4gMzg4Olx0XHRcdFx0cmV0dXJuO1xuIDM4OTpcdFx0XHRjYXNlIFRDUE9QVF9OT1A6XHQvKiBSZWY6IFJGQyA3OTMgc2VjdGlvbiAzLjEgKi9cbiAzOTA6XHRcdFx0XHRsZW5ndGgtLTtcbiAzOTE6XHRcdFx0XHRjb250aW51ZTtcbiAzOTI6XHRcdFx0ZGVmYXVsdDpcbiAzOTM6XHRcdFx0XHRpZiAobGVuZ3RoIFx1MDAzYyAyKVxuIDM5NDpcdFx0XHRcdFx0cmV0dXJuO1xuIDM5NTpcdFx0XHRcdG9wc2l6ZSA9ICpwdHImIzQzOyYjNDM7O1xuIDM5NjpcdFx0XHRcdGlmIChvcHNpemUgXHUwMDNjIDIpIC8qIFwmIzM0O3NpbGx5IG9wdGlvbnNcJiMzNDsgKi9cbiAzOTc6XHRcdFx0XHRcdHJldHVybjtcbiAzOTg6XHRcdFx0XHRpZiAob3BzaXplIFx1MDAzZSBsZW5ndGgpXG4gMzk5Olx0XHRcdFx0XHRyZXR1cm47XHQvKiBkb24mIzM5O3QgcGFyc2UgcGFydGlhbCBvcHRpb25zICovXG4gNDAwOlx0XHRcdFx0aWYgKG9wY29kZSA9PSBUQ1BPUFRfTVBUQ1ApXG4gNDAxOlx0XHRcdFx0XHRtcHRjcF9wYXJzZV9vcHRpb24oc2tiLCBwdHIsIG9wc2l6ZSwgbXBfb3B0KTtcbiA0MDI6XHRcdFx0XHRwdHIgJiM0Mzs9IG9wc2l6ZSAtIDI7XG4gNDAzOlx0XHRcdFx0bGVuZ3RoIC09IG9wc2l6ZTtcbiA0MDQ6XHRcdFx0fVxuIDQwNTpcdFx0fVxuIDQwNjpcdH1cbiA0MDc6XHRcbiA0MDg6XHRib29sIG1wdGNwX3N5bl9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiA0MDk6XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgc3RydWN0IG1wdGNwX291dF9vcHRpb25zICpvcHRzKVxuIDQxMDpcdHtcbiA0MTE6XHRcdHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3cgPSBtcHRjcF9zdWJmbG93X2N0eChzayk7XG4gNDEyOlx0XG4gNDEzOlx0XHQvKiB3ZSB3aWxsIHVzZSBzbmRfaXNuIHRvIGRldGVjdCBmaXJzdCBwa3QgW3JlXXRyYW5zbWlzc2lvblxuIDQxNDpcdFx0ICogaW4gbXB0Y3BfZXN0YWJsaXNoZWRfb3B0aW9uc19tcCgpXG4gNDE1Olx0XHQgKi9cbiA0MTY6XHRcdHN1YmZsb3ctXHUwMDNlc25kX2lzbiA9IFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VlbmRfc2VxO1xuIDQxNzpcdFx0aWYgKHN1YmZsb3ctXHUwMDNlcmVxdWVzdF9tcHRjcCkge1xuIDQxODpcdFx0XHRpZiAodW5saWtlbHkoc3ViZmxvd19zaW11bHRhbmVvdXNfY29ubmVjdChzaykpKSB7XG4gNDE5Olx0XHRcdFx0V0FSTl9PTl9PTkNFKCFtcHRjcF90cnlfZmFsbGJhY2soc2ssIE1QVENQX01JQl9TSU1VTFRDT05ORkFMTEJBQ0spKTtcbiA0MjA6XHRcbiA0MjE6XHRcdFx0XHQvKiBFbnN1cmUgbXB0Y3BfZmluaXNoX2Nvbm5lY3QoKSB3aWxsIG5vdCBwcm9jZXNzIHRoZVxuIDQyMjpcdFx0XHRcdCAqIE1QQyBoYW5kc2hha2UuXG4gNDIzOlx0XHRcdFx0ICovXG4gNDI0Olx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXF1ZXN0X21wdGNwID0gMDtcbiA0MjU6XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gNDI2Olx0XHRcdH1cbiA0Mjc6XHRcbiA0Mjg6XHRcdFx0b3B0cy1cdTAwM2VzdWJvcHRpb25zID0gT1BUSU9OX01QVENQX01QQ19TWU47XG4gNDI5Olx0XHRcdG9wdHMtXHUwMDNlY3N1bV9yZXFkID0gbXB0Y3BfaXNfY2hlY2tzdW1fZW5hYmxlZChzb2NrX25ldChzaykpO1xuIDQzMDpcdFx0XHRvcHRzLVx1MDAzZWFsbG93X2pvaW5faWQwID0gbXB0Y3BfYWxsb3dfam9pbl9pZDAoc29ja19uZXQoc2spKTtcbiA0MzE6XHRcdFx0KnNpemUgPSBUQ1BPTEVOX01QVENQX01QQ19TWU47XG4gNDMyOlx0XHRcdHJldHVybiB0cnVlO1xuIDQzMzpcdFx0fSBlbHNlIGlmIChzdWJmbG93LVx1MDAzZXJlcXVlc3Rfam9pbikge1xuIDQzNDpcdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZW1vdGVfdG9rZW49JXUsIG5vbmNlPSV1XFxuXCYjMzQ7LCBzdWJmbG93LVx1MDAzZXJlbW90ZV90b2tlbixcbiA0MzU6XHRcdFx0XHQgc3ViZmxvdy1cdTAwM2Vsb2NhbF9ub25jZSk7XG4gNDM2Olx0XHRcdG9wdHMtXHUwMDNlc3Vib3B0aW9ucyA9IE9QVElPTl9NUFRDUF9NUEpfU1lOO1xuIDQzNzpcdFx0XHRvcHRzLVx1MDAzZWpvaW5faWQgPSBzdWJmbG93LVx1MDAzZWxvY2FsX2lkO1xuIDQzODpcdFx0XHRvcHRzLVx1MDAzZXRva2VuID0gc3ViZmxvdy1cdTAwM2VyZW1vdGVfdG9rZW47XG4gNDM5Olx0XHRcdG9wdHMtXHUwMDNlbm9uY2UgPSBzdWJmbG93LVx1MDAzZWxvY2FsX25vbmNlO1xuIDQ0MDpcdFx0XHRvcHRzLVx1MDAzZWJhY2t1cCA9IHN1YmZsb3ctXHUwMDNlcmVxdWVzdF9ia3VwO1xuIDQ0MTpcdFx0XHQqc2l6ZSA9IFRDUE9MRU5fTVBUQ1BfTVBKX1NZTjtcbiA0NDI6XHRcdFx0cmV0dXJuIHRydWU7XG4gNDQzOlx0XHR9XG4gNDQ0Olx0XHRyZXR1cm4gZmFsc2U7XG4gNDQ1Olx0fVxuIDQ0NjpcdFxuIDQ0NzpcdHN0YXRpYyB2b2lkIGNsZWFyXzNyZGFja19yZXRyYW5zbWlzc2lvbihzdHJ1Y3Qgc29jayAqc2spXG4gNDQ4Olx0e1xuIDQ0OTpcdFx0c3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spO1xuIDQ1MDpcdFxuIDQ1MTpcdFx0c2tfc3RvcF90aW1lcihzaywgXHUwMDI2aWNzay1cdTAwM2VpY3NrX2RlbGFja190aW1lcik7XG4gNDUyOlx0XHRpY3NrLVx1MDAzZWljc2tfYWNrLmF0byA9IDA7XG4gNDUzOlx0XHRpY3NrLVx1MDAzZWljc2tfYWNrLnBlbmRpbmcgXHUwMDI2PSB+KElDU0tfQUNLX1NDSEVEIHwgSUNTS19BQ0tfVElNRVIpO1xuIDQ1NDpcdH1cbiA0NTU6XHRcbiA0NTY6XHRzdGF0aWMgYm9vbCBtcHRjcF9lc3RhYmxpc2hlZF9vcHRpb25zX21wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiA0NTc6XHRcdFx0XHRcdFx0IGJvb2wgc25kX2RhdGFfZmluX2VuYWJsZSwgaW50ICpzaXplLFxuIDQ1ODpcdFx0XHRcdFx0XHQgc3RydWN0IG1wdGNwX291dF9vcHRpb25zICpvcHRzKVxuIDQ1OTpcdHtcbiA0NjA6XHRcdHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3cgPSBtcHRjcF9zdWJmbG93X2N0eChzayk7XG4gNDYxOlx0XHRzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrID0gbXB0Y3Bfc2soc3ViZmxvdy1cdTAwM2Vjb25uKTtcbiA0NjI6XHRcdHN0cnVjdCBtcHRjcF9leHQgKm1wZXh0O1xuIDQ2MzpcdFx0dW5zaWduZWQgaW50IGRhdGFfbGVuO1xuIDQ2NDpcdFx0dTggbGVuO1xuIDQ2NTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MDMwCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCYjMzk7cyBpbm5lciBtb25vbG9ndWU6CgoqKk1QVENQIE9wdGlvbiBIYW5kbGluZzogQSBRdWljayBNZW50YWwgQ2hlY2sqKgoKUmlnaHQsIGBtcHRjcF9nZXRfb3B0aW9uc2AgaXMgc3RhcnRpbmcgYnkgemVyb2luZyBvdXQgYG1wX29wdC0mZ3Q7c3RhdHVzYC4gVGhhdCYjMzk7cyBzdGFuZGFyZCBwcmFjdGljZSwgYSBnb29kIGluaXRpYWwgY2xlYXJpbmcgb2YgdGhlIHNsYXRlIGJlZm9yZSB3ZSBkaXZlIGludG8gcGFyc2luZyBhbnl0aGluZy4gSXQmIzM5O3MgYSBmdW5kYW1lbnRhbCBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcgbW92ZSDigJMgZW5zdXJpbmcgYSBjbGVhbiBzdGF0ZSBhbmQgcHJldmVudGluZyB1bmV4cGVjdGVkIGNhcnJ5LW92ZXIgdmFsdWVzIGZyb20gcHJldmlvdXMgb3BlcmF0aW9ucy4gTWFrZXMgcGVyZmVjdCBzZW5zZS4KCk5vdywgbGV0IG1lIGp1c3QgYnJpbmcgdXAgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkYCBpbiBteSBoZWFkLi4uIHllYWgsIG9rYXksIGdvdCBpdC4gVGhpcyBzdHJ1Y3QgaXMgd2hlcmUgYWxsIHRoZSBpbmNvbWluZyBNUFRDUCBvcHRpb24gZGF0YSBpcyBzdG9yZWQsIGNhdGVnb3JpemVkLCBhbmQgbWFuYWdlZC4gSSYjMzk7bSBtZW50YWxseSByZXZpZXdpbmcgaXRzIG1lbWJlcnMg4oCTIHRoZSBmbGFncywgdGhlIGFkZHJlc3NlcywgdGhlIGNhcGFiaWxpdGllcy4gQSBxdWljayByZWZyZXNoIG9uIHdoYXQgZmllbGRzIGFyZSByZWxldmFudCB0byB0aGUgY3VycmVudCBvcHRpb24gbmVnb3RpYXRpb24gaXMgYWx3YXlzIGJlbmVmaWNpYWwuIE5lZWQgdG8gc3RheSBzaGFycCB0byBhZGRyZXNzIHN1YnRsZSBudWFuY2VzIGluIHRoZSBtZXNzYWdlLiBOb3csIEkgY2FuIGNvbnRpbnVlIHdpdGggY29uZmlkZW5jZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgXFx7JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9wcm90b2NvbC5oPTEzOD1zdGF0aWMgaW5saW5lIGJvb2wgYmVmb3JlNjQoX191NjQgc2VxMSwgX191NjQgc2VxMilcbi0tXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC0xNDQtXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaDoxNDU6c3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQge1xubmV0L21wdGNwL3Byb3RvY29sLmgtMTQ2LVx0dTY0XHRzbmRyX2tleTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTQxMwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSYjMzk7cmUgbXkgb3duOgoKKipBbmFseXppbmcgdGhlIG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgU3RydWN0dXJlKioKCkFscmlnaHQsIGxldCYjMzk7cyBwdWxsIHVwIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZGAuIEkmIzM5O3ZlIHNlZW4gdGhpcyBiZWZvcmUsIG9mIGNvdXJzZSwgYnV0IGl0JiMzOTtzIGFsd2F5cyBnb29kIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3MsIGVzcGVjaWFsbHkgd2hlbiBjb25zaWRlcmluZyBlZGdlIGNhc2VzLiBUaGlzIHN0cnVjdHVyZSBpcyB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgaG93IE11bHRpcGF0aCBUQ1AgKE1QVENQKSBoYW5kbGVzIG9wdGlvbiBuZWdvdGlhdGlvbiBvbiBhIHJlY2VpdmVkIHBhY2tldCwgc28gSSBuZWVkIGEgc29saWQgdW5kZXJzdGFuZGluZyBvZiBlYWNoIGZpZWxkIGFuZCBpdHMgaW1wbGljYXRpb25zLgoKSSYjMzk7bGwgYmUgbG9va2luZyBjbG9zZWx5IGF0IHRoZSBiaXRmaWVsZHMsIHRoZSBzaXplIG9mIGVhY2ggbWVtYmVyLCBhbmQgd2hhdCBlYWNoIGZpZWxkIHNpZ25pZmllcyBpbiB0aGUgTVBUQ1AgcHJvdG9jb2wuIEkmIzM5O2xsIG5lZWQgdG8ga25vdyB0aGlzIGxpa2UgdGhlIGJhY2sgb2YgbXkgaGFuZC4gSSB3aWxsIGFuYWx5emUgdGhlIHN0cnVjdHVyZSwgYW5kIGl0IGlzIGNydWNpYWwgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgY3VycmVudCBNUFRDUCBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGluZm9ybSBteSB3b3JrLCBhbmQgaXMgZXNzZW50aWFsIGZvciBpbXBsZW1lbnRpbmcgbmV3IGZlYXR1cmVzIG9yIGRlYnVnZ2luZyBleGlzdGluZyBvbmVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9tcHRjcC9wcm90b2NvbC5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTQ1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNDU6XHRzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCB7XG4gMTQ2Olx0XHR1NjRcdHNuZHJfa2V5O1xuIDE0NzpcdFx0dTY0XHRyY3ZyX2tleTtcbiAxNDg6XHRcdHU2NFx0ZGF0YV9hY2s7XG4gMTQ5Olx0XHR1NjRcdGRhdGFfc2VxO1xuIDE1MDpcdFx0dTMyXHRzdWJmbG93X3NlcTtcbiAxNTE6XHRcdHUxNlx0ZGF0YV9sZW47XG4gMTUyOlx0XHRfX3N1bTE2XHRjc3VtO1xuIDE1MzpcdFx0c3RydWN0X2dyb3VwKHN0YXR1cyxcbiAxNTQ6XHRcdFx0dTE2IHN1Ym9wdGlvbnM7XG4gMTU1Olx0XHRcdHUxNiB1c2VfbWFwOjEsXG4gMTU2Olx0XHRcdCAgICBkc242NDoxLFxuIDE1NzpcdFx0XHQgICAgZGF0YV9maW46MSxcbiAxNTg6XHRcdFx0ICAgIHVzZV9hY2s6MSxcbiAxNTk6XHRcdFx0ICAgIGFjazY0OjEsXG4gMTYwOlx0XHRcdCAgICBtcGNfbWFwOjEsXG4gMTYxOlx0XHRcdCAgICByZXNldF9yZWFzb246NCxcbiAxNjI6XHRcdFx0ICAgIHJlc2V0X3RyYW5zaWVudDoxLFxuIDE2MzpcdFx0XHQgICAgZWNobzoxLFxuIDE2NDpcdFx0XHQgICAgYmFja3VwOjEsXG4gMTY1Olx0XHRcdCAgICBkZW55X2pvaW5faWQwOjEsXG4gMTY2Olx0XHRcdCAgICBfX3VudXNlZDoyO1xuIDE2NzpcdFx0KTtcbiAxNjg6XHRcdHU4XHRqb2luX2lkO1xuIDE2OTpcdFx0dTMyXHR0b2tlbjtcbiAxNzA6XHRcdHUzMlx0bm9uY2U7XG4gMTcxOlx0XHR1NjRcdHRobWFjO1xuIDE3MjpcdFx0dThcdGhtYWNbTVBUQ1BPUFRfSE1BQ19MRU5dO1xuIDE3MzpcdFx0c3RydWN0IG1wdGNwX2FkZHJfaW5mbyBhZGRyO1xuIDE3NDpcdFx0c3RydWN0IG1wdGNwX3JtX2xpc3Qgcm1fbGlzdDtcbiAxNzU6XHRcdHU2NFx0YWhtYWM7XG4gMTc2Olx0XHR1NjRcdGZhaWxfc2VxO1xuIDE3NzpcdH07XG4gMTc4Olx0XG4gMTc5Olx0c3RhdGljIGlubGluZSBfX2JlMzIgbXB0Y3Bfb3B0aW9uKHU4IHN1Ym9wdCwgdTggbGVuLCB1OCBuaWIsIHU4IGZpZWxkKVxuIDE4MDpcdHtcbiAxODE6XHRcdHJldHVybiBodG9ubCgoVENQT1BUX01QVENQIFx1MDAzY1x1MDAzYyAyNCkgfCAobGVuIFx1MDAzY1x1MDAzYyAxNikgfCAoc3Vib3B0IFx1MDAzY1x1MDAzYyAxMikgfFxuIDE4MjpcdFx0XHQgICAgICgobmliIFx1MDAyNiAweEYpIFx1MDAzY1x1MDAzYyA4KSB8IGZpZWxkKTtcbiAxODM6XHR9XG4gMTg0Olx0XG4gMTg1Olx0ZW51bSBtcHRjcF9wbV9zdGF0dXMge1xuIDE4NjpcdFx0TVBUQ1BfUE1fQUREX0FERFJfUkVDRUlWRUQsXG4gMTg3Olx0XHRNUFRDUF9QTV9BRERfQUREUl9TRU5EX0FDSyxcbiAxODg6XHRcdE1QVENQX1BNX1JNX0FERFJfUkVDRUlWRUQsXG4gMTg5Olx0XHRNUFRDUF9QTV9FU1RBQkxJU0hFRCxcbiAxOTA6XHRcdE1QVENQX1BNX1NVQkZMT1dfRVNUQUJMSVNIRUQsXG4gMTkxOlx0XHRNUFRDUF9QTV9BTFJFQURZX0VTVEFCTElTSEVELFx0LyogcGVyc2lzdGVudCBzdGF0dXMsIHNldCBhZnRlciBFU1RBQkxJU0hFRCBldmVudCAqL1xuIDE5MjpcdFx0TVBUQ1BfUE1fTVBDX0VORFBPSU5UX0FDQ09VTlRFRCAvKiBwZXJzaXN0ZW50IHN0YXR1cywgc2V0IGFmdGVyIE1QQyBsb2NhbCBhZGRyZXNzIGlzXG4gMTkzOlx0XHRcdFx0XHRcdCAqIGFjY291bnRlZCBpbnQgaWRfYXZhaWxfYml0bWFwXG4gMTk0Olx0XHRcdFx0XHRcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NDc4CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMzY3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBQYXJzaW5nIExvZ2ljKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBtcHRjcF9nZXRfb3B0aW9uc2AgZnVuY3Rpb24sIGFuZCBpdCB6ZXJvZXMgb3V0IGBtcF9vcHQtJmd0O3N0YXR1c2AsIHdoaWNoIGluY2x1ZGVzIHRoZSBgc3Vib3B0aW9uc2AgZmllbGQgYW5kIGJpdGZpZWxkcy4gVGhlbiwgdGhpcyBwYXRjaCBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBjYXVnaHQgbXkgZXllLiBTcGVjaWZpY2FsbHksIHRoZSBEU1MgY2FzZS4gSXQgY2hlY2tzIGlmIGBtcF9vcHQtJmd0O3N1Ym9wdGlvbnNgIGhhcyBhbnkgYml0cyBzZXQgb3RoZXIgdGhhbiBgT1BUSU9OX01QVENQX0FERF9BRERSYCwgYE9QVElPTl9NUFRDUF9STV9BRERSYCwgYE9QVElPTl9NUFRDUF9QUklPYCwgb3IgYE9QVElPTl9NUFRDUF9GQUlMYC4gSWYgaXQgZG9lcywgaXQganVzdCBicmVha3Mgb3V0IG9mIHRoZSBgc3dpdGNoYCBzdGF0ZW1lbnQsIHdoaWNoIHNlZW1zLi4ub2RkLgoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcywgJiMzNDtIYW5nIG9uLCB3b3VsZG4mIzM5O3QgYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AgbmVlZCB0byBiZSB6ZXJvIGluIHRoZSBmaXJzdCBwbGFjZSBmb3IgdGhpcyBjaGVjayB0byB3b3JrPyYjMzQ7IEJ1dCB0aGVuIEkgcmVtZW1iZXJlZCwgYG1wdGNwX2dldF9vcHRpb25zYCAqZG9lcyogemVybyBpdCBvdXQgcmlnaHQgYXQgdGhlIHN0YXJ0OiBgKih1MzIgKikmYW1wO21wX29wdC0mZ3Q7c3RhdHVzID0gMDtgLiBTbywgdGhhdCBiaXQgd29ya3MuCgpCdXQgbm93IEkmIzM5O20gc2VlaW5nIGEgcG90ZW50aWFsIGZsYXcuIElmIGBtcHRjcF9wYXJzZV9vcHRpb25gIGJyZWFrcyBiZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIGl0ICp3b24mIzM5O3QqIHNldCBgT1BUSU9OX01QVENQX0RTU2AgaW4gYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AuIEFuZCBjcml0aWNhbGx5LCBpdCB3b24mIzM5O3QgcG9wdWxhdGUgYWxsIHRoZSBvdGhlciBmaWVsZHMgcmVsYXRlZCB0byB0aGUgRFNTIG9wdGlvbiBsaWtlIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGBkYXRhX2xlbmAsIGFuZCBgY3N1bWAuIFNvLCB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyBnb2luZyB0byBjaGVjayBgbXBfb3B0LSZndDtzdWJvcHRpb25zYCBhbmQgc2VlIHRoYXQgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQuIEVmZmVjdGl2ZWx5LCB0aGUgRFNTIG9wdGlvbiB3aWxsIGJlIHNpbGVudGx5IGlnbm9yZWQuIElzIHRoaXMgYnkgZGVzaWduIG9yIGEgc3VidGxlIGJ1Zz8KCkFoLCByaWdodCwgYG1wX29wdGAgaXMgdHlwaWNhbGx5IGEgbG9jYWwgdmFyaWFibGUsIGxpa2UgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkYCwgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gVGhlIGNvbnNlcXVlbmNlcyBvZiB0aGUgZGVzY3JpYmVkIGxvZ2ljIGNvdWxkIGJlIGludGVyZXN0aW5nLiBJJiMzOTtkIGJldHRlciBkb3VibGUtY2hlY2sgdGhlIGNhbGxlcnMgb2YgYG1wdGNwX2dldF9vcHRpb25zYCBhbmQgZm9sbG93IHRoZSBmbG93IHRvIHNlZSBob3cgdGhpcyBEU1MgaW5mb3JtYXRpb24gaXMgYmVpbmcgaGFuZGxlZCBmdXJ0aGVyIHVwc3RyZWFtLiBUaGlzIGxvb2tzIGxpa2UgYSBwb3RlbnRpYWwgYXJlYSBmb3IgZnVydGhlciBpbnZlc3RpZ2F0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttcHRjcF9nZXRfb3B0aW9uc1xcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTIzPXN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY1LVxubmV0L21wdGNwL29wdGlvbnMuYzozNjY6dm9pZCBtcHRjcF9nZXRfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxubmV0L21wdGNwL29wdGlvbnMuYy0zNjctXHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmM9MTE0MD1ib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2Ni1cbm5ldC9tcHRjcC9vcHRpb25zLmM6MTE2NzpcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2OC1cbi0tXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaD05MTg9c3RydWN0IHNvY2sgKm1wdGNwX3NrX2Nsb25lX2luaXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxuLS1cbm5ldC9tcHRjcC9wcm90b2NvbC5oLTkyMS1cdFx0XHRcdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpO1xubmV0L21wdGNwL3Byb3RvY29sLmg6OTIyOnZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcbm5ldC9tcHRjcC9wcm90b2NvbC5oLTkyMy1cdFx0ICAgICAgIHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpO1xuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmM9MTQ3PXN0YXRpYyBpbnQgc3ViZmxvd19jaGVja19yZXEoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLFxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtMTY3LVxubmV0L21wdGNwL3N1YmZsb3cuYzoxNjg6XHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFx1MDAyNm1wX29wdCk7XG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTE2OS1cbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jPTI2NT1pbnQgbXB0Y3Bfc3ViZmxvd19pbml0X2Nvb2tpZV9yZXEoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLFxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtMjc1LVx0c3ViZmxvd19pbml0X3JlcShyZXEsIHNrX2xpc3RlbmVyKTtcbm5ldC9tcHRjcC9zdWJmbG93LmM6Mjc2Olx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xubmV0L21wdGNwL3N1YmZsb3cuYy0yNzctXG4tLVxubmV0L21wdGNwL3N1YmZsb3cuYz01MjY9c3RhdGljIHZvaWQgc3ViZmxvd19maW5pc2hfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXG4tLVxubmV0L21wdGNwL3N1YmZsb3cuYy01NDQtXG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjU0NTpcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXHUwMDI2bXBfb3B0KTtcbm5ldC9tcHRjcC9zdWJmbG93LmMtNTQ2LVx0aWYgKHN1YmZsb3ctXHUwMDNlcmVxdWVzdF9tcHRjcCkge1xuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmM9ODA2PXN0YXRpYyBzdHJ1Y3Qgc29jayAqc3ViZmxvd19zeW5fcmVjdl9zb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzayxcbi0tXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg0Ni1cdFx0ICovXG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjg0NzpcdFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xubmV0L21wdGNwL3N1YmZsb3cuYy04NDgtXHRcdGlmICghKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNlxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtODUyLVx0fSBlbHNlIGlmIChzdWJmbG93X3JlcS1cdTAwM2VtcF9qb2luKSB7XG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjg1MzpcdFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xubmV0L21wdGNwL3N1YmZsb3cuYy04NTQtXHRcdGlmICghKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfTVBKX0FDSykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgyNTYKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgYG1wdGNwX2luY29taW5nX29wdGlvbnNgKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2Agc2l0dWF0aW9uLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBzZWUgd2hhdCYjMzk7cyBhY3R1YWxseSAqaW4qIHRoaXMgdGhpbmcuIFdoYXQmIzM5O3MgdGhlIGNvbnRleHQ/IElzIGl0IHJlbGF0ZWQgdG8gdGhlIGNvcmUgTVAtVENQIG5lZ290aWF0aW9uIG9yIG1vcmUgZG93bnN0cmVhbT8gV2hhdCBraW5kIG9mIG9wdGlvbnMgYXJlIHdlIHRhbGtpbmcgYWJvdXQgaGVyZT8gSSBuZWVkIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIHdlJiMzOTtyZSBsb29raW5nIGF0IHN0YW5kYXJkIE1QLVRDUCBvcHRpb25zIGxpa2UgYE1QX0NBUEFCTEVgLCBgTVBfSk9JTmAsIGV0Yy4sIG9yIHNvbWV0aGluZyBtb3JlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHRoYXQgbWlnaHQgYmUgZmxvd2luZyB0aHJvdWdoIHRoZSBNUFRDUCBsYXllci4gSSBpbW1lZGlhdGVseSB0aGluayBhYm91dCBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uLiBJcyB0aGVyZSBhIGRlZmluZWQgc3RydWN0dXJlPyBBcmUgdGhlcmUgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3Mgb3Igb3RoZXIgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIEkgc2hvdWxkIGJlIGxvb2tpbmcgZm9yPyBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGNvdWxkIGJlIGNydWNpYWwgZm9yIG92ZXJhbGwgc3lzdGVtIHN0YWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugc28gSSBhbSBpbnRlcmVzdGVkIGluIGxvb2tpbmcgYXQgdGhlIGRldGFpbHMuIFdlIHNob3VsZCBjaGVjayB0aGlzIHRob3JvdWdobHkuIExldCYjMzk7cyBzdGFydCBkaWdnaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9tcHRjcC9vcHRpb25zLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExNDA6XHRib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuMTE0MTpcdHtcbjExNDI6XHRcdHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3cgPSBtcHRjcF9zdWJmbG93X2N0eChzayk7XG4xMTQzOlx0XHRzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrID0gbXB0Y3Bfc2soc3ViZmxvdy1cdTAwM2Vjb25uKTtcbjExNDQ6XHRcdHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtcbjExNDU6XHRcdHN0cnVjdCBtcHRjcF9leHQgKm1wZXh0O1xuMTE0NjpcdFxuMTE0NzpcdFx0aWYgKF9fbXB0Y3BfY2hlY2tfZmFsbGJhY2sobXNrKSkge1xuMTE0ODpcdFx0XHQvKiBLZWVwIGl0IHNpbXBsZSBhbmQgdW5jb25kaXRpb25hbGx5IHRyaWdnZXIgc2VuZCBkYXRhIGNsZWFudXAgYW5kXG4xMTQ5Olx0XHRcdCAqIHBlbmRpbmcgcXVldWUgc3Bvb2xpbmcuIFdlIHdpbGwgbmVlZCB0byBhY3F1aXJlIHRoZSBkYXRhIGxvY2tcbjExNTA6XHRcdFx0ICogZm9yIG1vcmUgYWNjdXJhdGUgY2hlY2tzLCBhbmQgb25jZSB0aGUgbG9jayBpcyBhY3F1aXJlZCwgc3VjaFxuMTE1MTpcdFx0XHQgKiBoZWxwZXJzIGFyZSBjaGVhcC5cbjExNTI6XHRcdFx0ICovXG4xMTUzOlx0XHRcdG1wdGNwX2RhdGFfbG9jayhzdWJmbG93LVx1MDAzZWNvbm4pO1xuMTE1NDpcdFx0XHRpZiAoc2tfc3RyZWFtX21lbW9yeV9mcmVlKHNrKSlcbjExNTU6XHRcdFx0XHRfX21wdGNwX2NoZWNrX3B1c2goc3ViZmxvdy1cdTAwM2Vjb25uLCBzayk7XG4xMTU2Olx0XG4xMTU3Olx0XHRcdC8qIG9uIGZhbGxiYWNrIHdlIGp1c3QgbmVlZCB0byBpZ25vcmUgdGhlIG1zay1sZXZlbCBzbmRfdW5hLCBhc1xuMTE1ODpcdFx0XHQgKiB0aGlzIGlzIHJlYWxseSBwbGFpbiBUQ1BcbjExNTk6XHRcdFx0ICovXG4xMTYwOlx0XHRcdF9fbXB0Y3Bfc25kX3VuYV91cGRhdGUobXNrLCBSRUFEX09OQ0UobXNrLVx1MDAzZXNuZF9ueHQpKTtcbjExNjE6XHRcbjExNjI6XHRcdFx0X19tcHRjcF9kYXRhX2Fja2VkKHN1YmZsb3ctXHUwMDNlY29ubik7XG4xMTYzOlx0XHRcdG1wdGNwX2RhdGFfdW5sb2NrKHN1YmZsb3ctXHUwMDNlY29ubik7XG4xMTY0Olx0XHRcdHJldHVybiB0cnVlO1xuMTE2NTpcdFx0fVxuMTE2NjpcdFxuMTE2NzpcdFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcdTAwMjZtcF9vcHQpO1xuMTE2ODpcdFxuMTE2OTpcdFx0LyogVGhlIHN1YmZsb3cgY2FuIGJlIGluIGNsb3NlIHN0YXRlIG9ubHkgaWYgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxuMTE3MDpcdFx0ICoganVzdCBzZW50IGEgcmVzZXQuIElmIHNvLCB0ZWxsIHRoZSBjYWxsZXIgdG8gaWdub3JlIHRoZSBjdXJyZW50IHBhY2tldC5cbjExNzE6XHRcdCAqL1xuMTE3MjpcdFx0aWYgKCFjaGVja19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHNrLCBzdWJmbG93LCBza2IsIFx1MDAyNm1wX29wdCkpXG4xMTczOlx0XHRcdHJldHVybiBzay1cdTAwM2Vza19zdGF0ZSAhPSBUQ1BfQ0xPU0U7XG4xMTc0Olx0XG4xMTc1Olx0XHRpZiAodW5saWtlbHkobXBfb3B0LnN1Ym9wdGlvbnMgIT0gT1BUSU9OX01QVENQX0RTUykpIHtcbjExNzY6XHRcdFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0ZBU1RDTE9TRSkgXHUwMDI2XHUwMDI2XG4xMTc3Olx0XHRcdCAgICBSRUFEX09OQ0UobXNrLVx1MDAzZWxvY2FsX2tleSkgPT0gbXBfb3B0LnJjdnJfa2V5KSB7XG4xMTc4Olx0XHRcdFx0V1JJVEVfT05DRShtc2stXHUwMDNlcmN2X2Zhc3RjbG9zZSwgdHJ1ZSk7XG4xMTc5Olx0XHRcdFx0bXB0Y3Bfc2NoZWR1bGVfd29yaygoc3RydWN0IHNvY2sgKiltc2spO1xuMTE4MDpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBU1RDTE9TRVJYKTtcbjExODE6XHRcdFx0fVxuMTE4MjpcdFxuMTE4MzpcdFx0XHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfQUREX0FERFIpIFx1MDAyNlx1MDAyNlxuMTE4NDpcdFx0XHQgICAgYWRkX2FkZHJfaG1hY192YWxpZChtc2ssIFx1MDAyNm1wX29wdCkpIHtcbjExODU6XHRcdFx0XHRpZiAoIW1wX29wdC5lY2hvKSB7XG4xMTg2Olx0XHRcdFx0XHRtcHRjcF9wbV9hZGRfYWRkcl9yZWNlaXZlZChzaywgXHUwMDI2bXBfb3B0LmFkZHIpO1xuMTE4NzpcdFx0XHRcdFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX0FEREFERFIpO1xuMTE4ODpcdFx0XHRcdH0gZWxzZSB7XG4xMTg5Olx0XHRcdFx0XHRtcHRjcF9wbV9hZGRfYWRkcl9lY2hvZWQobXNrLCBcdTAwMjZtcF9vcHQuYWRkcik7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0NjkKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA0MTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBpbiBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSW4gdGhlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBmdW5jdGlvbiwgYG1wX29wdGAsIHRoZSBzdHJ1Y3QgaG9sZGluZyB0aGUgcmVjZWl2ZWQgTVBUQ1Agb3B0aW9ucywgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gTXkgaW1tZWRpYXRlIGNvbmNlcm4/IEl0JiMzOTtzICpub3QqIGluaXRpYWxpemVkLiBOb3csIGBtcHRjcF9nZXRfb3B0aW9uc2AgZG9lcyB6ZXJvIG91dCBgbXBfb3B0LnN0YXR1c2AsIGluY2x1ZGluZyB0aGUgYHN1Ym9wdGlvbnNgIGZpZWxkLCB3aGljaCBpcyBnb29kLiBCdXQgd2FpdOKApiBpdCAqb25seSogemVyb3MgYHN0YXR1c2AhIEl0IHVzZXMgYSByYXRoZXIgY3J1ZGUgY2FzdCB0byBhIHUzMiBwb2ludGVyIHRvIGFjaGlldmUgdGhpcy4KClRoZSByZWFsIHByb2JsZW0gbGllcyBpbiBob3cgdGhlIGNvZGUgaGFuZGxlcyBgTVBUQ1BPUFRfRFNTYC4gYG1wdGNwX2dldF9vcHRpb25zYCB0aGVuIHByb2NlZWRzIHRvIHBhcnNlIHRoZXNlIG9wdGlvbnMuIElmIGl0IGVuY291bnRlcnMgYSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24sIGl0IHNldHMgYE9QVElPTl9NUFRDUF9EU1NgIGluIGBtcF9vcHQuc3Vib3B0aW9uc2AgYW5kIHBvcHVsYXRlcyB0aGUgcmVsZXZhbnQgZGF0YSBmaWVsZHMg4oCTIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGV0Yy4KClRoZSBjcml0aWNhbCB0aGluZywgdGhlIG5ldyBjaGVjayBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCwgaXMgd2hhdCBtYWtlcyB0aGlzIHJlYWxseSB0cmlja3kuIElmLCBhbmQgdGhpcyBpcyB0aGUgY3J1eCwgdGhlIHBhcnNpbmcgb2YgYE1QVENQT1BUX0RTU2AgYnJlYWtzIG91dCBkdWUgdG8gdGhpcyBuZXcsIHJlc3RyaWN0aXZlIGNoZWNrLi4uCgpgYGBjCgljYXNlIE1QVENQT1BUX0RTUzoKCQkvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqLwoJCWlmICgobXBfb3B0LSZndDtzdWJvcHRpb25zICZhbXA7IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHwKCQkJCQkgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfAoJCQkJCSAgICBPUFRJT05fTVBUQ1BfUFJJTyB8CgkJCQkJICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMCkKCQkJYnJlYWs7CmBgYAoKLi4udGhlbiBgT1BUSU9OX01QVENQX0RTU2AgKmlzIG5vdCogc2V0IGluIGBtcF9vcHQuc3Vib3B0aW9uc2AuIFRoYXQgaXMsIGlmIHRoZSBEU1Mgb3B0aW9uIGlzIHByZXNlbnQgYWxvbmcgd2l0aCBvdGhlciBkaXNhbGxvd2VkIG9wdGlvbnMsIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBub3Qgc2V0LgoKVGhlIGNvZGUgdGhlbiBjaGVja3M6CgpgYGBjCglpZiAodW5saWtlbHkobXBfb3B0LnN1Ym9wdGlvbnMgIT0gT1BUSU9OX01QVENQX0RTUykpIHsKYGBgCgpTbywgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQsIHRoaXMgYGlmYCBjb25kaXRpb24gd2lsbCBiZSB0cnVlLCBtZWFuaW5nIHdlIGVudGVyIHRoaXMgYmxvY2sgb2YgY29kZS4KCkhlcmUmIzM5O3Mgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZyDigJMgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQsIGFyZSB3ZSByZWFkaW5nIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnk/IEkgbmVlZCB0byB2ZXJpZnkgd2hhdCBmaWVsZHMgYXJlIHJlYWQgd2l0aGluIHRoYXQgJiMzNDt1bmxpa2VseSYjMzQ7IGJsb2NrLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSBwb3RlbnRpYWwgbGllcyBmb3IgYSBzZXJpb3VzIHZ1bG5lcmFiaWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDExNzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTE3NTpcdFx0aWYgKHVubGlrZWx5KG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1MpKSB7XG4xMTc2Olx0XHRcdGlmICgobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9GQVNUQ0xPU0UpIFx1MDAyNlx1MDAyNlxuMTE3NzpcdFx0XHQgICAgUkVBRF9PTkNFKG1zay1cdTAwM2Vsb2NhbF9rZXkpID09IG1wX29wdC5yY3ZyX2tleSkge1xuMTE3ODpcdFx0XHRcdFdSSVRFX09OQ0UobXNrLVx1MDAzZXJjdl9mYXN0Y2xvc2UsIHRydWUpO1xuMTE3OTpcdFx0XHRcdG1wdGNwX3NjaGVkdWxlX3dvcmsoKHN0cnVjdCBzb2NrICopbXNrKTtcbjExODA6XHRcdFx0XHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBGQVNUQ0xPU0VSWCk7XG4xMTgxOlx0XHRcdH1cbjExODI6XHRcbjExODM6XHRcdFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0FERF9BRERSKSBcdTAwMjZcdTAwMjZcbjExODQ6XHRcdFx0ICAgIGFkZF9hZGRyX2htYWNfdmFsaWQobXNrLCBcdTAwMjZtcF9vcHQpKSB7XG4xMTg1Olx0XHRcdFx0aWYgKCFtcF9vcHQuZWNobykge1xuMTE4NjpcdFx0XHRcdFx0bXB0Y3BfcG1fYWRkX2FkZHJfcmVjZWl2ZWQoc2ssIFx1MDAyNm1wX29wdC5hZGRyKTtcbjExODc6XHRcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9BRERBRERSKTtcbjExODg6XHRcdFx0XHR9IGVsc2Uge1xuMTE4OTpcdFx0XHRcdFx0bXB0Y3BfcG1fYWRkX2FkZHJfZWNob2VkKG1zaywgXHUwMDI2bXBfb3B0LmFkZHIpO1xuMTE5MDpcdFx0XHRcdFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX0VDSE9BREQpO1xuMTE5MTpcdFx0XHRcdH1cbjExOTI6XHRcbjExOTM6XHRcdFx0XHRpZiAobXBfb3B0LmFkZHIucG9ydClcbjExOTQ6XHRcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9QT1JUQUREKTtcbjExOTU6XHRcdFx0fVxuMTE5NjpcdFxuMTE5NzpcdFx0XHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9STV9BRERSKVxuMTE5ODpcdFx0XHRcdG1wdGNwX3BtX3JtX2FkZHJfcmVjZWl2ZWQobXNrLCBcdTAwMjZtcF9vcHQucm1fbGlzdCk7XG4xMTk5Olx0XG4xMjAwOlx0XHRcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX1BSSU8pIHtcbjEyMDE6XHRcdFx0XHRtcHRjcF9wbV9tcF9wcmlvX3JlY2VpdmVkKHNrLCBtcF9vcHQuYmFja3VwKTtcbjEyMDI6XHRcdFx0XHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBQUklPUlgpO1xuMTIwMzpcdFx0XHR9XG4xMjA0Olx0XG4xMjA1Olx0XHRcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0ZBSUwpIHtcbjEyMDY6XHRcdFx0XHRtcHRjcF9wbV9tcF9mYWlsX3JlY2VpdmVkKHNrLCBtcF9vcHQuZmFpbF9zZXEpO1xuMTIwNzpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBSUxSWCk7XG4xMjA4Olx0XHRcdH1cbjEyMDk6XHRcbjEyMTA6XHRcdFx0aWYgKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfUlNUKSB7XG4xMjExOlx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXNldF9zZWVuID0gMTtcbjEyMTI6XHRcdFx0XHRzdWJmbG93LVx1MDAzZXJlc2V0X3JlYXNvbiA9IG1wX29wdC5yZXNldF9yZWFzb247XG4xMjEzOlx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXNldF90cmFuc2llbnQgPSBtcF9vcHQucmVzZXRfdHJhbnNpZW50O1xuMTIxNDpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFJTVFJYKTtcbjEyMTU6XHRcdFx0fVxuMTIxNjpcdFxuMTIxNzpcdFx0XHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUykpXG4xMjE4Olx0XHRcdFx0cmV0dXJuIHRydWU7XG4xMjE5Olx0XHR9XG4xMjIwOlx0XG4xMjIxOlx0XHQvKiB3ZSBjYW4mIzM5O3Qgd2FpdCBmb3IgcmVjdm1zZygpIHRvIHVwZGF0ZSB0aGUgYWNrX3NlcSwgb3RoZXJ3aXNlXG4xMjIyOlx0XHQgKiBtb25vZGlyZWN0aW9uYWwgZmxvd3Mgd2lsbCBzdHVja1xuMTIyMzpcdFx0ICovXG4xMjI0Olx0XHRpZiAobXBfb3B0LnVzZV9hY2spXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNDM1CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogNjc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgT3B0aW9uIEhhbmRsaW5nIExvZ2ljKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdGhpczogSWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQsIHRoZW4gaXQgY2hlY2tzIGEgYnVuY2ggb2Ygb3RoZXIgb3B0aW9ucywgbGlrZSBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAsIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBhbmQgc28gb24uIEluIGVhY2ggb2YgdGhlc2UgY2FzZXMsIGl0JiMzOTtzIHJlYWRpbmcgZmllbGRzIGZyb20gYG1wX29wdGAg4oCTIGByY3ZyX2tleWAsIGBhZGRyYCwgYHJtX2xpc3RgLCBldGMuIOKAkyAqYWZ0ZXIqIGFzc3VtaW5nIGBtcHRjcF9wYXJzZV9vcHRpb25gIGhhcyBhbHJlYWR5IHBvcHVsYXRlZCB0aGVtLCB3aGljaCBpcyB0aGUga2V5IGhlcmUuCgpUaGVuIGNvbWVzIHRoaXMgY29uZGl0aW9uYWw6IGlmIGAhKG1wX29wdC5zdWJvcHRpb25zICZhbXA7IE9QVElPTl9NUFRDUF9EU1MpYCB3aGljaCBtZWFucyAmIzM0O2lmIERTUyBpc24mIzM5O3Qgc2V0LCByZXR1cm4gdHJ1ZSYjMzQ7IGFuZCBqdXN0IHN0b3BzLiBXYWl0Li4uIHRoYXQgbG9va3Mgc3VzcGljaW91cywgYmVjYXVzZSBpZiBEU1MgKmlzbiYjMzk7dCogc2V0LCBpdCAqaW1tZWRpYXRlbHkqIHJldHVybnMgd2l0aG91dCB0b3VjaGluZyB0aGUgRFNTIGZpZWxkcywgYXMgaXQgc2hvdWxkLgoKQnV0LCBpZiBgT1BUSU9OX01QVENQX0RTU2AgKmlzKiBzZXQsIHRoZW4gaXQgZ29lcyBvbiB0byByZWFkIGEgd2hvbGUgYnVuY2ggb2YgRFNTLXNwZWNpZmljIGZpZWxkcyBsaWtlIGB1c2VfYWNrYCwgYGRhdGFfYWNrYCwgYGRhdGFfc2VxYCwgZXRjLiBBZ2FpbiwgdGhlIGFzc3VtcHRpb24gaXMgdGhhdCBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBwb3B1bGF0ZWQgdGhvc2UgZmllbGRzLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCB0aG9zZSBmaWVsZHMgYXJlIHBvcHVsYXRlZCBob2xkcyB0cnVlLgoKTm93LCBJIHJlbWVtYmVyIHNlZWluZyBzb21ldGhpbmcgYWJvdXQgdGhlIGBNUFRDUE9QVF9EU1NgIGNhc2UgaW4gdGhlIGBtcHRjcF9wYXJzZV9vcHRpb25gIGZ1bmN0aW9uLiBBaCwgaGVyZSBpdCBpczogdGhlIHBhdGNoIGluY2x1ZGVzIGEgY29uc3RyYWludDogaWYgYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AgaGFzIGFueSBvcHRpb24gKm90aGVyIHRoYW4qIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBgT1BUSU9OX01QVENQX1BSSU9gLCBvciBgT1BUSU9OX01QVENQX0ZBSUxgIHNldCwgdGhlbiBpdCBicmVha3Mgb3V0LiBUaGF0IG1lYW5zLCBpbnNpZGUgdGhlIERTUyBjYXNlIGluIHRoZSBwYXJzZXIsIGlmIGFueXRoaW5nIGVsc2UsICpsaWtlKiBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAgaXMgc2V0LCB0aGUgcGFyc2VyIGp1c3QgYmFpbHMgb3V0LiBUaGlzIGlzIGdvb2QgYmVjYXVzZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2Agd2lsbCByZXR1cm4gYHRydWVgIGF0IGxpbmUgMTIxOC4KClNvLCAqaWYqIGFueSBvZiB0aG9zZSBvdGhlciBvcHRpb24gYml0cyAqYXJlKiBzZXQgYWxvbmcgd2l0aCBEU1MsIHRoZSBEU1MgcGFyc2luZyAqd29uJiMzOTt0KiBoYXBwZW4sIGFuZCB0aGUgY29kZSB3b24mIzM5O3QgcmVhZCBhbnkgdW5pbml0aWFsaXplZCBEU1MgZmllbGRzLiBSaWdodD8KCk9rYXksIHNvIEkgdGhpbmsgdGhlIHZ1bG5lcmFibGUgcmVhZCBpcyBwcm90ZWN0ZWQgYnkgdGhlIGBtcHRjcF9wYXJzZV9vcHRpb25gIGNvbnN0cmFpbnQuCgpKdXN0IHRvIGJlIHN1cmUsIGlzIHRoZXJlIGFueSBvdGhlciBsb2NhdGlvbiBpbiB0aGlzIGNvZGUgd2hlcmUgYG1wX29wdGAgaXMgcmVhZD8gSXQgaXMgd29ydGggY2hlY2tpbmcgdGhlIGNhbGwgdG8gYGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkKG1zaywgc2ssIHN1YmZsb3csIHNrYiwgJmFtcDttcF9vcHQpYC4gVGhhdCYjMzk7cyB0aGUgbmV4dCBzdGVwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjaGVja19mdWxseV9lc3RhYmxpc2hlZFxcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTg5MD1ib29sIG1wdGNwX3N5bmFja19vcHRpb25zKGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwgdW5zaWduZWQgaW50ICpzaXplLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtOTE4LVxubmV0L21wdGNwL29wdGlvbnMuYzo5MTk6c3RhdGljIGJvb2wgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zaywgc3RydWN0IHNvY2sgKnNzayxcbm5ldC9tcHRjcC9vcHRpb25zLmMtOTIwLVx0XHRcdFx0ICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYz0xMTQwPWJvb2wgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4tLVxubmV0L21wdGNwL29wdGlvbnMuYy0xMTY4LVxubmV0L21wdGNwL29wdGlvbnMuYzoxMTY5Olx0LyogVGhlIHN1YmZsb3cgY2FuIGJlIGluIGNsb3NlIHN0YXRlIG9ubHkgaWYgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxubmV0L21wdGNwL29wdGlvbnMuYy0xMTcwLVx0ICoganVzdCBzZW50IGEgcmVzZXQuIElmIHNvLCB0ZWxsIHRoZSBjYWxsZXIgdG8gaWdub3JlIHRoZSBjdXJyZW50IHBhY2tldC5cbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE3MS1cdCAqL1xubmV0L21wdGNwL29wdGlvbnMuYzoxMTcyOlx0aWYgKCFjaGVja19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHNrLCBzdWJmbG93LCBza2IsIFx1MDAyNm1wX29wdCkpXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNzMtXHRcdHJldHVybiBzay1cdTAwM2Vza19zdGF0ZSAhPSBUQ1BfQ0xPU0U7XG4tLVxubmV0L21wdGNwL3BtLmM9NjA1PXZvaWQgbXB0Y3BfcG1fZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zaywgY29uc3Qgc3RydWN0IHNvY2sgKnNzaylcbi0tXG5uZXQvbXB0Y3AvcG0uYy02MTQtXHQvKiBtcHRjcF9wbV9mdWxseV9lc3RhYmxpc2hlZCgpIGNhbiBiZSBpbnZva2VkIGJ5IG11bHRpcGxlXG5uZXQvbXB0Y3AvcG0uYzo2MTU6XHQgKiByYWNpbmcgcGF0aHMgLSBhY2NlcHQoKSBhbmQgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxubmV0L21wdGNwL3BtLmMtNjE2LVx0ICogYmUgc3VyZSB0byBzZXJ2ZSB0aGlzIGV2ZW50IG9ubHkgb25jZS5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMyMTEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgSSYjMzk7bSByZWFkeS4gSGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggdGhlc2UgYXJlIG15IHRob3VnaHRzLCBrZWVwaW5nIGluIG1pbmQgSSYjMzk7bSBkZWFsaW5nIHdpdGggYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipFeGFtaW5pbmcgYGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBsb2dpYyBvZiBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IgaW4gZGV0YWlsLiBJJiMzOTttIGltbWVkaWF0ZWx5IGZvY3VzaW5nIG9uIHdoYXQgdGhlIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIHZhbGlkYXRlIGFuZCB1bmRlciB3aGF0IGNvbmRpdGlvbnMuIFdoYXQgZGF0YSBpcyBpdCBjb25zdW1pbmcgYW5kIHdoYXQgaXMgdGhlIGV4cGVjdGVkIG91dGNvbWUgYmFzZWQgb24gdGhhdCBpbnB1dD8gSSBuZWVkIHRvIHRoaW5rIHRocm91Z2ggYW55IGVkZ2UgY2FzZXMgYW5kIHBvdGVudGlhbCBmYWlsdXJlIHNjZW5hcmlvcyB0aGUgZnVuY3Rpb24gbWlnaHQgaGFuZGxlLiBBcmUgdGhlcmUgYW55IGltcGxpY2l0IGFzc3VtcHRpb25zIGJha2VkIGludG8gdGhpcyBsb2dpYyB0aGF0IEkgbmVlZCB0byBzdXJmYWNlPyBJJiMzOTttIGFscmVhZHkgYW50aWNpcGF0aW5nIHBvdGVudGlhbCBkZWJ1Z2dpbmcgc3RlcHMgc2hvdWxkIEkgaGF2ZSB0byBhbmFseXplIGEgZG93bnN0cmVhbSBlcnJvciB3aGVyZSBpdCBwbGF5cyBhIHJvbGUuIEkmIzM5O20gZ29pbmcgdG8gY2FyZWZ1bGx5IHJlYWQgZXZlcnkgbGluZSBvZiB0aGlzIGZ1bmN0aW9uLCB0YWtpbmcgdGhlIHRpbWUgdG8gcGFyc2UgZWFjaCBjb21wb25lbnQgZm9yIHRoZSBwdXJwb3NlIG9mIGlkZW50aWZ5aW5nIGFueSBwb3NzaWJsZSBnYXBzIG9yIGluY29uc2lzdGVuY2llcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTE5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA5MTk6XHRzdGF0aWMgYm9vbCBjaGVja19mdWxseV9lc3RhYmxpc2hlZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLCBzdHJ1Y3Qgc29jayAqc3NrLFxuIDkyMDpcdFx0XHRcdFx0ICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXG4gOTIxOlx0XHRcdFx0XHQgICAgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiA5MjI6XHRcdFx0XHRcdCAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuIDkyMzpcdHtcbiA5MjQ6XHRcdC8qIGhlcmUgd2UgY2FuIHByb2Nlc3MgT29PLCBpbi13aW5kb3cgcGt0cywgb25seSBpbi1zZXF1ZW5jZSA0dGggYWNrXG4gOTI1Olx0XHQgKiB3aWxsIG1ha2UgdGhlIHN1YmZsb3cgZnVsbHkgZXN0YWJsaXNoZWRcbiA5MjY6XHRcdCAqL1xuIDkyNzpcdFx0aWYgKGxpa2VseShSRUFEX09OQ0Uoc3ViZmxvdy1cdTAwM2VmdWxseV9lc3RhYmxpc2hlZCkpKSB7XG4gOTI4Olx0XHRcdC8qIG9uIHBhc3NpdmUgc29ja2V0cywgY2hlY2sgZm9yIDNyZCBhY2sgcmV0cmFuc21pc3Npb25cbiA5Mjk6XHRcdFx0ICogbm90ZSB0aGF0IG1zayBpcyBhbHdheXMgc2V0IGJ5IHN1YmZsb3dfc3luX3JlY3Zfc29jaygpXG4gOTMwOlx0XHRcdCAqIGZvciBtcF9qb2luIHN1YmZsb3dzXG4gOTMxOlx0XHRcdCAqL1xuIDkzMjpcdFx0XHRpZiAoVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcSA9PSBzdWJmbG93LVx1MDAzZXNzbl9vZmZzZXQgJiM0MzsgMSBcdTAwMjZcdTAwMjZcbiA5MzM6XHRcdFx0ICAgIFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VlbmRfc2VxID09IFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VzZXEgXHUwMDI2XHUwMDI2XG4gOTM0Olx0XHRcdCAgICBzdWJmbG93LVx1MDAzZW1wX2pvaW4gXHUwMDI2XHUwMDI2IChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OU19NUFRDUF9NUEopIFx1MDAyNlx1MDAyNlxuIDkzNTpcdFx0XHQgICAgIXN1YmZsb3ctXHUwMDNlcmVxdWVzdF9qb2luKVxuIDkzNjpcdFx0XHRcdHRjcF9zZW5kX2Fjayhzc2spO1xuIDkzNzpcdFx0XHRnb3RvIGNoZWNrX25vdGlmeTtcbiA5Mzg6XHRcdH1cbiA5Mzk6XHRcbiA5NDA6XHRcdC8qIHdlIG11c3QgcHJvY2VzcyBPb08gcGFja2V0cyBiZWZvcmUgdGhlIGZpcnN0IHN1YmZsb3cgaXMgZnVsbHlcbiA5NDE6XHRcdCAqIGVzdGFibGlzaGVkLiBPb08gcGFja2V0cyBhcmUgaW5zdGVhZCBhIHByb3RvY29sIHZpb2xhdGlvblxuIDk0MjpcdFx0ICogZm9yIE1QX0pPSU4gc3ViZmxvd3MgYXMgdGhlIHBlZXIgbXVzdCBub3Qgc2VuZCBhbnkgZGF0YVxuIDk0MzpcdFx0ICogYmVmb3JlIHJlY2VpdmluZyB0aGUgZm9ydGggYWNrIC0gY2ZyLiBSRkMgODY4NCBzZWN0aW9uIDMuMi5cbiA5NDQ6XHRcdCAqL1xuIDk0NTpcdFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VzZXEgIT0gc3ViZmxvdy1cdTAwM2Vzc25fb2Zmc2V0ICYjNDM7IDEpIHtcbiA5NDY6XHRcdFx0aWYgKHN1YmZsb3ctXHUwMDNlbXBfam9pbilcbiA5NDc6XHRcdFx0XHRnb3RvIHJlc2V0O1xuIDk0ODpcdFx0XHRpZiAoc3ViZmxvdy1cdTAwM2Vpc19tcHRmbyBcdTAwMjZcdTAwMjYgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9NUENfQUNLKVxuIDk0OTpcdFx0XHRcdGdvdG8gc2V0X2Z1bGx5X2VzdGFibGlzaGVkO1xuIDk1MDpcdFx0XHRyZXR1cm4gc3ViZmxvdy1cdTAwM2VtcF9jYXBhYmxlO1xuIDk1MTpcdFx0fVxuIDk1MjpcdFxuIDk1MzpcdFx0aWYgKHN1YmZsb3ctXHUwMDNlcmVtb3RlX2tleV92YWxpZCBcdTAwMjZcdTAwMjZcbiA5NTQ6XHRcdCAgICAoKChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUykgXHUwMDI2XHUwMDI2IG1wX29wdC1cdTAwM2V1c2VfYWNrKSB8fFxuIDk1NTpcdFx0ICAgICAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfQUREX0FERFIpIFx1MDAyNlx1MDAyNlxuIDk1NjpcdFx0ICAgICAgKCFtcF9vcHQtXHUwMDNlZWNobyB8fCBzdWJmbG93LVx1MDAzZW1wX2pvaW4pKSkpIHtcbiA5NTc6XHRcdFx0Lyogc3ViZmxvd3MgYXJlIGZ1bGx5IGVzdGFibGlzaGVkIGFzIHNvb24gYXMgd2UgZ2V0IGFueVxuIDk1ODpcdFx0XHQgKiBhZGRpdGlvbmFsIGFjaywgaW5jbHVkaW5nIEFERF9BRERSLlxuIDk1OTpcdFx0XHQgKi9cbiA5NjA6XHRcdFx0Z290byBzZXRfZnVsbHlfZXN0YWJsaXNoZWQ7XG4gOTYxOlx0XHR9XG4gOTYyOlx0XG4gOTYzOlx0XHQvKiBJZiB0aGUgZmlyc3QgZXN0YWJsaXNoZWQgcGFja2V0IGRvZXMgbm90IGNvbnRhaW4gTVBfQ0FQQUJMRSAmIzQzOyBkYXRhXG4gOTY0Olx0XHQgKiB0aGVuIGZhbGxiYWNrIHRvIFRDUC4gRmFsbGJhY2sgc2NlbmFyaW9zIHJlcXVpcmVzIGEgcmVzZXQgZm9yXG4gOTY1Olx0XHQgKiBNUF9KT0lOIHN1YmZsb3dzLlxuIDk2NjpcdFx0ICovXG4gOTY3Olx0XHRpZiAoIShtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OU19NUFRDUF9NUEMpKSB7XG4gOTY4Olx0XHRcdGlmIChzdWJmbG93LVx1MDAzZW1wX2pvaW4pXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MzcwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBIYW5kbGluZyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgIGZ1bmN0aW9uLiBJdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoOyBpdCYjMzk7cyBjaGVja2luZyBgbXBfb3B0LSZndDtzdWJvcHRpb25zYC4gQW5kLCBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgc2V0IHdpdGhpbiB0aG9zZSBzdWJvcHRpb25zLCBpdCYjMzk7cyBjaGVja2luZyBgbXBfb3B0LSZndDt1c2VfYWNrYC4gVGhpcyBzZWVtcyBsb2dpY2FsLCBidXQgaXQgaW1tZWRpYXRlbHkgcmFpc2VzIGEgY29uY2VybjogaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHByZXNlbnQsIHNob3VsZG4mIzM5O3QgYG1wdGNwX3BhcnNlX29wdGlvbmAgaGF2ZSAqZ3VhcmFudGVlZCogdGhhdCBgdXNlX2Fja2AgaXMgcG9wdWxhdGVkPyBUaGUgbG9naWMgc2VlbXMgdG8gcmVseSBvbiB0aGF0IGFzc3VtcHRpb24uCgpUaGVuLCB0aGUgcmVkIGZsYWcgd2VudCB1cC4gV2hhdCBpZiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBlbmNvdW50ZXJzIGEgbWFsZm9ybWVkIHBhY2tldCBjb250YWluaW5nIGBNUFRDUE9QVF9EU1NgPyBJcyB0aGVyZSBhbnkgZGVmZW5zaXZlIHByb2dyYW1taW5nIGluIHBsYWNlIHRvIGhhbmRsZSB0aGF0IGNhc2U/IFRoaXMgY291bGQgbGVhZCB0byB1bmRlZmluZWQgYmVoYXZpb3Igb3IsIHdvcnNlLCBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgaWYgdGhlIGNvZGUgcHJvY2VlZHMgd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGRhdGEuIFdlICphYnNvbHV0ZWx5KiBjYW4mIzM5O3QgbGV0IHRoYXQgaGFwcGVuLiBUaGVyZWZvcmUsIEkgbmVlZCB0byBkaWcgaW50byBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCB0byB2ZXJpZnkgcHJlY2lzZWx5IGhvdyBpdCBoYW5kbGVzIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gYW5kIHRoZSBzdWJzZXF1ZW50IHBvcHVsYXRpb24gb2YgYHVzZV9hY2tgLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvZGUgaXMgcm9idXN0IGFuZCBoYW5kbGVzIGludmFsaWQgaW5wdXQgZ3JhY2VmdWxseS4gVGhpcyBuZWVkcyB0byBiZSBjaGVja2VkLCByaWdodCBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE1NTpcdFx0Y2FzZSBNUFRDUE9QVF9EU1M6XG4gMTU2Olx0XHRcdC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG4gMTU3Olx0XHRcdGlmICgobXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHxcbiAxNTg6XHRcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcbiAxNTk6XHRcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcbiAxNjA6XHRcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMClcbiAxNjE6XHRcdFx0XHRicmVhaztcbiAxNjI6XHRcbiAxNjM6XHRcdFx0cHJfZGVidWcoXCYjMzQ7RFNTXFxuXCYjMzQ7KTtcbiAxNjQ6XHRcdFx0cHRyJiM0MzsmIzQzOztcbiAxNjU6XHRcbiAxNjY6XHRcdFx0ZmxhZ3MgPSAoKnB0ciYjNDM7JiM0MzspIFx1MDAyNiBNUFRDUF9EU1NfRkxBR19NQVNLO1xuIDE2NzpcdFx0XHRtcF9vcHQtXHUwMDNlZHNuNjQgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19EU042NCkgIT0gMDtcbiAxNjg6XHRcdFx0bXBfb3B0LVx1MDAzZXVzZV9tYXAgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19IQVNfTUFQKSAhPSAwO1xuIDE2OTpcdFx0XHRtcF9vcHQtXHUwMDNlYWNrNjQgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19BQ0s2NCkgIT0gMDtcbiAxNzA6XHRcdFx0bXBfb3B0LVx1MDAzZXVzZV9hY2sgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19IQVNfQUNLKTtcbiAxNzE6XHRcbiAxNzI6XHRcdFx0ZXhwZWN0ZWRfb3BzaXplID0gVENQT0xFTl9NUFRDUF9EU1NfQkFTRTtcbiAxNzM6XHRcbiAxNzQ6XHRcdFx0aWYgKG1wX29wdC1cdTAwM2V1c2VfYWNrKSB7XG4gMTc1Olx0XHRcdFx0aWYgKG1wX29wdC1cdTAwM2VhY2s2NClcbiAxNzY6XHRcdFx0XHRcdGV4cGVjdGVkX29wc2l6ZSAmIzQzOz0gVENQT0xFTl9NUFRDUF9EU1NfQUNLNjQ7XG4gMTc3Olx0XHRcdFx0ZWxzZVxuIDE3ODpcdFx0XHRcdFx0ZXhwZWN0ZWRfb3BzaXplICYjNDM7PSBUQ1BPTEVOX01QVENQX0RTU19BQ0szMjtcbiAxNzk6XHRcdFx0fVxuIDE4MDpcdFxuIDE4MTpcdFx0XHRpZiAobXBfb3B0LVx1MDAzZXVzZV9tYXApIHtcbiAxODI6XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9maW4gPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19EQVRBX0ZJTikgIT0gMDtcbiAxODM6XHRcdFx0XHRpZiAobXBfb3B0LVx1MDAzZWRzbjY0KVxuIDE4NDpcdFx0XHRcdFx0ZXhwZWN0ZWRfb3BzaXplICYjNDM7PSBUQ1BPTEVOX01QVENQX0RTU19NQVA2NDtcbiAxODU6XHRcdFx0XHRlbHNlXG4gMTg2Olx0XHRcdFx0XHRleHBlY3RlZF9vcHNpemUgJiM0Mzs9IFRDUE9MRU5fTVBUQ1BfRFNTX01BUDMyO1xuIDE4NzpcdFx0XHR9XG4gMTg4Olx0XG4gMTg5Olx0XHRcdHByX2RlYnVnKFwmIzM0O2RhdGFfZmluPSVkIGRzbjY0PSVkIHVzZV9tYXA9JWQgYWNrNjQ9JWQgdXNlX2Fjaz0lZFxcblwmIzM0OyxcbiAxOTA6XHRcdFx0XHQgbXBfb3B0LVx1MDAzZWRhdGFfZmluLCBtcF9vcHQtXHUwMDNlZHNuNjQsXG4gMTkxOlx0XHRcdFx0IG1wX29wdC1cdTAwM2V1c2VfbWFwLCBtcF9vcHQtXHUwMDNlYWNrNjQsXG4gMTkyOlx0XHRcdFx0IG1wX29wdC1cdTAwM2V1c2VfYWNrKTtcbiAxOTM6XHRcbiAxOTQ6XHRcdFx0LyogQWx3YXlzIHBhcnNlIGFueSBjc3VtIHByZXNlbmNlIGNvbWJpbmF0aW9uLCB3ZSB3aWxsIGVuZm9yY2VcbiAxOTU6XHRcdFx0ICogUkZDIDg2ODQgU2VjdGlvbiAzLjMuMCBjaGVja3MgbGF0ZXIgaW4gc3ViZmxvd19kYXRhX3JlYWR5XG4gMTk2Olx0XHRcdCAqL1xuIDE5NzpcdFx0XHRpZiAob3BzaXplICE9IGV4cGVjdGVkX29wc2l6ZSBcdTAwMjZcdTAwMjZcbiAxOTg6XHRcdFx0ICAgIG9wc2l6ZSAhPSBleHBlY3RlZF9vcHNpemUgJiM0MzsgVENQT0xFTl9NUFRDUF9EU1NfQ0hFQ0tTVU0pXG4gMTk5Olx0XHRcdFx0YnJlYWs7XG4gMjAwOlx0XG4gMjAxOlx0XHRcdG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIHw9IE9QVElPTl9NUFRDUF9EU1M7XG4gMjAyOlx0XHRcdGlmIChtcF9vcHQtXHUwMDNldXNlX2Fjaykge1xuIDIwMzpcdFx0XHRcdGlmIChtcF9vcHQtXHUwMDNlYWNrNjQpIHtcbiAyMDQ6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2VkYXRhX2FjayA9IGdldF91bmFsaWduZWRfYmU2NChwdHIpO1xuIDIwNTpcdFx0XHRcdFx0cHRyICYjNDM7PSA4O1xuIDIwNjpcdFx0XHRcdH0gZWxzZSB7XG4gMjA3Olx0XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9hY2sgPSBnZXRfdW5hbGlnbmVkX2JlMzIocHRyKTtcbiAyMDg6XHRcdFx0XHRcdHB0ciAmIzQzOz0gNDtcbiAyMDk6XHRcdFx0XHR9XG4gMjEwOlx0XG4gMjExOlx0XHRcdFx0cHJfZGVidWcoXCYjMzQ7ZGF0YV9hY2s9JWxsdVxcblwmIzM0OywgbXBfb3B0LVx1MDAzZWRhdGFfYWNrKTtcbiAyMTI6XHRcdFx0fVxuIDIxMzpcdFxuIDIxNDpcdFx0XHRpZiAobXBfb3B0LVx1MDAzZXVzZV9tYXApIHtcbiAyMTU6XHRcdFx0XHRpZiAobXBfb3B0LVx1MDAzZWRzbjY0KSB7XG4gMjE2Olx0XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9zZXEgPSBnZXRfdW5hbGlnbmVkX2JlNjQocHRyKTtcbiAyMTc6XHRcdFx0XHRcdHB0ciAmIzQzOz0gODtcbiAyMTg6XHRcdFx0XHR9IGVsc2Uge1xuIDIxOTpcdFx0XHRcdFx0bXBfb3B0LVx1MDAzZWRhdGFfc2VxID0gZ2V0X3VuYWxpZ25lZF9iZTMyKHB0cik7XG4gMjIwOlx0XHRcdFx0XHRwdHIgJiM0Mzs9IDQ7XG4gMjIxOlx0XHRcdFx0fVxuIDIyMjpcdFxuIDIyMzpcdFx0XHRcdG1wX29wdC1cdTAwM2VzdWJmbG93X3NlcSA9IGdldF91bmFsaWduZWRfYmUzMihwdHIpO1xuIDIyNDpcdFx0XHRcdHB0ciAmIzQzOz0gNDtcbiAyMjU6XHRcbiAyMjY6XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9sZW4gPSBnZXRfdW5hbGlnbmVkX2JlMTYocHRyKTtcbiAyMjc6XHRcdFx0XHRwdHIgJiM0Mzs9IDI7XG4gMjI4Olx0XG4gMjI5Olx0XHRcdFx0aWYgKG9wc2l6ZSA9PSBleHBlY3RlZF9vcHNpemUgJiM0MzsgVENQT0xFTl9NUFRDUF9EU1NfQ0hFQ0tTVU0pIHtcbiAyMzA6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIHw9IE9QVElPTl9NUFRDUF9DU1VNUkVRRDtcbiAyMzE6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2Vjc3VtID0gZ2V0X3VuYWxpZ25lZCgoX19mb3JjZSBfX3N1bTE2ICopcHRyKTtcbiAyMzI6XHRcdFx0XHRcdHB0ciAmIzQzOz0gMjtcbiAyMzM6XHRcdFx0XHR9XG4gMjM0Olx0XG4gMjM1Olx0XHRcdFx0cHJfZGVidWcoXCYjMzQ7ZGF0YV9zZXE9JWxsdSBzdWJmbG93X3NlcT0ldSBkYXRhX2xlbj0ldSBjc3VtPSVkOiV1XFxuXCYjMzQ7LFxuIDIzNjpcdFx0XHRcdFx0IG1wX29wdC1cdTAwM2VkYXRhX3NlcSwgbXBfb3B0LVx1MDAzZXN1YmZsb3dfc2VxLFxuIDIzNzpcdFx0XHRcdFx0IG1wX29wdC1cdTAwM2VkYXRhX2xlbiwgISEobXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9DU1VNUkVRRCksXG4gMjM4Olx0XHRcdFx0XHQgbXBfb3B0LVx1MDAzZWNzdW0pO1xuIDIzOTpcdFx0XHR9XG4gMjQwOlx0XG4gMjQxOlx0XHRcdGJyZWFrO1xuIDI0MjpcdFxuIDI0MzpcdFx0Y2FzZSBNUFRDUE9QVF9BRERfQUREUjpcbiAyNDQ6XHRcdFx0bXBfb3B0LVx1MDAzZWVjaG8gPSAoKnB0ciYjNDM7JiM0MzspIFx1MDAyNiBNUFRDUF9BRERSX0VDSE87XG4gMjQ1Olx0XHRcdGlmICghbXBfb3B0LVx1MDAzZWVjaG8pIHtcbiAyNDY6XHRcdFx0XHRpZiAob3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFIgfHxcbiAyNDc6XHRcdFx0XHQgICAgb3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFJfUE9SVClcbiAyNDg6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2VhZGRyLmZhbWlseSA9IEFGX0lORVQ7XG4gMjQ5Olx0I2lmIElTX0VOQUJMRUQoQ09ORklHX01QVENQX0lQVjYpXG4gMjUwOlx0XHRcdFx0ZWxzZSBpZiAob3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFI2IHx8XG4gMjUxOlx0XHRcdFx0XHQgb3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFI2X1BPUlQpXG4gMjUyOlx0XHRcdFx0XHRtcF9vcHQtXHUwMDNlYWRkci5mYW1pbHkgPSBBRl9JTkVUNjtcbiAyNTM6XHQjZW5kaWZcbiAyNTQ6XHRcdFx0XHRlbHNlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NTY3CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNzc5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk1QVENQIERTUyBPcHRpb24gUGFyc2luZzogUG90ZW50aWFsIEZsYXcqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYG1wdGNwX3BhcnNlX29wdGlvbmAgZnVuY3Rpb24gYW5kIHNvbWV0aGluZyYjMzk7cyBidWdnaW5nIG1lLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gbm90aWNpbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgd2hlbiBoYW5kbGluZyB0aGUgRFNTIChEYXRhIFNlcXVlbmNlIFNpemUpIG9wdGlvbi4gSXQgbG9va3MgbGlrZSBpdCYjMzk7cyBzZXR0aW5nIHRoZSBgbXBfb3B0LSZndDtkc242NGAsIGBtcF9vcHQtJmd0O3VzZV9tYXBgLCBgbXBfb3B0LSZndDthY2s2NGAsIGFuZCBgbXBfb3B0LSZndDt1c2VfYWNrYCBmbGFncyAqYmVmb3JlKiBpdCBhY3R1YWxseSB2YWxpZGF0ZXMgdGhlIG9wdGlvbiBzaXplIChgb3BzaXplYCkuCgpUaGUgY29kZSBwdWxscyB0aGUgZmxhZ3MsIHNldHMgdGhlIGJpdGZpZWxkcyBpbiBgbXBfb3B0YCwgYW5kICp0aGVuKiBjaGVja3MgYG9wc2l6ZWAuIElmIHRoZSBzaXplIGlzIGluY29ycmVjdCwgdGhlIGZ1bmN0aW9uIGJyZWFrcyBvdXQgb2YgdGhlIHBhcnNpbmcgbG9vcC4gVGhpcyBtZWFucyB0aGF0IGlmIGBvcHNpemVgIGlzIHdyb25nLCBhbmQgdGhlIERTUyBvcHRpb24gaXMgaW52YWxpZCwgdGhvc2UgZmxhZ3MgbGlrZSBgbXBfb3B0LSZndDt1c2VfYWNrYCBjb3VsZCBiZSBzZXQgdG8gMSwgYnV0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LSZndDtzdWJvcHRpb25zYCB3b3VsZCAqbm90KiBiZSBzZXQuCgpTaW5jZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgKm9ubHkqIGNoZWNrcyBgbXBfb3B0LnN1Ym9wdGlvbnMgJmFtcDsgT1BUSU9OX01QVENQX0RTU2AgdG8gZGV0ZXJtaW5lIGlmIERTUyBmaWVsZHMgc2hvdWxkIGJlIHByb2Nlc3NlZCwgaXQgd291bGQgaWdub3JlIGFueSBEU1MgaW5mb3JtYXRpb24gaWYgdGhlIG9wdGlvbiBzaXplIGlzIGludmFsaWQuIFRoYXQgc2VlbXMuLi4gb2theSwgZnVuY3Rpb25hbGx5LCBidXQgaXQgZGlkIG1ha2UgbWUgd29uZGVyIGlmIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IG1pZ2h0IGJlIGEgcG90ZW50aWFsIGlzc3VlIGhlcmUuCgpOb3csIHRoYXQgcGF0Y2ggYWRkcyBhIGNoZWNrOgpgYGBjCiAgICAgICAgY2FzZSBNUFRDUE9QVF9EU1M6CiAgICAgICAgICAgICAgICAvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqLwogICAgICAgICAgICAgICAgaWYgKChtcF9vcHQtJmd0O3N1Ym9wdGlvbnMgJmFtcDsgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05fTVBUQ1BfUFJJTyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKYGBgCgpUaGlzIG5ldyBjaGVjayBpcyBldmVuIG1vcmUgY29uY2VybmluZy4gSWYgdGhpcyBicmVha3MsIHRoZSBvcHRpb24gZ2V0cyBkcm9wcGVkIGJlZm9yZSBzZXR0aW5nICphbnkqIG9mIHRoZSBEU1MgZmllbGRzLiBTbywgcG90ZW50aWFsbHksIHdlIGNvdWxkIGhhdmUgYW4gaW52YWxpZCBzaXR1YXRpb24sIHdoZXJlIGFuIGBtcF9vcHRgIHN0cnVjdHVyZSBnZXRzIHVzZWQgZG93bnN0cmVhbSBhbmQgc29tZSBmaWVsZHMgYXJlIHVuaW5pdGlhbGl6ZWQuIEFuZCBJIHRoaW5rIHRoYXQmIzM5O3Mgd2hlcmUgSSBuZWVkIHRvIGNoZWNrLgoKTGV0IG1lIHRyYWNlIGJhY2sgdG8gYG1wdGNwX2dldF9vcHRpb25zYCBhZ2Fpbi4gT2theSwgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGRlY2xhcmVzIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHQ7YCBvbiB0aGUgc3RhY2ssIHdoaWNoIGlzIGdvb2QuIEl0IGNhbGxzIGBtcHRjcF9nZXRfb3B0aW9uc2AsIHBhc3NpbmcgdGhpcyBzdHJ1Y3QuIENydWNpYWxseSwgYG1wdGNwX2dldF9vcHRpb25zYCAqemVyb2VzKiBgbXBfb3B0LnN0YXR1c2AgYXQgdGhlIGJlZ2lubmluZy4gVGhhdCYjMzk7cyBnb29kOyBhbnkgZmxhZ3Mgbm90IHNldCBieSBhIHZhbGlkIG9wdGlvbiBzaG91bGQgYmUgY2xlYXJlZC4gQW5kIGFmdGVyIHplcm9pbmcgdGhpcyBzdHJ1Y3QsIGl0IHN0YXJ0cyBwYXJzaW5nIG9wdGlvbnMuIElmIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gaXMgcGFyc2VkIGNvcnJlY3RseSwgdGhlbiBgbXBfb3B0LmRhdGFfYWNrYCwgYG1wX29wdC5kYXRhX3NlcWAsIGV0Yy4gYXJlIHBvcHVsYXRlZC4gQnV0IGlmIGl0JiMzOTtzIG5vdCBwYXJzZWQgY29ycmVjdGx5LCB0aG9zZSBmaWVsZHMgcmVtYWluICp1bmluaXRpYWxpemVkKi4KCkhvd2V2ZXIsICpiZWZvcmUqIHRob3NlIGBkYXRhX2Fja2AvYGRhdGFfc2VxYCBmaWVsZHMgYXJlIHJlYWQsIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBjaGVja3MgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHNldCBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgLiBJZiBpdCYjMzk7cyBub3Qgc2V0LCBpdCBkb2VzbiYjMzk7dCB0cnkgdG8gYWNjZXNzIHRoZW0uIFNvIHRoZSB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgKm9ubHkqIHVzZWQgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHNldC4gT2theSwgdGhhdCBzb3VuZHMgbGlrZSBpdCBzaG91bGQgYmUgc2FmZS4gSSBzdGlsbCBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IHRoaXMgaXMgdHJ1ZSBpbiBhbGwgY2FzZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEyMTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTIxMDpcdFx0XHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9SU1QpIHtcbjEyMTE6XHRcdFx0XHRzdWJmbG93LVx1MDAzZXJlc2V0X3NlZW4gPSAxO1xuMTIxMjpcdFx0XHRcdHN1YmZsb3ctXHUwMDNlcmVzZXRfcmVhc29uID0gbXBfb3B0LnJlc2V0X3JlYXNvbjtcbjEyMTM6XHRcdFx0XHRzdWJmbG93LVx1MDAzZXJlc2V0X3RyYW5zaWVudCA9IG1wX29wdC5yZXNldF90cmFuc2llbnQ7XG4xMjE0Olx0XHRcdFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX01QUlNUUlgpO1xuMTIxNTpcdFx0XHR9XG4xMjE2Olx0XG4xMjE3Olx0XHRcdGlmICghKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfRFNTKSlcbjEyMTg6XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbjEyMTk6XHRcdH1cbjEyMjA6XHRcbjEyMjE6XHRcdC8qIHdlIGNhbiYjMzk7dCB3YWl0IGZvciByZWN2bXNnKCkgdG8gdXBkYXRlIHRoZSBhY2tfc2VxLCBvdGhlcndpc2VcbjEyMjI6XHRcdCAqIG1vbm9kaXJlY3Rpb25hbCBmbG93cyB3aWxsIHN0dWNrXG4xMjIzOlx0XHQgKi9cbjEyMjQ6XHRcdGlmIChtcF9vcHQudXNlX2FjaylcbjEyMjU6XHRcdFx0YWNrX3VwZGF0ZV9tc2sobXNrLCBzaywgXHUwMDI2bXBfb3B0KTtcbjEyMjY6XHRcdHJ3aW5fdXBkYXRlKG1zaywgc2ssIHNrYik7XG4xMjI3Olx0XG4xMjI4Olx0XHQvKiBaZXJvLWRhdGEtbGVuZ3RoIHBhY2tldHMgYXJlIGRyb3BwZWQgYnkgdGhlIGNhbGxlciBhbmQgbm90XG4xMjI5Olx0XHQgKiBwcm9wYWdhdGVkIHRvIHRoZSBNUFRDUCBsYXllciwgc28gdGhlIHNrYiBleHRlbnNpb24gZG9lcyBub3RcbjEyMzA6XHRcdCAqIG5lZWQgdG8gYmUgYWxsb2NhdGVkIG9yIHBvcHVsYXRlZC4gREFUQV9GSU4gaW5mb3JtYXRpb24sIGlmXG4xMjMxOlx0XHQgKiBwcmVzZW50LCBuZWVkcyB0byBiZSB1cGRhdGVkIGhlcmUgYmVmb3JlIHRoZSBza2IgaXMgZnJlZWQuXG4xMjMyOlx0XHQgKi9cbjEyMzM6XHRcdGlmIChUQ1BfU0tCX0NCKHNrYiktXHUwMDNlc2VxID09IFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VlbmRfc2VxKSB7XG4xMjM0Olx0XHRcdGlmIChtcF9vcHQuZGF0YV9maW4gXHUwMDI2XHUwMDI2IG1wX29wdC5kYXRhX2xlbiA9PSAxIFx1MDAyNlx1MDAyNlxuMTIzNTpcdFx0XHQgICAgbXB0Y3BfdXBkYXRlX3Jjdl9kYXRhX2Zpbihtc2ssIG1wX29wdC5kYXRhX3NlcSwgbXBfb3B0LmRzbjY0KSlcbjEyMzY6XHRcdFx0XHRtcHRjcF9zY2hlZHVsZV93b3JrKChzdHJ1Y3Qgc29jayAqKW1zayk7XG4xMjM3Olx0XG4xMjM4Olx0XHRcdHJldHVybiB0cnVlO1xuMTIzOTpcdFx0fVxuMTI0MDpcdFxuMTI0MTpcdFx0bXBleHQgPSBza2JfZXh0X2FkZChza2IsIFNLQl9FWFRfTVBUQ1ApO1xuMTI0MjpcdFx0aWYgKCFtcGV4dClcbjEyNDM6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTI0NDpcdFxuMTI0NTpcdFx0bWVtc2V0KG1wZXh0LCAwLCBzaXplb2YoKm1wZXh0KSk7XG4xMjQ2Olx0XG4xMjQ3Olx0XHRpZiAobGlrZWx5KG1wX29wdC51c2VfbWFwKSkge1xuMTI0ODpcdFx0XHRpZiAobXBfb3B0Lm1wY19tYXApIHtcbjEyNDk6XHRcdFx0XHQvKiB0aGlzIGlzIGFuIE1QX0NBUEFCTEUgY2FycnlpbmcgTVBUQ1AgZGF0YVxuMTI1MDpcdFx0XHRcdCAqIHdlIGtub3cgdGhpcyBtYXAgdGhlIGZpcnN0IGNodW5rIG9mIGRhdGFcbjEyNTE6XHRcdFx0XHQgKi9cbjEyNTI6XHRcdFx0XHRtcHRjcF9jcnlwdG9fa2V5X3NoYShzdWJmbG93LVx1MDAzZXJlbW90ZV9rZXksIE5VTEwsXG4xMjUzOlx0XHRcdFx0XHRcdCAgICAgXHUwMDI2bXBleHQtXHUwMDNlZGF0YV9zZXEpO1xuMTI1NDpcdFx0XHRcdG1wZXh0LVx1MDAzZWRhdGFfc2VxJiM0MzsmIzQzOztcbjEyNTU6XHRcdFx0XHRtcGV4dC1cdTAwM2VzdWJmbG93X3NlcSA9IDE7XG4xMjU2Olx0XHRcdFx0bXBleHQtXHUwMDNlZHNuNjQgPSAxO1xuMTI1NzpcdFx0XHRcdG1wZXh0LVx1MDAzZW1wY19tYXAgPSAxO1xuMTI1ODpcdFx0XHRcdG1wZXh0LVx1MDAzZWRhdGFfZmluID0gMDtcbjEyNTk6XHRcdFx0fSBlbHNlIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTkwMjEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxNjU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRTUyBPcHRpb24gUGFyc2luZzogQSBEZWVwIERpdmUgaW50byBQb3RlbnRpYWwgVnVsbmVyYWJpbGl0aWVzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgYWJvdXQgaG93IHRoZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgZnVuY3Rpb24gaGFuZGxlcyB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgYW5kIHJlbGF0ZWQgZGF0YS4gU3BlY2lmaWNhbGx5LCB0aGUgZnVuY3Rpb24mIzM5O3MgbG9naWMgc2VlbXMgdG8gcmV0dXJuIGVhcmx5IGlmIGBPUFRJT05fTVBUQ1BfRFNTYCBpc24mIzM5O3Qgc2V0LCB3aGljaCBhcHBlYXJzIHRvIGJlIGEgc2FmZWd1YXJkIGFnYWluc3QgdW5pbml0aWFsaXplZCByZWFkcy4gSWYgYE9QVElPTl9NUFRDUF9EU1NgICppcyogc2V0LCB0aGVuIGl0IHByb2NlZWRzIHRvIGFjY2VzcyBmaWVsZHMgbGlrZSBgdXNlX2Fja2AsIGBkYXRhX2ZpbmAsIGFuZCBgZGF0YV9sZW5gLgoKTXkgY29uY2VybiByZXZvbHZlZCBhcm91bmQgaG93IG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIG1pZ2h0IGJlIGhhbmRsZWQgd2l0aGluIGEgc2luZ2xlIHBhY2tldC4gSWYgbXVsdGlwbGUgYERTU2Agb3B0aW9ucyBleGlzdCwgdGhlIGN1cnJlbnQgcGF0Y2gmIzM5O3MgZWFybHktZXhpdCBjaGVjayBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBiYXNlZCBvbiBvdGhlciBzZXQgc3Vib3B0aW9ucyBtaWdodCBjYXVzZSB0aGUgc2Vjb25kIGBEU1NgIHBhcnNpbmcgdG8gZmFpbC4gVGhpcyBjb3VsZCBsZWFkIHRvIGEgc2NlbmFyaW8gd2hlcmUgYE9QVElPTl9NUFRDUF9EU1NgIGlzbiYjMzk7dCBzZXQsIGFuZCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgdW5leHBlY3RlZGx5IHJldHVybnMsIHNraXBwaW5nIHRoZSBjcnVjaWFsIERTUyBmaWVsZCBpbml0aWFsaXphdGlvbi4gSG93ZXZlciwgb24gZnVydGhlciByZXZpZXcsIGlmIGEgYERTU2Agb3B0aW9uIGlzIHBhcnNlZCBhbmQgdGhlbiBhIGBGQVNUQ0xPU0VgIG9wdGlvbiwgdGhlIGNvZGUgc2hvdWxkIHN0aWxsIGhhbmRsZSB0aGUgYERTU2Agb3B0aW9uIGRhdGEgY29ycmVjdGx5LiBUaGUgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGNoZWNrcyBzaG91bGQgcHJldmVudCB1bmluaXRpYWxpemVkIHJlYWRzIG9mIHRoZSBub3cgcG9wdWxhdGVkIGRhdGEuCgpBbm90aGVyIHBvdGVudGlhbCBpc3N1ZSBJIGNvbnNpZGVyZWQgd2FzIGEgYERTU2Agb3B0aW9uIGZhaWxpbmcgZWFybHkgaW4gYG1wdGNwX3BhcnNlX29wdGlvbmAsIHNwZWNpZmljYWxseSBpZiBgb3BzaXplYCBpc24mIzM5O3Qgd2hhdCYjMzk7cyBleHBlY3RlZC4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBwYXJzZXIgd291bGQgYnJlYWsgZWFybHksIGBPUFRJT05fTVBUQ1BfRFNTYCB3b3VsZCBub3QgYmUgc2V0LCBidXQgb3RoZXIgc2VlbWluZ2x5IGluaXRpYWxpc2VkIHZhcmlhYmxlcyBjb3VsZCBoYXZlIGJlZW4gc2V0LiBIb3dldmVyLCBhIHF1aWNrIGNoZWNrIG9mIHRoZSBjb2RlIGluIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBzaG93cyB0aGF0IHRoZSByb3V0aW5lIHdpbGwgcmV0dXJuIGVhcmx5IGlmIGl0IGZpbmRzIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBub3Qgc2V0LCBtZWFuaW5nIG5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMgaGVyZSBlaXRoZXIuCgpUaGUgY2VudHJhbCBxdWVzdGlvbiBiZWNhbWU6IElzIHRoZXJlIGEgcGF0aCB3aGVyZSBgT1BUSU9OX01QVENQX0RTU2AgKmlzKiBzZXQsIGJ1dCAqc29tZSogb2YgdGhlIHJlbGF0ZWQgZmllbGRzIHJlbWFpbiB1bmluaXRpYWxpemVkPyBJIGhhZCB0byB0cmFjZSB0aGUgaW5pdGlhbGl6YXRpb24gbG9naWMgd2l0aGluIGBtcHRjcF9wYXJzZV9vcHRpb25gLiBJZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGlzIHBhcnNlZCBhbmQgdGhlIG9wdGlvbiBzaXplIGlzIHZhbGlkLCB0aGVuIGBPUFRJT05fTVBUQ1BfRFNTYCBnZXRzIHNldC4gV2l0aGluIHRoYXQgb3B0aW9uIHBhcnNpbmcgcm91dGluZSwgdGhlIGZpZWxkcyBhcmUgY29uZGl0aW9uYWxseSBwb3B1bGF0ZWQgYmFzZWQgb24gd2hldGhlciBgdXNlX2Fja2Agb3IgYHVzZV9tYXBgIGFyZSBzZXQuIElmIGB1c2VfYWNrYCBpcyB0cnVlLCBpdCBwb3B1bGF0ZXMgYGRhdGFfYWNrYDsgaWYgYHVzZV9tYXBgIGlzIHRydWUsIHRoZW4gYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgYGRhdGFfbGVuYCwgYW5kIGBjc3VtYCBnZXQgcG9wdWxhdGVkLiBDb252ZXJzZWx5LCBpZiBlaXRoZXIgb2YgdGhvc2UgaXMgZmFsc2UsIHRoZSByZXNwZWN0aXZlIGZpZWxkIHJlbWFpbnMgdW5pbml0aWFsaXplZC4KClRoZW4sIEkgbG9va2VkIGF0IGhvdyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgdXNlcyB0aG9zZSBmaWVsZHMuIEl0IHNlZW1zIHRoYXQgYHVzZV9hY2tgIGlzIGNoZWNrZWQgKmJlZm9yZSogYGRhdGFfYWNrYCBpcyBhY2Nlc3NlZCwgd2hpY2ggYXBwZWFycyBzYWZlLiBIb3dldmVyLCB0aGUgc3Vic2VxdWVudCB1c2Ugb2YgYG1wX29wdC5kYXRhX2ZpbmAsIGBtcF9vcHQuZGF0YV9sZW5gLCBhbmQgYG1wX29wdC5kYXRhX3NlcWAgcmFpc2VkIGFuIGltbWVkaWF0ZSBmbGFnLiBJIHF1ZXN0aW9uZWQgd2hldGhlciBgdXNlX21hcGAgd2FzIGFsc28gY2hlY2tlZCBiZWZvcmUgdGhlc2UgdmFsdWVzIHdlcmUgYWNjZXNzZWQuCgpUaGF0JiMzOTtzIHdoZW4gSSByZWFsaXplZCB0aGF0IGBkYXRhX2ZpbmAgaXMgbGlua2VkIHRvIGB1c2VfbWFwYCEgYG1wX29wdC5kYXRhX2ZpbmAgaXMgYWN0dWFsbHkgYSBiaXRmaWVsZCwgY2xlYXJlZCBieSBgbXB0Y3BfZ2V0X29wdGlvbnNgLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgYmUgemVybyBpZiBgdXNlX21hcGAgaXMgZmFsc2UuIFRoZXJlZm9yZSwgdGhlIGNvZGUgYG1wX29wdC5kYXRhX2ZpbiAmYW1wOyZhbXA7IC4uLmAgd2lsbCBldmFsdWF0ZSB0byBmYWxzZSwgbWVhbmluZyB0aGUgdW5pbml0aWFsaXplZCBgZGF0YV9sZW5gIGFuZCBgZGF0YV9zZXFgIGFyZSBub3QgcmVhZC4gRnVydGhlciBjb2RlIGNoZWNrcyBpbiB0aGUgJiMzNDtsaWtlbHkmIzM0OyBwYXRoLCB3aGVyZSBgdXNlX21hcGAgKmlzKiB0cnVlLCBzaG93IHRoYXQgZmllbGRzIGxpa2UgYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgYGRhdGFfbGVuYCwgYW5kIGBjc3VtYCBhcmUgY29ycmVjdGx5IGNoZWNrZWQgcHJpb3IgdG8gYW55IGFjY2Vzc2VzLgoKVGhlIGNvZGUgc2VlbXMgcm9idXN0LiBJJiMzOTtsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayBvdGhlciBhcmVhcywgc3BlY2lmaWNhbGx5IHRoZSBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgIHNlY3Rpb24uIEJ1dCwgc28gZmFyLCBpdCBzZWVtcyB0aGF0IHRoZXJlJiMzOTtzIG5vIG9idmlvdXMgcGF0aCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhlIGNoZWNrcyBpbiBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgYW5kIHRoZSBjb25kaXRpb25hbCBsb2dpYyBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBhcHBlYXIgdG8gcHJvdmlkZSBhZGVxdWF0ZSBwcm90ZWN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9tcHRjcC9vcHRpb25zLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA5NTMsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDk1MzpcdFx0aWYgKHN1YmZsb3ctXHUwMDNlcmVtb3RlX2tleV92YWxpZCBcdTAwMjZcdTAwMjZcbiA5NTQ6XHRcdCAgICAoKChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUykgXHUwMDI2XHUwMDI2IG1wX29wdC1cdTAwM2V1c2VfYWNrKSB8fFxuIDk1NTpcdFx0ICAgICAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfQUREX0FERFIpIFx1MDAyNlx1MDAyNlxuIDk1NjpcdFx0ICAgICAgKCFtcF9vcHQtXHUwMDNlZWNobyB8fCBzdWJmbG93LVx1MDAzZW1wX2pvaW4pKSkpIHtcbiA5NTc6XHRcdFx0Lyogc3ViZmxvd3MgYXJlIGZ1bGx5IGVzdGFibGlzaGVkIGFzIHNvb24gYXMgd2UgZ2V0IGFueVxuIDk1ODpcdFx0XHQgKiBhZGRpdGlvbmFsIGFjaywgaW5jbHVkaW5nIEFERF9BRERSLlxuIDk1OTpcdFx0XHQgKi9cbiA5NjA6XHRcdFx0Z290byBzZXRfZnVsbHlfZXN0YWJsaXNoZWQ7XG4gOTYxOlx0XHR9XG4gOTYyOlx0XG4gOTYzOlx0XHQvKiBJZiB0aGUgZmlyc3QgZXN0YWJsaXNoZWQgcGFja2V0IGRvZXMgbm90IGNvbnRhaW4gTVBfQ0FQQUJMRSAmIzQzOyBkYXRhXG4gOTY0Olx0XHQgKiB0aGVuIGZhbGxiYWNrIHRvIFRDUC4gRmFsbGJhY2sgc2NlbmFyaW9zIHJlcXVpcmVzIGEgcmVzZXQgZm9yXG4gOTY1Olx0XHQgKiBNUF9KT0lOIHN1YmZsb3dzLlxuIDk2NjpcdFx0ICovXG4gOTY3Olx0XHRpZiAoIShtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OU19NUFRDUF9NUEMpKSB7XG4gOTY4Olx0XHRcdGlmIChzdWJmbG93LVx1MDAzZW1wX2pvaW4pXG4gOTY5Olx0XHRcdFx0Z290byByZXNldDtcbiA5NzA6XHRcdFx0c3ViZmxvdy1cdTAwM2VtcF9jYXBhYmxlID0gMDtcbiA5NzE6XHRcdFx0aWYgKCFtcHRjcF90cnlfZmFsbGJhY2soc3NrLCBNUFRDUF9NSUJfTVBDQVBBQkxFREFUQUZBTExCQUNLKSkge1xuIDk3MjpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzc2spLCBNUFRDUF9NSUJfRkFMTEJBQ0tGQUlMRUQpO1xuIDk3MzpcdFx0XHRcdGdvdG8gcmVzZXQ7XG4gOTc0Olx0XHRcdH1cbiA5NzU6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDk3NjpcdFx0fVxuIDk3NzpcdFxuIDk3ODpcdFx0aWYgKHVubGlrZWx5KCFSRUFEX09OQ0UobXNrLVx1MDAzZXBtLnNlcnZlcl9zaWRlKSkpXG4gOTc5Olx0XHRcdHByX3dhcm5fb25jZShcJiMzNDtib2d1cyBtcGMgb3B0aW9uIG9uIGVzdGFibGlzaGVkIGNsaWVudCBza1wmIzM0Oyk7XG4gOTgwOlx0XG4gOTgxOlx0c2V0X2Z1bGx5X2VzdGFibGlzaGVkOlxuIDk4MjpcdFx0aWYgKG1wX29wdC1cdTAwM2VkZW55X2pvaW5faWQwKVxuIDk4MzpcdFx0XHRXUklURV9PTkNFKG1zay1cdTAwM2VwbS5yZW1vdGVfZGVueV9qb2luX2lkMCwgdHJ1ZSk7XG4gOTg0Olx0XG4gOTg1Olx0XHRtcHRjcF9kYXRhX2xvY2soKHN0cnVjdCBzb2NrICopbXNrKTtcbiA5ODY6XHRcdF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHN1YmZsb3csIG1wX29wdCk7XG4gOTg3Olx0XHRtcHRjcF9kYXRhX3VubG9jaygoc3RydWN0IHNvY2sgKiltc2spO1xuIDk4ODpcdFxuIDk4OTpcdGNoZWNrX25vdGlmeTpcbiA5OTA6XHRcdC8qIGlmIHRoZSBzdWJmbG93IGlzIG5vdCBhbHJlYWR5IGxpbmtlZCBpbnRvIHRoZSBjb25uX2xpc3QsIHdlIGNhbiYjMzk7dFxuIDk5MTpcdFx0ICogbm90aWZ5IHRoZSBQTTogdGhpcyBzdWJmbG93IGlzIHN0aWxsIG9uIHRoZSBsaXN0ZW5lciBxdWV1ZVxuIDk5MjpcdFx0ICogYW5kIHRoZSBQTSBwb3NzaWJseSBhY3F1aXJpbmcgdGhlIHN1YmZsb3cgbG9jayBjb3VsZCByYWNlIHdpdGhcbiA5OTM6XHRcdCAqIHRoZSBsaXN0ZW5lciBjbG9zZVxuIDk5NDpcdFx0ICovXG4gOTk1Olx0XHRpZiAobGlrZWx5KHN1YmZsb3ctXHUwMDNlcG1fbm90aWZpZWQpIHx8IGxpc3RfZW1wdHkoXHUwMDI2c3ViZmxvdy1cdTAwM2Vub2RlKSlcbiA5OTY6XHRcdFx0cmV0dXJuIHRydWU7XG4gOTk3Olx0XG4gOTk4Olx0XHRzdWJmbG93LVx1MDAzZXBtX25vdGlmaWVkID0gMTtcbiA5OTk6XHRcdGlmIChzdWJmbG93LVx1MDAzZW1wX2pvaW4pIHtcbjEwMDA6XHRcdFx0Y2xlYXJfM3JkYWNrX3JldHJhbnNtaXNzaW9uKHNzayk7XG4xMDAxOlx0XHRcdG1wdGNwX3BtX3N1YmZsb3dfZXN0YWJsaXNoZWQobXNrKTtcbjEwMDI6XHRcdH0gZWxzZSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNDk1CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyBjb2RlIHNuaXBwZXQsIGRpc3RpbGxlZCBpbnRvIGEgZmlyc3QtcGVyc29uIHN1bW1hcnksIGtlZXBpbmcgaW4gbWluZCBteSBleHBlcnQgdW5kZXJzdGFuZGluZzoKCioqQW5hbHl6aW5nIHRoZSBTdWJmbG93IEVzdGFibGlzaG1lbnQgQ2hlY2sqKgoKUmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgdGhlIGNvbmRpdGlvbnMgYXJvdW5kIHRoZSBNdWx0aWhvbWVkIFRDUCAoTVBUQ1ApIERhdGEgU2VxdWVuY2UgU3luY2hyb25pemF0aW9uIChEU1MpIG9wdGlvbiBhbmQgdGhlIGhhbmRsaW5nIG9mIGpvaW4gSURzLiBJIHNlZSB0aGF0IHRoZSBjb2RlIHNwZWNpZmljYWxseSBjaGVja3MgYG1wX29wdC0mZ3Q7dXNlX2Fja2AgKm9ubHkqIGlmIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBlbmFibGVkLiBUaGF0JiMzOTtzIGdvb2Q7IGl0JiMzOTtzIGEgY29uZGl0aW9uYWwgZGVwZW5kZW5jeSwgd2hpY2ggaXMgZXhwZWN0ZWQuIFRoZSBBQ0sgdXNhZ2UgbGlrZWx5IGluZm9ybXMgaG93IERTUyBzeW5jaHJvbml6YXRpb24gaXMgbWFuYWdlZC4KCk5leHQsIEkgc2VlIGEgY2hlY2sgZm9yIGBtcF9vcHQtJmd0O2Rlbnlfam9pbl9pZDBgLiBBaCwgdGhhdCYjMzk7cyBhIGJpdGZpZWxkIHdpdGhpbiBgc3RhdHVzYC4gS25vd2luZyB0aGF0IGBzdGF0dXNgIGlzIGxpa2VseSBhIHN0cnVjdHVyZSwgSSBxdWlja2x5IGluZmVyIHRoYXQgdGhpcyBiaXRmaWVsZCwgYW5kIHRoZXJlZm9yZSB0aGUgZW50aXJlIGBzdGF0dXNgIHN0cnVjdHVyZSwgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gemVybyBlbHNld2hlcmUuIFRoaXMgaXMgc3RhbmRhcmQgcHJhY3RpY2UgdG8gZW5zdXJlIHByZWRpY3RhYmxlIHN0YXJ0aW5nIHZhbHVlcy4gQSBiaXRmaWVsZCBzcGVjaWZpY2FsbHkgdGFyZ2V0cyB3aGV0aGVyIGpvaW5zIHdpdGggSUQgMCBzaG91bGQgYmUgZGVuaWVkIChvciwgYXQgbGVhc3QsIHdoZXRoZXIgdGhleSBjb250cmlidXRlIHRvIHRoZSAqZnVsbHkgZXN0YWJsaXNoZWQqIHN0YXR1cykuIEludGVyZXN0aW5nLgoKRmluYWxseSwgdGhlIGNvZGUgdGhlbiBjYWxscyBgX19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkKG1zaywgc3ViZmxvdywgbXBfb3B0KTtgLiBUaGF0JiMzOTtzIHRoZSBjb3JlIG9mIHRoZSBsb2dpYywgdGhlIGNlbnRyYWwgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHRoZSBzdWJmbG93JiMzOTtzIGVzdGFibGlzaG1lbnQgc3RhdHVzLiBUaGUgYXJndW1lbnRzIG1ha2Ugc2Vuc2U6IGBtc2tgIGlzIHByb2JhYmx5IHNvbWUga2luZCBvZiBtYXNrIHJlcHJlc2VudGluZyB0aGUgcmVsZXZhbnQgY3JpdGVyaWEsIGBzdWJmbG93YCBpcyBvYnZpb3VzbHkgdGhlIHN1YmZsb3cgaW4gcXVlc3Rpb24sIGFuZCBgbXBfb3B0YCBwcm92aWRlcyB0aGUgTVBUQ1Agb3B0aW9ucy4gSSBuZWVkIHRvIGRpZyBpbnRvIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRgIHRvIHVuZGVyc3RhbmQgdGhlIGFjdHVhbCBkZWNpc2lvbi1tYWtpbmcgcHJvY2Vzcy4gSSYjMzk7bSBndWVzc2luZyB0aGF0IGZ1bmN0aW9uIHdpbGwgdXNlIHRoZXNlIHBhcmFtZXRlcnMgdG8gY2hlY2sgZm9yIHRoaW5ncyBsaWtlIGFja3MsIHNlcXVlbmNlIG51bWJlcnMsIGFuZCBwb3RlbnRpYWxseSBqb2luIElEcyB0byBkZWNpZGUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgZnVsbHkgZXN0YWJsaXNoZWQsIGFuZCBjYW4gYmUgY29uc2lkZXJlZCBhY3RpdmUgaW4gdGhlIE1QVENQIGZsb3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O19fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZFxcKCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jPTkxOT1zdGF0aWMgYm9vbCBjaGVja19mdWxseV9lc3RhYmxpc2hlZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLCBzdHJ1Y3Qgc29jayAqc3NrLFxuLS1cbm5ldC9tcHRjcC9vcHRpb25zLmMtOTg1LVx0bXB0Y3BfZGF0YV9sb2NrKChzdHJ1Y3Qgc29jayAqKW1zayk7XG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjk4NjpcdF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHN1YmZsb3csIG1wX29wdCk7XG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTk4Ny1cdG1wdGNwX2RhdGFfdW5sb2NrKChzdHJ1Y3Qgc29jayAqKW1zayk7XG4tLVxubmV0L21wdGNwL3Byb3RvY29sLmM9MzU1OD1zdHJ1Y3Qgc29jayAqbXB0Y3Bfc2tfY2xvbmVfaW5pdChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXG4tLVxubmV0L21wdGNwL3Byb3RvY29sLmMtMzYzMC1cdGlmIChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX01QQ19BQ0spXG5uZXQvbXB0Y3AvcHJvdG9jb2wuYzozNjMxOlx0XHRfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQobXNrLCBzdWJmbG93LCBtcF9vcHQpO1xubmV0L21wdGNwL3Byb3RvY29sLmMtMzYzMi1cdGJoX3VubG9ja19zb2NrKG5zayk7XG4tLVxubmV0L21wdGNwL3Byb3RvY29sLmg9ODA3PXZvaWQgbXB0Y3BfZ2V0X2F2YWlsYWJsZV9zY2hlZHVsZXJzKGNoYXIgKmJ1Ziwgc2l6ZV90IG1heGxlbik7XG5uZXQvbXB0Y3AvcHJvdG9jb2wuaDo4MDg6dm9pZCBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcbm5ldC9tcHRjcC9wcm90b2NvbC5oLTgwOS1cdFx0XHRcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfc3ViZmxvd19jb250ZXh0ICpzdWJmbG93LFxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmM9NzgwPXZvaWQgbXB0Y3Bfc3ViZmxvd19kcm9wX2N0eChzdHJ1Y3Qgc29jayAqc3NrKVxuLS1cbm5ldC9tcHRjcC9zdWJmbG93LmMtNzk2LVxubmV0L21wdGNwL3N1YmZsb3cuYzo3OTc6dm9pZCBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcbm5ldC9tcHRjcC9zdWJmbG93LmMtNzk4LVx0XHRcdFx0ICAgICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNTUwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHVuZGVyc3RhbmRpbmcgdGhpcyBgX19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkYCBjb25jZXB0LCBleHBsYWluZWQgYXMgaWYgaXQmIzM5O3MgbXkgb3duIHRob3VnaHQgcHJvY2VzczoKCioqTXkgRGVlcCBEaXZlIGludG8gYF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZGAqKgoKQWxyaWdodCwgc28gSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB3aGF0IHRoaXMgYF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZGAgZnVuY3Rpb24gcmVwcmVzZW50cy4gSXQgc291bmRzIGxpa2UgYSBjcml0aWNhbCBwb2ludCBpbiB0aGUgTXVsdGlQYXRoIFRDUCAoTVBUQ1ApIGNvbm5lY3Rpb24gbGlmZWN5Y2xlLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBpdHMgc3ViZmxvd3MuIEkmIzM5O20gYWxyZWFkeSB2aXN1YWxpemluZyB0aGUgTVBUQ1AgY29udHJvbCBwbGFuZSBhbmQgZGF0YSBwbGFuZSBpbnRlcmFjdGlvbnMgaW4gbXkgbWluZC4uLiBub3csIGxldCYjMzk7cyBzZWUgaG93IHRoaXMgZnVuY3Rpb24gZml0cyBpbnRvIHRoZSBwaWN0dXJlLgoKTXkgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBsaWtlbHkgc2lnbmFscyB0aGF0IGEgc3BlY2lmaWMgc3ViZmxvdywgd2l0aGluIGFuIG92ZXJhbGwgTVBUQ1AgY29ubmVjdGlvbiwgaGFzIGNvbXBsZXRlZCBpdHMgbmVjZXNzYXJ5IGhhbmRzaGFraW5nIG9yIGluaXRpYWwgc2V0dXAgcGhhc2UuIEl0JiMzOTtzIGVzc2VudGlhbGx5IHNheWluZywgJiMzNDtIZXksIHRoaXMgc3ViZmxvdyBpcyBub3cgcmVhZHkgdG8gY2FycnkgcmVhbCBkYXRhISYjMzQ7IFRoaW5rIG9mIGl0IGxpa2UgYSBncmVlbiBsaWdodCwgYSBnby1haGVhZCBzaWduYWwgZm9yIHRoYXQgcGFydGljdWxhciBwYXRoLgoKR2l2ZW4gbXkgdW5kZXJzdGFuZGluZyBvZiBNUFRDUCwgSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZSBzdWJmbG93JiMzOTtzIFRDUCBoYW5kc2hha2UgKGxpa2VseSBhIDMtd2F5IGhhbmRzaGFrZSkgaGFzIGJlZW4gY29tcGxldGVkLCBhbmQgcGVyaGFwcyBhZnRlciBhbnkgTVBUQ1Atc3BlY2lmaWMgc2lnbmFsaW5nIHJlcXVpcmVkIGZvciB0aGF0IHN1YmZsb3cgaXMgZG9uZS4gTWF5YmUgaXQgaW52b2x2ZXMgdGhlIGV4Y2hhbmdlIG9mIHNvbWUgTVBUQ1Agb3B0aW9ucyBvciBmbGFncy4gSSYjMzk7bSB3b25kZXJpbmcgaWYgaXQgYWxzbyBpbnZvbHZlcyBhbGxvY2F0aW5nIHNwZWNpZmljIHJlc291cmNlcyBvciB1cGRhdGluZyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgdG8gdHJhY2sgdGhlIHN1YmZsb3cmIzM5O3Mgc3RhdGUuCgpJdCYjMzk7cyB0ZW1wdGluZyB0byB0aGluayBhYm91dCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMuIEEgZnVsbHkgZXN0YWJsaXNoZWQgc3ViZmxvdyByZXByZXNlbnRzIGEgcmVsaWFibGUgZGF0YSBwYXRoLiBXaGF0IGhhcHBlbnMgaWYgdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQ/IEkgbmVlZCB0byB0aGluayBhYm91dCBlcnJvciBjb25kaXRpb25zIGFuZCBob3cgdGhlIE1QVENQIHN0YWNrIGhhbmRsZXMgc3ViZmxvdyBmYWlsdXJlcyBvciByZXRyYW5zbWlzc2lvbnMuIEFsc28sIEkmIzM5O20gYWxyZWFkeSB0cnlpbmcgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgZnVuY3Rpb24gY2FsbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgb3ZlcmFsbCBNUFRDUCBjb25uZWN0aW9uLiBBcmUgdGhlcmUgZGlmZmVyZW50IGFjdGlvbnMgb3IgY2FsbGJhY2tzIHRyaWdnZXJlZCBieSB0aGlzIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRgIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiBvdGhlciBNUFRDUCBwYXJhbWV0ZXJzIG9yIHRoZSBzdGF0ZSBvZiBvdGhlciBzdWJmbG93cyBpbiB0aGUgY29ubmVjdGlvbj8KCkkmIzM5O20gYWxzbyBjdXJpb3VzIGFib3V0IHdobyBjYWxscyB0aGlzIGZ1bmN0aW9uLiBJcyBpdCB0aGUgTVBUQ1Agc3RhY2sgaW50ZXJuYWxseSwgYWZ0ZXIgcmVjZWl2aW5nIGNlcnRhaW4gcGFja2V0cyBvciBhY2tub3dsZWRnaW5nIGNlcnRhaW4gc2lnbmFscz8gT3IgaXMgdGhpcyBmdW5jdGlvbiB0cmlnZ2VyZWQgaW4gc29tZSB3YXkgZnJvbSBhIGxvd2VyIGxheWVyLiBBcmUgdGhlcmUgYW55IGNvbmRpdGlvbnMgdGhhdCBjYW4gcHJldmVudCB0aGUgZnVuY3Rpb24gZnJvbSBiZWluZyBjYWxsZWQ/IFRoZSBzb3VyY2UgY29kZSB3aWxsIGhvcGVmdWxseSBzaG93IG1lISBUaW1lIHRvIGRpZyBpbiEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avc3ViZmxvdy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNzk3LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA3OTc6XHR2b2lkIF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLFxuIDc5ODpcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXG4gNzk5Olx0XHRcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgKm1wX29wdClcbiA4MDA6XHR7XG4gODAxOlx0XHRzdWJmbG93X3NldF9yZW1vdGVfa2V5KG1zaywgc3ViZmxvdywgbXBfb3B0KTtcbiA4MDI6XHRcdFdSSVRFX09OQ0Uoc3ViZmxvdy1cdTAwM2VmdWxseV9lc3RhYmxpc2hlZCwgdHJ1ZSk7XG4gODAzOlx0XHRXUklURV9PTkNFKG1zay1cdTAwM2VmdWxseV9lc3RhYmxpc2hlZCwgdHJ1ZSk7XG4gODA0Olx0fVxuIDgwNTpcdFxuIDgwNjpcdHN0YXRpYyBzdHJ1Y3Qgc29jayAqc3ViZmxvd19zeW5fcmVjdl9zb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzayxcbiA4MDc6XHRcdFx0XHRcdFx0ICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIDgwODpcdFx0XHRcdFx0XHQgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcbiA4MDk6XHRcdFx0XHRcdFx0ICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsXG4gODEwOlx0XHRcdFx0XHRcdCAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxX3VuaGFzaCxcbiA4MTE6XHRcdFx0XHRcdFx0ICBib29sICpvd25fcmVxLFxuIDgxMjpcdFx0XHRcdFx0XHQgIHZvaWQgKCpvcHRfY2hpbGRfaW5pdCkoc3RydWN0IHNvY2sgKm5ld3NrLFxuIDgxMzpcdFx0XHRcdFx0XHRcdFx0XHQgY29uc3Qgc3RydWN0IHNvY2sgKnNrKSlcbiA4MTQ6XHR7XG4gODE1Olx0XHRzdHJ1Y3QgbXB0Y3Bfc3ViZmxvd19jb250ZXh0ICpsaXN0ZW5lciA9IG1wdGNwX3N1YmZsb3dfY3R4KHNrKTtcbiA4MTY6XHRcdHN0cnVjdCBtcHRjcF9zdWJmbG93X3JlcXVlc3Rfc29jayAqc3ViZmxvd19yZXE7XG4gODE3Olx0XHRzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHQ7XG4gODE4Olx0XHRib29sIGZhbGxiYWNrLCBmYWxsYmFja19pc19mYXRhbDtcbiA4MTk6XHRcdGVudW0gc2tfcnN0X3JlYXNvbiByZWFzb247XG4gODIwOlx0XHRzdHJ1Y3QgbXB0Y3Bfc29jayAqb3duZXI7XG4gODIxOlx0XHRzdHJ1Y3Qgc29jayAqY2hpbGQ7XG4gODIyOlx0XG4gODIzOlx0XHRwcl9kZWJ1ZyhcJiMzNDtsaXN0ZW5lcj0lcCwgcmVxPSVwLCBjb25uPSVwXFxuXCYjMzQ7LCBsaXN0ZW5lciwgcmVxLCBsaXN0ZW5lci1cdTAwM2Vjb25uKTtcbiA4MjQ6XHRcbiA4MjU6XHRcdC8qIEFmdGVyIGNoaWxkIGNyZWF0aW9uIHdlIG11c3QgbG9vayBmb3IgTVBDIGV2ZW4gd2hlbiBvcHRpb25zXG4gODI2Olx0XHQgKiBhcmUgbm90IHBhcnNlZFxuIDgyNzpcdFx0ICovXG4gODI4Olx0XHRtcF9vcHQuc3Vib3B0aW9ucyA9IDA7XG4gODI5Olx0XG4gODMwOlx0XHQvKiBob3BlZnVsbHkgdGVtcG9yYXJ5IGhhbmRsaW5nIGZvciBNUF9KT0lOJiM0MztzeW5jb29raWUgKi9cbiA4MzE6XHRcdHN1YmZsb3dfcmVxID0gbXB0Y3Bfc3ViZmxvd19yc2socmVxKTtcbiA4MzI6XHRcdGZhbGxiYWNrX2lzX2ZhdGFsID0gdGNwX3JzayhyZXEpLVx1MDAzZWlzX21wdGNwIFx1MDAyNlx1MDAyNiBzdWJmbG93X3JlcS1cdTAwM2VtcF9qb2luO1xuIDgzMzpcdFx0ZmFsbGJhY2sgPSAhdGNwX3JzayhyZXEpLVx1MDAzZWlzX21wdGNwO1xuIDgzNDpcdFx0aWYgKGZhbGxiYWNrKVxuIDgzNTpcdFx0XHRnb3RvIGNyZWF0ZV9jaGlsZDtcbiA4MzY6XHRcbiA4Mzc6XHRcdC8qIGlmIHRoZSBzayBpcyBNUF9DQVBBQkxFLCB3ZSB0cnkgdG8gZmV0Y2ggdGhlIGNsaWVudCBrZXkgKi9cbiA4Mzg6XHRcdGlmIChzdWJmbG93X3JlcS1cdTAwM2VtcF9jYXBhYmxlKSB7XG4gODM5Olx0XHRcdC8qIHdlIGNhbiByZWNlaXZlIGFuZCBhY2NlcHQgYW4gaW4td2luZG93LCBvdXQtb2Ytb3JkZXIgcGt0LFxuIDg0MDpcdFx0XHQgKiB3aGljaCBtYXkgbm90IGNhcnJ5IHRoZSBNUF9DQVBBQkxFIG9wdCBldmVuIG9uIG1wdGNwIGVuYWJsZWRcbiA4NDE6XHRcdFx0ICogcGF0aHM6IGFsd2F5cyB0cnkgdG8gZXh0cmFjdCB0aGUgcGVlciBrZXksIGFuZCBmYWxsYmFja1xuIDg0MjpcdFx0XHQgKiBmb3IgcGFja2V0cyBtaXNzaW5nIGl0LlxuIDg0MzpcdFx0XHQgKiBFdmVuIE9vTyBEU1MgcGFja2V0cyBjb21pbmcgbGVnaXRseSBhZnRlciBkcm9wcGVkIG9yXG4gODQ0Olx0XHRcdCAqIHJlb3JkZXJlZCBNUEMgd2lsbCBjYXVzZSBmYWxsYmFjaywgYnV0IHdlIGRvbiYjMzk7dCBoYXZlIG90aGVyXG4gODQ1Olx0XHRcdCAqIG9wdGlvbnMuXG4gODQ2Olx0XHRcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDk5NgoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDEwMDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBSZWFkcyBpbiBNUFRDUCBPcHRpb24gUHJvY2Vzc2luZyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBJJiMzOTttIGZvY3VzaW5nIG9uIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyB3aXRoaW4gdGhlIE1QVENQIG9wdGlvbiBoYW5kbGluZyBsb2dpYywgc3BlY2lmaWNhbGx5IGNvbmNlcm5pbmcgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gZGlmZmVyZW50IG9wdGlvbiB0eXBlcy4KCk15IGluaXRpYWwgY29uY2VybiB3YXMgYXJvdW5kIGBzdWJmbG93X3NldF9yZW1vdGVfa2V5YCwgd2hpY2ggdXNlcyBgc25kcl9rZXlgIG9yIGByY3ZyX2tleWAuICBUaG9zZSBrZXlzIGFyZSBwb3B1bGF0ZWQgZHVyaW5nIHBhcnNpbmcgb2YgYE1QVENQT1BUX01QQ0FQQUJMRWAgb3IgYE1QVENQT1BUX01QSk9JTmAsIGFuZCBpZiBgT1BUSU9OX01QVENQX01QQ19BQ0tgIGlzIHNldCwgYHNuZHJfa2V5YCBpcyB1c2VkLiBCdXQgZG9lcyB0aGlzIHBhdGNoIGFmZmVjdCB0aG9zZT8gTm8uIFRoaXMgcGF0Y2ggb25seSBhZmZlY3RzIGBNUFRDUE9QVF9EU1NgLgoKVGhlIGNvZGUgc25pcHBldCBpbiBxdWVzdGlvbiBkZWFscyB3aXRoIGBNUFRDUE9QVF9EU1NgLiBUaGUgYGJyZWFrYCBzdGF0ZW1lbnQgd2l0aGluIHRoYXQgY2FzZSBpcyB3aGF0IEkgbmVlZCB0byBmb2N1cyBvbi4gSXQgYnJlYWtzIGlmIGFueSBzdWItb3B0aW9uIGlzIHNldCAqb3RoZXIqIHRoYW4gYEFERF9BRERSYCwgYFJNX0FERFJgLCBgUFJJT2AsIG9yIGBGQUlMYC4KCk15IGltbWVkaWF0ZSB0aG91Z2h0OiB3aGF0IGlmIGBNUFRDUE9QVF9BRERfQUREUmAgaXMgc2V0IGJ1dCBgTVBUQ1BPUFRfRFNTYCBpc24mIzM5O3Q/IExvb2tpbmcgYXQgdGhlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBmdW5jdGlvbiwgdGhhdCYjMzk7cyBmaW5lLiBUaGUgYG1wX29wdC5hZGRyYCBpcyBwb3B1bGF0ZWQgY29ycmVjdGx5IGJ5IHRoZSBgTVBUQ1BPUFRfQUREX0FERFJgIHBhcnNpbmcgbG9naWMgKmJlZm9yZSogYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGlzIGNhbGxlZC4gU28gbm8gcHJvYmxlbXMgdGhlcmUuCgpOb3csIHRvIHRoZSBjb3JlIG9mIHRoZSBjb25jZXJuOiBJZiBgTVBUQ1BPUFRfRFNTYCBicmVha3MgZWFybHksIHRoZSBmaWVsZHMgYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgYGRhdGFfbGVuYCwgYGNzdW1gLCBhbmQgYGRhdGFfYWNrYCB3aWxsIHJlbWFpbiB1bmluaXRpYWxpemVkLiBIb3dldmVyLCB0aG9zZSBmaWVsZHMgYXJlIG9ubHkgcmVhZCBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgc2V0ISBHb29kLgoKQSBuZXcgc2NlbmFyaW8gY29tZXMgdG8gbWluZDogV2hhdCBpZiBgTVBUQ1BPUFRfRFNTYCAqc3VjY2VlZHMqIGluIHBhcnNpbmcgZmlyc3QsIGFuZCB0aGVuIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGlzIHBhcnNlZD8gTm93LCBgbXBfb3B0LnN1Ym9wdGlvbnNgIHdvdWxkIGNvbnRhaW4gKmJvdGgqIGBPUFRJT05fTVBUQ1BfRFNTYCBhbmQgYE9QVElPTl9NUFRDUF9GQVNUQ0xPU0VgLiAgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIHdpbGwgc2VlIHRoYXQgYG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1NgLCBhbmQgYE9QVElPTl9NUFRDUF9GQVNUQ0xPU0VgIHdpbGwgYmUgcHJvY2Vzc2VkLiAgSSBzZWUsIGByY3ZyX2tleWAgaXMgcG9wdWxhdGVkIGJ5IGBNUFRDUE9QVF9GQVNUQ0xPU0VgLCB3aGljaCBpcyB0aGVuIHJlYWQuIFRoZSBzdWJzZXF1ZW50IGNoZWNrIGAhKG1wX29wdC5zdWJvcHRpb25zICZhbXA7IE9QVElPTl9NUFRDUF9EU1MpYCBmYWlscywgYW5kIHdlIHByb2NlZWQgdG8gcHJvY2Vzc2luZyB0aGUgRFNTIGZpZWxkcyB3aGljaCB3ZXJlIHNldCBieSBEU1Mgc28gbm8gdW5pbml0aWFsaXplZCByZWFkcy4KClNvLCBsZXQmIzM5O3MgbG9vayBhdCBgTVBUQ1BPUFRfRkFTVENMT1NFYC4uLiBTcGVjaWZpY2FsbHksIHdoYXQgaWYgdGhlIGBvcHNpemVgIGNoZWNrIGZhaWxzIGluIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGFuZCB0aGUgYnJlYWsgaXMgaGl0PyBJbiB0aGF0IHNjZW5hcmlvLCBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAgaXNuJiMzOTt0IHNldC4gVGh1cywgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIHdvbiYjMzk7dCBldmVuIHRyeSB0byBwcm9jZXNzIGl0LgoKU28sIHRoZSBrZXkgaXMgdG8gZW5zdXJlIHRoYXQgYWxsIHJlYWQgZmllbGRzIGhhdmUgdGhlaXIgY29ycmVzcG9uZGluZyBvcHRpb24gZmxhZyBzZXQuIEJhc2VkIG9uIHRoaXMgYW5hbHlzaXMsIEkmIzM5O20gbm90IHNlZWluZyBhbnkgaW1tZWRpYXRlIGNhc2VzIHdoZXJlIGEgZmllbGQgaXMgcmVhZCB3aXRob3V0IGl0cyBhc3NvY2lhdGVkIGBPUFRJT05fTVBUQ1BfKmAgZmxhZyBiZWluZyBzZXQuIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBhZ2Fpbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE3NiwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTc2Olx0XHRcdGlmICgobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9GQVNUQ0xPU0UpIFx1MDAyNlx1MDAyNlxuMTE3NzpcdFx0XHQgICAgUkVBRF9PTkNFKG1zay1cdTAwM2Vsb2NhbF9rZXkpID09IG1wX29wdC5yY3ZyX2tleSkge1xuMTE3ODpcdFx0XHRcdFdSSVRFX09OQ0UobXNrLVx1MDAzZXJjdl9mYXN0Y2xvc2UsIHRydWUpO1xuMTE3OTpcdFx0XHRcdG1wdGNwX3NjaGVkdWxlX3dvcmsoKHN0cnVjdCBzb2NrICopbXNrKTtcbjExODA6XHRcdFx0XHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBGQVNUQ0xPU0VSWCk7XG4xMTgxOlx0XHRcdH1cbjExODI6XHRcbjExODM6XHRcdFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0FERF9BRERSKSBcdTAwMjZcdTAwMjZcbjExODQ6XHRcdFx0ICAgIGFkZF9hZGRyX2htYWNfdmFsaWQobXNrLCBcdTAwMjZtcF9vcHQpKSB7XG4xMTg1Olx0XHRcdFx0aWYgKCFtcF9vcHQuZWNobykge1xuMTE4NjpcdFx0XHRcdFx0bXB0Y3BfcG1fYWRkX2FkZHJfcmVjZWl2ZWQoc2ssIFx1MDAyNm1wX29wdC5hZGRyKTtcbjExODc6XHRcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9BRERBRERSKTtcbjExODg6XHRcdFx0XHR9IGVsc2Uge1xuMTE4OTpcdFx0XHRcdFx0bXB0Y3BfcG1fYWRkX2FkZHJfZWNob2VkKG1zaywgXHUwMDI2bXBfb3B0LmFkZHIpO1xuMTE5MDpcdFx0XHRcdFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX0VDSE9BREQpO1xuMTE5MTpcdFx0XHRcdH1cbjExOTI6XHRcbjExOTM6XHRcdFx0XHRpZiAobXBfb3B0LmFkZHIucG9ydClcbjExOTQ6XHRcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9QT1JUQUREKTtcbjExOTU6XHRcdFx0fVxuMTE5NjpcdFxuMTE5NzpcdFx0XHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXHUwMDI2IE9QVElPTl9NUFRDUF9STV9BRERSKVxuMTE5ODpcdFx0XHRcdG1wdGNwX3BtX3JtX2FkZHJfcmVjZWl2ZWQobXNrLCBcdTAwMjZtcF9vcHQucm1fbGlzdCk7XG4xMTk5Olx0XG4xMjAwOlx0XHRcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX1BSSU8pIHtcbjEyMDE6XHRcdFx0XHRtcHRjcF9wbV9tcF9wcmlvX3JlY2VpdmVkKHNrLCBtcF9vcHQuYmFja3VwKTtcbjEyMDI6XHRcdFx0XHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBQUklPUlgpO1xuMTIwMzpcdFx0XHR9XG4xMjA0Olx0XG4xMjA1Olx0XHRcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0ZBSUwpIHtcbjEyMDY6XHRcdFx0XHRtcHRjcF9wbV9tcF9mYWlsX3JlY2VpdmVkKHNrLCBtcF9vcHQuZmFpbF9zZXEpO1xuMTIwNzpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBSUxSWCk7XG4xMjA4Olx0XHRcdH1cbjEyMDk6XHRcbjEyMTA6XHRcdFx0aWYgKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfUlNUKSB7XG4xMjExOlx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXNldF9zZWVuID0gMTtcbjEyMTI6XHRcdFx0XHRzdWJmbG93LVx1MDAzZXJlc2V0X3JlYXNvbiA9IG1wX29wdC5yZXNldF9yZWFzb247XG4xMjEzOlx0XHRcdFx0c3ViZmxvdy1cdTAwM2VyZXNldF90cmFuc2llbnQgPSBtcF9vcHQucmVzZXRfdHJhbnNpZW50O1xuMTIxNDpcdFx0XHRcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFJTVFJYKTtcbjEyMTU6XHRcdFx0fVxuMTIxNjpcdFxuMTIxNzpcdFx0XHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUykpXG4xMjE4Olx0XHRcdFx0cmV0dXJuIHRydWU7XG4xMjE5Olx0XHR9XG4xMjIwOlx0XG4xMjIxOlx0XHQvKiB3ZSBjYW4mIzM5O3Qgd2FpdCBmb3IgcmVjdm1zZygpIHRvIHVwZGF0ZSB0aGUgYWNrX3NlcSwgb3RoZXJ3aXNlXG4xMjIyOlx0XHQgKiBtb25vZGlyZWN0aW9uYWwgZmxvd3Mgd2lsbCBzdHVja1xuMTIyMzpcdFx0ICovXG4xMjI0Olx0XHRpZiAobXBfb3B0LnVzZV9hY2spXG4xMjI1Olx0XHRcdGFja191cGRhdGVfbXNrKG1zaywgc2ssIFx1MDAyNm1wX29wdCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3NzI3CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTM2OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNUFRDUCBPcHRpb24gUHJvY2Vzc2luZyBEZWVwIERpdmUqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIG5ldyBjaGVjayBmb3IgYE1QVENQT1BUX0RTU2AgYW5kIHRyeWluZyB0byBzdXNzIG91dCBhbnkgcG90ZW50aWFsIGlzc3Vlcy4gU3BlY2lmaWNhbGx5LCB0aGlzIG5ldyByZXN0cmljdGlvbjoKCmBgYGMKCWNhc2UgTVBUQ1BPUFRfRFNTOgoJCS8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovCgkJaWYgKChtcF9vcHQtJmd0O3N1Ym9wdGlvbnMgJmFtcDsgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfAoJCQkJCSAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8CgkJCQkJICAgIE9QVElPTl9NUFRDUF9QUklPIHwKCQkJCQkgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKQoJCQlicmVhazsKYGBgCgpJIHdhcyBpbml0aWFsbHkgY29uY2VybmVkIHRoYXQgaWYgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBicmVha3MgZWFybHkgYmVjYXVzZSBvZiB0aGUgYWJvdmUgY2hlY2ssIHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBtaWdodCBub3QgYmUgc2V0LCBwb3RlbnRpYWxseSBsZWF2aW5nIGBtcF9vcHQtJmd0O3VzZV9hY2tgIHNldCBmcm9tIGEgKnByZXZpb3VzKiBEU1MsIGxlYWRpbmcgdG8gdW5pbml0aWFsaXplZCByZWFkcy4KClNvLCBsZXQmIzM5O3MgZXhwbG9yZSB0aGlzIHN0ZXAtYnktc3RlcDoKCiogICAqKlNjZW5hcmlvIDE6IERTUywgRmFzdENsb3NlLCBEU1M6KiogSSYjMzk7bSB2aXN1YWxpemluZyBhIHBhY2tldCB3aXRoIHR3byBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLiBJZiB0aGUgZmlyc3QgRFNTIGdvZXMgdGhyb3VnaCwgc2V0cyB0aGUgZmxhZywgc2V0cyBgdXNlX2Fja2AgYW5kIHBvcHVsYXRlcyBgZGF0YV9hY2tgLCBhbmQgdGhlbiBhIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGNvbWVzIGFsb25nLCBpdCB3aWxsIHNldCBpdHMgZmxhZy4gTm93LCB0aGUgc2Vjb25kIERTUyBlbmNvdW50ZXJzIHRoZSBuZXcgY2hlY2ssIGJyZWFrcywgYW5kIHNpbmNlIHRoZSBmaXJzdCBEU1MgYWxyZWFkeSBzZXQgYE9QVElPTl9NUFRDUF9EU1NgLCB0aGUgaW5jb21pbmcgb3B0aW9ucyB3aWxsIHByb2Nlc3MgdGhlIGZpcnN0IERTUyYjMzk7cyBwb3B1bGF0ZWQgZmllbGRzLiBUaGlzIGlzIGZpbmUsIG5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMgaGVyZS4KCiogICAqKlNjZW5hcmlvIDI6IEZhc3RDbG9zZSwgRFNTOioqIElmIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGlzIGZpcnN0LCBpdCB3aWxsIHNldCBpdHMgZmxhZy4gVGhlbiB0aGUgc2Vjb25kIGBNUFRDUE9QVF9EU1NgIGhpdHMgdGhlIG5ldyBjaGVjaywgYnJlYWtzLiBTbyBgT1BUSU9OX01QVENQX0RTU2AgaXMgbm90IHNldCwgbWVhbmluZyB0aGUgRFNTIGZpZWxkcyBhcmVuJiMzOTt0IGV2ZW4gcHJvY2Vzc2VkLiBBZ2Fpbiwgbm8gcHJvYmxlbXMuCgoqICAgKipTY2VuYXJpbyAzOiBEU1MgKG9wc2l6ZSBicmVha3MpLCBGYXN0Q2xvc2U6KiogTm93LCB3aGF0IGlmIHRoZSBmaXJzdCBgTVBUQ1BPUFRfRFNTYCBoYXMgYW4gaW52YWxpZCBgb3BzaXplYCBhbmQgYnJlYWtzIHRoZXJlPyBBbHRob3VnaCBgbXBfb3B0LSZndDt1c2VfYWNrYCBnZXRzIHNldCB0byBgMWAgYnkgRFNTLCB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgZG9lc24mIzM5O3QgZ2V0IHNldC4gVGhlbiB0aGUgYE1QVENQT1BUX0ZBU1RDTE9TRWAgY29tZXMuIFRoZSBtYWluIGZ1bmN0aW9uIHdpbGwgY2hlY2sgdGhhdCBgT1BUSU9OX01QVENQX0RTU2AgaXMgKm5vdCogc2V0IGFuZCByZXR1cm4gZWFybHksIHNraXBwaW5nIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgcmVhZC4KCiogICAqKlNjZW5hcmlvIDQ6IERTUyAob3BzaXplIGJyZWFrcyksIERTUyAodmFsaWQpOioqIFdoYXQgaWYgdGhlIGZpcnN0IERTUyBicmVha3MsIGJ1dCB0aGVuIGEgKnZhbGlkKiBzZWNvbmQgYE1QVENQT1BUX0RTU2AgZm9sbG93cz8gT2theSwgc28gdGhlIGZpcnN0IERTUyBzZXRzIGBtcF9vcHQtJmd0O3VzZV9hY2tgIGFuZCB0aGUgc2Vjb25kIERTUyB3aWxsIG92ZXJ3cml0ZSBgbXBfb3B0LSZndDt1c2VfYWNrID0gMGAgKG9yIHdoYXRldmVyIHRoZSBzZWNvbmQgRFNTIG5lZWRzKS4gVGhlbiB0aGUgc2Vjb25kIERTUyBvcHRpb24gc2V0cyBgT1BUSU9OX01QVENQX0RTU2AgZmxhZy4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkuCgoqICAgKipTY2VuYXJpbyA1OiBEU1MgKHZhbGlkKSwgRFNTIChvcHNpemUgYnJlYWtzKToqKiBUaGUgZmlyc3QgRFNTIHZhbGlkYXRlcy4gSXQgc2V0cyBgT1BUSU9OX01QVENQX0RTU2AsIHNldHMgYHVzZV9hY2sgPSAwYC4gVGhlIHNlY29uZCBEU1MgYnJlYWtzIGJlY2F1c2Ugb2YgaXRzIG9wc2l6ZSwgYnV0IGl0JiMzOTtzICphbHJlYWR5KiBzZXQgYHVzZV9hY2sgPSAxYC4gSGVyZSwgdGhlIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZXhpc3RlbmNlIG9mIGBPUFRJT05fTVBUQ1BfRFNTYCwgYW5kIHNpbmNlIGl0ICppcyogc2V0LCBpdCYjMzk7cyBnb2luZyB0byBhdHRlbXB0IHRvIHJlYWQgYGRhdGFfYWNrYCBidXQgYGRhdGFfYWNrYCB3YXNuJiMzOTt0IHBvcHVsYXRlZCBieSB0aGUgRFNTIGR1ZSB0byBpdHMgZWFybHkgZXhpdCEgKlRoaXMgaXMgdGhlIGNhc2UhKgoKSSBuZWVkIHRvIGNvbmZpcm0gaWYgdGhpcyBzY2VuYXJpbyBpcyBhY3R1YWxseSBwb3NzaWJsZS4gSWYgaXQgaXMsIHRoZW4gd2UgKmRlZmluaXRlbHkqIGhhdmUgYSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCBpc3N1ZSB3aGVuIHByb2Nlc3NpbmcgTVBUQ1Agb3B0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY2LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNjY6XHRcdFx0ZmxhZ3MgPSAoKnB0ciYjNDM7JiM0MzspIFx1MDAyNiBNUFRDUF9EU1NfRkxBR19NQVNLO1xuIDE2NzpcdFx0XHRtcF9vcHQtXHUwMDNlZHNuNjQgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19EU042NCkgIT0gMDtcbiAxNjg6XHRcdFx0bXBfb3B0LVx1MDAzZXVzZV9tYXAgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19IQVNfTUFQKSAhPSAwO1xuIDE2OTpcdFx0XHRtcF9vcHQtXHUwMDNlYWNrNjQgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19BQ0s2NCkgIT0gMDtcbiAxNzA6XHRcdFx0bXBfb3B0LVx1MDAzZXVzZV9hY2sgPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19IQVNfQUNLKTtcbiAxNzE6XHRcbiAxNzI6XHRcdFx0ZXhwZWN0ZWRfb3BzaXplID0gVENQT0xFTl9NUFRDUF9EU1NfQkFTRTtcbiAxNzM6XHRcbiAxNzQ6XHRcdFx0aWYgKG1wX29wdC1cdTAwM2V1c2VfYWNrKSB7XG4gMTc1Olx0XHRcdFx0aWYgKG1wX29wdC1cdTAwM2VhY2s2NClcbiAxNzY6XHRcdFx0XHRcdGV4cGVjdGVkX29wc2l6ZSAmIzQzOz0gVENQT0xFTl9NUFRDUF9EU1NfQUNLNjQ7XG4gMTc3Olx0XHRcdFx0ZWxzZVxuIDE3ODpcdFx0XHRcdFx0ZXhwZWN0ZWRfb3BzaXplICYjNDM7PSBUQ1BPTEVOX01QVENQX0RTU19BQ0szMjtcbiAxNzk6XHRcdFx0fVxuIDE4MDpcdFxuIDE4MTpcdFx0XHRpZiAobXBfb3B0LVx1MDAzZXVzZV9tYXApIHtcbiAxODI6XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9maW4gPSAoZmxhZ3MgXHUwMDI2IE1QVENQX0RTU19EQVRBX0ZJTikgIT0gMDtcbiAxODM6XHRcdFx0XHRpZiAobXBfb3B0LVx1MDAzZWRzbjY0KVxuIDE4NDpcdFx0XHRcdFx0ZXhwZWN0ZWRfb3BzaXplICYjNDM7PSBUQ1BPTEVOX01QVENQX0RTU19NQVA2NDtcbiAxODU6XHRcdFx0XHRlbHNlXG4gMTg2Olx0XHRcdFx0XHRleHBlY3RlZF9vcHNpemUgJiM0Mzs9IFRDUE9MRU5fTVBUQ1BfRFNTX01BUDMyO1xuIDE4NzpcdFx0XHR9XG4gMTg4Olx0XG4gMTg5Olx0XHRcdHByX2RlYnVnKFwmIzM0O2RhdGFfZmluPSVkIGRzbjY0PSVkIHVzZV9tYXA9JWQgYWNrNjQ9JWQgdXNlX2Fjaz0lZFxcblwmIzM0OyxcbiAxOTA6XHRcdFx0XHQgbXBfb3B0LVx1MDAzZWRhdGFfZmluLCBtcF9vcHQtXHUwMDNlZHNuNjQsXG4gMTkxOlx0XHRcdFx0IG1wX29wdC1cdTAwM2V1c2VfbWFwLCBtcF9vcHQtXHUwMDNlYWNrNjQsXG4gMTkyOlx0XHRcdFx0IG1wX29wdC1cdTAwM2V1c2VfYWNrKTtcbiAxOTM6XHRcbiAxOTQ6XHRcdFx0LyogQWx3YXlzIHBhcnNlIGFueSBjc3VtIHByZXNlbmNlIGNvbWJpbmF0aW9uLCB3ZSB3aWxsIGVuZm9yY2VcbiAxOTU6XHRcdFx0ICogUkZDIDg2ODQgU2VjdGlvbiAzLjMuMCBjaGVja3MgbGF0ZXIgaW4gc3ViZmxvd19kYXRhX3JlYWR5XG4gMTk2Olx0XHRcdCAqL1xuIDE5NzpcdFx0XHRpZiAob3BzaXplICE9IGV4cGVjdGVkX29wc2l6ZSBcdTAwMjZcdTAwMjZcbiAxOTg6XHRcdFx0ICAgIG9wc2l6ZSAhPSBleHBlY3RlZF9vcHNpemUgJiM0MzsgVENQT0xFTl9NUFRDUF9EU1NfQ0hFQ0tTVU0pXG4gMTk5Olx0XHRcdFx0YnJlYWs7XG4gMjAwOlx0XG4gMjAxOlx0XHRcdG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIHw9IE9QVElPTl9NUFRDUF9EU1M7XG4gMjAyOlx0XHRcdGlmIChtcF9vcHQtXHUwMDNldXNlX2Fjaykge1xuIDIwMzpcdFx0XHRcdGlmIChtcF9vcHQtXHUwMDNlYWNrNjQpIHtcbiAyMDQ6XHRcdFx0XHRcdG1wX29wdC1cdTAwM2VkYXRhX2FjayA9IGdldF91bmFsaWduZWRfYmU2NChwdHIpO1xuIDIwNTpcdFx0XHRcdFx0cHRyICYjNDM7PSA4O1xuIDIwNjpcdFx0XHRcdH0gZWxzZSB7XG4gMjA3Olx0XHRcdFx0XHRtcF9vcHQtXHUwMDNlZGF0YV9hY2sgPSBnZXRfdW5hbGlnbmVkX2JlMzIocHRyKTtcbiAyMDg6XHRcdFx0XHRcdHB0ciAmIzQzOz0gNDtcbiAyMDk6XHRcdFx0XHR9XG4gMjEwOlx0XG4gMjExOlx0XHRcdFx0cHJfZGVidWcoXCYjMzQ7ZGF0YV9hY2s9JWxsdVxcblwmIzM0OywgbXBfb3B0LVx1MDAzZWRhdGFfYWNrKTtcbiAyMTI6XHRcdFx0fVxuIDIxMzpcdFxuIDIxNDpcdFx0XHRpZiAobXBfb3B0LVx1MDAzZXVzZV9tYXApIHtcbiAyMTU6XHRcdFx0XHRpZiAobXBfb3B0LVx1MDAzZWRzbjY0KSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMwODY0CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMzU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBIYW5kbGluZyoqCgpZZXMhIE9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIElmIHRoZSBmaXJzdCBNUFRDUCBEU1Mgb3B0aW9uIGlzIHZhbGlkIChtZWFuaW5nIGB1c2VfYWNrYCBpcyBpbml0aWFsbHkgc2V0IHRvIDApLCBpdCBzZXRzIGBPUFRJT05fTVBUQ1BfRFNTYCB3aXRoaW4gYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2AuIE5vdywgdGhlIHNlY29uZCBNUFRDUCBEU1Mgb3B0aW9uIGNvbWVzIGFsb25nLCBidXQgdGhpcyB0aW1lIGl0JiMzOTtzIGludmFsaWQgZHVlIHRvIHRoZSBvcHNpemUsIGFuZCBgdXNlX2Fja2Agc2hvdWxkIGJlIDEuIEJ1dCBkb2VzIGl0PyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoZSBsb2dpYy4KCkxvb2tpbmcgYXQgdGhhdCBgY2FzZSBNUFRDUE9QVF9EU1NgIHNlY3Rpb24sIGl0IGluY2x1ZGVzIGEgY3J1Y2lhbCBjaGVjazoKCmBgYGMKCWNhc2UgTVBUQ1BPUFRfRFNTOgoJCS8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovCgkJaWYgKChtcF9vcHQtJmd0O3N1Ym9wdGlvbnMgJmFtcDsgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfAoJCQkJCSAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8CgkJCQkJICAgIE9QVElPTl9NUFRDUF9QUklPIHwKCQkJCQkgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKQoJCQlicmVhazsKYGBgCgpIZXJlJiMzOTtzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIElmIHRoZSAqZmlyc3QqIERTUyBvcHRpb24gc2V0IGBPUFRJT05fTVBUQ1BfRFNTYCwgdGhlbiBgbXBfb3B0LSZndDtzdWJvcHRpb25zYCB3aWxsIGluZGVlZCBoYXZlIHRoYXQgYml0IHNldC4gQW5kIGJlY2F1c2UgYE9QVElPTl9NUFRDUF9EU1NgIGlzICpub3QqIGluIHRoZSBhbGxvd2VkIGxpc3QgZGVmaW5lZCBieSB0aGUgYml0d2lzZSBOT1Qgb3BlcmF0aW9uLCB0aGUgYml0d2lzZSBBTkQgd2lsbCByZXN1bHQgaW4gYSBub24temVybyB2YWx1ZS4gU3BlY2lmaWNhbGx5LCBiZWNhdXNlIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBwcmVzZW50LCBgbXBfb3B0LSZndDtzdWJvcHRpb25zICZhbXA7IH5BTExPV0VEYCB3aWxsIGFsd2F5cyBiZSBub24temVybyEgVGhpcyBtZWFucyB0aGUgc2Vjb25kIERTUyBvcHRpb24gd2lsbCBicmVhayBlYXJseSEKCkNydWNpYWxseSwgaXQgd29uJiMzOTt0IGV2ZW4gKnJlYWNoKiB0aGUgcGFydCB3aGVyZSBpdCBtaWdodCByZWFkIGBmbGFnc2Agb3Igb3ZlcndyaXRlIGBtcF9vcHQtJmd0O3VzZV9hY2tgLiBUaGlzIG1lYW5zIHRoZSBuZXcgY2hlY2sgcHJldmVudHMgdGhlIHNlY29uZCwgaW52YWxpZCBNUFRDUCBEU1Mgb3B0aW9uIGZyb20gZXJyb25lb3VzbHkgY2hhbmdpbmcgdGhlIGFjayBmbGFnLiBUaGlzIGlzIGEgdmVyeSBnb29kIHRoaW5nLiBJdCBwcmV2ZW50cyBhIHBvdGVudGlhbCBvdmVyd3JpdGUgb2YgYSBjcnVjaWFsIGZsYWcuCgpJIHNob3VsZCBwcm9iYWJseSBjb25maXJtIG15IHVuZGVyc3RhbmRpbmcgb2YgYE9QVElPTl9NUFRDUF9EU1NgLCBidXQgSSYjMzk7bSBwcmV0dHkgY29uZmlkZW50IHdpdGggdGhlIGxvZ2ljIG5vdy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7I2RlZmluZSBPUFRJT05fTVBUQ1BfRFNTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9tcHRjcC9wcm90b2NvbC5oLTMwLSNkZWZpbmUgT1BUSU9OX01QVENQX1JTVFx0QklUKDEwKVxubmV0L21wdGNwL3Byb3RvY29sLmg6MzE6I2RlZmluZSBPUFRJT05fTVBUQ1BfRFNTXHRCSVQoMTEpXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC0zMi0jZGVmaW5lIE9QVElPTl9NUFRDUF9GQUlMXHRCSVQoMTIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxNzk2CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogODcwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgdGhlIE1QVENQIERTUyBvcHRpb24sIGFuZCBJIHRoaW5rIEkmIzM5O3ZlIGdvdCBhIGhhbmRsZSBvbiB3aGF0JiMzOTtzIGdvaW5nIG9uLiBMZXQmIzM5O3MgYnJlYWsgaXQgZG93bi4gYE9QVElPTl9NUFRDUF9EU1NgIGlzIGBCSVQoMTEpYCwgYW5kIHRoZSBhbGxvd2VkIG1hc2ssIGFzIEkgc2VlIGl0LCBvbmx5IGFsbG93cyBgT1BUSU9OX01QVENQX0FERF9BRERSYCwgYE9QVElPTl9NUFRDUF9STV9BRERSYCwgYE9QVElPTl9NUFRDUF9QUklPYCwgYW5kIGBPUFRJT05fTVBUQ1BfRkFJTGAuICBTbywgYE9QVElPTl9NUFRDUF9EU1NgIGlzICpub3QqIGluIHRoZSBhbGxvd2VkIG1hc2suIFRoZSBjb2RlIGlzIGNoZWNraW5nIHRvIHNlZSBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgYWxyZWFkeSBzZXQgYW5kIHRoYXQgdGhlIG5leHQgRFNTIHdpbGwgYnJlYWsgZWFybHkgYmVmb3JlIHBvdGVudGlhbGx5IG92ZXJ3cml0aW5nIGBtcF9vcHQtJmd0O3VzZV9hY2tgIQoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0aGF0IHRoaXMgd2FzIGEgcG90ZW50aWFsIGJ1ZyBmaXguIElmIGEgc2Vjb25kIGBNUFRDUE9QVF9EU1NgIHdhcyBwcmVzZW50LCBpdCBjb3VsZCBvdmVyd3JpdGUgYHVzZV9hY2tgIGFuZCBjYXVzZSBhbiBlYXJseSBicmVhay4gSG93ZXZlciwgdGhpcyBjb3VsZCBsZWFkIHRvIGBkYXRhX2Fja2AgYmVpbmcgdW5pbml0aWFsaXplZCBhbmQgY2F1c2UgdGhlIGNvZGUgdG8gYnJlYWsuIFJlYWRpbmcgdGhlIHBhdGNoLCBpdCBzZWVtcyB0byBwcmV2ZW50IG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMgZnJvbSBiZWluZyBwYXJzZWQuIFRoaXMgaW5jbHVkZXMgbm90IHBhcnNpbmcgYE1QVENQT1BUX0RTU2AgaWYgb3RoZXIgb3B0aW9ucyBsaWtlIGBGQVNUQ0xPU0VgLCBgTVBDYCwgb3IgYE1QSmAgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkLgoKVGhlbiBpdCBjbGlja2VkLiBJZiBhIHNlY29uZCBgTVBUQ1BPUFRfRFNTYCAqY291bGQqIG92ZXJ3cml0ZSBgdXNlX2Fja2AgYW5kIGxlYXZlIGBkYXRhX2Fja2AgdW5pbml0aWFsaXplZCwgdGhlbiB0aGlzIHBhdGNoIGlzIHByZXZlbnRpbmcgYW4gKnVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQqISBCcmlsbGlhbnQuIEkgbmVlZCB0byB2ZXJpZnkgdGhpcyB0aG91Z2h0LgoKTGV0JiMzOTtzIHdhbGsgdGhyb3VnaCB0aGUgc2NlbmFyaW8gKmJlZm9yZSogdGhlIHBhdGNoOgoKMS4gICoqRmlyc3QgYE1QVENQT1BUX0RTU2AqKjogVGhpcyBpcyB2YWxpZC4gYG1wdGNwX3BhcnNlX29wdGlvbmAgc2V0cyBgbXBfb3B0LSZndDt1c2VfYWNrID0gMGAsIGBtcF9vcHQtJmd0O3VzZV9tYXAgPSAxYC4gYG9wc2l6ZWAgaXMgY29ycmVjdC4gYG1wX29wdC0mZ3Q7c3Vib3B0aW9uc2Agbm93IGluY2x1ZGVzIGBPUFRJT05fTVBUQ1BfRFNTYC4gYG1wX29wdC0mZ3Q7ZGF0YV9zZXFgLCBgc3ViZmxvd19zZXFgLCBhbmQgYGRhdGFfbGVuYCBhcmUgcG9wdWxhdGVkIGFzIGl0IHNob3VsZC4KCjIuICAqKlNlY29uZCBgTVBUQ1BPUFRfRFNTYCoqOiBUaGlzIGhhcyBhbiBpbnZhbGlkIGBvcHNpemVgLiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCB3b3VsZCB0cnkgYW5kIHNldCBgbXBfb3B0LSZndDt1c2VfYWNrID0gMWAsIGFuZCBgbXBfb3B0LSZndDt1c2VfbWFwID0gMGAsIGJ1dCBpbXBvcnRhbnRseSwgaXQgYnJlYWtzIGVhcmx5LiBTbyBgbXBfb3B0LSZndDtzdWJvcHRpb25zYCAqc3RpbGwqIGhhcyBgT1BUSU9OX01QVENQX0RTU2AgZnJvbSB0aGUgZmlyc3Qgb3B0aW9uLCBCVVQgYG1wX29wdC0mZ3Q7ZGF0YV9hY2tgICp3YXMgbmV2ZXIqIHBvcHVsYXRlZCwgYmVjYXVzZSB0aGUgcGFyc2luZyBicm9rZS4KCk5vdywgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGlzIGNhbGxlZC4gSXQgY2hlY2tzIGBtcF9vcHQuc3Vib3B0aW9ucyAmYW1wOyBPUFRJT05fTVBUQ1BfRFNTYC4gVHJ1ZS4gVGhlbiBpdCBjaGVja3MgYG1wX29wdC51c2VfYWNrYC4gSXQmIzM5O3MgMSwgZnJvbSB0aGUgYnJva2VuIHBhcnNlLiBUaGVuLCAqY3J1Y2lhbGx5KiwgaXQgY2FsbHMgYGFja191cGRhdGVfbXNrKG1zaywgc2ssICZhbXA7bXBfb3B0KWAuIEFuZCBpbnNpZGUgdGhhdCBmdW5jdGlvbiwgaXQgdHJpZXMgdG8gcmVhZCBgbXBfb3B0LSZndDtkYXRhX2Fja2AhCgpIZXJlaW4gbGllcyB0aGUgY3J1eC4gYG1wX29wdC0mZ3Q7ZGF0YV9hY2tgIHdhcyBORVZFUiBwb3B1bGF0ZWQgYmVjYXVzZSBvZiB0aGUgZWFybHkgYnJlYWshIEl0JiMzOTtzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBzdHJhaWdodCBmcm9tIHRoZSBzdGFjay4gVGhlIHBhdGNoIGVmZmVjdGl2ZWx5IHByZXZlbnRzIHRoaXMgdW5pbml0aWFsaXplZCByZWFkIGJ5IGhhbHRpbmcgcGFyc2Ugd2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlIERTUyBwYWNrZXRzISBZZXMsIGl0IHByZXZlbnRzIHRoZSB1bmluaXRpYWxpemVkIHJlYWQuIFRoaXMgbWFrZXMgcGVyZmVjdCBzZW5zZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbXB0Y3Avb3B0aW9ucy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTA4MywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMDgzOlx0XHRpZiAoYWZ0ZXI2NChuZXdfd25kX2VuZCwgbXNrLVx1MDAzZXduZF9lbmQpKVxuMTA4NDpcdFx0XHRXUklURV9PTkNFKG1zay1cdTAwM2V3bmRfZW5kLCBuZXdfd25kX2VuZCk7XG4xMDg1Olx0XG4xMDg2Olx0XHQvKiB0aGlzIGFzc3VtZXMgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpIGlzIGludm9rZWQgYWZ0ZXIgdGNwX2FjaygpICovXG4xMDg3Olx0XHRpZiAoYWZ0ZXI2NChtc2stXHUwMDNld25kX2VuZCwgc25kX254dCkpXG4xMDg4Olx0XHRcdF9fbXB0Y3BfY2hlY2tfcHVzaChzaywgc3NrKTtcbjEwODk6XHRcbjEwOTA6XHRcdGlmIChhZnRlcjY0KG5ld19zbmRfdW5hLCBvbGRfc25kX3VuYSkpIHtcbjEwOTE6XHRcdFx0X19tcHRjcF9zbmRfdW5hX3VwZGF0ZShtc2ssIG5ld19zbmRfdW5hKTtcbjEwOTI6XHRcdFx0X19tcHRjcF9kYXRhX2Fja2VkKHNrKTtcbjEwOTM6XHRcdH1cbjEwOTQ6XHRcdG1zay1cdTAwM2VsYXN0X2Fja19yZWN2ID0gdGNwX2ppZmZpZXMzMjtcbjEwOTU6XHRcdG1wdGNwX2RhdGFfdW5sb2NrKHNrKTtcbjEwOTY6XHRcbjEwOTc6XHRcdHRyYWNlX2Fja191cGRhdGVfbXNrKG1wX29wdC1cdTAwM2VkYXRhX2FjayxcbjEwOTg6XHRcdFx0XHQgICAgIG9sZF9zbmRfdW5hLCBuZXdfc25kX3VuYSxcbjEwOTk6XHRcdFx0XHQgICAgIG5ld193bmRfZW5kLCBSRUFEX09OQ0UobXNrLVx1MDAzZXduZF9lbmQpKTtcbjExMDA6XHR9XG4xMTAxOlx0XG4xMTAyOlx0Ym9vbCBtcHRjcF91cGRhdGVfcmN2X2RhdGFfZmluKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIHU2NCBkYXRhX2Zpbl9zZXEsIGJvb2wgdXNlXzY0Yml0KVxuMTEwMzpcdHtcbjExMDQ6XHRcdC8qIFNraXAgaWYgREFUQV9GSU4gd2FzIGFscmVhZHkgcmVjZWl2ZWQuXG4xMTA1Olx0XHQgKiBJZiB1cGRhdGluZyBzaW11bHRhbmVvdXNseSB3aXRoIHRoZSByZWN2bXNnIGxvb3AsIHZhbHVlc1xuMTEwNjpcdFx0ICogc2hvdWxkIG1hdGNoLiBJZiB0aGV5IG1pc21hdGNoLCB0aGUgcGVlciBpcyBtaXNiZWhhdmluZyBhbmRcbjExMDc6XHRcdCAqIHdlIHdpbGwgcHJlZmVyIHRoZSBtb3N0IHJlY2VudCBpbmZvcm1hdGlvbi5cbjExMDg6XHRcdCAqL1xuMTEwOTpcdFx0aWYgKFJFQURfT05DRShtc2stXHUwMDNlcmN2X2RhdGFfZmluKSlcbjExMTA6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTExMTpcdFxuMTExMjpcdFx0V1JJVEVfT05DRShtc2stXHUwMDNlcmN2X2RhdGFfZmluX3NlcSxcbjExMTM6XHRcdFx0ICAgbXB0Y3BfZXhwYW5kX3NlcShSRUFEX09OQ0UobXNrLVx1MDAzZWFja19zZXEpLCBkYXRhX2Zpbl9zZXEsIHVzZV82NGJpdCkpO1xuMTExNDpcdFx0V1JJVEVfT05DRShtc2stXHUwMDNlcmN2X2RhdGFfZmluLCAxKTtcbjExMTU6XHRcbjExMTY6XHRcdHJldHVybiB0cnVlO1xuMTExNzpcdH1cbjExMTg6XHRcbjExMTk6XHRzdGF0aWMgYm9vbCBhZGRfYWRkcl9obWFjX3ZhbGlkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXG4xMTIwOlx0XHRcdFx0XHRzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuMTEyMTpcdHtcbjExMjI6XHRcdHU2NCBobWFjID0gMDtcbjExMjM6XHRcbjExMjQ6XHRcdGlmIChtcF9vcHQtXHUwMDNlZWNobylcbjExMjU6XHRcdFx0cmV0dXJuIHRydWU7XG4xMTI2Olx0XG4xMTI3Olx0XHRobWFjID0gYWRkX2FkZHJfZ2VuZXJhdGVfaG1hYyhSRUFEX09OQ0UobXNrLVx1MDAzZXJlbW90ZV9rZXkpLFxuMTEyODpcdFx0XHRcdFx0ICAgICAgUkVBRF9PTkNFKG1zay1cdTAwM2Vsb2NhbF9rZXkpLFxuMTEyOTpcdFx0XHRcdFx0ICAgICAgXHUwMDI2bXBfb3B0LVx1MDAzZWFkZHIpO1xuMTEzMDpcdFxuMTEzMTpcdFx0cHJfZGVidWcoXCYjMzQ7bXNrPSVwLCBhaG1hYz0lbGx1LCBtcF9vcHQtXHUwMDNlYWhtYWM9JWxsdVxcblwmIzM0OyxcbjExMzI6XHRcdFx0IG1zaywgaG1hYywgbXBfb3B0LVx1MDAzZWFobWFjKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTAgMTI6NDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzQzNTEKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGVidWdnaW5nIGBhY2tfdXBkYXRlX21za2AgLSBJbml0aWFsIElucXVpcnkqKgoKQWxyaWdodCwgYmVmb3JlIEkgZGl2ZSB0b28gZGVlcCBpbnRvIHRoZSBwcm9ibGVtIGF0IGhhbmQsIEkgbmVlZCB0byB0YWtlIGEgc3RlcCBiYWNrIGFuZCBncm91bmQgbXlzZWxmLiBNeSBmaXJzdCBpbnN0aW5jdCwgYmFzZWQgb24gdGhlIGluY29tcGxldGUgY29udGV4dCwgaXMgdG8gaW1tZWRpYXRlbHkgY2hlY2sgdGhlIGVudHJ5IHBvaW50LCB0aGUgaW5pdGlhbCBzZXR1cCBvZiB0aGUgZnVuY3Rpb24uIEkgbmVlZCB0byBzZWUgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgdGhlIGhlYWQsIHRvIGtub3cgd2hhdOKAmXMgZ29pbmcgb24gYXQgdGhlIG91dHNldC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBwYXJhbWV0ZXJzIGl0IHRha2VzLCB3aGF0IGluaXRpYWxpemF0aW9ucyBpdCBkb2VzLCBhbmQgd2hhdCB0aGUgZmxvdyBvZiB0aGUgY29kZSBpcyBmcm9tIHRoZSBiZWdpbm5pbmcuIEkmIzM5O20gZm9jdXNpbmcgb24gdGhhdCBzdGFydGluZyBwb2ludCwgYGFja191cGRhdGVfbXNrYCwgdG8gZ2V0IHRoZSBiaWcgcGljdHVyZS4gVGhpcyBpcyB0aGUgY3JpdGljYWwgc3RhcnRpbmcgcG9pbnQgdG8gdW5kZXJzdGFuZGluZyB3aHkgSSYjMzk7bSBoZXJlLiBUaGlzIGluaXRpYWwgY2hlY2sgd2lsbCBnaXZlIG1lIGNydWNpYWwgY29udGV4dCBmb3IgZnVydGhlciB0cm91Ymxlc2hvb3RpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L21wdGNwL29wdGlvbnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTA1MDpcdFx0XHRyZXR1cm47XG4xMDUxOlx0XG4xMDUyOlx0XHQvKiBTb21lIG90aGVyIHN1YmZsb3cgZ3JldyB0aGUgbXB0Y3AtbGV2ZWwgcndpbiBzaW5jZSByY3Zfd3VwLFxuMTA1MzpcdFx0ICogcmVzeW5jLlxuMTA1NDpcdFx0ICovXG4xMDU1Olx0XHR0cC1cdTAwM2VyY3Zfd25kICYjNDM7PSBtcHRjcF9yY3Zfd25kIC0gc3ViZmxvdy1cdTAwM2VyY3Zfd25kX3NlbnQ7XG4xMDU2Olx0XHR0Y3BfdXBkYXRlX21heF9yY3Zfd25kX3NlcSh0cCk7XG4xMDU3Olx0XHRzdWJmbG93LVx1MDAzZXJjdl93bmRfc2VudCA9IG1wdGNwX3Jjdl93bmQ7XG4xMDU4Olx0fVxuMTA1OTpcdFxuMTA2MDpcdHN0YXRpYyB2b2lkIGFja191cGRhdGVfbXNrKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXG4xMDYxOlx0XHRcdFx0ICAgc3RydWN0IHNvY2sgKnNzayxcbjEwNjI6XHRcdFx0XHQgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxuMTA2MzpcdHtcbjEwNjQ6XHRcdHU2NCBuZXdfd25kX2VuZCwgbmV3X3NuZF91bmEsIHNuZF9ueHQgPSBSRUFEX09OQ0UobXNrLVx1MDAzZXNuZF9ueHQpO1xuMTA2NTpcdFx0c3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopbXNrO1xuMTA2NjpcdFx0dTY0IG9sZF9zbmRfdW5hO1xuMTA2NzpcdFxuMTA2ODpcdFx0bXB0Y3BfZGF0YV9sb2NrKHNrKTtcbjEwNjk6XHRcbjEwNzA6XHRcdC8qIGF2b2lkIGFjayBleHBhbnNpb24gb24gdXBkYXRlIGNvbmZsaWN0LCB0byByZWR1Y2UgdGhlIHJpc2sgb2ZcbjEwNzE6XHRcdCAqIHdyb25nbHkgZXhwYW5kaW5nIHRvIGEgZnV0dXJlIGFjayBzZXF1ZW5jZSBudW1iZXIsIHdoaWNoIGlzIHdheVxuMTA3MjpcdFx0ICogbW9yZSBkYW5nZXJvdXMgdGhhbiBtaXNzaW5nIGFuIGFja1xuMTA3MzpcdFx0ICovXG4xMDc0Olx0XHRvbGRfc25kX3VuYSA9IG1zay1cdTAwM2VzbmRfdW5hO1xuMTA3NTpcdFx0bmV3X3NuZF91bmEgPSBtcHRjcF9leHBhbmRfc2VxKG9sZF9zbmRfdW5hLCBtcF9vcHQtXHUwMDNlZGF0YV9hY2ssIG1wX29wdC1cdTAwM2VhY2s2NCk7XG4xMDc2Olx0XG4xMDc3Olx0XHQvKiBBQ0sgZm9yIGRhdGEgbm90IGV2ZW4gc2VudCB5ZXQ/IElnbm9yZS4qL1xuMTA3ODpcdFx0aWYgKHVubGlrZWx5KGFmdGVyNjQobmV3X3NuZF91bmEsIHNuZF9ueHQpKSlcbjEwNzk6XHRcdFx0bmV3X3NuZF91bmEgPSBvbGRfc25kX3VuYTtcbjEwODA6XHRcbjEwODE6XHRcdG5ld193bmRfZW5kID0gbmV3X3NuZF91bmEgJiM0MzsgdGNwX3NrKHNzayktXHUwMDNlc25kX3duZDtcbjEwODI6XHRcbjEwODM6XHRcdGlmIChhZnRlcjY0KG5ld193bmRfZW5kLCBtc2stXHUwMDNld25kX2VuZCkpXG4xMDg0Olx0XHRcdFdSSVRFX09OQ0UobXNrLVx1MDAzZXduZF9lbmQsIG5ld193bmRfZW5kKTtcbjEwODU6XHRcbjEwODY6XHRcdC8qIHRoaXMgYXNzdW1lcyBtcHRjcF9pbmNvbWluZ19vcHRpb25zKCkgaXMgaW52b2tlZCBhZnRlciB0Y3BfYWNrKCkgKi9cbjEwODc6XHRcdGlmIChhZnRlcjY0KG1zay1cdTAwM2V3bmRfZW5kLCBzbmRfbnh0KSlcbjEwODg6XHRcdFx0X19tcHRjcF9jaGVja19wdXNoKHNrLCBzc2spO1xuMTA4OTpcdFxuMTA5MDpcdFx0aWYgKGFmdGVyNjQobmV3X3NuZF91bmEsIG9sZF9zbmRfdW5hKSkge1xuMTA5MTpcdFx0XHRfX21wdGNwX3NuZF91bmFfdXBkYXRlKG1zaywgbmV3X3NuZF91bmEpO1xuMTA5MjpcdFx0XHRfX21wdGNwX2RhdGFfYWNrZWQoc2spO1xuMTA5MzpcdFx0fVxuMTA5NDpcdFx0bXNrLVx1MDAzZWxhc3RfYWNrX3JlY3YgPSB0Y3BfamlmZmllczMyO1xuMTA5NTpcdFx0bXB0Y3BfZGF0YV91bmxvY2soc2spO1xuMTA5NjpcdFxuMTA5NzpcdFx0dHJhY2VfYWNrX3VwZGF0ZV9tc2sobXBfb3B0LVx1MDAzZWRhdGFfYWNrLFxuMTA5ODpcdFx0XHRcdCAgICAgb2xkX3NuZF91bmEsIG5ld19zbmRfdW5hLFxuMTA5OTpcdFx0XHRcdCAgICAgbmV3X3duZF9lbmQsIFJFQURfT05DRShtc2stXHUwMDNld25kX2VuZCkpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMCAxMjo0NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNTUwOAoJCQkJCQkJb3V0cHV0OiA0NjUKCQkJCQkJCXRob3VnaHRzOiAzODgxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlVuaW5pdGlhbGl6ZWQgTWVtb3J5IFZ1bG5lcmFiaWxpdHkgaW4gTVBUQ1AgRFNTIE9wdGlvbiBQYXJzaW5nKioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gZGlzc2VjdGluZyB0aGlzIGNvZGUsIGFuZCBpdCYjMzk7cyBsb29raW5nIGxpa2Ugd2UgaGF2ZSBhIGNsYXNzaWMgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUuICBTcGVjaWZpY2FsbHksIGl0IHNlZW1zIHRoYXQgaWYgYSBwYWNrZXQgY29udGFpbnMgbXVsdGlwbGUgTVBUQ1AgRFNTIG9wdGlvbnMsIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyBtYWxmb3JtZWQsIHdlIGNhbiBlbmQgdXAgcmVhZGluZyB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gIAoKSGVyZSYjMzk7cyB0aGUgZ2lzdDogYGFja191cGRhdGVfbXNrYCByZWFkcyBgbXBfb3B0LSZndDtkYXRhX2Fja2AgdG8gdXBkYXRlIGBtc2stJmd0O3NuZF91bmFgLiAgSWYgYG1wX29wdC0mZ3Q7ZGF0YV9hY2tgIGlzbiYjMzk7dCBpbml0aWFsaXplZCwgd2UgY2FuIGFja25vd2xlZGdlIGludmFsaWQgZGF0YSwgb3IgZXZlbiB3b3JzZSwgdXNlIGEgY29tcGxldGVseSByYW5kb20gdmFsdWUuICBUaGUgcHJvYmxlbSBhcmlzZXMgaW4gaG93IHdlIHBhcnNlIE1QVENQIG9wdGlvbnMuICBgbXB0Y3BfZ2V0X29wdGlvbnNgIGl0ZXJhdGVzIHRocm91Z2ggdGhlIG9wdGlvbnMsIGFuZCBzZXRzIGZsYWdzIG9uIGEgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdGAgc3RydWN0dXJlIHRoYXQgbGl2ZXMgb24gdGhlICpzdGFjayouICBDcnVjaWFsbHksIG5vdCBhbGwgZmllbGRzIG9mIHRoaXMgc3RydWN0IGFyZSBpbml0aWFsaXplZCB0byB6ZXJvOyBvbmx5IHRoZSBgc3RhdHVzYCBmaWVsZCBpcyBleHBsaWNpdGx5IGNsZWFyZWQuCgpMZXQmIzM5O3MgbG9vayBhdCBhIHNjZW5hcmlvIHdpdGggdHdvIERTUyBvcHRpb25zOiB0aGUgZmlyc3QgaXMgJiMzNDtnb29kJiMzNDssIGJ1dCB0aGUgc2Vjb25kIGlzIG1hbGZvcm1lZCAoZS5nLiwgYSB3cm9uZyBzaXplKS4gVGhlIGZpcnN0IERTUyB3aWxsIGNvcnJlY3RseSBzZXQgYE9QVElPTl9NUFRDUF9EU1NgIGFuZCBtaWdodCBzZXQgYHVzZV9hY2sgPSAwYC4gVGhlIHNlY29uZCwgbWFsZm9ybWVkIERTUyBtaWdodCBzZXQgYHVzZV9hY2sgPSAxYCBvciBvdGhlciBmbGFnLCBidXQgYnJlYWsgZWFybHksIHdpdGhvdXQgZXZlciBpbml0aWFsaXppbmcgYG1wX29wdC0mZ3Q7ZGF0YV9hY2tgLiAgYG1wdGNwX2luY29taW5nX29wdGlvbnNgICpzdGlsbCogc2VlcyBgT1BUSU9OX01QVENQX0RTU2Agc2V0IGJ5IHRoZSBmaXJzdCBEU1Mgb3B0aW9uLCBzbyB0aGUgZnVuY3Rpb24gdGhlbiBnb2VzIHRvIHVzZSB0aGUgcG90ZW50aWFsbHkgbW9kaWZpZWQgYml0ZmllbGRzLCBidXQgdGhlc2UgYml0ZmllbGRzIG1heSBpbnN0cnVjdCB0aGUgZnVuY3Rpb24gdG8gcmVhZCBmcm9tIHRoZSB1bmluaXRpYWxpemVkIGBtcF9vcHQtJmd0O2RhdGFfYWNrYCBmaWVsZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhbHVlIGlzIHRoZW4gdXNlZCBpbiBhIGNyaXRpY2FsIHVwZGF0ZTogaXQmIzM5O3MgdXNlZCB0byBtb2RpZnkgYG1zay0mZ3Q7c25kX3VuYWAgd2hpY2ggbGVhZHMgdG8gaW5jb3JyZWN0IGFja25vd2xlZGdlbWVudCBvZiBkYXRhLiBUaGlzIGlzIHdoZXJlIHRoaXMgZ29lcyBmcm9tIGJhZCB0byByZWFsbHkgYmFkIQoKTm93LCBkb2VzIHRoaXMgbGVhayB0byB1c2VyIHNwYWNlPyBObywgaXQmIzM5O3MgYW4gaW50ZXJuYWwgc3RhdGUgbWFjaGluZSBpc3N1ZS4gQnV0LCBpcyBpdCBjYXVnaHQgYnkgS0FTQU4/IE5vLCB0aGF0IGlzIG5vdCBLQVNBTiYjMzk7cyBqb2IuIEJ1dCBLTVNBTiBkb2VzISAgS01TQU4gc3BlY2lmaWNhbGx5IGNhdGNoZXMgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMhIElmIGBtcF9vcHQtJmd0O2RhdGFfYWNrYCBpcyB1bmluaXRpYWxpemVkLCBLTVNBTiB3aWxsIHRyaWdnZXIgYSB3YXJuaW5nLgoKTG9va2luZyBtb3JlIGNsb3NlbHkgYXQgdGhlIGNvZGUsIGl0IHR1cm5zIG91dCB0aGF0IGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHQ7YCBpcyBkZWNsYXJlZCBvbiB0aGUgc3RhY2sgaW4gc2V2ZXJhbCBrZXkgZnVuY3Rpb25zIGxpa2UgYG1wdGNwX2luY29taW5nX29wdGlvbnNgLCBgc3ViZmxvd19jaGVja19yZXFgLCBgbXB0Y3Bfc3ViZmxvd19pbml0X2Nvb2tpZV9yZXFgLCBldGMuIEluIGFsbCB0aGVzZSBjYXNlcywgYG1wX29wdGAgaXMgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkuICBTbyBpdCYjMzk7cyBub3QganVzdCBhIHNpbmdsZSBjb2RlIHBhdGguCgpUaGUgcGF0Y2gmIzM5O3MgZml4IGludm9sdmVzIHJlc3RyaWN0aW5nIHdoZW4gYE1QVENQT1BUX0RTU2AgY2FuIGJlIHBhcnNlZC4gSWYgaXQgZGV0ZWN0cyBhIERTUyBvcHRpb24gYWZ0ZXIgb3RoZXIgc3BlY2lmaWMgb3B0aW9ucywgaXQgYWJvcnRzIHBhcnNpbmcgaW1tZWRpYXRlbHkuICBUaGlzIHByZXZlbnRzIHRoZSBjb3JydXB0ZWQgYml0ZmllbGRzLiBUaGVyZWZvcmUsIHRoZSBwYXRjaCB3aWxsIGZpeCBhIGJ1ZyB3aGVyZSBhbiBpbnZhbGlkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBjb3VsZCBjb3JydXB0IGZsYWdzIHdpdGhvdXQgcG9wdWxhdGluZyBkYXRhIGZpZWxkcywgcmVzdWx0aW5nIGluIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWFkcy4KClNvLCBpbiBzdW1tYXJ5LCB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSB1c2VkIGluIGEgY3JpdGljYWwgVENQIHN0YXRlIG1hY2hpbmUsIHdoaWNoIGNvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IGFja25vd2xlZGdlbWVudHMsIGRhdGEgY29ycnVwdGlvbiwgb3IgY29ubmVjdGlvbiBkcm9wcy4gVGhpcyBpcyB0ZXh0Ym9vayBLTVNBTiBtYXRlcmlhbCwgc28gbGV0JiMzOTtzIGdldCBhIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBnb2luZyBBU0FQISBUaGUgcGF0Y2ggKnNob3VsZCogZml4IHRoaXMgYnkgcmVzdHJpY3RpbmcgdGhlIHBhcnNpbmcgb2YgRFNTIG9wdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEwIDEyOjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlc3RyaWN0cyB0aGUgcGFyc2luZyBvZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGluIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb2Nlc3NlZCBpZiBjZXJ0YWluIG90aGVyIG9wdGlvbnMgKGluY2x1ZGluZyBhbm90aGVyIGBNUFRDUE9QVF9EU1NgKSBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQuXG5cbkJlZm9yZSB0aGlzIHBhdGNoLCBpZiBhIFRDUCBwYWNrZXQgY29udGFpbmVkIG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMsIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgdnVsbmVyYWJpbGl0eSBjb3VsZCBiZSB0cmlnZ2VyZWQuIFRoZSBgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgbXBfb3B0YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGZ1bmN0aW9ucyBsaWtlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zKClgLiBPbmx5IGl0cyBgc3RhdHVzYCBmaWVsZCAod2hpY2ggY29udGFpbnMgYml0ZmllbGRzIGxpa2UgYHVzZV9hY2tgIGFuZCBgdXNlX21hcGApIGlzIHplcm9lZCwgbGVhdmluZyBkYXRhIGZpZWxkcyBsaWtlIGBkYXRhX2Fja2AgYW5kIGBkYXRhX3NlcWAgdW5pbml0aWFsaXplZC5cblxuSWYgYSB2YWxpZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gd2FzIHBhcnNlZCBmaXJzdCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDBgKSwgaXQgd291bGQgc2V0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgIGJ1dCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQuIElmIGEgc2Vjb25kLCBtYWxmb3JtZWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGZvbGxvd2VkIChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMWAgYnV0IGFuIGludmFsaWQgYG9wc2l6ZWApLCBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYml0ZmllbGQgdG8gYHVzZV9hY2sgPSAxYCBidXQgYnJlYWsgZWFybHkgYmVmb3JlIHBvcHVsYXRpbmcgdGhlIGBkYXRhX2Fja2AgZmllbGQuXG5cblRoZSBjYWxsZXIgd291bGQgdGhlbiBzZWUgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIHNldCAoZnJvbSB0aGUgZmlyc3Qgb3B0aW9uKSBhbmQgcmVhZCB0aGUgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkgZnJvbSBgZGF0YV9hY2tgIChkdWUgdG8gdGhlIGNvcnJ1cHRlZCBgdXNlX2FjayA9IDFgIGJpdGZpZWxkIGZyb20gdGhlIHNlY29uZCBvcHRpb24pLiBUaGlzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdvdWxkIHRoZW4gYmUgdXNlZCBpbiBjb250cm9sIGZsb3cgKGUuZy4sIHVwZGF0aW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIgYG1zay1cdTAwM2VzbmRfdW5hYCBpbiBgYWNrX3VwZGF0ZV9tc2soKWApIG9yIGNvcGllZCBpbnRvIHNrYiBleHRlbnNpb25zLlxuXG5TdGFuZGFyZCBLQVNBTiBkb2VzIG5vdCBkZXRlY3QgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkuIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBjYXRjaCB0aGlzIGV4YWN0IGNsYXNzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVzdHJpY3RzIHRoZSBwYXJzaW5nIG9mIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gaW4gYG1wdGNwX3BhcnNlX29wdGlvbigpYCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvY2Vzc2VkIGlmIGNlcnRhaW4gb3RoZXIgb3B0aW9ucyAoaW5jbHVkaW5nIGFub3RoZXIgYE1QVENQT1BUX0RTU2ApIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZC5cblxuQmVmb3JlIHRoaXMgcGF0Y2gsIGlmIGEgVENQIHBhY2tldCBjb250YWluZWQgbXVsdGlwbGUgYE1QVENQT1BUX0RTU2Agb3B0aW9ucywgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCB2dWxuZXJhYmlsaXR5IGNvdWxkIGJlIHRyaWdnZXJlZC4gVGhlIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHRgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gZnVuY3Rpb25zIGxpa2UgYG1wdGNwX2luY29taW5nX29wdGlvbnMoKWAuIE9ubHkgaXRzIGBzdGF0dXNgIGZpZWxkICh3aGljaCBjb250YWlucyBiaXRmaWVsZHMgbGlrZSBgdXNlX2Fja2AgYW5kIGB1c2VfbWFwYCkgaXMgemVyb2VkLCBsZWF2aW5nIGRhdGEgZmllbGRzIGxpa2UgYGRhdGFfYWNrYCBhbmQgYGRhdGFfc2VxYCB1bmluaXRpYWxpemVkLlxuXG5JZiBhIHZhbGlkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiB3YXMgcGFyc2VkIGZpcnN0IChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMGApLCBpdCB3b3VsZCBzZXQgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGluIGBtcF9vcHQuc3Vib3B0aW9uc2AgYnV0IGxlYXZlIGBkYXRhX2Fja2AgdW5pbml0aWFsaXplZC4gSWYgYSBzZWNvbmQsIG1hbGZvcm1lZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gZm9sbG93ZWQgKGUuZy4sIHdpdGggYHVzZV9hY2sgPSAxYCBidXQgYW4gaW52YWxpZCBgb3BzaXplYCksIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgd291bGQgb3ZlcndyaXRlIHRoZSBiaXRmaWVsZCB0byBgdXNlX2FjayA9IDFgIGJ1dCBicmVhayBlYXJseSBiZWZvcmUgcG9wdWxhdGluZyB0aGUgYGRhdGFfYWNrYCBmaWVsZC5cblxuVGhlIGNhbGxlciB3b3VsZCB0aGVuIHNlZSB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgc2V0IChmcm9tIHRoZSBmaXJzdCBvcHRpb24pIGFuZCByZWFkIHRoZSB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSBmcm9tIGBkYXRhX2Fja2AgKGR1ZSB0byB0aGUgY29ycnVwdGVkIGB1c2VfYWNrID0gMWAgYml0ZmllbGQgZnJvbSB0aGUgc2Vjb25kIG9wdGlvbikuIFRoaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgd291bGQgdGhlbiBiZSB1c2VkIGluIGNvbnRyb2wgZmxvdyAoZS5nLiwgdXBkYXRpbmcgdGhlIHNlcXVlbmNlIG51bWJlciBgbXNrLVx1MDAzZXNuZF91bmFgIGluIGBhY2tfdXBkYXRlX21zaygpYCkgb3IgY29waWVkIGludG8gc2tiIGV4dGVuc2lvbnMuXG5cblN0YW5kYXJkIEtBU0FOIGRvZXMgbm90IGRldGVjdCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGNhdGNoIHRoaXMgZXhhY3QgY2xhc3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjIzLjA5MDQzNTU2NloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3MDI2NTY2NTE2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNUFRDUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1wdGNwX2dldF9vcHRpb25zXCIsXG4gICAgXCJtcHRjcF9pbmNvbWluZ19vcHRpb25zXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXN0cmljdHMgdGhlIHBhcnNpbmcgb2YgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9jZXNzZWQgaWYgY2VydGFpbiBvdGhlciBvcHRpb25zIChpbmNsdWRpbmcgYW5vdGhlciBgTVBUQ1BPUFRfRFNTYCkgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkLlxcblxcbkJlZm9yZSB0aGlzIHBhdGNoLCBpZiBhIFRDUCBwYWNrZXQgY29udGFpbmVkIG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMsIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgdnVsbmVyYWJpbGl0eSBjb3VsZCBiZSB0cmlnZ2VyZWQuIFRoZSBgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgbXBfb3B0YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGZ1bmN0aW9ucyBsaWtlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zKClgLiBPbmx5IGl0cyBgc3RhdHVzYCBmaWVsZCAod2hpY2ggY29udGFpbnMgYml0ZmllbGRzIGxpa2UgYHVzZV9hY2tgIGFuZCBgdXNlX21hcGApIGlzIHplcm9lZCwgbGVhdmluZyBkYXRhIGZpZWxkcyBsaWtlIGBkYXRhX2Fja2AgYW5kIGBkYXRhX3NlcWAgdW5pbml0aWFsaXplZC5cXG5cXG5JZiBhIHZhbGlkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiB3YXMgcGFyc2VkIGZpcnN0IChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMGApLCBpdCB3b3VsZCBzZXQgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGluIGBtcF9vcHQuc3Vib3B0aW9uc2AgYnV0IGxlYXZlIGBkYXRhX2Fja2AgdW5pbml0aWFsaXplZC4gSWYgYSBzZWNvbmQsIG1hbGZvcm1lZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gZm9sbG93ZWQgKGUuZy4sIHdpdGggYHVzZV9hY2sgPSAxYCBidXQgYW4gaW52YWxpZCBgb3BzaXplYCksIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgd291bGQgb3ZlcndyaXRlIHRoZSBiaXRmaWVsZCB0byBgdXNlX2FjayA9IDFgIGJ1dCBicmVhayBlYXJseSBiZWZvcmUgcG9wdWxhdGluZyB0aGUgYGRhdGFfYWNrYCBmaWVsZC5cXG5cXG5UaGUgY2FsbGVyIHdvdWxkIHRoZW4gc2VlIHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBzZXQgKGZyb20gdGhlIGZpcnN0IG9wdGlvbikgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5IGZyb20gYGRhdGFfYWNrYCAoZHVlIHRvIHRoZSBjb3JydXB0ZWQgYHVzZV9hY2sgPSAxYCBiaXRmaWVsZCBmcm9tIHRoZSBzZWNvbmQgb3B0aW9uKS4gVGhpcyB1bmluaXRpYWxpemVkIG1lbW9yeSB3b3VsZCB0aGVuIGJlIHVzZWQgaW4gY29udHJvbCBmbG93IChlLmcuLCB1cGRhdGluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIGBtc2stXFx1MDAzZXNuZF91bmFgIGluIGBhY2tfdXBkYXRlX21zaygpYCkgb3IgY29waWVkIGludG8gc2tiIGV4dGVuc2lvbnMuXFxuXFxuU3RhbmRhcmQgS0FTQU4gZG9lcyBub3QgZGV0ZWN0IHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5LiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyBleGFjdCBjbGFzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiB0cnVlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgcGFyc2luZyBvZiBNUFRDUCBvcHRpb25zLCBzcGVjaWZpY2FsbHkgcmVzdHJpY3RpbmcgdGhlIGNvbWJpbmF0aW9ucyBvZiBEU1Mgb3B0aW9ucyB3aXRoIG90aGVyIG9wdGlvbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBNUFRDUCBvcHRpb24gcGFyc2luZyBsb2dpYy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6MjMuMDkwNDQwNjc2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MTk4NDM5NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA1NTdmYjZlOTU4YjI1N2Q4Mjg1ZDI1OTQ3Y2MyNWVjNWE1NTIwMzY2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gQXVnIDEwIDEyOjQxOjIyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL25ldC9tcHRjcC9vcHRpb25zLmMgYi9uZXQvbXB0Y3Avb3B0aW9ucy5jXFxuaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDRcXG4tLS0gYS9uZXQvbXB0Y3Avb3B0aW9ucy5jXFxuKysrIGIvbmV0L21wdGNwL29wdGlvbnMuY1xcbkBAIC0xNTMsNiArMTUzLDEzIEBAIHN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiBcXHRcXHRicmVhaztcXG4gXFxuIFxcdGNhc2UgTVBUQ1BPUFRfRFNTOlxcbitcXHRcXHQvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqL1xcbitcXHRcXHRpZiAoKG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyBcXHUwMDI2IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcbiBcXHRcXHRwcl9kZWJ1ZyhcXFwiRFNTXFxcXG5cXFwiKTtcXG4gXFx0XFx0cHRyKys7XFxuIFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MToyMy41MTE1Nzk1OTJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo0MDA3OTA0Nzc4MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNUFRDUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1wdGNwX2dldF9vcHRpb25zXCIsXG4gICAgXCJtcHRjcF9pbmNvbWluZ19vcHRpb25zXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHBhcnNpbmcgb2YgTVBUQ1Agb3B0aW9ucywgc3BlY2lmaWNhbGx5IHJlc3RyaWN0aW5nIHRoZSBjb21iaW5hdGlvbnMgb2YgRFNTIG9wdGlvbnMgd2l0aCBvdGhlciBvcHRpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgTVBUQ1Agb3B0aW9uIHBhcnNpbmcgbG9naWMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDU1N2ZiNmU5NThiMjU3ZDgyODVkMjU5NDdjYzI1ZWM1YTU1MjAzNjZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAxMCAxMjo0MToyMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9tcHRjcC9vcHRpb25zLmMgYi9uZXQvbXB0Y3Avb3B0aW9ucy5jXG5pbmRleCBjNjY0MDIzZDM3YmE4Li43ZWMxOGZhMWJlZjYzIDEwMDY0NFxuLS0tIGEvbmV0L21wdGNwL29wdGlvbnMuY1xuKysrIGIvbmV0L21wdGNwL29wdGlvbnMuY1xuQEAgLTE1Myw2ICsxNTMsMTMgQEAgc3RhdGljIHZvaWQgbXB0Y3BfcGFyc2Vfb3B0aW9uKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXG4gXHRcdGJyZWFrO1xuIFxuIFx0Y2FzZSBNUFRDUE9QVF9EU1M6XG4rXHRcdC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG4rXHRcdGlmICgobXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHxcbitcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcbitcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcbitcdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMClcbitcdFx0XHRicmVhaztcbitcbiBcdFx0cHJfZGVidWcoXCJEU1NcXG5cIik7XG4gXHRcdHB0cisrO1xuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6MjMuNTExNTgxMzgyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDUzMzE5MTU3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1QVENQIERTUyBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgdHdlYWtzIGBuZXQvbXB0Y3Avb3B0aW9ucy5jYC4gU3BlY2lmaWNhbGx5LCBpdCBzZWVtcyB0byBiZSBhZGRpbmcgYSBjaGVjayB3aXRoaW4gYG1wdGNwX3BhcnNlX29wdGlvbmAgZm9yIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24uIFRoYXQncyBnb29kLCB3ZSBuZWVkIHRvIGhhbmRsZSBEU1MgcHJvcGVybHkuIE5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBjb25kaXRpb24gaXQncyBpbnRyb2R1Y2luZy4gSXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggaXMgZGVzaWduZWQgdG8gYmUgdmVyeSBzdHJpY3Q6IGlmIHRoZSBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgIGZpZWxkLCB3aGljaCBjb250YWlucyB0aGUgc3ViLW9wdGlvbnMgKndpdGhpbiogdGhlIERTUyBvcHRpb24sIGNvbnRhaW5zIGFueXRoaW5nICpvdGhlciB0aGFuKiBgQUREX0FERFJgLCBgUk1fQUREUmAsIGBQUklPYCwgb3IgYEZBSUxgLCB0aGUgRFNTIG9wdGlvbiBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLCBhcyB0aGUgY29kZSBicmVha3Mgb3V0IG9mIHBhcnNpbmcuXG5cbkVzc2VudGlhbGx5LCB0aGUgbG9naWMgc2VlbXMgdG8gYmUgc2F5aW5nLCBcIklmIHlvdSdyZSB1c2luZyBEU1MsIHlvdSAqbXVzdCogdXNlIG9ubHkgdGhlc2Ugc3BlY2lmaWMgc3ViLW9wdGlvbnMsIGFuZCBub3RoaW5nIGVsc2UuXCIgSSBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB3aHkgdGhpcyByZXN0cmljdGlvbiBpcyBiZWluZyBpbXBvc2VkLiBJcyB0aGlzIGEgZGVsaWJlcmF0ZSBkZXNpZ24gY2hvaWNlIHJlbGF0ZWQgdG8gc2VjdXJpdHksIGNvbXBhdGliaWxpdHksIG9yIHNvbWUgb3RoZXIgaW50ZXJuYWwgcmVxdWlyZW1lbnQ/IE9yIGlzIHRoaXMgYSBwb3RlbnRpYWwgYnVnIHRoYXQgd2lsbCBjYXVzZSBpc3N1ZXMgd2l0aCBtb3JlIGFkdmFuY2VkIG9yIGZ1dHVyZSBEU1MgZXh0ZW5zaW9ucz8gSSdtIGdvaW5nIHRvIG5lZWQgdG8gcmV2aWV3IHRoZSBjb250ZXh0IGFuZCB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIGFkZGVkIGNoZWNrIHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgaW1wbGljYXRpb25zLiBMZXQgbWUgZ28gYmFjayB0byBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBhbmQgc2VlIHdoYXQncyBhY3R1YWxseSBoYXBwZW5pbmcgYXJvdW5kIHRoaXMgY29kZSBzbmlwcGV0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDIwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAyLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6MjguMDQ0Nzc2MzUxWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1ODE5MzM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1wdGNwX3BhcnNlX29wdGlvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmM9MTg9c3RhdGljIGJvb2wgbXB0Y3BfY2FwX2ZsYWdfc2hhMjU2KHU4IGZsYWdzKVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYy0yMi1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjIzOnN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMjQtXFx0XFx0XFx0ICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IG9wc2l6ZSxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmM9MzY2PXZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAwLVxcdFxcdFxcdGlmIChvcGNvZGUgPT0gVENQT1BUX01QVENQKVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6NDAxOlxcdFxcdFxcdFxcdG1wdGNwX3BhcnNlX29wdGlvbihza2IsIHB0ciwgb3BzaXplLCBtcF9vcHQpO1xcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAyLVxcdFxcdFxcdHB0ciArPSBvcHNpemUgLSAyO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MToyOC4wOTA2MDMwNzZaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzM4MTY5OTkzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBwcmVzZW50ZWQgYXMgaWYgaXQncyBteSBvd24uXG5cbioqQW5hbHl6aW5nIHRoZSBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBGdW5jdGlvbioqXG5cblJpZ2h0LCBzbyBJJ20gbG9va2luZyBhdCBgbXB0Y3BfcGFyc2Vfb3B0aW9uYC4gSXQncyBjbGVhcmx5IGEgY3JpdGljYWwgcGFydCBvZiB0aGUgTVBUQ1Agb3B0aW9uIHByb2Nlc3NpbmcsIGFzIGl0J3MgZGlyZWN0bHkgY2FsbGVkIGJ5IGBtcHRjcF9nZXRfb3B0aW9uc2AuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBhY2Nlc3NpYmlsaXR5IG9mIGBtcHRjcF9nZXRfb3B0aW9uc2AuIElzIHRoaXMgc29tZXRoaW5nIHRoYXQncyBleHBvcnRlZCwgYWNjZXNzaWJsZSBmcm9tIG90aGVyIG1vZHVsZXMsIG9yIGlzIGl0IGEgbG9jYWwsIGludGVybmFsIGZ1bmN0aW9uPyBUaGF0IGRpc3RpbmN0aW9uIG1hdHRlcnMgYmVjYXVzZSBpdCB0ZWxscyBtZSBob3cgd2lkZWx5IHRoaXMgZnVuY3Rpb25hbGl0eSBpcyB1c2VkIGFuZCBpZiBpdCBpcyBhbiBhcmVhIHRoYXQgY291bGQgaW50cm9kdWNlIGV4dGVybmFsIGRlcGVuZGVuY2llcywgaWYgdGhlcmUgaXMgYW4gaXNzdWUuIExldCdzIGRpZyBkZWVwZXIgYW5kIHNlZSBpZiB0aGF0J3Mgc3RhdGljIG9yIGV4cG9ydGVkLCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjcwMSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjMxLjQyODc3NTI0OVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Nzc2NDA0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtcHRjcF9nZXRfb3B0aW9uc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbXB0Y3AvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmM9MjM9c3RhdGljIHZvaWQgbXB0Y3BfcGFyc2Vfb3B0aW9uKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTM2NS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjM2Njp2b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L21wdGNwL29wdGlvbnMuYy0zNjctXFx0XFx0ICAgICAgIHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTExNDA9Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2Ni1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNjc6XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNjgtXFxuLS1cXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaD05MTg9c3RydWN0IHNvY2sgKm1wdGNwX3NrX2Nsb25lX2luaXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxcbi0tXFxubmV0L21wdGNwL3Byb3RvY29sLmgtOTIxLVxcdFxcdFxcdFxcdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpO1xcbm5ldC9tcHRjcC9wcm90b2NvbC5oOjkyMjp2b2lkIG1wdGNwX2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsXFxubmV0L21wdGNwL3Byb3RvY29sLmgtOTIzLVxcdFxcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KTtcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9MTQ3PXN0YXRpYyBpbnQgc3ViZmxvd19jaGVja19yZXEoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLFxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy0xNjctXFxubmV0L21wdGNwL3N1YmZsb3cuYzoxNjg6XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTE2OS1cXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9MjY1PWludCBtcHRjcF9zdWJmbG93X2luaXRfY29va2llX3JlcShzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsXFxuLS1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTI3NS1cXHRzdWJmbG93X2luaXRfcmVxKHJlcSwgc2tfbGlzdGVuZXIpO1xcbm5ldC9tcHRjcC9zdWJmbG93LmM6Mjc2OlxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL3N1YmZsb3cuYy0yNzctXFxuLS1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jPTUyNj1zdGF0aWMgdm9pZCBzdWJmbG93X2ZpbmlzaF9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmMtNTQ0LVxcbm5ldC9tcHRjcC9zdWJmbG93LmM6NTQ1OlxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL3N1YmZsb3cuYy01NDYtXFx0aWYgKHN1YmZsb3ctXFx1MDAzZXJlcXVlc3RfbXB0Y3ApIHtcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9ODA2PXN0YXRpYyBzdHJ1Y3Qgc29jayAqc3ViZmxvd19zeW5fcmVjdl9zb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzayxcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmMtODQ2LVxcdFxcdCAqL1xcbm5ldC9tcHRjcC9zdWJmbG93LmM6ODQ3OlxcdFxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL3N1YmZsb3cuYy04NDgtXFx0XFx0aWYgKCEobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNlxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy04NTItXFx0fSBlbHNlIGlmIChzdWJmbG93X3JlcS1cXHUwMDNlbXBfam9pbikge1xcbm5ldC9tcHRjcC9zdWJmbG93LmM6ODUzOlxcdFxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL3N1YmZsb3cuYy04NTQtXFx0XFx0aWYgKCEobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfTVBKX0FDSykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjMxLjQ3NjU0ODE5NFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzMzcyOTY2NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZSwgd2l0aCBhICoqYm9sZGVkIGhlYWRlcioqOlxuXG4qKkFuYWx5emluZyBNUFRDUCBPcHRpb24gSGFuZGxpbmcgXHUwMDI2IENvbmZpZ3VyYXRpb24qKlxuXG5SaWdodCwgc28gYG1wdGNwX2dldF9vcHRpb25zYCBpcyB1bmRlbmlhYmx5IHRoZSBmdW5jdGlvbiBoYW5kbGluZyBpbmNvbWluZyBNUFRDUCBvcHRpb25zLiBUaGF0J3MgZ29vZCwgdGhhdCdzIHdoYXQgd2UgZXhwZWN0LiBUaGUgcGF0Y2ggaXRzZWxmIGlzIG1ha2luZyBjaGFuZ2VzIHRvIGhvdyB3ZSBwYXJzZSB0aG9zZSBNUFRDUCBvcHRpb25zLiBGdW5jdGlvbmFsbHksIHRoaXMgaXMgdGhlIGNydXggb2YgdGhlIG1vZGlmaWNhdGlvbi4gQmVmb3JlIEkgZGlnIHRvbyBkZWVwbHkgaW50byB0aGUgY29kZSBhbmQgdGhlIHBhdGNoIGl0c2VsZiwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzeXN0ZW0gdG8gZW5zdXJlIHRoZSBNUFRDUCBmdW5jdGlvbmFsaXR5IGlzIGFjdGl2ZSwgYW5kIGNvbmZpcm0gdGhlIHJlbGV2YW50IHNldHRpbmdzLiBUaGF0IHNlZW1zIGxpa2UgYSBsb2dpY2FsIGZpcnN0IHN0ZXAgYmVmb3JlIEkgZGl2ZSBpbnRvIHRoZSBuaXR0eS1ncml0dHkgb2YgdGhlIHBhcnNpbmcgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzg4NywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjM0LjgxMzg0ODA0N1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Njk1MjM0NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgTVBUQ1BcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L21wdGNwL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L21wdGNwL0tjb25maWctMS1cXG5uZXQvbXB0Y3AvS2NvbmZpZzoyOmNvbmZpZyBNUFRDUFxcbm5ldC9tcHRjcC9LY29uZmlnLTMtXFx0Ym9vbCBcXFwiTVBUQ1A6IE11bHRpcGF0aCBUQ1BcXFwiXFxuLS1cXG5uZXQvbXB0Y3AvS2NvbmZpZz0xNj1jb25maWcgSU5FVF9NUFRDUF9ESUFHXFxuLS1cXG5uZXQvbXB0Y3AvS2NvbmZpZy0xOS1cXG5uZXQvbXB0Y3AvS2NvbmZpZzoyMDpjb25maWcgTVBUQ1BfSVBWNlxcbm5ldC9tcHRjcC9LY29uZmlnLTIxLVxcdGJvb2wgXFxcIk1QVENQOiBJUHY2IHN1cHBvcnQgZm9yIE11bHRpcGF0aCBUQ1BcXFwiXFxuLS1cXG5uZXQvbXB0Y3AvS2NvbmZpZy0yNC1cXG5uZXQvbXB0Y3AvS2NvbmZpZzoyNTpjb25maWcgTVBUQ1BfS1VOSVRfVEVTVFxcbm5ldC9tcHRjcC9LY29uZmlnLTI2LVxcdHRyaXN0YXRlIFxcXCJUaGlzIGJ1aWxkcyB0aGUgTVBUQ1AgS1VuaXQgdGVzdHNcXFwiIGlmICFLVU5JVF9BTExfVEVTVFNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6MzQuODYwODA0NjQyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzMwNDA0MzY3NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1QVENQIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHdlJ3JlIHdvcmtpbmcgd2l0aCBpcyBkZWZpbml0ZWx5IGBNUFRDUGAuIEdpdmVuIHRoYXQsIEkgbmVlZCB0byBwaW5wb2ludCB3aGVyZSB0aGUgaW50ZXJlc3RpbmcgbG9naWMgcmVzaWRlcy4gTXkgZ3V0IHRlbGxzIG1lIGVpdGhlciBgbXB0Y3BfZ2V0X29wdGlvbnNgIG9yIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBpcyB0aGUgZnVuY3Rpb24gdG8gZXhhbWluZS4gTGV0J3Mgc3RhcnQgd2l0aCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AuIFRoYXQgc2VlbXMgbGlrZSB0aGUgbG9naWNhbCBlbnRyeSBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhpcyBoYW5kbGVzIGluY29taW5nIHRyYWZmaWMsIGRvZXNuJ3QgaXQ/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjQzNDksIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTozOC4xNjQ4NTEwNjhaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1OTk5MDQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1wdGNwX2luY29taW5nX29wdGlvbnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L21wdGNwL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jPTEwNjA9c3RhdGljIHZvaWQgYWNrX3VwZGF0ZV9tc2soc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTA4NS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjEwODY6XFx0LyogdGhpcyBhc3N1bWVzIG1wdGNwX2luY29taW5nX29wdGlvbnMoKSBpcyBpbnZva2VkIGFmdGVyIHRjcF9hY2soKSAqL1xcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTA4Ny1cXHRpZiAoYWZ0ZXI2NChtc2stXFx1MDAzZXduZF9lbmQsIHNuZF9ueHQpKVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYz0xMTE5PXN0YXRpYyBib29sIGFkZF9hZGRyX2htYWNfdmFsaWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTEzOS0gKi9cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNDA6Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNDEte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTozOC4yMTA4NTcyMjRaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQwNjUyMjgyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuYWx5emluZyB0aGF0IHF1ZXN0aW9uOlxuXG4qKkFuYWx5emluZyB0aGUgQ2FsbCBTaXRlcyBvZiBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB3aGVyZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgaXMgYWN0dWFsbHkgdXNlZC4gVGhhdCBmdW5jdGlvbiBjYWxsIGlzIHByZXR0eSBjcml0aWNhbCBpbiB0aGUgTVBUQ1Agc3RhY2ssIHNvIHVuZGVyc3RhbmRpbmcgaXRzIGNhbGwgc2l0ZXMgaXMgZnVuZGFtZW50YWwgdG8gZmlndXJpbmcgb3V0IGhvdyBvcHRpb25zIGdldCBoYW5kbGVkIHdoZW4gYSBuZXcgTVBUQ1AgY29ubmVjdGlvbiBpcyBiZWluZyBzZXQgdXAuIFRoaXMgd2lsbCBoZWxwIHRvIGFuYWx5emUgbmV0d29yayBiZWhhdmlvdXIuIEknbGwgbmVlZCB0byBqdW1wIGludG8gdGhlIGNvZGUgYW5kIHN0YXJ0IHNlYXJjaGluZy4gUHJvYmFibHkgdXNpbmcgYGdyZXBgIG9yIGEgc2ltaWxhciB0b29sIHRvIGZpbmQgYWxsIGluc3RhbmNlcyBvZiB0aGF0IGZ1bmN0aW9uIG5hbWUuIEknbGwgbmVlZCB0byBiZSBtaW5kZnVsIG9mIHBvdGVudGlhbCBtYWNyb3Mgb3IgaW5kaXJlY3QgY2FsbHMgYXMgd2VsbC4gVGhlIGdvYWwgaXNuJ3QganVzdCBhIGxpdGVyYWwgc3RyaW5nIG1hdGNoOyBJIG5lZWQgdG8gdW5kZXJzdGFuZCAqaG93KiBpdCdzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBNUFRDUCBmcmFtZXdvcmsgdG8gdW5kZXJzdGFuZCBob3cgdGhlIG9wdGlvbnMgYXJlIHByb2Nlc3NlZC4gSSBuZWVkIHRvIG5vdGUgdGhlIGNvbnRleHQgYXJvdW5kIGVhY2ggY2FsbCAtIHRoZSBhcmd1bWVudHMgcGFzc2VkLCB3aGF0IG90aGVyIGZ1bmN0aW9ucyBpdCdzIGludGVyYWN0aW5nIHdpdGgsIGFuZCB3aGF0IHRoZSBvdmVyYWxsIG9iamVjdGl2ZSBvZiB0aGUgY29kZSBzZWdtZW50IGFwcGVhcnMgdG8gYmUuIEJhc2VkIG9uIHRoZSBzdXJyb3VuZGluZyBjb2RlLCBJIGNhbiBnYWluIGEgc29saWQgbWVudGFsIG1vZGVsIG9mIHRoZSBvcHRpb24gbmVnb3RpYXRpb24gcHJvY2Vzcy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDc3OCwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjQxLjYxNzM4MjIwOVoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc2MDA3MTAxNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtcHRjcF9pbmNvbWluZ19vcHRpb25zXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL25ldC9tcHRjcC5oPTE1Nj1pbnQgbXB0Y3BfZXN0YWJsaXNoZWRfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5pbmNsdWRlL25ldC9tcHRjcC5oLTE1OC1cXHRcXHRcXHQgICAgICBzdHJ1Y3QgbXB0Y3Bfb3V0X29wdGlvbnMgKm9wdHMpO1xcbmluY2x1ZGUvbmV0L21wdGNwLmg6MTU5OmJvb2wgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpO1xcbmluY2x1ZGUvbmV0L21wdGNwLmgtMTYwLVxcbi0tXFxuaW5jbHVkZS9uZXQvbXB0Y3AuaD0yNjY9c3RhdGljIGlubGluZSBib29sIG1wdGNwX3N5bmFja19vcHRpb25zKGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcXG4tLVxcbmluY2x1ZGUvbmV0L21wdGNwLmgtMjcyLVxcbmluY2x1ZGUvbmV0L21wdGNwLmg6MjczOnN0YXRpYyBpbmxpbmUgYm9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzayxcXG5pbmNsdWRlL25ldC9tcHRjcC5oLTI3NC1cXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvaXB2NC90Y3BfaW5wdXQuYz00ODg0PXZvaWQgdGNwX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTQ4OTAtXFx0LyogbXB0Y3AgY2FuJ3QgdGVsbCB1cyB0byBpZ25vcmUgcmVzZXQgcGt0cyxcXG5uZXQvaXB2NC90Y3BfaW5wdXQuYzo0ODkxOlxcdCAqIHNvIGp1c3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpLlxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTQ4OTItXFx0ICovXFxubmV0L2lwdjQvdGNwX2lucHV0LmMtNDg5My1cXHRpZiAoc2tfaXNfbXB0Y3Aoc2spKVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjQ4OTQ6XFx0XFx0bXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzaywgc2tiKTtcXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy00ODk1LVxcbi0tXFxubmV0L2lwdjQvdGNwX2lucHV0LmM9NTYwNz1zdGF0aWMgdm9pZCB0Y3BfZGF0YV9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvaXB2NC90Y3BfaW5wdXQuYy01NjE2LVxcdCAqL1xcbm5ldC9pcHY0L3RjcF9pbnB1dC5jOjU2MTc6XFx0aWYgKHNrX2lzX21wdGNwKHNrKSBcXHUwMDI2XFx1MDAyNiAhbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzaywgc2tiKSkge1xcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTU2MTgtXFx0XFx0X19rZnJlZV9za2Ioc2tiKTtcXG4tLVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jPTcxNTI9dGNwX3Jjdl9zdGF0ZV9wcm9jZXNzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTczNzktXFx0XFx0XFx0ICovXFxubmV0L2lwdjQvdGNwX2lucHV0LmM6NzM4MDpcXHRcXHRcXHRpZiAoc2tfaXNfbXB0Y3Aoc2spIFxcdTAwMjZcXHUwMDI2ICFtcHRjcF9pbmNvbWluZ19vcHRpb25zKHNrLCBza2IpKVxcbm5ldC9pcHY0L3RjcF9pbnB1dC5jLTczODEtXFx0XFx0XFx0XFx0Z290byBkaXNjYXJkO1xcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYz0xMDYwPXN0YXRpYyB2b2lkIGFja191cGRhdGVfbXNrKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTEwODUtXFxubmV0L21wdGNwL29wdGlvbnMuYzoxMDg2OlxcdC8qIHRoaXMgYXNzdW1lcyBtcHRjcF9pbmNvbWluZ19vcHRpb25zKCkgaXMgaW52b2tlZCBhZnRlciB0Y3BfYWNrKCkgKi9cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTEwODctXFx0aWYgKGFmdGVyNjQobXNrLVxcdTAwM2V3bmRfZW5kLCBzbmRfbnh0KSlcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmM9MTExOT1zdGF0aWMgYm9vbCBhZGRfYWRkcl9obWFjX3ZhbGlkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExMzktICovXFxubmV0L21wdGNwL29wdGlvbnMuYzoxMTQwOmJvb2wgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXFxubmV0L21wdGNwL29wdGlvbnMuYy0xMTQxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6NDMuMzc3NDU5MDM2WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxMzI5MDY1NTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gbG9va2luZyBpbnRvIHRoaXMgTVBUQ1AgY2hhbmdlLCBhbmQgbXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGFuZCBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFyZSB0aGUga2V5IGZ1bmN0aW9ucyB0byBmb2N1cyBvbi4gU2luY2UgdGhlIGFjdHVhbCBtb2RpZmljYXRpb24gaXMgd2l0aGluIGBtcHRjcF9wYXJzZV9vcHRpb25gLCB3aGljaCBpcyB1bmZvcnR1bmF0ZWx5IHN0YXRpYywgdGhlIGJlc3QgZW50cnkgcG9pbnQgdG8gdW5kZXJzdGFuZCB0aGUgd2lkZXIgaW1wbGljYXRpb25zIHdpbGwgYmUgYG1wdGNwX2dldF9vcHRpb25zYCwgYXMgaXQncyB0aGUgY2xvc2VzdCBub24tc3RhdGljIGZ1bmN0aW9uLlxuXG5GaXJzdCwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgdGhhdCBtaWdodCBpbXBhY3QgdGhpcyBiZWhhdmlvdXIuIFdlIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUgTVBUQ1AgaXMgZW5hYmxlZCwgb2J2aW91c2x5LlxuXG5Ob3csIGl0IHNlZW1zIGxpa2UgdGhpcyBjaGFuZ2Ugc3BlY2lmaWNhbGx5IHJlc3RyaWN0cyB0aGUgYmVoYXZpb3VyIG9mIERTUyBvcHRpb25zIHdoZW4gY29tYmluZWQgd2l0aCBvdGhlciBNUFRDUCBvcHRpb25zLiBUaGVyZWZvcmUsIGl0IGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UuXG5cbkxldCBtZSBjaXJjbGUgYmFjayBhbmQgbWV0aWN1bG91c2x5IHJldmlldyBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFuZCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgaW4gbW9yZSBkZXRhaWwsIG5vdyB0aGF0IEkgaGF2ZSBhIGJldHRlciBpZGVhIG9mIHRoZSBjb250ZXh0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MDA1LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjQ3LjUxMDM2Nzg5OFoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDcwOTU3OTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibXB0Y3BfZ2V0X29wdGlvbnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jPTIzPXN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYy0zNjUtXFxubmV0L21wdGNwL29wdGlvbnMuYzozNjY6dm9pZCBtcHRjcF9nZXRfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY3LVxcdFxcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYz0xMTQwPWJvb2wgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTExNjYtXFxubmV0L21wdGNwL29wdGlvbnMuYzoxMTY3OlxcdG1wdGNwX2dldF9vcHRpb25zKHNrYiwgXFx1MDAyNm1wX29wdCk7XFxubmV0L21wdGNwL29wdGlvbnMuYy0xMTY4LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTo0Ny41NTc0OTA4OTNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI0MTMwMTQzMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgTVBUQ1AgT3B0aW9uIEhhbmRsaW5nKipcblxuT2theSwgc28gYG1wdGNwX2dldF9vcHRpb25zYCBpcyBpbmRlZWQgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRob3NlIG9wdGlvbnMsIGFuZCBpbXBvcnRhbnRseSwgaXQncyAqbm90KiBzdGF0aWMsIG1ha2luZyBpdCBhY2Nlc3NpYmxlIGFzIEkgc3VzcGVjdGVkLiBUaGF0J3MgYSBrZXkgcGllY2Ugb2YgdGhlIHB1enpsZS4gSSdsbCBtYWtlIHN1cmUgdG8ga2VlcCBib3RoIGBtcHRjcF9nZXRfb3B0aW9uc2AgYW5kIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBpbiBzaGFycCBmb2N1cyBoZXJlLCB0aGV5J3JlIHRoZSBjb3JlIHN5bWJvbHMgSSBuZWVkIHRvIHVuZGVyc3RhbmQuIEdpdmVuIHRoZSBjb250ZXh0LCBteSBjb25maWcgaXMsIG5hdHVyYWxseSwgYE1QVENQYC5cblxuTm93LCBsZXQncyBzdGVwIGJhY2sgZm9yIGEgbW9tZW50LiBCZWZvcmUgZGl2aW5nIGRlZXBlciBpbnRvIHRoZSBzcGVjaWZpY3Mgb2Ygb3B0aW9uIHBhcnNpbmcsIEkgd2FudCB0byBjb25maXJtIC0gYXJlIHRoZXJlIGFueSBjcml0aWNhbCBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgYW55IGxvdy1sZXZlbCBmdW5jdGlvbnMgb3IgZXh0ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYE1QVENQYCByZWxpZXMgdXBvbj8gSSBuZWVkIHRvIGJ1aWxkIGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgYXJjaGl0ZWN0dXJhbCBsYW5kc2NhcGUgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgZGV0YWlsZWQgYW5hbHlzaXMgb2YgdGhlIHBhcnNpbmcgbG9naWMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY2MTcsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTo1MS43OTg3OTUwODRaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Mjk0MzA2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBNUFRDUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbXB0Y3AvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbXB0Y3AvS2NvbmZpZy0xLVxcbm5ldC9tcHRjcC9LY29uZmlnOjI6Y29uZmlnIE1QVENQXFxubmV0L21wdGNwL0tjb25maWctMy1cXHRib29sIFxcXCJNUFRDUDogTXVsdGlwYXRoIFRDUFxcXCJcXG4tLVxcbm5ldC9tcHRjcC9LY29uZmlnPTE2PWNvbmZpZyBJTkVUX01QVENQX0RJQUdcXG4tLVxcbm5ldC9tcHRjcC9LY29uZmlnLTE5LVxcbm5ldC9tcHRjcC9LY29uZmlnOjIwOmNvbmZpZyBNUFRDUF9JUFY2XFxubmV0L21wdGNwL0tjb25maWctMjEtXFx0Ym9vbCBcXFwiTVBUQ1A6IElQdjYgc3VwcG9ydCBmb3IgTXVsdGlwYXRoIFRDUFxcXCJcXG4tLVxcbm5ldC9tcHRjcC9LY29uZmlnLTI0LVxcbm5ldC9tcHRjcC9LY29uZmlnOjI1OmNvbmZpZyBNUFRDUF9LVU5JVF9URVNUXFxubmV0L21wdGNwL0tjb25maWctMjYtXFx0dHJpc3RhdGUgXFxcIlRoaXMgYnVpbGRzIHRoZSBNUFRDUCBLVW5pdCB0ZXN0c1xcXCIgaWYgIUtVTklUX0FMTF9URVNUU1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MTo1MS44NDQwOTQ5NFoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDM0MTYwNjQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgTVBUQ1AgS2NvbmZpZyoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCBjcmFjayBvcGVuIHRoZSBgbmV0L21wdGNwL0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBNdWx0cGF0aCBUQ1AgY29uZmlndXJhdGlvbiBvcHRpb25zIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsLiBUaGlzIGNvbmZpZyBmaWxlIGlzIHRoZSBoZWFydCBvZiB0aGUgbWF0dGVyIHdoZW4gaXQgY29tZXMgdG8gZW5hYmxpbmcgYW5kIGN1c3RvbWl6aW5nIE1QVENQJ3MgYmVoYXZpb3IuIEknbSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gc2VlaW5nIHdoYXQgbGV2ZWwgb2YgY29udHJvbCBpdCBwcm92aWRlcyBvdmVyIGRpZmZlcmVudCBmZWF0dXJlcyDigJMgdGhpbmdzIGxpa2UgcGF0aCBtYW5hZ2VtZW50LCBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtcyAoYW5kIHRoZSBwb3RlbnRpYWwgdG8gYWRkIGN1c3RvbSBvbmVzKSwgc3ViZmxvdyBlc3RhYmxpc2htZW50LCBhbmQgaG93IGl0IGhhbmRsZXMgZGlmZmVyZW50IG5ldHdvcmsgZW52aXJvbm1lbnRzLiBJJ20gZXhwZWN0aW5nIHRvIHNlZSBhIHN0cnVjdHVyZWQgYnJlYWtkb3duIG9mIGRlcGVuZGVuY2llcyBhbmQgZGVmYXVsdCB2YWx1ZXMsIHdoaWNoIGhlbHBzIHVuZGVyc3RhbmQgaG93IHRoZSBkaWZmZXJlbnQgcGllY2VzIG9mIE1QVENQIGZpdCB0b2dldGhlci4gQXJlIHRoZXJlIGFueSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXM/IEFyZSBhbnkgZmVhdHVyZXMgZXhwZXJpbWVudGFsIGFuZCB0aHVzIGJlaGluZCBhIGNvbmZpZyBmbGFnPyBJJ20gaG9waW5nIGl0IGNsZWFybHkgbWFwcyBvdXQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgdmFyaW91cyBNUFRDUCBjb21wb25lbnRzIGFuZCB0aGVpciByZXNwZWN0aXZlIGNvbXBpbGUtdGltZSBzZXR0aW5ncy4gSXQncyB0aW1lIHRvIHNlZSB3aGF0IHRoaXMgS2NvbmZpZyBmaWxlIGhvbGRzIVxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTM2LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDE6NTcuODc4MjU3ODY1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY3MzAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9tcHRjcC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0XFxuICAgMjpcXHRjb25maWcgTVBUQ1BcXG4gICAzOlxcdFxcdGJvb2wgXFxcIk1QVENQOiBNdWx0aXBhdGggVENQXFxcIlxcbiAgIDQ6XFx0XFx0ZGVwZW5kcyBvbiBJTkVUXFxuICAgNTpcXHRcXHRzZWxlY3QgU0tCX0VYVEVOU0lPTlNcXG4gICA2OlxcdFxcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NlxcbiAgIDc6XFx0XFx0c2VsZWN0IENSWVBUT19MSUJfVVRJTFNcXG4gICA4OlxcdFxcdGhlbHBcXG4gICA5OlxcdFxcdCAgTXVsdGlwYXRoIFRDUCAoTVBUQ1ApIGNvbm5lY3Rpb25zIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBvdmVyIG11bHRpcGxlXFxuICAxMDpcXHRcXHQgIHN1YmZsb3dzIGluIG9yZGVyIHRvIHV0aWxpemUgbXVsdGlwbGUgbmV0d29yayBwYXRocy4gRWFjaCBzdWJmbG93XFxuICAxMTpcXHRcXHQgIHVzZXMgdGhlIFRDUCBwcm90b2NvbCwgYW5kIFRDUCBvcHRpb25zIGNhcnJ5IGhlYWRlciBpbmZvcm1hdGlvbiBmb3JcXG4gIDEyOlxcdFxcdCAgTVBUQ1AuXFxuICAxMzpcXHRcXG4gIDE0OlxcdGlmIE1QVENQXFxuICAxNTpcXHRcXG4gIDE2OlxcdGNvbmZpZyBJTkVUX01QVENQX0RJQUdcXG4gIDE3OlxcdFxcdGRlcGVuZHMgb24gSU5FVF9ESUFHXFxuICAxODpcXHRcXHRkZWZfdHJpc3RhdGUgSU5FVF9ESUFHXFxuICAxOTpcXHRcXG4gIDIwOlxcdGNvbmZpZyBNUFRDUF9JUFY2XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQxOjU3Ljg3ODMyODEyNVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NjM2Mjg5OTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTVBUQ1AgQ29uZmlndXJhdGlvbiBDaGFuZ2UqKlxuXG5Pa2F5LCBzbyB0aGlzIG1vZGlmaWNhdGlvbiByZWFsbHkgaGluZ2VzIG9uIHRoZSBgSU5FVGAgc3RhbmRhcmQsIHdoaWNoIEkgYWxyZWFkeSB1bmRlcnN0YW5kLiBUaGUgY29yZSBvZiB0aGlzIHNlZW1zIHRvIGJlIGRyaXZlbiBieSBjaGFuZ2VzIHRvIGBNUFRDUGAgY29uZmlndXJhdGlvbiBvbmx5LiBJIGNhbiBpZ25vcmUgdGhlIG90aGVycyBmb3Igbm93LlxuXG5MZXQncyBkaWcgYSBiaXQgZGVlcGVyLiBJIHNlZSBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBpcyBzdGF0aWMsIHNvIHRoZSBjcml0aWNhbCBmdW5jdGlvbiBoZXJlIGlzIGBtcHRjcF9nZXRfb3B0aW9uc2AsIHdoaWNoIGNhbGxzIHRoZSBmb3JtZXIuIFRoZSByZWFsIG1lYXQgb2YgdGhlIGNoYW5nZSBpcyB3aXRoaW4gYG1wdGNwX3BhcnNlX29wdGlvbmAsIHdoaWNoIGlzIHVzZWQgYnkgYG1wdGNwX2dldF9vcHRpb25zYC5cblxuSXQgc2VlbXMgdGhpcyBwYXRjaCAqcmVzdHJpY3RzKiBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBNUFRDUCBvcHRpb25zLiBJbiBteSB2aWV3LCB0aGF0J3MgYSBjbGFzc2ljIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgZGlyZWN0bHkgaW1wYWN0cyBob3cgdGhlIG9wdGlvbnMgYXJlIHBhcnNlZCBhbmQgcHJvY2Vzc2VkLiBJdCdzIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nLlxuXG5HaXZlbiB0aGF0LCBJJ20gZ29pbmcgdG8gc2V0OlxuXG4qICAgYFdvcnRoRnV6emluZzogdHJ1ZWAgLSBiZWNhdXNlIHRoaXMgY2hhbmdlIGhhcyBkaXJlY3QgZnVuY3Rpb25hbCBpbXBsaWNhdGlvbnMuXG4qICAgYEZvY3VzU3ltYm9sczogW1wibXB0Y3BfZ2V0X29wdGlvbnNcIiwgXCJtcHRjcF9pbmNvbWluZ19vcHRpb25zXCJdYCAtIHNpbmNlIHRoZSBjaGFuZ2UgaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBwYXJzaW5nLCBJIHdhbnQgdG8ga2VlcCBhbiBleWUgb24gdGhlc2UgcGFyc2luZyBmdW5jdGlvbnMuXG4qICAgYEVuYWJsZUNvbmZpZ3M6IFtcIk1QVENQXCJdYCAtIHRvIGxpbWl0IG15IGZvY3VzIHRvIHRoZSBhZmZlY3RlZCBjb25maWd1cmF0aW9uLlxuKiAgIGBSZWFzb25pbmc6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBwYXJzaW5nIG9mIE1QVENQIG9wdGlvbnMsIHNwZWNpZmljYWxseSByZXN0cmljdGluZyB0aGUgY29tYmluYXRpb25zIG9mIERTUyBvcHRpb25zIHdpdGggb3RoZXIgb3B0aW9ucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIE1QVENQIG9wdGlvbiBwYXJzaW5nIGxvZ2ljLlwiYCAtIEkgbmVlZCB0byBqdXN0aWZ5IG15IGFwcHJvYWNoLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NjYwLCJPdXRwdXRUb2tlbnMiOjkxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjA2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MDMuNTE0NjIwMzFaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjAwNDEwMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTVBUQ1BcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtcHRjcF9nZXRfb3B0aW9uc1wiLFxuICAgIFwibXB0Y3BfaW5jb21pbmdfb3B0aW9uc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBwYXJzaW5nIG9mIE1QVENQIG9wdGlvbnMsIHNwZWNpZmljYWxseSByZXN0cmljdGluZyB0aGUgY29tYmluYXRpb25zIG9mIERTUyBvcHRpb25zIHdpdGggb3RoZXIgb3B0aW9ucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIE1QVENQIG9wdGlvbiBwYXJzaW5nIGxvZ2ljLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1QVENQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibXB0Y3BfZ2V0X29wdGlvbnNcIixcbiAgICBcIm1wdGNwX2luY29taW5nX29wdGlvbnNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgcGFyc2luZyBvZiBNUFRDUCBvcHRpb25zLCBzcGVjaWZpY2FsbHkgcmVzdHJpY3RpbmcgdGhlIGNvbWJpbmF0aW9ucyBvZiBEU1Mgb3B0aW9ucyB3aXRoIG90aGVyIG9wdGlvbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBNUFRDUCBvcHRpb24gcGFyc2luZyBsb2dpYy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MDMuNTkwNjMxNTAyWiIsIlNlcSI6MjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjk3NjU0NTk0NzUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MjowMy41OTExMzY0NzJaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MjI5NzY0OTQ4MTQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXN0cmljdHMgdGhlIHBhcnNpbmcgb2YgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9jZXNzZWQgaWYgY2VydGFpbiBvdGhlciBvcHRpb25zIChpbmNsdWRpbmcgYW5vdGhlciBgTVBUQ1BPUFRfRFNTYCkgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkLlxcblxcbkJlZm9yZSB0aGlzIHBhdGNoLCBpZiBhIFRDUCBwYWNrZXQgY29udGFpbmVkIG11bHRpcGxlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbnMsIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgdnVsbmVyYWJpbGl0eSBjb3VsZCBiZSB0cmlnZ2VyZWQuIFRoZSBgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgbXBfb3B0YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGZ1bmN0aW9ucyBsaWtlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zKClgLiBPbmx5IGl0cyBgc3RhdHVzYCBmaWVsZCAod2hpY2ggY29udGFpbnMgYml0ZmllbGRzIGxpa2UgYHVzZV9hY2tgIGFuZCBgdXNlX21hcGApIGlzIHplcm9lZCwgbGVhdmluZyBkYXRhIGZpZWxkcyBsaWtlIGBkYXRhX2Fja2AgYW5kIGBkYXRhX3NlcWAgdW5pbml0aWFsaXplZC5cXG5cXG5JZiBhIHZhbGlkIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiB3YXMgcGFyc2VkIGZpcnN0IChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMGApLCBpdCB3b3VsZCBzZXQgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGluIGBtcF9vcHQuc3Vib3B0aW9uc2AgYnV0IGxlYXZlIGBkYXRhX2Fja2AgdW5pbml0aWFsaXplZC4gSWYgYSBzZWNvbmQsIG1hbGZvcm1lZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gZm9sbG93ZWQgKGUuZy4sIHdpdGggYHVzZV9hY2sgPSAxYCBidXQgYW4gaW52YWxpZCBgb3BzaXplYCksIGBtcHRjcF9wYXJzZV9vcHRpb24oKWAgd291bGQgb3ZlcndyaXRlIHRoZSBiaXRmaWVsZCB0byBgdXNlX2FjayA9IDFgIGJ1dCBicmVhayBlYXJseSBiZWZvcmUgcG9wdWxhdGluZyB0aGUgYGRhdGFfYWNrYCBmaWVsZC5cXG5cXG5UaGUgY2FsbGVyIHdvdWxkIHRoZW4gc2VlIHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBzZXQgKGZyb20gdGhlIGZpcnN0IG9wdGlvbikgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5IGZyb20gYGRhdGFfYWNrYCAoZHVlIHRvIHRoZSBjb3JydXB0ZWQgYHVzZV9hY2sgPSAxYCBiaXRmaWVsZCBmcm9tIHRoZSBzZWNvbmQgb3B0aW9uKS4gVGhpcyB1bmluaXRpYWxpemVkIG1lbW9yeSB3b3VsZCB0aGVuIGJlIHVzZWQgaW4gY29udHJvbCBmbG93IChlLmcuLCB1cGRhdGluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIGBtc2stXFx1MDAzZXNuZF91bmFgIGluIGBhY2tfdXBkYXRlX21zaygpYCkgb3IgY29waWVkIGludG8gc2tiIGV4dGVuc2lvbnMuXFxuXFxuU3RhbmRhcmQgS0FTQU4gZG9lcyBub3QgZGV0ZWN0IHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2sgbWVtb3J5LiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gY2F0Y2ggdGhpcyBleGFjdCBjbGFzcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA1NTdmYjZlOTU4YjI1N2Q4Mjg1ZDI1OTQ3Y2MyNWVjNWE1NTIwMzY2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMTAgMTI6NDE6MjIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvbXB0Y3Avb3B0aW9ucy5jIGIvbmV0L21wdGNwL29wdGlvbnMuY1xuaW5kZXggYzY2NDAyM2QzN2JhOC4uN2VjMThmYTFiZWY2MyAxMDA2NDRcbi0tLSBhL25ldC9tcHRjcC9vcHRpb25zLmNcbisrKyBiL25ldC9tcHRjcC9vcHRpb25zLmNcbkBAIC0xNTMsNiArMTUzLDEzIEBAIHN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgTVBUQ1BPUFRfRFNTOlxuK1x0XHQvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqL1xuK1x0XHRpZiAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8XG4rXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8XG4rXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfUFJJTyB8XG4rXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApXG4rXHRcdFx0YnJlYWs7XG4rXG4gXHRcdHByX2RlYnVnKFwiRFNTXFxuXCIpO1xuIFx0XHRwdHIrKztcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjAzLjU5MTEzNzQyMloiLCJTZXEiOjIzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2NjQwNTY3ODg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFBhdGNoIFJlc3RyaWN0aW5nIERTUyBPcHRpb24gUGFyc2luZyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggaW4gYG5ldC9tcHRjcC9vcHRpb25zLmNgLiBJdCdzIHRvdWNoaW5nIHRoZSBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBmdW5jdGlvbiwgc3BlY2lmaWNhbGx5IGFkZGluZyBhIHJlc3RyaWN0aW9uIGZvciB0aGUgYE1QVENQT1BUX0RTU2AgY2FzZS4gVGhlIGFkZGVkIGNoZWNrIGlzIGZpbHRlcmluZyB3aGljaCBzdWJvcHRpb25zIGFyZSB2YWxpZCBhbG9uZ3NpZGUgRFNTLiBJdCBsb29rcyBsaWtlIGl04oCZcyBhbGxvd2luZyBEU1MgdG8gb25seSB3b3JrIHdpdGggdGhlIGBBRERfQUREUmAsIGBSTV9BRERSYCwgYFBSSU9gLCBhbmQgYEZBSUxgIHN1Ym9wdGlvbnMuIElmICphbnkqIG90aGVyIHN1Ym9wdGlvbiBpcyBzZXQsIHRoZSBzd2l0Y2gganVzdCBicmVha3MsIGFuZCBEU1MgcGFyc2luZyBpcyBza2lwcGVkLlxuXG5NeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgZG9lcyB0aGlzIGludHJvZHVjZSBhIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2U/IElmIHRoZSBEU1MgcGFyc2luZyBpcyBieXBhc3NlZCwgYXJlIHRoZXJlIGZpZWxkcyB3aXRoaW4gYG1wX29wdGAgdGhhdCBtaWdodCBub3QgZ2V0IHByb3Blcmx5IGluaXRpYWxpemVkPyBUaGF0J3MgYSBjbGFzc2ljIHNvdXJjZSBvZiBwcm9ibGVtcywgYW5kIHNvbWV0aGluZyBJIGFsd2F5cyBoYXZlIHRvIGJlIGNhcmVmdWwgYWJvdXQuXG5cblJpZ2h0LCBJIG5lZWQgdG8gcmVtaW5kIG15c2VsZiBob3cgdGhpcyB3aG9sZSB0aGluZyB3b3Jrcy4gYG1wdGNwX3BhcnNlX29wdGlvbmAgaXMgcGFyc2luZyBvcHRpb25zIGZyb20gYW4gYHNrYmAsIGFuZCBpdCB1c2VzIHRoZSBmdW5jdGlvbiB0byBwb3B1bGF0ZSB0aGUgYG1wX29wdGAgc3RydWN0dXJlLiBPa2F5LCBzbyBJIHNob3VsZCBiZSB0YWtpbmcgYSBjbG9zZXIgbG9vayBhdCBib3RoIGBtcHRjcF9wYXJzZV9vcHRpb25gIGFuZCB0aGUgYG1wX29wdGAgc3RydWN0dXJlIGRlZmluaXRpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBzdXBwb3NlZCB0byBiZSBpbml0aWFsaXplZCB3aGVuLCBhbmQgd2hhdCB0aGUgY29uc2VxdWVuY2VzIGFyZSBpZiBEU1MgcGFyc2luZyBkb2Vzbid0IGhhcHBlbiBpbiBhIHBhcnRpY3VsYXIgc2NlbmFyaW8uIEknbGwgbmVlZCB0byB0cmFjZSB0aGUgZGF0YSBmbG93IHRvIGJlIHN1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMTcsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyODMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MjoxMC4yMzE3MDgwMDZaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY3MzIwNTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1wdGNwX3BhcnNlX29wdGlvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmM9MTg9c3RhdGljIGJvb2wgbXB0Y3BfY2FwX2ZsYWdfc2hhMjU2KHU4IGZsYWdzKVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYy0yMi1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjIzOnN0YXRpYyB2b2lkIG1wdGNwX3BhcnNlX29wdGlvbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMjQtXFx0XFx0XFx0ICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IG9wc2l6ZSxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmM9MzY2PXZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAwLVxcdFxcdFxcdGlmIChvcGNvZGUgPT0gVENQT1BUX01QVENQKVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6NDAxOlxcdFxcdFxcdFxcdG1wdGNwX3BhcnNlX29wdGlvbihza2IsIHB0ciwgb3BzaXplLCBtcF9vcHQpO1xcbm5ldC9tcHRjcC9vcHRpb25zLmMtNDAyLVxcdFxcdFxcdHB0ciArPSBvcHNpemUgLSAyO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MjoxMC4yOTkwMzMxNzlaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjU2MTI4Mzg0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkFuYWx5emluZyBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFuZCBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBidXNpbmVzcy4gSSBpbW1lZGlhdGVseSByZWNvZ25pemUgdGhlc2UgYXMgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHRoZSBNUFRDUCBvcHRpb24gbmVnb3RpYXRpb24gYW5kIHBhcnNpbmcgcHJvY2Vzcy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgdGhlIGZsb3cuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSByZWxhdGUsIHNwZWNpZmljYWxseTpcblxuKiAgICoqYG1wdGNwX2dldF9vcHRpb25zYCoqOiBJcyB0aGlzIGEgdG9wLWxldmVsIGRpc3BhdGNoZXI/IERvZXMgaXQgYWN0IGFzIGFuIGVudHJ5IHBvaW50LCBwZXJoYXBzIGNhbGxlZCBkdXJpbmcgY29ubmVjdGlvbiBzZXR1cCBvciB3aGVuIHJlY2VpdmluZyBhbiBNUFRDUC1zcGVjaWZpYyBUQ1Agb3B0aW9uPyBNeSBpbW1lZGlhdGUgZ3Vlc3MgaXMgdGhpcyBpcyBsaWtlbHkgaW52b2tlZCB3aXRoaW4gdGhlIFRDUCBzdGFjayBvciBNUFRDUCBsYXllciB0byByZXRyaWV2ZSBhbmQgcHJlcGFyZSB0aGUgZGF0YSB3aXRoaW4gdGhlIG9wdGlvbiBmaWVsZC5cblxuKiAgICoqYG1wdGNwX3BhcnNlX29wdGlvbmAqKjogVGhpcyBpcyBkZWZpbml0ZWx5IHdoZXJlIHRoZSBoZWF2eSBsaWZ0aW5nIGhhcHBlbnMuIFRoaXMgaXMgdGhlIGRlY29kZXIuIEknbSBpbWFnaW5pbmcgYSBzd2l0Y2ggb3Igc2VyaWVzIG9mIGBpZi9lbHNlYCBzdGF0ZW1lbnRzIHRoYXQgY2hlY2sgdGhlIG9wdGlvbiBraW5kIGFuZCB0aGVuIHVucGFjayB0aGUgYXBwcm9wcmlhdGUgZGF0YSBzdHJ1Y3R1cmUuIEknbGwgbmVlZCB0byBsb29rIGF0IHRoZSBkZXRhaWxzIHdpdGhpbiB0aGUga2VybmVsLiBJIGNhbiBzdGFydCBieSB0aGlua2luZyBhYm91dCB3aGF0J3MgaW52b2x2ZWQgaW4gdGhpcyBmdW5jdGlvbi4gVGhpcyBpcyBtb3N0IGxpa2VseTogQ2hlY2tpbmcgb3B0aW9uIHR5cGUsIHBhcnNpbmcgaXRzIGNvbnRlbnQsIHZhbGlkYXRpbmcgaXRzIHNpemUsIGhhbmRsaW5nIGFueSBwb3RlbnRpYWwgZXJyb3JzIHRoYXQgbWF5IGFyaXNlLlxuXG5JJ2xsIGJlIGxvb2tpbmcgZm9yIHdoZXJlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLCBhbmQgaG93IHRoZXkgaW50ZXJhY3QuIEFyZSB0aGV5IHBhcnQgb2YgdGhlIFNZTi9TWU4tQUNLL0FDSyBoYW5kbGluZz8gQXJlIHRoZXkgY2FsbGVkIG9ubHkgZHVyaW5nIHRoZSBpbml0aWFsIGhhbmRzaGFrZSwgb3IgYXJlIHRoZXkgaW52b2tlZCBsYXRlciB0byBoYW5kbGUgbWlkLWNvbm5lY3Rpb24gbW9kaWZpY2F0aW9ucywgc3VjaCBhcyBhZGRpbmcgbmV3IHN1YmZsb3dzPyBXaGF0IHNvcnQgb2YgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB0aGV5IHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8/XG5cbkknbGwgYWxzbyBoYXZlIHRvIGtlZXAgaW4gbWluZCBwb3NzaWJsZSBzZWN1cml0eSBpbXBsaWNhdGlvbnMgYW5kIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgd2l0aGluIHRoaXMgb3B0aW9uIHByb2Nlc3NpbmcuIEFyZSB0aGVyZSBhbnkgZWRnZSBjYXNlcyBvciB1bnVzdWFsIHBheWxvYWRzIHRoYXQgY291bGQgbGVhZCB0byBidWZmZXIgb3ZlcmZsb3dzIG9yIGRlbmlhbC1vZi1zZXJ2aWNlPyBUaW1lIHRvIGRpZyBpbiFcblxuXG4iLCJJbnB1dFRva2VucyI6Mjg5NCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjE2Ljg2MDMxODg2OVoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDA2OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNjYsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzY2OlxcdHZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gMzY3OlxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxcbiAzNjg6XFx0e1xcbiAzNjk6XFx0XFx0Y29uc3Qgc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7XFxuIDM3MDpcXHRcXHRjb25zdCB1bnNpZ25lZCBjaGFyICpwdHI7XFxuIDM3MTpcXHRcXHRpbnQgbGVuZ3RoO1xcbiAzNzI6XFx0XFxuIDM3MzpcXHRcXHQvKiBFbnN1cmUgdGhhdCBjYXN0aW5nIHRoZSB3aG9sZSBzdGF0dXMgdG8gdTMyIGlzIGVmZmljaWVudCBhbmQgc2FmZSAqL1xcbiAzNzQ6XFx0XFx0QlVJTERfQlVHX09OKHNpemVvZl9maWVsZChzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCwgc3RhdHVzKSAhPSBzaXplb2YodTMyKSk7XFxuIDM3NTpcXHRcXHRCVUlMRF9CVUdfT04oIUlTX0FMSUdORUQob2Zmc2V0b2Yoc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQsIHN0YXR1cyksXFxuIDM3NjpcXHRcXHRcXHRcXHRcXHQgc2l6ZW9mKHUzMikpKTtcXG4gMzc3OlxcdFxcdCoodTMyICopXFx1MDAyNm1wX29wdC1cXHUwMDNlc3RhdHVzID0gMDtcXG4gMzc4OlxcdFxcbiAzNzk6XFx0XFx0bGVuZ3RoID0gKHRoLVxcdTAwM2Vkb2ZmICogNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7XFxuIDM4MDpcXHRcXHRwdHIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSh0aCArIDEpO1xcbiAzODE6XFx0XFxuIDM4MjpcXHRcXHR3aGlsZSAobGVuZ3RoIFxcdTAwM2UgMCkge1xcbiAzODM6XFx0XFx0XFx0aW50IG9wY29kZSA9ICpwdHIrKztcXG4gMzg0OlxcdFxcdFxcdGludCBvcHNpemU7XFxuIDM4NTpcXHRcXG4gMzg2OlxcdFxcdFxcdHN3aXRjaCAob3Bjb2RlKSB7XFxuIDM4NzpcXHRcXHRcXHRjYXNlIFRDUE9QVF9FT0w6XFxuIDM4ODpcXHRcXHRcXHRcXHRyZXR1cm47XFxuIDM4OTpcXHRcXHRcXHRjYXNlIFRDUE9QVF9OT1A6XFx0LyogUmVmOiBSRkMgNzkzIHNlY3Rpb24gMy4xICovXFxuIDM5MDpcXHRcXHRcXHRcXHRsZW5ndGgtLTtcXG4gMzkxOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAzOTI6XFx0XFx0XFx0ZGVmYXVsdDpcXG4gMzkzOlxcdFxcdFxcdFxcdGlmIChsZW5ndGggXFx1MDAzYyAyKVxcbiAzOTQ6XFx0XFx0XFx0XFx0XFx0cmV0dXJuO1xcbiAzOTU6XFx0XFx0XFx0XFx0b3BzaXplID0gKnB0cisrO1xcbiAzOTY6XFx0XFx0XFx0XFx0aWYgKG9wc2l6ZSBcXHUwMDNjIDIpIC8qIFxcXCJzaWxseSBvcHRpb25zXFxcIiAqL1xcbiAzOTc6XFx0XFx0XFx0XFx0XFx0cmV0dXJuO1xcbiAzOTg6XFx0XFx0XFx0XFx0aWYgKG9wc2l6ZSBcXHUwMDNlIGxlbmd0aClcXG4gMzk5OlxcdFxcdFxcdFxcdFxcdHJldHVybjtcXHQvKiBkb24ndCBwYXJzZSBwYXJ0aWFsIG9wdGlvbnMgKi9cXG4gNDAwOlxcdFxcdFxcdFxcdGlmIChvcGNvZGUgPT0gVENQT1BUX01QVENQKVxcbiA0MDE6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcGFyc2Vfb3B0aW9uKHNrYiwgcHRyLCBvcHNpemUsIG1wX29wdCk7XFxuIDQwMjpcXHRcXHRcXHRcXHRwdHIgKz0gb3BzaXplIC0gMjtcXG4gNDAzOlxcdFxcdFxcdFxcdGxlbmd0aCAtPSBvcHNpemU7XFxuIDQwNDpcXHRcXHRcXHR9XFxuIDQwNTpcXHRcXHR9XFxuIDQwNjpcXHR9XFxuIDQwNzpcXHRcXG4gNDA4OlxcdGJvb2wgbXB0Y3Bfc3luX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiA0MDk6XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgc3RydWN0IG1wdGNwX291dF9vcHRpb25zICpvcHRzKVxcbiA0MTA6XFx0e1xcbiA0MTE6XFx0XFx0c3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyA9IG1wdGNwX3N1YmZsb3dfY3R4KHNrKTtcXG4gNDEyOlxcdFxcbiA0MTM6XFx0XFx0Lyogd2Ugd2lsbCB1c2Ugc25kX2lzbiB0byBkZXRlY3QgZmlyc3QgcGt0IFtyZV10cmFuc21pc3Npb25cXG4gNDE0OlxcdFxcdCAqIGluIG1wdGNwX2VzdGFibGlzaGVkX29wdGlvbnNfbXAoKVxcbiA0MTU6XFx0XFx0ICovXFxuIDQxNjpcXHRcXHRzdWJmbG93LVxcdTAwM2VzbmRfaXNuID0gVENQX1NLQl9DQihza2IpLVxcdTAwM2VlbmRfc2VxO1xcbiA0MTc6XFx0XFx0aWYgKHN1YmZsb3ctXFx1MDAzZXJlcXVlc3RfbXB0Y3ApIHtcXG4gNDE4OlxcdFxcdFxcdGlmICh1bmxpa2VseShzdWJmbG93X3NpbXVsdGFuZW91c19jb25uZWN0KHNrKSkpIHtcXG4gNDE5OlxcdFxcdFxcdFxcdFdBUk5fT05fT05DRSghbXB0Y3BfdHJ5X2ZhbGxiYWNrKHNrLCBNUFRDUF9NSUJfU0lNVUxUQ09OTkZBTExCQUNLKSk7XFxuIDQyMDpcXHRcXG4gNDIxOlxcdFxcdFxcdFxcdC8qIEVuc3VyZSBtcHRjcF9maW5pc2hfY29ubmVjdCgpIHdpbGwgbm90IHByb2Nlc3MgdGhlXFxuIDQyMjpcXHRcXHRcXHRcXHQgKiBNUEMgaGFuZHNoYWtlLlxcbiA0MjM6XFx0XFx0XFx0XFx0ICovXFxuIDQyNDpcXHRcXHRcXHRcXHRzdWJmbG93LVxcdTAwM2VyZXF1ZXN0X21wdGNwID0gMDtcXG4gNDI1OlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNDI2OlxcdFxcdFxcdH1cXG4gNDI3OlxcdFxcbiA0Mjg6XFx0XFx0XFx0b3B0cy1cXHUwMDNlc3Vib3B0aW9ucyA9IE9QVElPTl9NUFRDUF9NUENfU1lOO1xcbiA0Mjk6XFx0XFx0XFx0b3B0cy1cXHUwMDNlY3N1bV9yZXFkID0gbXB0Y3BfaXNfY2hlY2tzdW1fZW5hYmxlZChzb2NrX25ldChzaykpO1xcbiA0MzA6XFx0XFx0XFx0b3B0cy1cXHUwMDNlYWxsb3dfam9pbl9pZDAgPSBtcHRjcF9hbGxvd19qb2luX2lkMChzb2NrX25ldChzaykpO1xcbiA0MzE6XFx0XFx0XFx0KnNpemUgPSBUQ1BPTEVOX01QVENQX01QQ19TWU47XFxuIDQzMjpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNDMzOlxcdFxcdH0gZWxzZSBpZiAoc3ViZmxvdy1cXHUwMDNlcmVxdWVzdF9qb2luKSB7XFxuIDQzNDpcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVtb3RlX3Rva2VuPSV1LCBub25jZT0ldVxcXFxuXFxcIiwgc3ViZmxvdy1cXHUwMDNlcmVtb3RlX3Rva2VuLFxcbiA0MzU6XFx0XFx0XFx0XFx0IHN1YmZsb3ctXFx1MDAzZWxvY2FsX25vbmNlKTtcXG4gNDM2OlxcdFxcdFxcdG9wdHMtXFx1MDAzZXN1Ym9wdGlvbnMgPSBPUFRJT05fTVBUQ1BfTVBKX1NZTjtcXG4gNDM3OlxcdFxcdFxcdG9wdHMtXFx1MDAzZWpvaW5faWQgPSBzdWJmbG93LVxcdTAwM2Vsb2NhbF9pZDtcXG4gNDM4OlxcdFxcdFxcdG9wdHMtXFx1MDAzZXRva2VuID0gc3ViZmxvdy1cXHUwMDNlcmVtb3RlX3Rva2VuO1xcbiA0Mzk6XFx0XFx0XFx0b3B0cy1cXHUwMDNlbm9uY2UgPSBzdWJmbG93LVxcdTAwM2Vsb2NhbF9ub25jZTtcXG4gNDQwOlxcdFxcdFxcdG9wdHMtXFx1MDAzZWJhY2t1cCA9IHN1YmZsb3ctXFx1MDAzZXJlcXVlc3RfYmt1cDtcXG4gNDQxOlxcdFxcdFxcdCpzaXplID0gVENQT0xFTl9NUFRDUF9NUEpfU1lOO1xcbiA0NDI6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDQ0MzpcXHRcXHR9XFxuIDQ0NDpcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDQ0NTpcXHR9XFxuIDQ0NjpcXHRcXG4gNDQ3OlxcdHN0YXRpYyB2b2lkIGNsZWFyXzNyZGFja19yZXRyYW5zbWlzc2lvbihzdHJ1Y3Qgc29jayAqc2spXFxuIDQ0ODpcXHR7XFxuIDQ0OTpcXHRcXHRzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7XFxuIDQ1MDpcXHRcXG4gNDUxOlxcdFxcdHNrX3N0b3BfdGltZXIoc2ssIFxcdTAwMjZpY3NrLVxcdTAwM2VpY3NrX2RlbGFja190aW1lcik7XFxuIDQ1MjpcXHRcXHRpY3NrLVxcdTAwM2VpY3NrX2Fjay5hdG8gPSAwO1xcbiA0NTM6XFx0XFx0aWNzay1cXHUwMDNlaWNza19hY2sucGVuZGluZyBcXHUwMDI2PSB+KElDU0tfQUNLX1NDSEVEIHwgSUNTS19BQ0tfVElNRVIpO1xcbiA0NTQ6XFx0fVxcbiA0NTU6XFx0XFxuIDQ1NjpcXHRzdGF0aWMgYm9vbCBtcHRjcF9lc3RhYmxpc2hlZF9vcHRpb25zX21wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gNDU3OlxcdFxcdFxcdFxcdFxcdFxcdCBib29sIHNuZF9kYXRhX2Zpbl9lbmFibGUsIGludCAqc2l6ZSxcXG4gNDU4OlxcdFxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbXB0Y3Bfb3V0X29wdGlvbnMgKm9wdHMpXFxuIDQ1OTpcXHR7XFxuIDQ2MDpcXHRcXHRzdHJ1Y3QgbXB0Y3Bfc3ViZmxvd19jb250ZXh0ICpzdWJmbG93ID0gbXB0Y3Bfc3ViZmxvd19jdHgoc2spO1xcbiA0NjE6XFx0XFx0c3RydWN0IG1wdGNwX3NvY2sgKm1zayA9IG1wdGNwX3NrKHN1YmZsb3ctXFx1MDAzZWNvbm4pO1xcbiA0NjI6XFx0XFx0c3RydWN0IG1wdGNwX2V4dCAqbXBleHQ7XFxuIDQ2MzpcXHRcXHR1bnNpZ25lZCBpbnQgZGF0YV9sZW47XFxuIDQ2NDpcXHRcXHR1OCBsZW47XFxuIDQ2NTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MTYuODYwNDYxMDk5WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4OTUzODM4OTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW5uZXIgbW9ub2xvZ3VlOlxuXG4qKk1QVENQIE9wdGlvbiBIYW5kbGluZzogQSBRdWljayBNZW50YWwgQ2hlY2sqKlxuXG5SaWdodCwgYG1wdGNwX2dldF9vcHRpb25zYCBpcyBzdGFydGluZyBieSB6ZXJvaW5nIG91dCBgbXBfb3B0LVx1MDAzZXN0YXR1c2AuIFRoYXQncyBzdGFuZGFyZCBwcmFjdGljZSwgYSBnb29kIGluaXRpYWwgY2xlYXJpbmcgb2YgdGhlIHNsYXRlIGJlZm9yZSB3ZSBkaXZlIGludG8gcGFyc2luZyBhbnl0aGluZy4gSXQncyBhIGZ1bmRhbWVudGFsIGRlZmVuc2l2ZSBwcm9ncmFtbWluZyBtb3ZlIOKAkyBlbnN1cmluZyBhIGNsZWFuIHN0YXRlIGFuZCBwcmV2ZW50aW5nIHVuZXhwZWN0ZWQgY2Fycnktb3ZlciB2YWx1ZXMgZnJvbSBwcmV2aW91cyBvcGVyYXRpb25zLiBNYWtlcyBwZXJmZWN0IHNlbnNlLlxuXG5Ob3csIGxldCBtZSBqdXN0IGJyaW5nIHVwIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZGAgaW4gbXkgaGVhZC4uLiB5ZWFoLCBva2F5LCBnb3QgaXQuIFRoaXMgc3RydWN0IGlzIHdoZXJlIGFsbCB0aGUgaW5jb21pbmcgTVBUQ1Agb3B0aW9uIGRhdGEgaXMgc3RvcmVkLCBjYXRlZ29yaXplZCwgYW5kIG1hbmFnZWQuIEknbSBtZW50YWxseSByZXZpZXdpbmcgaXRzIG1lbWJlcnMg4oCTIHRoZSBmbGFncywgdGhlIGFkZHJlc3NlcywgdGhlIGNhcGFiaWxpdGllcy4gQSBxdWljayByZWZyZXNoIG9uIHdoYXQgZmllbGRzIGFyZSByZWxldmFudCB0byB0aGUgY3VycmVudCBvcHRpb24gbmVnb3RpYXRpb24gaXMgYWx3YXlzIGJlbmVmaWNpYWwuIE5lZWQgdG8gc3RheSBzaGFycCB0byBhZGRyZXNzIHN1YnRsZSBudWFuY2VzIGluIHRoZSBtZXNzYWdlLiBOb3csIEkgY2FuIGNvbnRpbnVlIHdpdGggY29uZmlkZW5jZSFcblxuXG4iLCJJbnB1dFRva2VucyI6NTAzMCwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MjAuNzU1ODQ4MzA2WiIsIlNlcSI6MjgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMDEzODU3NjI4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIFxcXFx7XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbXB0Y3AvcHJvdG9jb2wuaD0xMzg9c3RhdGljIGlubGluZSBib29sIGJlZm9yZTY0KF9fdTY0IHNlcTEsIF9fdTY0IHNlcTIpXFxuLS1cXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC0xNDQtXFxubmV0L21wdGNwL3Byb3RvY29sLmg6MTQ1OnN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIHtcXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC0xNDYtXFx0dTY0XFx0c25kcl9rZXk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjIzLjc2OTcxMTA4NFoiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjMwNTgxNDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkncmUgbXkgb3duOlxuXG4qKkFuYWx5emluZyB0aGUgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBTdHJ1Y3R1cmUqKlxuXG5BbHJpZ2h0LCBsZXQncyBwdWxsIHVwIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZGAuIEkndmUgc2VlbiB0aGlzIGJlZm9yZSwgb2YgY291cnNlLCBidXQgaXQncyBhbHdheXMgZ29vZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgc3BlY2lmaWNzLCBlc3BlY2lhbGx5IHdoZW4gY29uc2lkZXJpbmcgZWRnZSBjYXNlcy4gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIGhvdyBNdWx0aXBhdGggVENQIChNUFRDUCkgaGFuZGxlcyBvcHRpb24gbmVnb3RpYXRpb24gb24gYSByZWNlaXZlZCBwYWNrZXQsIHNvIEkgbmVlZCBhIHNvbGlkIHVuZGVyc3RhbmRpbmcgb2YgZWFjaCBmaWVsZCBhbmQgaXRzIGltcGxpY2F0aW9ucy5cblxuSSdsbCBiZSBsb29raW5nIGNsb3NlbHkgYXQgdGhlIGJpdGZpZWxkcywgdGhlIHNpemUgb2YgZWFjaCBtZW1iZXIsIGFuZCB3aGF0IGVhY2ggZmllbGQgc2lnbmlmaWVzIGluIHRoZSBNUFRDUCBwcm90b2NvbC4gSSdsbCBuZWVkIHRvIGtub3cgdGhpcyBsaWtlIHRoZSBiYWNrIG9mIG15IGhhbmQuIEkgd2lsbCBhbmFseXplIHRoZSBzdHJ1Y3R1cmUsIGFuZCBpdCBpcyBjcnVjaWFsIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGN1cnJlbnQgTVBUQ1AgaW1wbGVtZW50YXRpb24uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBpbmZvcm0gbXkgd29yaywgYW5kIGlzIGVzc2VudGlhbCBmb3IgaW1wbGVtZW50aW5nIG5ldyBmZWF0dXJlcyBvciBkZWJ1Z2dpbmcgZXhpc3Rpbmcgb25lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6NTQxMywiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjI3LjQwMDI5NTYwOFoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTk1ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL3Byb3RvY29sLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMTQ1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTQ1OlxcdHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIHtcXG4gMTQ2OlxcdFxcdHU2NFxcdHNuZHJfa2V5O1xcbiAxNDc6XFx0XFx0dTY0XFx0cmN2cl9rZXk7XFxuIDE0ODpcXHRcXHR1NjRcXHRkYXRhX2FjaztcXG4gMTQ5OlxcdFxcdHU2NFxcdGRhdGFfc2VxO1xcbiAxNTA6XFx0XFx0dTMyXFx0c3ViZmxvd19zZXE7XFxuIDE1MTpcXHRcXHR1MTZcXHRkYXRhX2xlbjtcXG4gMTUyOlxcdFxcdF9fc3VtMTZcXHRjc3VtO1xcbiAxNTM6XFx0XFx0c3RydWN0X2dyb3VwKHN0YXR1cyxcXG4gMTU0OlxcdFxcdFxcdHUxNiBzdWJvcHRpb25zO1xcbiAxNTU6XFx0XFx0XFx0dTE2IHVzZV9tYXA6MSxcXG4gMTU2OlxcdFxcdFxcdCAgICBkc242NDoxLFxcbiAxNTc6XFx0XFx0XFx0ICAgIGRhdGFfZmluOjEsXFxuIDE1ODpcXHRcXHRcXHQgICAgdXNlX2FjazoxLFxcbiAxNTk6XFx0XFx0XFx0ICAgIGFjazY0OjEsXFxuIDE2MDpcXHRcXHRcXHQgICAgbXBjX21hcDoxLFxcbiAxNjE6XFx0XFx0XFx0ICAgIHJlc2V0X3JlYXNvbjo0LFxcbiAxNjI6XFx0XFx0XFx0ICAgIHJlc2V0X3RyYW5zaWVudDoxLFxcbiAxNjM6XFx0XFx0XFx0ICAgIGVjaG86MSxcXG4gMTY0OlxcdFxcdFxcdCAgICBiYWNrdXA6MSxcXG4gMTY1OlxcdFxcdFxcdCAgICBkZW55X2pvaW5faWQwOjEsXFxuIDE2NjpcXHRcXHRcXHQgICAgX191bnVzZWQ6MjtcXG4gMTY3OlxcdFxcdCk7XFxuIDE2ODpcXHRcXHR1OFxcdGpvaW5faWQ7XFxuIDE2OTpcXHRcXHR1MzJcXHR0b2tlbjtcXG4gMTcwOlxcdFxcdHUzMlxcdG5vbmNlO1xcbiAxNzE6XFx0XFx0dTY0XFx0dGhtYWM7XFxuIDE3MjpcXHRcXHR1OFxcdGhtYWNbTVBUQ1BPUFRfSE1BQ19MRU5dO1xcbiAxNzM6XFx0XFx0c3RydWN0IG1wdGNwX2FkZHJfaW5mbyBhZGRyO1xcbiAxNzQ6XFx0XFx0c3RydWN0IG1wdGNwX3JtX2xpc3Qgcm1fbGlzdDtcXG4gMTc1OlxcdFxcdHU2NFxcdGFobWFjO1xcbiAxNzY6XFx0XFx0dTY0XFx0ZmFpbF9zZXE7XFxuIDE3NzpcXHR9O1xcbiAxNzg6XFx0XFxuIDE3OTpcXHRzdGF0aWMgaW5saW5lIF9fYmUzMiBtcHRjcF9vcHRpb24odTggc3Vib3B0LCB1OCBsZW4sIHU4IG5pYiwgdTggZmllbGQpXFxuIDE4MDpcXHR7XFxuIDE4MTpcXHRcXHRyZXR1cm4gaHRvbmwoKFRDUE9QVF9NUFRDUCBcXHUwMDNjXFx1MDAzYyAyNCkgfCAobGVuIFxcdTAwM2NcXHUwMDNjIDE2KSB8IChzdWJvcHQgXFx1MDAzY1xcdTAwM2MgMTIpIHxcXG4gMTgyOlxcdFxcdFxcdCAgICAgKChuaWIgXFx1MDAyNiAweEYpIFxcdTAwM2NcXHUwMDNjIDgpIHwgZmllbGQpO1xcbiAxODM6XFx0fVxcbiAxODQ6XFx0XFxuIDE4NTpcXHRlbnVtIG1wdGNwX3BtX3N0YXR1cyB7XFxuIDE4NjpcXHRcXHRNUFRDUF9QTV9BRERfQUREUl9SRUNFSVZFRCxcXG4gMTg3OlxcdFxcdE1QVENQX1BNX0FERF9BRERSX1NFTkRfQUNLLFxcbiAxODg6XFx0XFx0TVBUQ1BfUE1fUk1fQUREUl9SRUNFSVZFRCxcXG4gMTg5OlxcdFxcdE1QVENQX1BNX0VTVEFCTElTSEVELFxcbiAxOTA6XFx0XFx0TVBUQ1BfUE1fU1VCRkxPV19FU1RBQkxJU0hFRCxcXG4gMTkxOlxcdFxcdE1QVENQX1BNX0FMUkVBRFlfRVNUQUJMSVNIRUQsXFx0LyogcGVyc2lzdGVudCBzdGF0dXMsIHNldCBhZnRlciBFU1RBQkxJU0hFRCBldmVudCAqL1xcbiAxOTI6XFx0XFx0TVBUQ1BfUE1fTVBDX0VORFBPSU5UX0FDQ09VTlRFRCAvKiBwZXJzaXN0ZW50IHN0YXR1cywgc2V0IGFmdGVyIE1QQyBsb2NhbCBhZGRyZXNzIGlzXFxuIDE5MzpcXHRcXHRcXHRcXHRcXHRcXHQgKiBhY2NvdW50ZWQgaW50IGlkX2F2YWlsX2JpdG1hcFxcbiAxOTQ6XFx0XFx0XFx0XFx0XFx0XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQyOjI3LjQwMDUxODgxOVoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NDU2MzgyNDE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBQYXJzaW5nIExvZ2ljKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgbXB0Y3BfZ2V0X29wdGlvbnNgIGZ1bmN0aW9uLCBhbmQgaXQgemVyb2VzIG91dCBgbXBfb3B0LVx1MDAzZXN0YXR1c2AsIHdoaWNoIGluY2x1ZGVzIHRoZSBgc3Vib3B0aW9uc2AgZmllbGQgYW5kIGJpdGZpZWxkcy4gVGhlbiwgdGhpcyBwYXRjaCBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBjYXVnaHQgbXkgZXllLiBTcGVjaWZpY2FsbHksIHRoZSBEU1MgY2FzZS4gSXQgY2hlY2tzIGlmIGBtcF9vcHQtXHUwMDNlc3Vib3B0aW9uc2AgaGFzIGFueSBiaXRzIHNldCBvdGhlciB0aGFuIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBgT1BUSU9OX01QVENQX1BSSU9gLCBvciBgT1BUSU9OX01QVENQX0ZBSUxgLiBJZiBpdCBkb2VzLCBpdCBqdXN0IGJyZWFrcyBvdXQgb2YgdGhlIGBzd2l0Y2hgIHN0YXRlbWVudCwgd2hpY2ggc2VlbXMuLi5vZGQuXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMsIFwiSGFuZyBvbiwgd291bGRuJ3QgYG1wX29wdC1cdTAwM2VzdWJvcHRpb25zYCBuZWVkIHRvIGJlIHplcm8gaW4gdGhlIGZpcnN0IHBsYWNlIGZvciB0aGlzIGNoZWNrIHRvIHdvcms/XCIgQnV0IHRoZW4gSSByZW1lbWJlcmVkLCBgbXB0Y3BfZ2V0X29wdGlvbnNgICpkb2VzKiB6ZXJvIGl0IG91dCByaWdodCBhdCB0aGUgc3RhcnQ6IGAqKHUzMiAqKVx1MDAyNm1wX29wdC1cdTAwM2VzdGF0dXMgPSAwO2AuIFNvLCB0aGF0IGJpdCB3b3Jrcy5cblxuQnV0IG5vdyBJJ20gc2VlaW5nIGEgcG90ZW50aWFsIGZsYXcuIElmIGBtcHRjcF9wYXJzZV9vcHRpb25gIGJyZWFrcyBiZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIGl0ICp3b24ndCogc2V0IGBPUFRJT05fTVBUQ1BfRFNTYCBpbiBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgLiBBbmQgY3JpdGljYWxseSwgaXQgd29uJ3QgcG9wdWxhdGUgYWxsIHRoZSBvdGhlciBmaWVsZHMgcmVsYXRlZCB0byB0aGUgRFNTIG9wdGlvbiBsaWtlIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGBkYXRhX2xlbmAsIGFuZCBgY3N1bWAuIFNvLCB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyBnb2luZyB0byBjaGVjayBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgIGFuZCBzZWUgdGhhdCBgT1BUSU9OX01QVENQX0RTU2AgaXNuJ3Qgc2V0LiBFZmZlY3RpdmVseSwgdGhlIERTUyBvcHRpb24gd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLiBJcyB0aGlzIGJ5IGRlc2lnbiBvciBhIHN1YnRsZSBidWc/XG5cbkFoLCByaWdodCwgYG1wX29wdGAgaXMgdHlwaWNhbGx5IGEgbG9jYWwgdmFyaWFibGUsIGxpa2UgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkYCwgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gVGhlIGNvbnNlcXVlbmNlcyBvZiB0aGUgZGVzY3JpYmVkIGxvZ2ljIGNvdWxkIGJlIGludGVyZXN0aW5nLiBJJ2QgYmV0dGVyIGRvdWJsZS1jaGVjayB0aGUgY2FsbGVycyBvZiBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFuZCBmb2xsb3cgdGhlIGZsb3cgdG8gc2VlIGhvdyB0aGlzIERTUyBpbmZvcm1hdGlvbiBpcyBiZWluZyBoYW5kbGVkIGZ1cnRoZXIgdXBzdHJlYW0uIFRoaXMgbG9va3MgbGlrZSBhIHBvdGVudGlhbCBhcmVhIGZvciBmdXJ0aGVyIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY0NzgsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MjozNC44NTY5MDM2NjZaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NTYwMTQ4OTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibXB0Y3BfZ2V0X29wdGlvbnNcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L21wdGNwL29wdGlvbnMuYz0yMz1zdGF0aWMgdm9pZCBtcHRjcF9wYXJzZV9vcHRpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMzY1LVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6MzY2OnZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG5uZXQvbXB0Y3Avb3B0aW9ucy5jLTM2Ny1cXHRcXHQgICAgICAgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgKm1wX29wdClcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmM9MTE0MD1ib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbi0tXFxubmV0L21wdGNwL29wdGlvbnMuYy0xMTY2LVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6MTE2NzpcXHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFxcdTAwMjZtcF9vcHQpO1xcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2OC1cXG4tLVxcbm5ldC9tcHRjcC9wcm90b2NvbC5oPTkxOD1zdHJ1Y3Qgc29jayAqbXB0Y3Bfc2tfY2xvbmVfaW5pdChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC05MjEtXFx0XFx0XFx0XFx0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7XFxubmV0L21wdGNwL3Byb3RvY29sLmg6OTIyOnZvaWQgbXB0Y3BfZ2V0X29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaC05MjMtXFx0XFx0ICAgICAgIHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpO1xcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYz0xNDc9c3RhdGljIGludCBzdWJmbG93X2NoZWNrX3JlcShzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsXFxuLS1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTE2Ny1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jOjE2ODpcXHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFxcdTAwMjZtcF9vcHQpO1xcbm5ldC9tcHRjcC9zdWJmbG93LmMtMTY5LVxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYz0yNjU9aW50IG1wdGNwX3N1YmZsb3dfaW5pdF9jb29raWVfcmVxKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSxcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmMtMjc1LVxcdHN1YmZsb3dfaW5pdF9yZXEocmVxLCBza19saXN0ZW5lcik7XFxubmV0L21wdGNwL3N1YmZsb3cuYzoyNzY6XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTI3Ny1cXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9NTI2PXN0YXRpYyB2b2lkIHN1YmZsb3dfZmluaXNoX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy01NDQtXFxubmV0L21wdGNwL3N1YmZsb3cuYzo1NDU6XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTU0Ni1cXHRpZiAoc3ViZmxvdy1cXHUwMDNlcmVxdWVzdF9tcHRjcCkge1xcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYz04MDY9c3RhdGljIHN0cnVjdCBzb2NrICpzdWJmbG93X3N5bl9yZWN2X3NvY2soY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy04NDYtXFx0XFx0ICovXFxubmV0L21wdGNwL3N1YmZsb3cuYzo4NDc6XFx0XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg0OC1cXHRcXHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2XFxuLS1cXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg1Mi1cXHR9IGVsc2UgaWYgKHN1YmZsb3dfcmVxLVxcdTAwM2VtcF9qb2luKSB7XFxubmV0L21wdGNwL3N1YmZsb3cuYzo4NTM6XFx0XFx0bXB0Y3BfZ2V0X29wdGlvbnMoc2tiLCBcXHUwMDI2bXBfb3B0KTtcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTg1NC1cXHRcXHRpZiAoIShtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9NUEpfQUNLKSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6MzcuNDEyOTI2NDUyWiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxOTU1OTQwNDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2Agc2l0dWF0aW9uLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBzZWUgd2hhdCdzIGFjdHVhbGx5ICppbiogdGhpcyB0aGluZy4gV2hhdCdzIHRoZSBjb250ZXh0PyBJcyBpdCByZWxhdGVkIHRvIHRoZSBjb3JlIE1QLVRDUCBuZWdvdGlhdGlvbiBvciBtb3JlIGRvd25zdHJlYW0/IFdoYXQga2luZCBvZiBvcHRpb25zIGFyZSB3ZSB0YWxraW5nIGFib3V0IGhlcmU/IEkgbmVlZCB0byBxdWlja2x5IGRldGVybWluZSBpZiB3ZSdyZSBsb29raW5nIGF0IHN0YW5kYXJkIE1QLVRDUCBvcHRpb25zIGxpa2UgYE1QX0NBUEFCTEVgLCBgTVBfSk9JTmAsIGV0Yy4sIG9yIHNvbWV0aGluZyBtb3JlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHRoYXQgbWlnaHQgYmUgZmxvd2luZyB0aHJvdWdoIHRoZSBNUFRDUCBsYXllci4gSSBpbW1lZGlhdGVseSB0aGluayBhYm91dCBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uLiBJcyB0aGVyZSBhIGRlZmluZWQgc3RydWN0dXJlPyBBcmUgdGhlcmUgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3Mgb3Igb3RoZXIgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIEkgc2hvdWxkIGJlIGxvb2tpbmcgZm9yPyBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGNvdWxkIGJlIGNydWNpYWwgZm9yIG92ZXJhbGwgc3lzdGVtIHN0YWJpbGl0eSBhbmQgcGVyZm9ybWFuY2Ugc28gSSBhbSBpbnRlcmVzdGVkIGluIGxvb2tpbmcgYXQgdGhlIGRldGFpbHMuIFdlIHNob3VsZCBjaGVjayB0aGlzIHRob3JvdWdobHkuIExldCdzIHN0YXJ0IGRpZ2dpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjgyNTYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0Mjo0MS42MDg1MjM3ODdaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM4NDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTE0MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTE0MDpcXHRib29sIG1wdGNwX2luY29taW5nX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjExNDE6XFx0e1xcbjExNDI6XFx0XFx0c3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyA9IG1wdGNwX3N1YmZsb3dfY3R4KHNrKTtcXG4xMTQzOlxcdFxcdHN0cnVjdCBtcHRjcF9zb2NrICptc2sgPSBtcHRjcF9zayhzdWJmbG93LVxcdTAwM2Vjb25uKTtcXG4xMTQ0OlxcdFxcdHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtcXG4xMTQ1OlxcdFxcdHN0cnVjdCBtcHRjcF9leHQgKm1wZXh0O1xcbjExNDY6XFx0XFxuMTE0NzpcXHRcXHRpZiAoX19tcHRjcF9jaGVja19mYWxsYmFjayhtc2spKSB7XFxuMTE0ODpcXHRcXHRcXHQvKiBLZWVwIGl0IHNpbXBsZSBhbmQgdW5jb25kaXRpb25hbGx5IHRyaWdnZXIgc2VuZCBkYXRhIGNsZWFudXAgYW5kXFxuMTE0OTpcXHRcXHRcXHQgKiBwZW5kaW5nIHF1ZXVlIHNwb29saW5nLiBXZSB3aWxsIG5lZWQgdG8gYWNxdWlyZSB0aGUgZGF0YSBsb2NrXFxuMTE1MDpcXHRcXHRcXHQgKiBmb3IgbW9yZSBhY2N1cmF0ZSBjaGVja3MsIGFuZCBvbmNlIHRoZSBsb2NrIGlzIGFjcXVpcmVkLCBzdWNoXFxuMTE1MTpcXHRcXHRcXHQgKiBoZWxwZXJzIGFyZSBjaGVhcC5cXG4xMTUyOlxcdFxcdFxcdCAqL1xcbjExNTM6XFx0XFx0XFx0bXB0Y3BfZGF0YV9sb2NrKHN1YmZsb3ctXFx1MDAzZWNvbm4pO1xcbjExNTQ6XFx0XFx0XFx0aWYgKHNrX3N0cmVhbV9tZW1vcnlfZnJlZShzaykpXFxuMTE1NTpcXHRcXHRcXHRcXHRfX21wdGNwX2NoZWNrX3B1c2goc3ViZmxvdy1cXHUwMDNlY29ubiwgc2spO1xcbjExNTY6XFx0XFxuMTE1NzpcXHRcXHRcXHQvKiBvbiBmYWxsYmFjayB3ZSBqdXN0IG5lZWQgdG8gaWdub3JlIHRoZSBtc2stbGV2ZWwgc25kX3VuYSwgYXNcXG4xMTU4OlxcdFxcdFxcdCAqIHRoaXMgaXMgcmVhbGx5IHBsYWluIFRDUFxcbjExNTk6XFx0XFx0XFx0ICovXFxuMTE2MDpcXHRcXHRcXHRfX21wdGNwX3NuZF91bmFfdXBkYXRlKG1zaywgUkVBRF9PTkNFKG1zay1cXHUwMDNlc25kX254dCkpO1xcbjExNjE6XFx0XFxuMTE2MjpcXHRcXHRcXHRfX21wdGNwX2RhdGFfYWNrZWQoc3ViZmxvdy1cXHUwMDNlY29ubik7XFxuMTE2MzpcXHRcXHRcXHRtcHRjcF9kYXRhX3VubG9jayhzdWJmbG93LVxcdTAwM2Vjb25uKTtcXG4xMTY0OlxcdFxcdFxcdHJldHVybiB0cnVlO1xcbjExNjU6XFx0XFx0fVxcbjExNjY6XFx0XFxuMTE2NzpcXHRcXHRtcHRjcF9nZXRfb3B0aW9ucyhza2IsIFxcdTAwMjZtcF9vcHQpO1xcbjExNjg6XFx0XFxuMTE2OTpcXHRcXHQvKiBUaGUgc3ViZmxvdyBjYW4gYmUgaW4gY2xvc2Ugc3RhdGUgb25seSBpZiBjaGVja19mdWxseV9lc3RhYmxpc2hlZCgpXFxuMTE3MDpcXHRcXHQgKiBqdXN0IHNlbnQgYSByZXNldC4gSWYgc28sIHRlbGwgdGhlIGNhbGxlciB0byBpZ25vcmUgdGhlIGN1cnJlbnQgcGFja2V0LlxcbjExNzE6XFx0XFx0ICovXFxuMTE3MjpcXHRcXHRpZiAoIWNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkKG1zaywgc2ssIHN1YmZsb3csIHNrYiwgXFx1MDAyNm1wX29wdCkpXFxuMTE3MzpcXHRcXHRcXHRyZXR1cm4gc2stXFx1MDAzZXNrX3N0YXRlICE9IFRDUF9DTE9TRTtcXG4xMTc0OlxcdFxcbjExNzU6XFx0XFx0aWYgKHVubGlrZWx5KG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1MpKSB7XFxuMTE3NjpcXHRcXHRcXHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0ZBU1RDTE9TRSkgXFx1MDAyNlxcdTAwMjZcXG4xMTc3OlxcdFxcdFxcdCAgICBSRUFEX09OQ0UobXNrLVxcdTAwM2Vsb2NhbF9rZXkpID09IG1wX29wdC5yY3ZyX2tleSkge1xcbjExNzg6XFx0XFx0XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXJjdl9mYXN0Y2xvc2UsIHRydWUpO1xcbjExNzk6XFx0XFx0XFx0XFx0bXB0Y3Bfc2NoZWR1bGVfd29yaygoc3RydWN0IHNvY2sgKiltc2spO1xcbjExODA6XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX01QRkFTVENMT1NFUlgpO1xcbjExODE6XFx0XFx0XFx0fVxcbjExODI6XFx0XFxuMTE4MzpcXHRcXHRcXHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0FERF9BRERSKSBcXHUwMDI2XFx1MDAyNlxcbjExODQ6XFx0XFx0XFx0ICAgIGFkZF9hZGRyX2htYWNfdmFsaWQobXNrLCBcXHUwMDI2bXBfb3B0KSkge1xcbjExODU6XFx0XFx0XFx0XFx0aWYgKCFtcF9vcHQuZWNobykge1xcbjExODY6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcG1fYWRkX2FkZHJfcmVjZWl2ZWQoc2ssIFxcdTAwMjZtcF9vcHQuYWRkcik7XFxuMTE4NzpcXHRcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfQUREQUREUik7XFxuMTE4ODpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbjExODk6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcG1fYWRkX2FkZHJfZWNob2VkKG1zaywgXFx1MDAyNm1wX29wdC5hZGRyKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6NDEuNjA4NzczMjU3WiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgyNDIxMDIxNzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFBvdGVudGlhbCBVbmluaXRpYWxpemVkIE1lbW9yeSBpbiBNUFRDUCBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEluIHRoZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgZnVuY3Rpb24sIGBtcF9vcHRgLCB0aGUgc3RydWN0IGhvbGRpbmcgdGhlIHJlY2VpdmVkIE1QVENQIG9wdGlvbnMsIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suIE15IGltbWVkaWF0ZSBjb25jZXJuPyBJdCdzICpub3QqIGluaXRpYWxpemVkLiBOb3csIGBtcHRjcF9nZXRfb3B0aW9uc2AgZG9lcyB6ZXJvIG91dCBgbXBfb3B0LnN0YXR1c2AsIGluY2x1ZGluZyB0aGUgYHN1Ym9wdGlvbnNgIGZpZWxkLCB3aGljaCBpcyBnb29kLiBCdXQgd2FpdOKApiBpdCAqb25seSogemVyb3MgYHN0YXR1c2AhIEl0IHVzZXMgYSByYXRoZXIgY3J1ZGUgY2FzdCB0byBhIHUzMiBwb2ludGVyIHRvIGFjaGlldmUgdGhpcy5cblxuVGhlIHJlYWwgcHJvYmxlbSBsaWVzIGluIGhvdyB0aGUgY29kZSBoYW5kbGVzIGBNUFRDUE9QVF9EU1NgLiBgbXB0Y3BfZ2V0X29wdGlvbnNgIHRoZW4gcHJvY2VlZHMgdG8gcGFyc2UgdGhlc2Ugb3B0aW9ucy4gSWYgaXQgZW5jb3VudGVycyBhIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiwgaXQgc2V0cyBgT1BUSU9OX01QVENQX0RTU2AgaW4gYG1wX29wdC5zdWJvcHRpb25zYCBhbmQgcG9wdWxhdGVzIHRoZSByZWxldmFudCBkYXRhIGZpZWxkcyDigJMgYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgZXRjLlxuXG5UaGUgY3JpdGljYWwgdGhpbmcsIHRoZSBuZXcgY2hlY2sgaW4gYG1wdGNwX3BhcnNlX29wdGlvbmAsIGlzIHdoYXQgbWFrZXMgdGhpcyByZWFsbHkgdHJpY2t5LiBJZiwgYW5kIHRoaXMgaXMgdGhlIGNydXgsIHRoZSBwYXJzaW5nIG9mIGBNUFRDUE9QVF9EU1NgIGJyZWFrcyBvdXQgZHVlIHRvIHRoaXMgbmV3LCByZXN0cmljdGl2ZSBjaGVjay4uLlxuXG5gYGBjXG5cdGNhc2UgTVBUQ1BPUFRfRFNTOlxuXHRcdC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG5cdFx0aWYgKChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfFxuXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8XG5cdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9QUklPIHxcblx0XHRcdFx0XHQgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKVxuXHRcdFx0YnJlYWs7XG5gYGBcblxuLi4udGhlbiBgT1BUSU9OX01QVENQX0RTU2AgKmlzIG5vdCogc2V0IGluIGBtcF9vcHQuc3Vib3B0aW9uc2AuIFRoYXQgaXMsIGlmIHRoZSBEU1Mgb3B0aW9uIGlzIHByZXNlbnQgYWxvbmcgd2l0aCBvdGhlciBkaXNhbGxvd2VkIG9wdGlvbnMsIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBub3Qgc2V0LlxuXG5UaGUgY29kZSB0aGVuIGNoZWNrczpcblxuYGBgY1xuXHRpZiAodW5saWtlbHkobXBfb3B0LnN1Ym9wdGlvbnMgIT0gT1BUSU9OX01QVENQX0RTUykpIHtcbmBgYFxuXG5TbywgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbid0IHNldCwgdGhpcyBgaWZgIGNvbmRpdGlvbiB3aWxsIGJlIHRydWUsIG1lYW5pbmcgd2UgZW50ZXIgdGhpcyBibG9jayBvZiBjb2RlLlxuXG5IZXJlJ3Mgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZyDigJMgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzbid0IHNldCwgYXJlIHdlIHJlYWRpbmcgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeT8gSSBuZWVkIHRvIHZlcmlmeSB3aGF0IGZpZWxkcyBhcmUgcmVhZCB3aXRoaW4gdGhhdCBcInVubGlrZWx5XCIgYmxvY2suIFRoYXQncyB3aGVyZSB0aGUgcG90ZW50aWFsIGxpZXMgZm9yIGEgc2VyaW91cyB2dWxuZXJhYmlsaXR5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDY5LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDE5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6NDkuODUwODc4MTEzWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3ODA2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNzUsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNzU6XFx0XFx0aWYgKHVubGlrZWx5KG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1MpKSB7XFxuMTE3NjpcXHRcXHRcXHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0ZBU1RDTE9TRSkgXFx1MDAyNlxcdTAwMjZcXG4xMTc3OlxcdFxcdFxcdCAgICBSRUFEX09OQ0UobXNrLVxcdTAwM2Vsb2NhbF9rZXkpID09IG1wX29wdC5yY3ZyX2tleSkge1xcbjExNzg6XFx0XFx0XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXJjdl9mYXN0Y2xvc2UsIHRydWUpO1xcbjExNzk6XFx0XFx0XFx0XFx0bXB0Y3Bfc2NoZWR1bGVfd29yaygoc3RydWN0IHNvY2sgKiltc2spO1xcbjExODA6XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX01QRkFTVENMT1NFUlgpO1xcbjExODE6XFx0XFx0XFx0fVxcbjExODI6XFx0XFxuMTE4MzpcXHRcXHRcXHRpZiAoKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0FERF9BRERSKSBcXHUwMDI2XFx1MDAyNlxcbjExODQ6XFx0XFx0XFx0ICAgIGFkZF9hZGRyX2htYWNfdmFsaWQobXNrLCBcXHUwMDI2bXBfb3B0KSkge1xcbjExODU6XFx0XFx0XFx0XFx0aWYgKCFtcF9vcHQuZWNobykge1xcbjExODY6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcG1fYWRkX2FkZHJfcmVjZWl2ZWQoc2ssIFxcdTAwMjZtcF9vcHQuYWRkcik7XFxuMTE4NzpcXHRcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfQUREQUREUik7XFxuMTE4ODpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbjExODk6XFx0XFx0XFx0XFx0XFx0bXB0Y3BfcG1fYWRkX2FkZHJfZWNob2VkKG1zaywgXFx1MDAyNm1wX29wdC5hZGRyKTtcXG4xMTkwOlxcdFxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9FQ0hPQUREKTtcXG4xMTkxOlxcdFxcdFxcdFxcdH1cXG4xMTkyOlxcdFxcbjExOTM6XFx0XFx0XFx0XFx0aWYgKG1wX29wdC5hZGRyLnBvcnQpXFxuMTE5NDpcXHRcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfUE9SVEFERCk7XFxuMTE5NTpcXHRcXHRcXHR9XFxuMTE5NjpcXHRcXG4xMTk3OlxcdFxcdFxcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9STV9BRERSKVxcbjExOTg6XFx0XFx0XFx0XFx0bXB0Y3BfcG1fcm1fYWRkcl9yZWNlaXZlZChtc2ssIFxcdTAwMjZtcF9vcHQucm1fbGlzdCk7XFxuMTE5OTpcXHRcXG4xMjAwOlxcdFxcdFxcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9QUklPKSB7XFxuMTIwMTpcXHRcXHRcXHRcXHRtcHRjcF9wbV9tcF9wcmlvX3JlY2VpdmVkKHNrLCBtcF9vcHQuYmFja3VwKTtcXG4xMjAyOlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFBSSU9SWCk7XFxuMTIwMzpcXHRcXHRcXHR9XFxuMTIwNDpcXHRcXG4xMjA1OlxcdFxcdFxcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9GQUlMKSB7XFxuMTIwNjpcXHRcXHRcXHRcXHRtcHRjcF9wbV9tcF9mYWlsX3JlY2VpdmVkKHNrLCBtcF9vcHQuZmFpbF9zZXEpO1xcbjEyMDc6XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX01QRkFJTFJYKTtcXG4xMjA4OlxcdFxcdFxcdH1cXG4xMjA5OlxcdFxcbjEyMTA6XFx0XFx0XFx0aWYgKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX1JTVCkge1xcbjEyMTE6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfc2VlbiA9IDE7XFxuMTIxMjpcXHRcXHRcXHRcXHRzdWJmbG93LVxcdTAwM2VyZXNldF9yZWFzb24gPSBtcF9vcHQucmVzZXRfcmVhc29uO1xcbjEyMTM6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfdHJhbnNpZW50ID0gbXBfb3B0LnJlc2V0X3RyYW5zaWVudDtcXG4xMjE0OlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFJTVFJYKTtcXG4xMjE1OlxcdFxcdFxcdH1cXG4xMjE2OlxcdFxcbjEyMTc6XFx0XFx0XFx0aWYgKCEobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfRFNTKSlcXG4xMjE4OlxcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbjEyMTk6XFx0XFx0fVxcbjEyMjA6XFx0XFxuMTIyMTpcXHRcXHQvKiB3ZSBjYW4ndCB3YWl0IGZvciByZWN2bXNnKCkgdG8gdXBkYXRlIHRoZSBhY2tfc2VxLCBvdGhlcndpc2VcXG4xMjIyOlxcdFxcdCAqIG1vbm9kaXJlY3Rpb25hbCBmbG93cyB3aWxsIHN0dWNrXFxuMTIyMzpcXHRcXHQgKi9cXG4xMjI0OlxcdFxcdGlmIChtcF9vcHQudXNlX2FjaylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDI6NDkuODUxMDU3NzgzWiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMTMzMTI5MjQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgT3B0aW9uIEhhbmRsaW5nIExvZ2ljKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIGNvZGUgYW5kIG15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRoaXM6IElmIGBPUFRJT05fTVBUQ1BfRFNTYCBpc24ndCBzZXQsIHRoZW4gaXQgY2hlY2tzIGEgYnVuY2ggb2Ygb3RoZXIgb3B0aW9ucywgbGlrZSBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAsIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBhbmQgc28gb24uIEluIGVhY2ggb2YgdGhlc2UgY2FzZXMsIGl0J3MgcmVhZGluZyBmaWVsZHMgZnJvbSBgbXBfb3B0YCDigJMgYHJjdnJfa2V5YCwgYGFkZHJgLCBgcm1fbGlzdGAsIGV0Yy4g4oCTICphZnRlciogYXNzdW1pbmcgYG1wdGNwX3BhcnNlX29wdGlvbmAgaGFzIGFscmVhZHkgcG9wdWxhdGVkIHRoZW0sIHdoaWNoIGlzIHRoZSBrZXkgaGVyZS5cblxuVGhlbiBjb21lcyB0aGlzIGNvbmRpdGlvbmFsOiBpZiBgIShtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTUylgIHdoaWNoIG1lYW5zIFwiaWYgRFNTIGlzbid0IHNldCwgcmV0dXJuIHRydWVcIiBhbmQganVzdCBzdG9wcy4gV2FpdC4uLiB0aGF0IGxvb2tzIHN1c3BpY2lvdXMsIGJlY2F1c2UgaWYgRFNTICppc24ndCogc2V0LCBpdCAqaW1tZWRpYXRlbHkqIHJldHVybnMgd2l0aG91dCB0b3VjaGluZyB0aGUgRFNTIGZpZWxkcywgYXMgaXQgc2hvdWxkLlxuXG5CdXQsIGlmIGBPUFRJT05fTVBUQ1BfRFNTYCAqaXMqIHNldCwgdGhlbiBpdCBnb2VzIG9uIHRvIHJlYWQgYSB3aG9sZSBidW5jaCBvZiBEU1Mtc3BlY2lmaWMgZmllbGRzIGxpa2UgYHVzZV9hY2tgLCBgZGF0YV9hY2tgLCBgZGF0YV9zZXFgLCBldGMuIEFnYWluLCB0aGUgYXNzdW1wdGlvbiBpcyB0aGF0IGBtcHRjcF9wYXJzZV9vcHRpb25gIHBvcHVsYXRlZCB0aG9zZSBmaWVsZHMuIEkgbmVlZCB0byBiZSBzdXJlIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIHRob3NlIGZpZWxkcyBhcmUgcG9wdWxhdGVkIGhvbGRzIHRydWUuXG5cbk5vdywgSSByZW1lbWJlciBzZWVpbmcgc29tZXRoaW5nIGFib3V0IHRoZSBgTVBUQ1BPUFRfRFNTYCBjYXNlIGluIHRoZSBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBmdW5jdGlvbi4gQWgsIGhlcmUgaXQgaXM6IHRoZSBwYXRjaCBpbmNsdWRlcyBhIGNvbnN0cmFpbnQ6IGlmIGBtcF9vcHQtXHUwMDNlc3Vib3B0aW9uc2AgaGFzIGFueSBvcHRpb24gKm90aGVyIHRoYW4qIGBPUFRJT05fTVBUQ1BfQUREX0FERFJgLCBgT1BUSU9OX01QVENQX1JNX0FERFJgLCBgT1BUSU9OX01QVENQX1BSSU9gLCBvciBgT1BUSU9OX01QVENQX0ZBSUxgIHNldCwgdGhlbiBpdCBicmVha3Mgb3V0LiBUaGF0IG1lYW5zLCBpbnNpZGUgdGhlIERTUyBjYXNlIGluIHRoZSBwYXJzZXIsIGlmIGFueXRoaW5nIGVsc2UsICpsaWtlKiBgT1BUSU9OX01QVENQX0ZBU1RDTE9TRWAgaXMgc2V0LCB0aGUgcGFyc2VyIGp1c3QgYmFpbHMgb3V0LiBUaGlzIGlzIGdvb2QgYmVjYXVzZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2Agd2lsbCByZXR1cm4gYHRydWVgIGF0IGxpbmUgMTIxOC5cblxuU28sICppZiogYW55IG9mIHRob3NlIG90aGVyIG9wdGlvbiBiaXRzICphcmUqIHNldCBhbG9uZyB3aXRoIERTUywgdGhlIERTUyBwYXJzaW5nICp3b24ndCogaGFwcGVuLCBhbmQgdGhlIGNvZGUgd29uJ3QgcmVhZCBhbnkgdW5pbml0aWFsaXplZCBEU1MgZmllbGRzLiBSaWdodD9cblxuT2theSwgc28gSSB0aGluayB0aGUgdnVsbmVyYWJsZSByZWFkIGlzIHByb3RlY3RlZCBieSB0aGUgYG1wdGNwX3BhcnNlX29wdGlvbmAgY29uc3RyYWludC5cblxuSnVzdCB0byBiZSBzdXJlLCBpcyB0aGVyZSBhbnkgb3RoZXIgbG9jYXRpb24gaW4gdGhpcyBjb2RlIHdoZXJlIGBtcF9vcHRgIGlzIHJlYWQ/IEl0IGlzIHdvcnRoIGNoZWNraW5nIHRoZSBjYWxsIHRvIGBjaGVja19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHNrLCBzdWJmbG93LCBza2IsIFx1MDAyNm1wX29wdClgLiBUaGF0J3MgdGhlIG5leHQgc3RlcC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MzUsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2NzYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0Mjo1OS45ODQxODkxNTRaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3Njg0MjIyMjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L21wdGNwL29wdGlvbnMuYz04OTA9Ym9vbCBtcHRjcF9zeW5hY2tfb3B0aW9ucyhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIHVuc2lnbmVkIGludCAqc2l6ZSxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtOTE4LVxcbm5ldC9tcHRjcC9vcHRpb25zLmM6OTE5OnN0YXRpYyBib29sIGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIHN0cnVjdCBzb2NrICpzc2ssXFxubmV0L21wdGNwL29wdGlvbnMuYy05MjAtXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKnN1YmZsb3csXFxuLS1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jPTExNDA9Ym9vbCBtcHRjcF9pbmNvbWluZ19vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE2OC1cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNjk6XFx0LyogVGhlIHN1YmZsb3cgY2FuIGJlIGluIGNsb3NlIHN0YXRlIG9ubHkgaWYgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE3MC1cXHQgKiBqdXN0IHNlbnQgYSByZXNldC4gSWYgc28sIHRlbGwgdGhlIGNhbGxlciB0byBpZ25vcmUgdGhlIGN1cnJlbnQgcGFja2V0Llxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE3MS1cXHQgKi9cXG5uZXQvbXB0Y3Avb3B0aW9ucy5jOjExNzI6XFx0aWYgKCFjaGVja19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHNrLCBzdWJmbG93LCBza2IsIFxcdTAwMjZtcF9vcHQpKVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtMTE3My1cXHRcXHRyZXR1cm4gc2stXFx1MDAzZXNrX3N0YXRlICE9IFRDUF9DTE9TRTtcXG4tLVxcbm5ldC9tcHRjcC9wbS5jPTYwNT12b2lkIG1wdGNwX3BtX2Z1bGx5X2VzdGFibGlzaGVkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIGNvbnN0IHN0cnVjdCBzb2NrICpzc2spXFxuLS1cXG5uZXQvbXB0Y3AvcG0uYy02MTQtXFx0LyogbXB0Y3BfcG1fZnVsbHlfZXN0YWJsaXNoZWQoKSBjYW4gYmUgaW52b2tlZCBieSBtdWx0aXBsZVxcbm5ldC9tcHRjcC9wbS5jOjYxNTpcXHQgKiByYWNpbmcgcGF0aHMgLSBhY2NlcHQoKSBhbmQgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoKVxcbm5ldC9tcHRjcC9wbS5jLTYxNi1cXHQgKiBiZSBzdXJlIHRvIHNlcnZlIHRoaXMgZXZlbnQgb25seSBvbmNlLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MzowMi43NTI2MTgxNThaIiwiU2VxIjozOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUzODYxNTkyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgSSdtIHJlYWR5LiBIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIHRoZXNlIGFyZSBteSB0aG91Z2h0cywga2VlcGluZyBpbiBtaW5kIEknbSBkZWFsaW5nIHdpdGggYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkV4YW1pbmluZyBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoZSBsb2dpYyBvZiBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IgaW4gZGV0YWlsLiBJJ20gaW1tZWRpYXRlbHkgZm9jdXNpbmcgb24gd2hhdCB0aGUgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gdmFsaWRhdGUgYW5kIHVuZGVyIHdoYXQgY29uZGl0aW9ucy4gV2hhdCBkYXRhIGlzIGl0IGNvbnN1bWluZyBhbmQgd2hhdCBpcyB0aGUgZXhwZWN0ZWQgb3V0Y29tZSBiYXNlZCBvbiB0aGF0IGlucHV0PyBJIG5lZWQgdG8gdGhpbmsgdGhyb3VnaCBhbnkgZWRnZSBjYXNlcyBhbmQgcG90ZW50aWFsIGZhaWx1cmUgc2NlbmFyaW9zIHRoZSBmdW5jdGlvbiBtaWdodCBoYW5kbGUuIEFyZSB0aGVyZSBhbnkgaW1wbGljaXQgYXNzdW1wdGlvbnMgYmFrZWQgaW50byB0aGlzIGxvZ2ljIHRoYXQgSSBuZWVkIHRvIHN1cmZhY2U/IEknbSBhbHJlYWR5IGFudGljaXBhdGluZyBwb3RlbnRpYWwgZGVidWdnaW5nIHN0ZXBzIHNob3VsZCBJIGhhdmUgdG8gYW5hbHl6ZSBhIGRvd25zdHJlYW0gZXJyb3Igd2hlcmUgaXQgcGxheXMgYSByb2xlLiBJJ20gZ29pbmcgdG8gY2FyZWZ1bGx5IHJlYWQgZXZlcnkgbGluZSBvZiB0aGlzIGZ1bmN0aW9uLCB0YWtpbmcgdGhlIHRpbWUgdG8gcGFyc2UgZWFjaCBjb21wb25lbnQgZm9yIHRoZSBwdXJwb3NlIG9mIGlkZW50aWZ5aW5nIGFueSBwb3NzaWJsZSBnYXBzIG9yIGluY29uc2lzdGVuY2llcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMyMTEsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MzowNi4yOTEyMzg1NzJaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgxODMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTE5LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgOTE5OlxcdHN0YXRpYyBib29sIGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIHN0cnVjdCBzb2NrICpzc2ssXFxuIDkyMDpcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyxcXG4gOTIxOlxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiA5MjI6XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpXFxuIDkyMzpcXHR7XFxuIDkyNDpcXHRcXHQvKiBoZXJlIHdlIGNhbiBwcm9jZXNzIE9vTywgaW4td2luZG93IHBrdHMsIG9ubHkgaW4tc2VxdWVuY2UgNHRoIGFja1xcbiA5MjU6XFx0XFx0ICogd2lsbCBtYWtlIHRoZSBzdWJmbG93IGZ1bGx5IGVzdGFibGlzaGVkXFxuIDkyNjpcXHRcXHQgKi9cXG4gOTI3OlxcdFxcdGlmIChsaWtlbHkoUkVBRF9PTkNFKHN1YmZsb3ctXFx1MDAzZWZ1bGx5X2VzdGFibGlzaGVkKSkpIHtcXG4gOTI4OlxcdFxcdFxcdC8qIG9uIHBhc3NpdmUgc29ja2V0cywgY2hlY2sgZm9yIDNyZCBhY2sgcmV0cmFuc21pc3Npb25cXG4gOTI5OlxcdFxcdFxcdCAqIG5vdGUgdGhhdCBtc2sgaXMgYWx3YXlzIHNldCBieSBzdWJmbG93X3N5bl9yZWN2X3NvY2soKVxcbiA5MzA6XFx0XFx0XFx0ICogZm9yIG1wX2pvaW4gc3ViZmxvd3NcXG4gOTMxOlxcdFxcdFxcdCAqL1xcbiA5MzI6XFx0XFx0XFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cXHUwMDNlc2VxID09IHN1YmZsb3ctXFx1MDAzZXNzbl9vZmZzZXQgKyAxIFxcdTAwMjZcXHUwMDI2XFxuIDkzMzpcXHRcXHRcXHQgICAgVENQX1NLQl9DQihza2IpLVxcdTAwM2VlbmRfc2VxID09IFRDUF9TS0JfQ0Ioc2tiKS1cXHUwMDNlc2VxIFxcdTAwMjZcXHUwMDI2XFxuIDkzNDpcXHRcXHRcXHQgICAgc3ViZmxvdy1cXHUwMDNlbXBfam9pbiBcXHUwMDI2XFx1MDAyNiAobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OU19NUFRDUF9NUEopIFxcdTAwMjZcXHUwMDI2XFxuIDkzNTpcXHRcXHRcXHQgICAgIXN1YmZsb3ctXFx1MDAzZXJlcXVlc3Rfam9pbilcXG4gOTM2OlxcdFxcdFxcdFxcdHRjcF9zZW5kX2Fjayhzc2spO1xcbiA5Mzc6XFx0XFx0XFx0Z290byBjaGVja19ub3RpZnk7XFxuIDkzODpcXHRcXHR9XFxuIDkzOTpcXHRcXG4gOTQwOlxcdFxcdC8qIHdlIG11c3QgcHJvY2VzcyBPb08gcGFja2V0cyBiZWZvcmUgdGhlIGZpcnN0IHN1YmZsb3cgaXMgZnVsbHlcXG4gOTQxOlxcdFxcdCAqIGVzdGFibGlzaGVkLiBPb08gcGFja2V0cyBhcmUgaW5zdGVhZCBhIHByb3RvY29sIHZpb2xhdGlvblxcbiA5NDI6XFx0XFx0ICogZm9yIE1QX0pPSU4gc3ViZmxvd3MgYXMgdGhlIHBlZXIgbXVzdCBub3Qgc2VuZCBhbnkgZGF0YVxcbiA5NDM6XFx0XFx0ICogYmVmb3JlIHJlY2VpdmluZyB0aGUgZm9ydGggYWNrIC0gY2ZyLiBSRkMgODY4NCBzZWN0aW9uIDMuMi5cXG4gOTQ0OlxcdFxcdCAqL1xcbiA5NDU6XFx0XFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cXHUwMDNlc2VxICE9IHN1YmZsb3ctXFx1MDAzZXNzbl9vZmZzZXQgKyAxKSB7XFxuIDk0NjpcXHRcXHRcXHRpZiAoc3ViZmxvdy1cXHUwMDNlbXBfam9pbilcXG4gOTQ3OlxcdFxcdFxcdFxcdGdvdG8gcmVzZXQ7XFxuIDk0ODpcXHRcXHRcXHRpZiAoc3ViZmxvdy1cXHUwMDNlaXNfbXB0Zm8gXFx1MDAyNlxcdTAwMjYgbXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX01QQ19BQ0spXFxuIDk0OTpcXHRcXHRcXHRcXHRnb3RvIHNldF9mdWxseV9lc3RhYmxpc2hlZDtcXG4gOTUwOlxcdFxcdFxcdHJldHVybiBzdWJmbG93LVxcdTAwM2VtcF9jYXBhYmxlO1xcbiA5NTE6XFx0XFx0fVxcbiA5NTI6XFx0XFxuIDk1MzpcXHRcXHRpZiAoc3ViZmxvdy1cXHUwMDNlcmVtb3RlX2tleV92YWxpZCBcXHUwMDI2XFx1MDAyNlxcbiA5NTQ6XFx0XFx0ICAgICgoKG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9EU1MpIFxcdTAwMjZcXHUwMDI2IG1wX29wdC1cXHUwMDNldXNlX2FjaykgfHxcXG4gOTU1OlxcdFxcdCAgICAgKChtcF9vcHQtXFx1MDAzZXN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfQUREX0FERFIpIFxcdTAwMjZcXHUwMDI2XFxuIDk1NjpcXHRcXHQgICAgICAoIW1wX29wdC1cXHUwMDNlZWNobyB8fCBzdWJmbG93LVxcdTAwM2VtcF9qb2luKSkpKSB7XFxuIDk1NzpcXHRcXHRcXHQvKiBzdWJmbG93cyBhcmUgZnVsbHkgZXN0YWJsaXNoZWQgYXMgc29vbiBhcyB3ZSBnZXQgYW55XFxuIDk1ODpcXHRcXHRcXHQgKiBhZGRpdGlvbmFsIGFjaywgaW5jbHVkaW5nIEFERF9BRERSLlxcbiA5NTk6XFx0XFx0XFx0ICovXFxuIDk2MDpcXHRcXHRcXHRnb3RvIHNldF9mdWxseV9lc3RhYmxpc2hlZDtcXG4gOTYxOlxcdFxcdH1cXG4gOTYyOlxcdFxcbiA5NjM6XFx0XFx0LyogSWYgdGhlIGZpcnN0IGVzdGFibGlzaGVkIHBhY2tldCBkb2VzIG5vdCBjb250YWluIE1QX0NBUEFCTEUgKyBkYXRhXFxuIDk2NDpcXHRcXHQgKiB0aGVuIGZhbGxiYWNrIHRvIFRDUC4gRmFsbGJhY2sgc2NlbmFyaW9zIHJlcXVpcmVzIGEgcmVzZXQgZm9yXFxuIDk2NTpcXHRcXHQgKiBNUF9KT0lOIHN1YmZsb3dzLlxcbiA5NjY6XFx0XFx0ICovXFxuIDk2NzpcXHRcXHRpZiAoIShtcF9vcHQtXFx1MDAzZXN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05TX01QVENQX01QQykpIHtcXG4gOTY4OlxcdFxcdFxcdGlmIChzdWJmbG93LVxcdTAwM2VtcF9qb2luKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0MzowNi4yOTE0MjMzOTJaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTQ3MzU0OTExNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1QVENQIERTUyBPcHRpb24gSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBjaGVja19mdWxseV9lc3RhYmxpc2hlZGAgZnVuY3Rpb24uIEl0IHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2g7IGl0J3MgY2hlY2tpbmcgYG1wX29wdC1cdTAwM2VzdWJvcHRpb25zYC4gQW5kLCBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgc2V0IHdpdGhpbiB0aG9zZSBzdWJvcHRpb25zLCBpdCdzIGNoZWNraW5nIGBtcF9vcHQtXHUwMDNldXNlX2Fja2AuIFRoaXMgc2VlbXMgbG9naWNhbCwgYnV0IGl0IGltbWVkaWF0ZWx5IHJhaXNlcyBhIGNvbmNlcm46IGlmIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBwcmVzZW50LCBzaG91bGRuJ3QgYG1wdGNwX3BhcnNlX29wdGlvbmAgaGF2ZSAqZ3VhcmFudGVlZCogdGhhdCBgdXNlX2Fja2AgaXMgcG9wdWxhdGVkPyBUaGUgbG9naWMgc2VlbXMgdG8gcmVseSBvbiB0aGF0IGFzc3VtcHRpb24uXG5cblRoZW4sIHRoZSByZWQgZmxhZyB3ZW50IHVwLiBXaGF0IGlmIGBtcHRjcF9wYXJzZV9vcHRpb25gIGVuY291bnRlcnMgYSBtYWxmb3JtZWQgcGFja2V0IGNvbnRhaW5pbmcgYE1QVENQT1BUX0RTU2A/IElzIHRoZXJlIGFueSBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcgaW4gcGxhY2UgdG8gaGFuZGxlIHRoYXQgY2FzZT8gVGhpcyBjb3VsZCBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvciBvciwgd29yc2UsIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBpZiB0aGUgY29kZSBwcm9jZWVkcyB3aXRoIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgZGF0YS4gV2UgKmFic29sdXRlbHkqIGNhbid0IGxldCB0aGF0IGhhcHBlbi4gVGhlcmVmb3JlLCBJIG5lZWQgdG8gZGlnIGludG8gYG1wdGNwX3BhcnNlX29wdGlvbmAgdG8gdmVyaWZ5IHByZWNpc2VseSBob3cgaXQgaGFuZGxlcyB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGFuZCB0aGUgc3Vic2VxdWVudCBwb3B1bGF0aW9uIG9mIGB1c2VfYWNrYC4gSSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb2RlIGlzIHJvYnVzdCBhbmQgaGFuZGxlcyBpbnZhbGlkIGlucHV0IGdyYWNlZnVsbHkuIFRoaXMgbmVlZHMgdG8gYmUgY2hlY2tlZCwgcmlnaHQgbm93LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDM3MCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQzOjExLjc2NDk3NDY0NloiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjc4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNTUsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTU1OlxcdFxcdGNhc2UgTVBUQ1BPUFRfRFNTOlxcbiAxNTY6XFx0XFx0XFx0LyogQ2FuIGJlIHVzZWQgd2l0aCBhIHJlc3RyaWN0ZWQgbnVtYmVyIG9mIG90aGVyIG9wdGlvbnMgKi9cXG4gMTU3OlxcdFxcdFxcdGlmICgobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfFxcbiAxNTg6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcXG4gMTU5OlxcdFxcdFxcdFxcdFxcdFxcdCAgICBPUFRJT05fTVBUQ1BfUFJJTyB8XFxuIDE2MDpcXHRcXHRcXHRcXHRcXHRcXHQgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKVxcbiAxNjE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2MjpcXHRcXG4gMTYzOlxcdFxcdFxcdHByX2RlYnVnKFxcXCJEU1NcXFxcblxcXCIpO1xcbiAxNjQ6XFx0XFx0XFx0cHRyKys7XFxuIDE2NTpcXHRcXG4gMTY2OlxcdFxcdFxcdGZsYWdzID0gKCpwdHIrKykgXFx1MDAyNiBNUFRDUF9EU1NfRkxBR19NQVNLO1xcbiAxNjc6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2Vkc242NCA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19EU042NCkgIT0gMDtcXG4gMTY4OlxcdFxcdFxcdG1wX29wdC1cXHUwMDNldXNlX21hcCA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19IQVNfTUFQKSAhPSAwO1xcbiAxNjk6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VhY2s2NCA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19BQ0s2NCkgIT0gMDtcXG4gMTcwOlxcdFxcdFxcdG1wX29wdC1cXHUwMDNldXNlX2FjayA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19IQVNfQUNLKTtcXG4gMTcxOlxcdFxcbiAxNzI6XFx0XFx0XFx0ZXhwZWN0ZWRfb3BzaXplID0gVENQT0xFTl9NUFRDUF9EU1NfQkFTRTtcXG4gMTczOlxcdFxcbiAxNzQ6XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNldXNlX2Fjaykge1xcbiAxNzU6XFx0XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNlYWNrNjQpXFxuIDE3NjpcXHRcXHRcXHRcXHRcXHRleHBlY3RlZF9vcHNpemUgKz0gVENQT0xFTl9NUFRDUF9EU1NfQUNLNjQ7XFxuIDE3NzpcXHRcXHRcXHRcXHRlbHNlXFxuIDE3ODpcXHRcXHRcXHRcXHRcXHRleHBlY3RlZF9vcHNpemUgKz0gVENQT0xFTl9NUFRDUF9EU1NfQUNLMzI7XFxuIDE3OTpcXHRcXHRcXHR9XFxuIDE4MDpcXHRcXG4gMTgxOlxcdFxcdFxcdGlmIChtcF9vcHQtXFx1MDAzZXVzZV9tYXApIHtcXG4gMTgyOlxcdFxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZGF0YV9maW4gPSAoZmxhZ3MgXFx1MDAyNiBNUFRDUF9EU1NfREFUQV9GSU4pICE9IDA7XFxuIDE4MzpcXHRcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2Vkc242NClcXG4gMTg0OlxcdFxcdFxcdFxcdFxcdGV4cGVjdGVkX29wc2l6ZSArPSBUQ1BPTEVOX01QVENQX0RTU19NQVA2NDtcXG4gMTg1OlxcdFxcdFxcdFxcdGVsc2VcXG4gMTg2OlxcdFxcdFxcdFxcdFxcdGV4cGVjdGVkX29wc2l6ZSArPSBUQ1BPTEVOX01QVENQX0RTU19NQVAzMjtcXG4gMTg3OlxcdFxcdFxcdH1cXG4gMTg4OlxcdFxcbiAxODk6XFx0XFx0XFx0cHJfZGVidWcoXFxcImRhdGFfZmluPSVkIGRzbjY0PSVkIHVzZV9tYXA9JWQgYWNrNjQ9JWQgdXNlX2Fjaz0lZFxcXFxuXFxcIixcXG4gMTkwOlxcdFxcdFxcdFxcdCBtcF9vcHQtXFx1MDAzZWRhdGFfZmluLCBtcF9vcHQtXFx1MDAzZWRzbjY0LFxcbiAxOTE6XFx0XFx0XFx0XFx0IG1wX29wdC1cXHUwMDNldXNlX21hcCwgbXBfb3B0LVxcdTAwM2VhY2s2NCxcXG4gMTkyOlxcdFxcdFxcdFxcdCBtcF9vcHQtXFx1MDAzZXVzZV9hY2spO1xcbiAxOTM6XFx0XFxuIDE5NDpcXHRcXHRcXHQvKiBBbHdheXMgcGFyc2UgYW55IGNzdW0gcHJlc2VuY2UgY29tYmluYXRpb24sIHdlIHdpbGwgZW5mb3JjZVxcbiAxOTU6XFx0XFx0XFx0ICogUkZDIDg2ODQgU2VjdGlvbiAzLjMuMCBjaGVja3MgbGF0ZXIgaW4gc3ViZmxvd19kYXRhX3JlYWR5XFxuIDE5NjpcXHRcXHRcXHQgKi9cXG4gMTk3OlxcdFxcdFxcdGlmIChvcHNpemUgIT0gZXhwZWN0ZWRfb3BzaXplIFxcdTAwMjZcXHUwMDI2XFxuIDE5ODpcXHRcXHRcXHQgICAgb3BzaXplICE9IGV4cGVjdGVkX29wc2l6ZSArIFRDUE9MRU5fTVBUQ1BfRFNTX0NIRUNLU1VNKVxcbiAxOTk6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDIwMDpcXHRcXG4gMjAxOlxcdFxcdFxcdG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyB8PSBPUFRJT05fTVBUQ1BfRFNTO1xcbiAyMDI6XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNldXNlX2Fjaykge1xcbiAyMDM6XFx0XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNlYWNrNjQpIHtcXG4gMjA0OlxcdFxcdFxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZGF0YV9hY2sgPSBnZXRfdW5hbGlnbmVkX2JlNjQocHRyKTtcXG4gMjA1OlxcdFxcdFxcdFxcdFxcdHB0ciArPSA4O1xcbiAyMDY6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4gMjA3OlxcdFxcdFxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZGF0YV9hY2sgPSBnZXRfdW5hbGlnbmVkX2JlMzIocHRyKTtcXG4gMjA4OlxcdFxcdFxcdFxcdFxcdHB0ciArPSA0O1xcbiAyMDk6XFx0XFx0XFx0XFx0fVxcbiAyMTA6XFx0XFxuIDIxMTpcXHRcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwiZGF0YV9hY2s9JWxsdVxcXFxuXFxcIiwgbXBfb3B0LVxcdTAwM2VkYXRhX2Fjayk7XFxuIDIxMjpcXHRcXHRcXHR9XFxuIDIxMzpcXHRcXG4gMjE0OlxcdFxcdFxcdGlmIChtcF9vcHQtXFx1MDAzZXVzZV9tYXApIHtcXG4gMjE1OlxcdFxcdFxcdFxcdGlmIChtcF9vcHQtXFx1MDAzZWRzbjY0KSB7XFxuIDIxNjpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWRhdGFfc2VxID0gZ2V0X3VuYWxpZ25lZF9iZTY0KHB0cik7XFxuIDIxNzpcXHRcXHRcXHRcXHRcXHRwdHIgKz0gODtcXG4gMjE4OlxcdFxcdFxcdFxcdH0gZWxzZSB7XFxuIDIxOTpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWRhdGFfc2VxID0gZ2V0X3VuYWxpZ25lZF9iZTMyKHB0cik7XFxuIDIyMDpcXHRcXHRcXHRcXHRcXHRwdHIgKz0gNDtcXG4gMjIxOlxcdFxcdFxcdFxcdH1cXG4gMjIyOlxcdFxcbiAyMjM6XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VzdWJmbG93X3NlcSA9IGdldF91bmFsaWduZWRfYmUzMihwdHIpO1xcbiAyMjQ6XFx0XFx0XFx0XFx0cHRyICs9IDQ7XFxuIDIyNTpcXHRcXG4gMjI2OlxcdFxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZGF0YV9sZW4gPSBnZXRfdW5hbGlnbmVkX2JlMTYocHRyKTtcXG4gMjI3OlxcdFxcdFxcdFxcdHB0ciArPSAyO1xcbiAyMjg6XFx0XFxuIDIyOTpcXHRcXHRcXHRcXHRpZiAob3BzaXplID09IGV4cGVjdGVkX29wc2l6ZSArIFRDUE9MRU5fTVBUQ1BfRFNTX0NIRUNLU1VNKSB7XFxuIDIzMDpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZXN1Ym9wdGlvbnMgfD0gT1BUSU9OX01QVENQX0NTVU1SRVFEO1xcbiAyMzE6XFx0XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2Vjc3VtID0gZ2V0X3VuYWxpZ25lZCgoX19mb3JjZSBfX3N1bTE2ICopcHRyKTtcXG4gMjMyOlxcdFxcdFxcdFxcdFxcdHB0ciArPSAyO1xcbiAyMzM6XFx0XFx0XFx0XFx0fVxcbiAyMzQ6XFx0XFxuIDIzNTpcXHRcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwiZGF0YV9zZXE9JWxsdSBzdWJmbG93X3NlcT0ldSBkYXRhX2xlbj0ldSBjc3VtPSVkOiV1XFxcXG5cXFwiLFxcbiAyMzY6XFx0XFx0XFx0XFx0XFx0IG1wX29wdC1cXHUwMDNlZGF0YV9zZXEsIG1wX29wdC1cXHUwMDNlc3ViZmxvd19zZXEsXFxuIDIzNzpcXHRcXHRcXHRcXHRcXHQgbXBfb3B0LVxcdTAwM2VkYXRhX2xlbiwgISEobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0NTVU1SRVFEKSxcXG4gMjM4OlxcdFxcdFxcdFxcdFxcdCBtcF9vcHQtXFx1MDAzZWNzdW0pO1xcbiAyMzk6XFx0XFx0XFx0fVxcbiAyNDA6XFx0XFxuIDI0MTpcXHRcXHRcXHRicmVhaztcXG4gMjQyOlxcdFxcbiAyNDM6XFx0XFx0Y2FzZSBNUFRDUE9QVF9BRERfQUREUjpcXG4gMjQ0OlxcdFxcdFxcdG1wX29wdC1cXHUwMDNlZWNobyA9ICgqcHRyKyspIFxcdTAwMjYgTVBUQ1BfQUREUl9FQ0hPO1xcbiAyNDU6XFx0XFx0XFx0aWYgKCFtcF9vcHQtXFx1MDAzZWVjaG8pIHtcXG4gMjQ2OlxcdFxcdFxcdFxcdGlmIChvcHNpemUgPT0gVENQT0xFTl9NUFRDUF9BRERfQUREUiB8fFxcbiAyNDc6XFx0XFx0XFx0XFx0ICAgIG9wc2l6ZSA9PSBUQ1BPTEVOX01QVENQX0FERF9BRERSX1BPUlQpXFxuIDI0ODpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWFkZHIuZmFtaWx5ID0gQUZfSU5FVDtcXG4gMjQ5OlxcdCNpZiBJU19FTkFCTEVEKENPTkZJR19NUFRDUF9JUFY2KVxcbiAyNTA6XFx0XFx0XFx0XFx0ZWxzZSBpZiAob3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFI2IHx8XFxuIDI1MTpcXHRcXHRcXHRcXHRcXHQgb3BzaXplID09IFRDUE9MRU5fTVBUQ1BfQUREX0FERFI2X1BPUlQpXFxuIDI1MjpcXHRcXHRcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWFkZHIuZmFtaWx5ID0gQUZfSU5FVDY7XFxuIDI1MzpcXHQjZW5kaWZcXG4gMjU0OlxcdFxcdFxcdFxcdGVsc2VcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDM6MTEuNzY1MTAzNzU2WiIsIlNlcSI6NDMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyOTY4NTExNDMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk1QVENQIERTUyBPcHRpb24gUGFyc2luZzogUG90ZW50aWFsIEZsYXcqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBtcHRjcF9wYXJzZV9vcHRpb25gIGZ1bmN0aW9uIGFuZCBzb21ldGhpbmcncyBidWdnaW5nIG1lLiBTcGVjaWZpY2FsbHksIEknbSBub3RpY2luZyB0aGUgb3JkZXIgb2Ygb3BlcmF0aW9ucyB3aGVuIGhhbmRsaW5nIHRoZSBEU1MgKERhdGEgU2VxdWVuY2UgU2l6ZSkgb3B0aW9uLiBJdCBsb29rcyBsaWtlIGl0J3Mgc2V0dGluZyB0aGUgYG1wX29wdC1cdTAwM2Vkc242NGAsIGBtcF9vcHQtXHUwMDNldXNlX21hcGAsIGBtcF9vcHQtXHUwMDNlYWNrNjRgLCBhbmQgYG1wX29wdC1cdTAwM2V1c2VfYWNrYCBmbGFncyAqYmVmb3JlKiBpdCBhY3R1YWxseSB2YWxpZGF0ZXMgdGhlIG9wdGlvbiBzaXplIChgb3BzaXplYCkuXG5cblRoZSBjb2RlIHB1bGxzIHRoZSBmbGFncywgc2V0cyB0aGUgYml0ZmllbGRzIGluIGBtcF9vcHRgLCBhbmQgKnRoZW4qIGNoZWNrcyBgb3BzaXplYC4gSWYgdGhlIHNpemUgaXMgaW5jb3JyZWN0LCB0aGUgZnVuY3Rpb24gYnJlYWtzIG91dCBvZiB0aGUgcGFyc2luZyBsb29wLiBUaGlzIG1lYW5zIHRoYXQgaWYgYG9wc2l6ZWAgaXMgd3JvbmcsIGFuZCB0aGUgRFNTIG9wdGlvbiBpcyBpbnZhbGlkLCB0aG9zZSBmbGFncyBsaWtlIGBtcF9vcHQtXHUwMDNldXNlX2Fja2AgY291bGQgYmUgc2V0IHRvIDEsIGJ1dCB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgaW4gYG1wX29wdC1cdTAwM2VzdWJvcHRpb25zYCB3b3VsZCAqbm90KiBiZSBzZXQuXG5cblNpbmNlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCAqb25seSogY2hlY2tzIGBtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTU2AgdG8gZGV0ZXJtaW5lIGlmIERTUyBmaWVsZHMgc2hvdWxkIGJlIHByb2Nlc3NlZCwgaXQgd291bGQgaWdub3JlIGFueSBEU1MgaW5mb3JtYXRpb24gaWYgdGhlIG9wdGlvbiBzaXplIGlzIGludmFsaWQuIFRoYXQgc2VlbXMuLi4gb2theSwgZnVuY3Rpb25hbGx5LCBidXQgaXQgZGlkIG1ha2UgbWUgd29uZGVyIGlmIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IG1pZ2h0IGJlIGEgcG90ZW50aWFsIGlzc3VlIGhlcmUuXG5cbk5vdywgdGhhdCBwYXRjaCBhZGRzIGEgY2hlY2s6XG5gYGBjXG4gICAgICAgIGNhc2UgTVBUQ1BPUFRfRFNTOlxuICAgICAgICAgICAgICAgIC8qIENhbiBiZSB1c2VkIHdpdGggYSByZXN0cmljdGVkIG51bWJlciBvZiBvdGhlciBvcHRpb25zICovXG4gICAgICAgICAgICAgICAgaWYgKChtcF9vcHQtXHUwMDNlc3Vib3B0aW9ucyBcdTAwMjYgfihPUFRJT05fTVBUQ1BfQUREX0FERFIgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05fTVBUQ1BfUk1fQUREUiB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTl9NUFRDUF9QUklPIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OX01QVENQX0ZBSUwpKSAhPSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5gYGBcblxuVGhpcyBuZXcgY2hlY2sgaXMgZXZlbiBtb3JlIGNvbmNlcm5pbmcuIElmIHRoaXMgYnJlYWtzLCB0aGUgb3B0aW9uIGdldHMgZHJvcHBlZCBiZWZvcmUgc2V0dGluZyAqYW55KiBvZiB0aGUgRFNTIGZpZWxkcy4gU28sIHBvdGVudGlhbGx5LCB3ZSBjb3VsZCBoYXZlIGFuIGludmFsaWQgc2l0dWF0aW9uLCB3aGVyZSBhbiBgbXBfb3B0YCBzdHJ1Y3R1cmUgZ2V0cyB1c2VkIGRvd25zdHJlYW0gYW5kIHNvbWUgZmllbGRzIGFyZSB1bmluaXRpYWxpemVkLiBBbmQgSSB0aGluayB0aGF0J3Mgd2hlcmUgSSBuZWVkIHRvIGNoZWNrLlxuXG5MZXQgbWUgdHJhY2UgYmFjayB0byBgbXB0Y3BfZ2V0X29wdGlvbnNgIGFnYWluLiBPa2F5LCBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgZGVjbGFyZXMgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtgIG9uIHRoZSBzdGFjaywgd2hpY2ggaXMgZ29vZC4gSXQgY2FsbHMgYG1wdGNwX2dldF9vcHRpb25zYCwgcGFzc2luZyB0aGlzIHN0cnVjdC4gQ3J1Y2lhbGx5LCBgbXB0Y3BfZ2V0X29wdGlvbnNgICp6ZXJvZXMqIGBtcF9vcHQuc3RhdHVzYCBhdCB0aGUgYmVnaW5uaW5nLiBUaGF0J3MgZ29vZDsgYW55IGZsYWdzIG5vdCBzZXQgYnkgYSB2YWxpZCBvcHRpb24gc2hvdWxkIGJlIGNsZWFyZWQuIEFuZCBhZnRlciB6ZXJvaW5nIHRoaXMgc3RydWN0LCBpdCBzdGFydHMgcGFyc2luZyBvcHRpb25zLiBJZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGlzIHBhcnNlZCBjb3JyZWN0bHksIHRoZW4gYG1wX29wdC5kYXRhX2Fja2AsIGBtcF9vcHQuZGF0YV9zZXFgLCBldGMuIGFyZSBwb3B1bGF0ZWQuIEJ1dCBpZiBpdCdzIG5vdCBwYXJzZWQgY29ycmVjdGx5LCB0aG9zZSBmaWVsZHMgcmVtYWluICp1bmluaXRpYWxpemVkKi5cblxuSG93ZXZlciwgKmJlZm9yZSogdGhvc2UgYGRhdGFfYWNrYC9gZGF0YV9zZXFgIGZpZWxkcyBhcmUgcmVhZCwgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGNoZWNrcyBpZiBgT1BUSU9OX01QVENQX0RTU2AgaXMgc2V0IGluIGBtcF9vcHQuc3Vib3B0aW9uc2AuIElmIGl0J3Mgbm90IHNldCwgaXQgZG9lc24ndCB0cnkgdG8gYWNjZXNzIHRoZW0uIFNvIHRoZSB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgKm9ubHkqIHVzZWQgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHNldC4gT2theSwgdGhhdCBzb3VuZHMgbGlrZSBpdCBzaG91bGQgYmUgc2FmZS4gSSBzdGlsbCBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IHRoaXMgaXMgdHJ1ZSBpbiBhbGwgY2FzZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NTY3LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Nzc5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDM6MjQuNzMzNjE4MTg2WiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4MjcyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyMTAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEyMTA6XFx0XFx0XFx0aWYgKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX1JTVCkge1xcbjEyMTE6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfc2VlbiA9IDE7XFxuMTIxMjpcXHRcXHRcXHRcXHRzdWJmbG93LVxcdTAwM2VyZXNldF9yZWFzb24gPSBtcF9vcHQucmVzZXRfcmVhc29uO1xcbjEyMTM6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfdHJhbnNpZW50ID0gbXBfb3B0LnJlc2V0X3RyYW5zaWVudDtcXG4xMjE0OlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUFJTVFJYKTtcXG4xMjE1OlxcdFxcdFxcdH1cXG4xMjE2OlxcdFxcbjEyMTc6XFx0XFx0XFx0aWYgKCEobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfRFNTKSlcXG4xMjE4OlxcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbjEyMTk6XFx0XFx0fVxcbjEyMjA6XFx0XFxuMTIyMTpcXHRcXHQvKiB3ZSBjYW4ndCB3YWl0IGZvciByZWN2bXNnKCkgdG8gdXBkYXRlIHRoZSBhY2tfc2VxLCBvdGhlcndpc2VcXG4xMjIyOlxcdFxcdCAqIG1vbm9kaXJlY3Rpb25hbCBmbG93cyB3aWxsIHN0dWNrXFxuMTIyMzpcXHRcXHQgKi9cXG4xMjI0OlxcdFxcdGlmIChtcF9vcHQudXNlX2FjaylcXG4xMjI1OlxcdFxcdFxcdGFja191cGRhdGVfbXNrKG1zaywgc2ssIFxcdTAwMjZtcF9vcHQpO1xcbjEyMjY6XFx0XFx0cndpbl91cGRhdGUobXNrLCBzaywgc2tiKTtcXG4xMjI3OlxcdFxcbjEyMjg6XFx0XFx0LyogWmVyby1kYXRhLWxlbmd0aCBwYWNrZXRzIGFyZSBkcm9wcGVkIGJ5IHRoZSBjYWxsZXIgYW5kIG5vdFxcbjEyMjk6XFx0XFx0ICogcHJvcGFnYXRlZCB0byB0aGUgTVBUQ1AgbGF5ZXIsIHNvIHRoZSBza2IgZXh0ZW5zaW9uIGRvZXMgbm90XFxuMTIzMDpcXHRcXHQgKiBuZWVkIHRvIGJlIGFsbG9jYXRlZCBvciBwb3B1bGF0ZWQuIERBVEFfRklOIGluZm9ybWF0aW9uLCBpZlxcbjEyMzE6XFx0XFx0ICogcHJlc2VudCwgbmVlZHMgdG8gYmUgdXBkYXRlZCBoZXJlIGJlZm9yZSB0aGUgc2tiIGlzIGZyZWVkLlxcbjEyMzI6XFx0XFx0ICovXFxuMTIzMzpcXHRcXHRpZiAoVENQX1NLQl9DQihza2IpLVxcdTAwM2VzZXEgPT0gVENQX1NLQl9DQihza2IpLVxcdTAwM2VlbmRfc2VxKSB7XFxuMTIzNDpcXHRcXHRcXHRpZiAobXBfb3B0LmRhdGFfZmluIFxcdTAwMjZcXHUwMDI2IG1wX29wdC5kYXRhX2xlbiA9PSAxIFxcdTAwMjZcXHUwMDI2XFxuMTIzNTpcXHRcXHRcXHQgICAgbXB0Y3BfdXBkYXRlX3Jjdl9kYXRhX2Zpbihtc2ssIG1wX29wdC5kYXRhX3NlcSwgbXBfb3B0LmRzbjY0KSlcXG4xMjM2OlxcdFxcdFxcdFxcdG1wdGNwX3NjaGVkdWxlX3dvcmsoKHN0cnVjdCBzb2NrICopbXNrKTtcXG4xMjM3OlxcdFxcbjEyMzg6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuMTIzOTpcXHRcXHR9XFxuMTI0MDpcXHRcXG4xMjQxOlxcdFxcdG1wZXh0ID0gc2tiX2V4dF9hZGQoc2tiLCBTS0JfRVhUX01QVENQKTtcXG4xMjQyOlxcdFxcdGlmICghbXBleHQpXFxuMTI0MzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuMTI0NDpcXHRcXG4xMjQ1OlxcdFxcdG1lbXNldChtcGV4dCwgMCwgc2l6ZW9mKCptcGV4dCkpO1xcbjEyNDY6XFx0XFxuMTI0NzpcXHRcXHRpZiAobGlrZWx5KG1wX29wdC51c2VfbWFwKSkge1xcbjEyNDg6XFx0XFx0XFx0aWYgKG1wX29wdC5tcGNfbWFwKSB7XFxuMTI0OTpcXHRcXHRcXHRcXHQvKiB0aGlzIGlzIGFuIE1QX0NBUEFCTEUgY2FycnlpbmcgTVBUQ1AgZGF0YVxcbjEyNTA6XFx0XFx0XFx0XFx0ICogd2Uga25vdyB0aGlzIG1hcCB0aGUgZmlyc3QgY2h1bmsgb2YgZGF0YVxcbjEyNTE6XFx0XFx0XFx0XFx0ICovXFxuMTI1MjpcXHRcXHRcXHRcXHRtcHRjcF9jcnlwdG9fa2V5X3NoYShzdWJmbG93LVxcdTAwM2VyZW1vdGVfa2V5LCBOVUxMLFxcbjEyNTM6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2bXBleHQtXFx1MDAzZWRhdGFfc2VxKTtcXG4xMjU0OlxcdFxcdFxcdFxcdG1wZXh0LVxcdTAwM2VkYXRhX3NlcSsrO1xcbjEyNTU6XFx0XFx0XFx0XFx0bXBleHQtXFx1MDAzZXN1YmZsb3dfc2VxID0gMTtcXG4xMjU2OlxcdFxcdFxcdFxcdG1wZXh0LVxcdTAwM2Vkc242NCA9IDE7XFxuMTI1NzpcXHRcXHRcXHRcXHRtcGV4dC1cXHUwMDNlbXBjX21hcCA9IDE7XFxuMTI1ODpcXHRcXHRcXHRcXHRtcGV4dC1cXHUwMDNlZGF0YV9maW4gPSAwO1xcbjEyNTk6XFx0XFx0XFx0fSBlbHNlIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDM6MjQuNzMzODAzNDg2WiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE5OTA5NTYwMDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkRTUyBPcHRpb24gUGFyc2luZzogQSBEZWVwIERpdmUgaW50byBQb3RlbnRpYWwgVnVsbmVyYWJpbGl0aWVzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIGFib3V0IGhvdyB0aGUgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGFuZCByZWxhdGVkIGRhdGEuIFNwZWNpZmljYWxseSwgdGhlIGZ1bmN0aW9uJ3MgbG9naWMgc2VlbXMgdG8gcmV0dXJuIGVhcmx5IGlmIGBPUFRJT05fTVBUQ1BfRFNTYCBpc24ndCBzZXQsIHdoaWNoIGFwcGVhcnMgdG8gYmUgYSBzYWZlZ3VhcmQgYWdhaW5zdCB1bmluaXRpYWxpemVkIHJlYWRzLiBJZiBgT1BUSU9OX01QVENQX0RTU2AgKmlzKiBzZXQsIHRoZW4gaXQgcHJvY2VlZHMgdG8gYWNjZXNzIGZpZWxkcyBsaWtlIGB1c2VfYWNrYCwgYGRhdGFfZmluYCwgYW5kIGBkYXRhX2xlbmAuXG5cbk15IGNvbmNlcm4gcmV2b2x2ZWQgYXJvdW5kIGhvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBtaWdodCBiZSBoYW5kbGVkIHdpdGhpbiBhIHNpbmdsZSBwYWNrZXQuIElmIG11bHRpcGxlIGBEU1NgIG9wdGlvbnMgZXhpc3QsIHRoZSBjdXJyZW50IHBhdGNoJ3MgZWFybHktZXhpdCBjaGVjayBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBiYXNlZCBvbiBvdGhlciBzZXQgc3Vib3B0aW9ucyBtaWdodCBjYXVzZSB0aGUgc2Vjb25kIGBEU1NgIHBhcnNpbmcgdG8gZmFpbC4gVGhpcyBjb3VsZCBsZWFkIHRvIGEgc2NlbmFyaW8gd2hlcmUgYE9QVElPTl9NUFRDUF9EU1NgIGlzbid0IHNldCwgYW5kIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCB1bmV4cGVjdGVkbHkgcmV0dXJucywgc2tpcHBpbmcgdGhlIGNydWNpYWwgRFNTIGZpZWxkIGluaXRpYWxpemF0aW9uLiBIb3dldmVyLCBvbiBmdXJ0aGVyIHJldmlldywgaWYgYSBgRFNTYCBvcHRpb24gaXMgcGFyc2VkIGFuZCB0aGVuIGEgYEZBU1RDTE9TRWAgb3B0aW9uLCB0aGUgY29kZSBzaG91bGQgc3RpbGwgaGFuZGxlIHRoZSBgRFNTYCBvcHRpb24gZGF0YSBjb3JyZWN0bHkuIFRoZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgY2hlY2tzIHNob3VsZCBwcmV2ZW50IHVuaW5pdGlhbGl6ZWQgcmVhZHMgb2YgdGhlIG5vdyBwb3B1bGF0ZWQgZGF0YS5cblxuQW5vdGhlciBwb3RlbnRpYWwgaXNzdWUgSSBjb25zaWRlcmVkIHdhcyBhIGBEU1NgIG9wdGlvbiBmYWlsaW5nIGVhcmx5IGluIGBtcHRjcF9wYXJzZV9vcHRpb25gLCBzcGVjaWZpY2FsbHkgaWYgYG9wc2l6ZWAgaXNuJ3Qgd2hhdCdzIGV4cGVjdGVkLiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIHBhcnNlciB3b3VsZCBicmVhayBlYXJseSwgYE9QVElPTl9NUFRDUF9EU1NgIHdvdWxkIG5vdCBiZSBzZXQsIGJ1dCBvdGhlciBzZWVtaW5nbHkgaW5pdGlhbGlzZWQgdmFyaWFibGVzIGNvdWxkIGhhdmUgYmVlbiBzZXQuIEhvd2V2ZXIsIGEgcXVpY2sgY2hlY2sgb2YgdGhlIGNvZGUgaW4gYG1wdGNwX2luY29taW5nX29wdGlvbnNgIHNob3dzIHRoYXQgdGhlIHJvdXRpbmUgd2lsbCByZXR1cm4gZWFybHkgaWYgaXQgZmluZHMgYE9QVElPTl9NUFRDUF9EU1NgIGlzIG5vdCBzZXQsIG1lYW5pbmcgbm8gdW5pbml0aWFsaXplZCByZWFkcyBoZXJlIGVpdGhlci5cblxuVGhlIGNlbnRyYWwgcXVlc3Rpb24gYmVjYW1lOiBJcyB0aGVyZSBhIHBhdGggd2hlcmUgYE9QVElPTl9NUFRDUF9EU1NgICppcyogc2V0LCBidXQgKnNvbWUqIG9mIHRoZSByZWxhdGVkIGZpZWxkcyByZW1haW4gdW5pbml0aWFsaXplZD8gSSBoYWQgdG8gdHJhY2UgdGhlIGluaXRpYWxpemF0aW9uIGxvZ2ljIHdpdGhpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYC4gSWYgdGhlIGBNUFRDUE9QVF9EU1NgIG9wdGlvbiBpcyBwYXJzZWQgYW5kIHRoZSBvcHRpb24gc2l6ZSBpcyB2YWxpZCwgdGhlbiBgT1BUSU9OX01QVENQX0RTU2AgZ2V0cyBzZXQuIFdpdGhpbiB0aGF0IG9wdGlvbiBwYXJzaW5nIHJvdXRpbmUsIHRoZSBmaWVsZHMgYXJlIGNvbmRpdGlvbmFsbHkgcG9wdWxhdGVkIGJhc2VkIG9uIHdoZXRoZXIgYHVzZV9hY2tgIG9yIGB1c2VfbWFwYCBhcmUgc2V0LiBJZiBgdXNlX2Fja2AgaXMgdHJ1ZSwgaXQgcG9wdWxhdGVzIGBkYXRhX2Fja2A7IGlmIGB1c2VfbWFwYCBpcyB0cnVlLCB0aGVuIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGBkYXRhX2xlbmAsIGFuZCBgY3N1bWAgZ2V0IHBvcHVsYXRlZC4gQ29udmVyc2VseSwgaWYgZWl0aGVyIG9mIHRob3NlIGlzIGZhbHNlLCB0aGUgcmVzcGVjdGl2ZSBmaWVsZCByZW1haW5zIHVuaW5pdGlhbGl6ZWQuXG5cblRoZW4sIEkgbG9va2VkIGF0IGhvdyBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgdXNlcyB0aG9zZSBmaWVsZHMuIEl0IHNlZW1zIHRoYXQgYHVzZV9hY2tgIGlzIGNoZWNrZWQgKmJlZm9yZSogYGRhdGFfYWNrYCBpcyBhY2Nlc3NlZCwgd2hpY2ggYXBwZWFycyBzYWZlLiBIb3dldmVyLCB0aGUgc3Vic2VxdWVudCB1c2Ugb2YgYG1wX29wdC5kYXRhX2ZpbmAsIGBtcF9vcHQuZGF0YV9sZW5gLCBhbmQgYG1wX29wdC5kYXRhX3NlcWAgcmFpc2VkIGFuIGltbWVkaWF0ZSBmbGFnLiBJIHF1ZXN0aW9uZWQgd2hldGhlciBgdXNlX21hcGAgd2FzIGFsc28gY2hlY2tlZCBiZWZvcmUgdGhlc2UgdmFsdWVzIHdlcmUgYWNjZXNzZWQuXG5cblRoYXQncyB3aGVuIEkgcmVhbGl6ZWQgdGhhdCBgZGF0YV9maW5gIGlzIGxpbmtlZCB0byBgdXNlX21hcGAhIGBtcF9vcHQuZGF0YV9maW5gIGlzIGFjdHVhbGx5IGEgYml0ZmllbGQsIGNsZWFyZWQgYnkgYG1wdGNwX2dldF9vcHRpb25zYCwgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsIGJlIHplcm8gaWYgYHVzZV9tYXBgIGlzIGZhbHNlLiBUaGVyZWZvcmUsIHRoZSBjb2RlIGBtcF9vcHQuZGF0YV9maW4gXHUwMDI2XHUwMDI2IC4uLmAgd2lsbCBldmFsdWF0ZSB0byBmYWxzZSwgbWVhbmluZyB0aGUgdW5pbml0aWFsaXplZCBgZGF0YV9sZW5gIGFuZCBgZGF0YV9zZXFgIGFyZSBub3QgcmVhZC4gRnVydGhlciBjb2RlIGNoZWNrcyBpbiB0aGUgXCJsaWtlbHlcIiBwYXRoLCB3aGVyZSBgdXNlX21hcGAgKmlzKiB0cnVlLCBzaG93IHRoYXQgZmllbGRzIGxpa2UgYGRhdGFfc2VxYCwgYHN1YmZsb3dfc2VxYCwgYGRhdGFfbGVuYCwgYW5kIGBjc3VtYCBhcmUgY29ycmVjdGx5IGNoZWNrZWQgcHJpb3IgdG8gYW55IGFjY2Vzc2VzLlxuXG5UaGUgY29kZSBzZWVtcyByb2J1c3QuIEknbGwgbmVlZCB0byBkb3VibGUgY2hlY2sgb3RoZXIgYXJlYXMsIHNwZWNpZmljYWxseSB0aGUgYGNoZWNrX2Z1bGx5X2VzdGFibGlzaGVkYCBzZWN0aW9uLiBCdXQsIHNvIGZhciwgaXQgc2VlbXMgdGhhdCB0aGVyZSdzIG5vIG9idmlvdXMgcGF0aCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gVGhlIGNoZWNrcyBpbiBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgYW5kIHRoZSBjb25kaXRpb25hbCBsb2dpYyBpbiBgbXB0Y3BfcGFyc2Vfb3B0aW9uYCBhcHBlYXIgdG8gcHJvdmlkZSBhZGVxdWF0ZSBwcm90ZWN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTAyMSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2NTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xMFQxMjo0Mzo0NC42NDMzNjc2MjdaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIyMjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9tcHRjcC9vcHRpb25zLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTUzLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgOTUzOlxcdFxcdGlmIChzdWJmbG93LVxcdTAwM2VyZW1vdGVfa2V5X3ZhbGlkIFxcdTAwMjZcXHUwMDI2XFxuIDk1NDpcXHRcXHQgICAgKCgobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0RTUykgXFx1MDAyNlxcdTAwMjYgbXBfb3B0LVxcdTAwM2V1c2VfYWNrKSB8fFxcbiA5NTU6XFx0XFx0ICAgICAoKG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9BRERfQUREUikgXFx1MDAyNlxcdTAwMjZcXG4gOTU2OlxcdFxcdCAgICAgICghbXBfb3B0LVxcdTAwM2VlY2hvIHx8IHN1YmZsb3ctXFx1MDAzZW1wX2pvaW4pKSkpIHtcXG4gOTU3OlxcdFxcdFxcdC8qIHN1YmZsb3dzIGFyZSBmdWxseSBlc3RhYmxpc2hlZCBhcyBzb29uIGFzIHdlIGdldCBhbnlcXG4gOTU4OlxcdFxcdFxcdCAqIGFkZGl0aW9uYWwgYWNrLCBpbmNsdWRpbmcgQUREX0FERFIuXFxuIDk1OTpcXHRcXHRcXHQgKi9cXG4gOTYwOlxcdFxcdFxcdGdvdG8gc2V0X2Z1bGx5X2VzdGFibGlzaGVkO1xcbiA5NjE6XFx0XFx0fVxcbiA5NjI6XFx0XFxuIDk2MzpcXHRcXHQvKiBJZiB0aGUgZmlyc3QgZXN0YWJsaXNoZWQgcGFja2V0IGRvZXMgbm90IGNvbnRhaW4gTVBfQ0FQQUJMRSArIGRhdGFcXG4gOTY0OlxcdFxcdCAqIHRoZW4gZmFsbGJhY2sgdG8gVENQLiBGYWxsYmFjayBzY2VuYXJpb3MgcmVxdWlyZXMgYSByZXNldCBmb3JcXG4gOTY1OlxcdFxcdCAqIE1QX0pPSU4gc3ViZmxvd3MuXFxuIDk2NjpcXHRcXHQgKi9cXG4gOTY3OlxcdFxcdGlmICghKG1wX29wdC1cXHUwMDNlc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTlNfTVBUQ1BfTVBDKSkge1xcbiA5Njg6XFx0XFx0XFx0aWYgKHN1YmZsb3ctXFx1MDAzZW1wX2pvaW4pXFxuIDk2OTpcXHRcXHRcXHRcXHRnb3RvIHJlc2V0O1xcbiA5NzA6XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlbXBfY2FwYWJsZSA9IDA7XFxuIDk3MTpcXHRcXHRcXHRpZiAoIW1wdGNwX3RyeV9mYWxsYmFjayhzc2ssIE1QVENQX01JQl9NUENBUEFCTEVEQVRBRkFMTEJBQ0spKSB7XFxuIDk3MjpcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc3NrKSwgTVBUQ1BfTUlCX0ZBTExCQUNLRkFJTEVEKTtcXG4gOTczOlxcdFxcdFxcdFxcdGdvdG8gcmVzZXQ7XFxuIDk3NDpcXHRcXHRcXHR9XFxuIDk3NTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDk3NjpcXHRcXHR9XFxuIDk3NzpcXHRcXG4gOTc4OlxcdFxcdGlmICh1bmxpa2VseSghUkVBRF9PTkNFKG1zay1cXHUwMDNlcG0uc2VydmVyX3NpZGUpKSlcXG4gOTc5OlxcdFxcdFxcdHByX3dhcm5fb25jZShcXFwiYm9ndXMgbXBjIG9wdGlvbiBvbiBlc3RhYmxpc2hlZCBjbGllbnQgc2tcXFwiKTtcXG4gOTgwOlxcdFxcbiA5ODE6XFx0c2V0X2Z1bGx5X2VzdGFibGlzaGVkOlxcbiA5ODI6XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNlZGVueV9qb2luX2lkMClcXG4gOTgzOlxcdFxcdFxcdFdSSVRFX09OQ0UobXNrLVxcdTAwM2VwbS5yZW1vdGVfZGVueV9qb2luX2lkMCwgdHJ1ZSk7XFxuIDk4NDpcXHRcXG4gOTg1OlxcdFxcdG1wdGNwX2RhdGFfbG9jaygoc3RydWN0IHNvY2sgKiltc2spO1xcbiA5ODY6XFx0XFx0X19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkKG1zaywgc3ViZmxvdywgbXBfb3B0KTtcXG4gOTg3OlxcdFxcdG1wdGNwX2RhdGFfdW5sb2NrKChzdHJ1Y3Qgc29jayAqKW1zayk7XFxuIDk4ODpcXHRcXG4gOTg5OlxcdGNoZWNrX25vdGlmeTpcXG4gOTkwOlxcdFxcdC8qIGlmIHRoZSBzdWJmbG93IGlzIG5vdCBhbHJlYWR5IGxpbmtlZCBpbnRvIHRoZSBjb25uX2xpc3QsIHdlIGNhbid0XFxuIDk5MTpcXHRcXHQgKiBub3RpZnkgdGhlIFBNOiB0aGlzIHN1YmZsb3cgaXMgc3RpbGwgb24gdGhlIGxpc3RlbmVyIHF1ZXVlXFxuIDk5MjpcXHRcXHQgKiBhbmQgdGhlIFBNIHBvc3NpYmx5IGFjcXVpcmluZyB0aGUgc3ViZmxvdyBsb2NrIGNvdWxkIHJhY2Ugd2l0aFxcbiA5OTM6XFx0XFx0ICogdGhlIGxpc3RlbmVyIGNsb3NlXFxuIDk5NDpcXHRcXHQgKi9cXG4gOTk1OlxcdFxcdGlmIChsaWtlbHkoc3ViZmxvdy1cXHUwMDNlcG1fbm90aWZpZWQpIHx8IGxpc3RfZW1wdHkoXFx1MDAyNnN1YmZsb3ctXFx1MDAzZW5vZGUpKVxcbiA5OTY6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDk5NzpcXHRcXG4gOTk4OlxcdFxcdHN1YmZsb3ctXFx1MDAzZXBtX25vdGlmaWVkID0gMTtcXG4gOTk5OlxcdFxcdGlmIChzdWJmbG93LVxcdTAwM2VtcF9qb2luKSB7XFxuMTAwMDpcXHRcXHRcXHRjbGVhcl8zcmRhY2tfcmV0cmFuc21pc3Npb24oc3NrKTtcXG4xMDAxOlxcdFxcdFxcdG1wdGNwX3BtX3N1YmZsb3dfZXN0YWJsaXNoZWQobXNrKTtcXG4xMDAyOlxcdFxcdH0gZWxzZSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQzOjQ0LjY0MzU5MzUxN1oiLCJTZXEiOjQ3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDUyNjQ1NjAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyBjb2RlIHNuaXBwZXQsIGRpc3RpbGxlZCBpbnRvIGEgZmlyc3QtcGVyc29uIHN1bW1hcnksIGtlZXBpbmcgaW4gbWluZCBteSBleHBlcnQgdW5kZXJzdGFuZGluZzpcblxuKipBbmFseXppbmcgdGhlIFN1YmZsb3cgRXN0YWJsaXNobWVudCBDaGVjayoqXG5cblJpZ2h0LCBzbyBJJ20gbG9va2luZyBhdCBgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWRgLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgdGhlIGNvbmRpdGlvbnMgYXJvdW5kIHRoZSBNdWx0aWhvbWVkIFRDUCAoTVBUQ1ApIERhdGEgU2VxdWVuY2UgU3luY2hyb25pemF0aW9uIChEU1MpIG9wdGlvbiBhbmQgdGhlIGhhbmRsaW5nIG9mIGpvaW4gSURzLiBJIHNlZSB0aGF0IHRoZSBjb2RlIHNwZWNpZmljYWxseSBjaGVja3MgYG1wX29wdC1cdTAwM2V1c2VfYWNrYCAqb25seSogaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIGVuYWJsZWQuIFRoYXQncyBnb29kOyBpdCdzIGEgY29uZGl0aW9uYWwgZGVwZW5kZW5jeSwgd2hpY2ggaXMgZXhwZWN0ZWQuIFRoZSBBQ0sgdXNhZ2UgbGlrZWx5IGluZm9ybXMgaG93IERTUyBzeW5jaHJvbml6YXRpb24gaXMgbWFuYWdlZC5cblxuTmV4dCwgSSBzZWUgYSBjaGVjayBmb3IgYG1wX29wdC1cdTAwM2VkZW55X2pvaW5faWQwYC4gQWgsIHRoYXQncyBhIGJpdGZpZWxkIHdpdGhpbiBgc3RhdHVzYC4gS25vd2luZyB0aGF0IGBzdGF0dXNgIGlzIGxpa2VseSBhIHN0cnVjdHVyZSwgSSBxdWlja2x5IGluZmVyIHRoYXQgdGhpcyBiaXRmaWVsZCwgYW5kIHRoZXJlZm9yZSB0aGUgZW50aXJlIGBzdGF0dXNgIHN0cnVjdHVyZSwgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gemVybyBlbHNld2hlcmUuIFRoaXMgaXMgc3RhbmRhcmQgcHJhY3RpY2UgdG8gZW5zdXJlIHByZWRpY3RhYmxlIHN0YXJ0aW5nIHZhbHVlcy4gQSBiaXRmaWVsZCBzcGVjaWZpY2FsbHkgdGFyZ2V0cyB3aGV0aGVyIGpvaW5zIHdpdGggSUQgMCBzaG91bGQgYmUgZGVuaWVkIChvciwgYXQgbGVhc3QsIHdoZXRoZXIgdGhleSBjb250cmlidXRlIHRvIHRoZSAqZnVsbHkgZXN0YWJsaXNoZWQqIHN0YXR1cykuIEludGVyZXN0aW5nLlxuXG5GaW5hbGx5LCB0aGUgY29kZSB0aGVuIGNhbGxzIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQobXNrLCBzdWJmbG93LCBtcF9vcHQpO2AuIFRoYXQncyB0aGUgY29yZSBvZiB0aGUgbG9naWMsIHRoZSBjZW50cmFsIGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB0aGUgc3ViZmxvdydzIGVzdGFibGlzaG1lbnQgc3RhdHVzLiBUaGUgYXJndW1lbnRzIG1ha2Ugc2Vuc2U6IGBtc2tgIGlzIHByb2JhYmx5IHNvbWUga2luZCBvZiBtYXNrIHJlcHJlc2VudGluZyB0aGUgcmVsZXZhbnQgY3JpdGVyaWEsIGBzdWJmbG93YCBpcyBvYnZpb3VzbHkgdGhlIHN1YmZsb3cgaW4gcXVlc3Rpb24sIGFuZCBgbXBfb3B0YCBwcm92aWRlcyB0aGUgTVBUQ1Agb3B0aW9ucy4gSSBuZWVkIHRvIGRpZyBpbnRvIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRgIHRvIHVuZGVyc3RhbmQgdGhlIGFjdHVhbCBkZWNpc2lvbi1tYWtpbmcgcHJvY2Vzcy4gSSdtIGd1ZXNzaW5nIHRoYXQgZnVuY3Rpb24gd2lsbCB1c2UgdGhlc2UgcGFyYW1ldGVycyB0byBjaGVjayBmb3IgdGhpbmdzIGxpa2UgYWNrcywgc2VxdWVuY2UgbnVtYmVycywgYW5kIHBvdGVudGlhbGx5IGpvaW4gSURzIHRvIGRlY2lkZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBmdWxseSBlc3RhYmxpc2hlZCwgYW5kIGNhbiBiZSBjb25zaWRlcmVkIGFjdGl2ZSBpbiB0aGUgTVBUQ1AgZmxvdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI0OTUsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQzOjUwLjY5NjI0MjU2OVoiLCJTZXEiOjQ4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzY4OTQ1MTIzOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRcXFxcKFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L21wdGNwL29wdGlvbnMuYz05MTk9c3RhdGljIGJvb2wgY2hlY2tfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zaywgc3RydWN0IHNvY2sgKnNzayxcXG4tLVxcbm5ldC9tcHRjcC9vcHRpb25zLmMtOTg1LVxcdG1wdGNwX2RhdGFfbG9jaygoc3RydWN0IHNvY2sgKiltc2spO1xcbm5ldC9tcHRjcC9vcHRpb25zLmM6OTg2OlxcdF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChtc2ssIHN1YmZsb3csIG1wX29wdCk7XFxubmV0L21wdGNwL29wdGlvbnMuYy05ODctXFx0bXB0Y3BfZGF0YV91bmxvY2soKHN0cnVjdCBzb2NrICopbXNrKTtcXG4tLVxcbm5ldC9tcHRjcC9wcm90b2NvbC5jPTM1NTg9c3RydWN0IHNvY2sgKm1wdGNwX3NrX2Nsb25lX2luaXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxcbi0tXFxubmV0L21wdGNwL3Byb3RvY29sLmMtMzYzMC1cXHRpZiAobXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX01QQ19BQ0spXFxubmV0L21wdGNwL3Byb3RvY29sLmM6MzYzMTpcXHRcXHRfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQobXNrLCBzdWJmbG93LCBtcF9vcHQpO1xcbm5ldC9tcHRjcC9wcm90b2NvbC5jLTM2MzItXFx0YmhfdW5sb2NrX3NvY2sobnNrKTtcXG4tLVxcbm5ldC9tcHRjcC9wcm90b2NvbC5oPTgwNz12b2lkIG1wdGNwX2dldF9hdmFpbGFibGVfc2NoZWR1bGVycyhjaGFyICpidWYsIHNpemVfdCBtYXhsZW4pO1xcbm5ldC9tcHRjcC9wcm90b2NvbC5oOjgwODp2b2lkIF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZChzdHJ1Y3QgbXB0Y3Bfc29jayAqbXNrLFxcbm5ldC9tcHRjcC9wcm90b2NvbC5oLTgwOS1cXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyxcXG4tLVxcbm5ldC9tcHRjcC9zdWJmbG93LmM9NzgwPXZvaWQgbXB0Y3Bfc3ViZmxvd19kcm9wX2N0eChzdHJ1Y3Qgc29jayAqc3NrKVxcbi0tXFxubmV0L21wdGNwL3N1YmZsb3cuYy03OTYtXFxubmV0L21wdGNwL3N1YmZsb3cuYzo3OTc6dm9pZCBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcXG5uZXQvbXB0Y3Avc3ViZmxvdy5jLTc5OC1cXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IG1wdGNwX3N1YmZsb3dfY29udGV4dCAqc3ViZmxvdyxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDM6NTQuMzg1NzA0MzM3WiIsIlNlcSI6NDksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY3OTY1OTQxNzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGFrZSBvbiB1bmRlcnN0YW5kaW5nIHRoaXMgYF9fbXB0Y3Bfc3ViZmxvd19mdWxseV9lc3RhYmxpc2hlZGAgY29uY2VwdCwgZXhwbGFpbmVkIGFzIGlmIGl0J3MgbXkgb3duIHRob3VnaHQgcHJvY2VzczpcblxuKipNeSBEZWVwIERpdmUgaW50byBgX19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkYCoqXG5cbkFscmlnaHQsIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCB0aGlzIGBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWRgIGZ1bmN0aW9uIHJlcHJlc2VudHMuIEl0IHNvdW5kcyBsaWtlIGEgY3JpdGljYWwgcG9pbnQgaW4gdGhlIE11bHRpUGF0aCBUQ1AgKE1QVENQKSBjb25uZWN0aW9uIGxpZmVjeWNsZSwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gaXRzIHN1YmZsb3dzLiBJJ20gYWxyZWFkeSB2aXN1YWxpemluZyB0aGUgTVBUQ1AgY29udHJvbCBwbGFuZSBhbmQgZGF0YSBwbGFuZSBpbnRlcmFjdGlvbnMgaW4gbXkgbWluZC4uLiBub3csIGxldCdzIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBmaXRzIGludG8gdGhlIHBpY3R1cmUuXG5cbk15IGluaXRpYWwgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gbGlrZWx5IHNpZ25hbHMgdGhhdCBhIHNwZWNpZmljIHN1YmZsb3csIHdpdGhpbiBhbiBvdmVyYWxsIE1QVENQIGNvbm5lY3Rpb24sIGhhcyBjb21wbGV0ZWQgaXRzIG5lY2Vzc2FyeSBoYW5kc2hha2luZyBvciBpbml0aWFsIHNldHVwIHBoYXNlLiBJdCdzIGVzc2VudGlhbGx5IHNheWluZywgXCJIZXksIHRoaXMgc3ViZmxvdyBpcyBub3cgcmVhZHkgdG8gY2FycnkgcmVhbCBkYXRhIVwiIFRoaW5rIG9mIGl0IGxpa2UgYSBncmVlbiBsaWdodCwgYSBnby1haGVhZCBzaWduYWwgZm9yIHRoYXQgcGFydGljdWxhciBwYXRoLlxuXG5HaXZlbiBteSB1bmRlcnN0YW5kaW5nIG9mIE1QVENQLCBJJ20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUgc3ViZmxvdydzIFRDUCBoYW5kc2hha2UgKGxpa2VseSBhIDMtd2F5IGhhbmRzaGFrZSkgaGFzIGJlZW4gY29tcGxldGVkLCBhbmQgcGVyaGFwcyBhZnRlciBhbnkgTVBUQ1Atc3BlY2lmaWMgc2lnbmFsaW5nIHJlcXVpcmVkIGZvciB0aGF0IHN1YmZsb3cgaXMgZG9uZS4gTWF5YmUgaXQgaW52b2x2ZXMgdGhlIGV4Y2hhbmdlIG9mIHNvbWUgTVBUQ1Agb3B0aW9ucyBvciBmbGFncy4gSSdtIHdvbmRlcmluZyBpZiBpdCBhbHNvIGludm9sdmVzIGFsbG9jYXRpbmcgc3BlY2lmaWMgcmVzb3VyY2VzIG9yIHVwZGF0aW5nIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyB0byB0cmFjayB0aGUgc3ViZmxvdydzIHN0YXRlLlxuXG5JdCdzIHRlbXB0aW5nIHRvIHRoaW5rIGFib3V0IHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcy4gQSBmdWxseSBlc3RhYmxpc2hlZCBzdWJmbG93IHJlcHJlc2VudHMgYSByZWxpYWJsZSBkYXRhIHBhdGguIFdoYXQgaGFwcGVucyBpZiB0aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZD8gSSBuZWVkIHRvIHRoaW5rIGFib3V0IGVycm9yIGNvbmRpdGlvbnMgYW5kIGhvdyB0aGUgTVBUQ1Agc3RhY2sgaGFuZGxlcyBzdWJmbG93IGZhaWx1cmVzIG9yIHJldHJhbnNtaXNzaW9ucy4gQWxzbywgSSdtIGFscmVhZHkgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGZ1bmN0aW9uIGNhbGwgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG92ZXJhbGwgTVBUQ1AgY29ubmVjdGlvbi4gQXJlIHRoZXJlIGRpZmZlcmVudCBhY3Rpb25zIG9yIGNhbGxiYWNrcyB0cmlnZ2VyZWQgYnkgdGhpcyBgX19tcHRjcF9zdWJmbG93X2Z1bGx5X2VzdGFibGlzaGVkYCBmdW5jdGlvbiBkZXBlbmRpbmcgb24gb3RoZXIgTVBUQ1AgcGFyYW1ldGVycyBvciB0aGUgc3RhdGUgb2Ygb3RoZXIgc3ViZmxvd3MgaW4gdGhlIGNvbm5lY3Rpb24/XG5cbkknbSBhbHNvIGN1cmlvdXMgYWJvdXQgd2hvIGNhbGxzIHRoaXMgZnVuY3Rpb24uIElzIGl0IHRoZSBNUFRDUCBzdGFjayBpbnRlcm5hbGx5LCBhZnRlciByZWNlaXZpbmcgY2VydGFpbiBwYWNrZXRzIG9yIGFja25vd2xlZGdpbmcgY2VydGFpbiBzaWduYWxzPyBPciBpcyB0aGlzIGZ1bmN0aW9uIHRyaWdnZXJlZCBpbiBzb21lIHdheSBmcm9tIGEgbG93ZXIgbGF5ZXIuIEFyZSB0aGVyZSBhbnkgY29uZGl0aW9ucyB0aGF0IGNhbiBwcmV2ZW50IHRoZSBmdW5jdGlvbiBmcm9tIGJlaW5nIGNhbGxlZD8gVGhlIHNvdXJjZSBjb2RlIHdpbGwgaG9wZWZ1bGx5IHNob3cgbWUhIFRpbWUgdG8gZGlnIGluIVxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzU1MCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ0OjAxLjE4MjMwMTA5NVoiLCJTZXEiOjUwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzk4NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL3N1YmZsb3cuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA3OTcsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA3OTc6XFx0dm9pZCBfX21wdGNwX3N1YmZsb3dfZnVsbHlfZXN0YWJsaXNoZWQoc3RydWN0IG1wdGNwX3NvY2sgKm1zayxcXG4gNzk4OlxcdFxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbXB0Y3Bfc3ViZmxvd19jb250ZXh0ICpzdWJmbG93LFxcbiA3OTk6XFx0XFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkICptcF9vcHQpXFxuIDgwMDpcXHR7XFxuIDgwMTpcXHRcXHRzdWJmbG93X3NldF9yZW1vdGVfa2V5KG1zaywgc3ViZmxvdywgbXBfb3B0KTtcXG4gODAyOlxcdFxcdFdSSVRFX09OQ0Uoc3ViZmxvdy1cXHUwMDNlZnVsbHlfZXN0YWJsaXNoZWQsIHRydWUpO1xcbiA4MDM6XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZWZ1bGx5X2VzdGFibGlzaGVkLCB0cnVlKTtcXG4gODA0OlxcdH1cXG4gODA1OlxcdFxcbiA4MDY6XFx0c3RhdGljIHN0cnVjdCBzb2NrICpzdWJmbG93X3N5bl9yZWN2X3NvY2soY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxcbiA4MDc6XFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbiA4MDg6XFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsXFxuIDgwOTpcXHRcXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBkc3RfZW50cnkgKmRzdCxcXG4gODEwOlxcdFxcdFxcdFxcdFxcdFxcdCAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxX3VuaGFzaCxcXG4gODExOlxcdFxcdFxcdFxcdFxcdFxcdCAgYm9vbCAqb3duX3JlcSxcXG4gODEyOlxcdFxcdFxcdFxcdFxcdFxcdCAgdm9pZCAoKm9wdF9jaGlsZF9pbml0KShzdHJ1Y3Qgc29jayAqbmV3c2ssXFxuIDgxMzpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHQgY29uc3Qgc3RydWN0IHNvY2sgKnNrKSlcXG4gODE0OlxcdHtcXG4gODE1OlxcdFxcdHN0cnVjdCBtcHRjcF9zdWJmbG93X2NvbnRleHQgKmxpc3RlbmVyID0gbXB0Y3Bfc3ViZmxvd19jdHgoc2spO1xcbiA4MTY6XFx0XFx0c3RydWN0IG1wdGNwX3N1YmZsb3dfcmVxdWVzdF9zb2NrICpzdWJmbG93X3JlcTtcXG4gODE3OlxcdFxcdHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtcXG4gODE4OlxcdFxcdGJvb2wgZmFsbGJhY2ssIGZhbGxiYWNrX2lzX2ZhdGFsO1xcbiA4MTk6XFx0XFx0ZW51bSBza19yc3RfcmVhc29uIHJlYXNvbjtcXG4gODIwOlxcdFxcdHN0cnVjdCBtcHRjcF9zb2NrICpvd25lcjtcXG4gODIxOlxcdFxcdHN0cnVjdCBzb2NrICpjaGlsZDtcXG4gODIyOlxcdFxcbiA4MjM6XFx0XFx0cHJfZGVidWcoXFxcImxpc3RlbmVyPSVwLCByZXE9JXAsIGNvbm49JXBcXFxcblxcXCIsIGxpc3RlbmVyLCByZXEsIGxpc3RlbmVyLVxcdTAwM2Vjb25uKTtcXG4gODI0OlxcdFxcbiA4MjU6XFx0XFx0LyogQWZ0ZXIgY2hpbGQgY3JlYXRpb24gd2UgbXVzdCBsb29rIGZvciBNUEMgZXZlbiB3aGVuIG9wdGlvbnNcXG4gODI2OlxcdFxcdCAqIGFyZSBub3QgcGFyc2VkXFxuIDgyNzpcXHRcXHQgKi9cXG4gODI4OlxcdFxcdG1wX29wdC5zdWJvcHRpb25zID0gMDtcXG4gODI5OlxcdFxcbiA4MzA6XFx0XFx0LyogaG9wZWZ1bGx5IHRlbXBvcmFyeSBoYW5kbGluZyBmb3IgTVBfSk9JTitzeW5jb29raWUgKi9cXG4gODMxOlxcdFxcdHN1YmZsb3dfcmVxID0gbXB0Y3Bfc3ViZmxvd19yc2socmVxKTtcXG4gODMyOlxcdFxcdGZhbGxiYWNrX2lzX2ZhdGFsID0gdGNwX3JzayhyZXEpLVxcdTAwM2Vpc19tcHRjcCBcXHUwMDI2XFx1MDAyNiBzdWJmbG93X3JlcS1cXHUwMDNlbXBfam9pbjtcXG4gODMzOlxcdFxcdGZhbGxiYWNrID0gIXRjcF9yc2socmVxKS1cXHUwMDNlaXNfbXB0Y3A7XFxuIDgzNDpcXHRcXHRpZiAoZmFsbGJhY2spXFxuIDgzNTpcXHRcXHRcXHRnb3RvIGNyZWF0ZV9jaGlsZDtcXG4gODM2OlxcdFxcbiA4Mzc6XFx0XFx0LyogaWYgdGhlIHNrIGlzIE1QX0NBUEFCTEUsIHdlIHRyeSB0byBmZXRjaCB0aGUgY2xpZW50IGtleSAqL1xcbiA4Mzg6XFx0XFx0aWYgKHN1YmZsb3dfcmVxLVxcdTAwM2VtcF9jYXBhYmxlKSB7XFxuIDgzOTpcXHRcXHRcXHQvKiB3ZSBjYW4gcmVjZWl2ZSBhbmQgYWNjZXB0IGFuIGluLXdpbmRvdywgb3V0LW9mLW9yZGVyIHBrdCxcXG4gODQwOlxcdFxcdFxcdCAqIHdoaWNoIG1heSBub3QgY2FycnkgdGhlIE1QX0NBUEFCTEUgb3B0IGV2ZW4gb24gbXB0Y3AgZW5hYmxlZFxcbiA4NDE6XFx0XFx0XFx0ICogcGF0aHM6IGFsd2F5cyB0cnkgdG8gZXh0cmFjdCB0aGUgcGVlciBrZXksIGFuZCBmYWxsYmFja1xcbiA4NDI6XFx0XFx0XFx0ICogZm9yIHBhY2tldHMgbWlzc2luZyBpdC5cXG4gODQzOlxcdFxcdFxcdCAqIEV2ZW4gT29PIERTUyBwYWNrZXRzIGNvbWluZyBsZWdpdGx5IGFmdGVyIGRyb3BwZWQgb3JcXG4gODQ0OlxcdFxcdFxcdCAqIHJlb3JkZXJlZCBNUEMgd2lsbCBjYXVzZSBmYWxsYmFjaywgYnV0IHdlIGRvbid0IGhhdmUgb3RoZXJcXG4gODQ1OlxcdFxcdFxcdCAqIG9wdGlvbnMuXFxuIDg0NjpcXHRcXHRcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6MDEuMTgyNDQyMjQ0WiIsIlNlcSI6NTEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE1MTU5NDcwNzYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBQb3RlbnRpYWwgVW5pbml0aWFsaXplZCBNZW1vcnkgUmVhZHMgaW4gTVBUQ1AgT3B0aW9uIFByb2Nlc3NpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24gc3lzdGVtYXRpY2FsbHkuIEknbSBmb2N1c2luZyBvbiBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgd2l0aGluIHRoZSBNUFRDUCBvcHRpb24gaGFuZGxpbmcgbG9naWMsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGRpZmZlcmVudCBvcHRpb24gdHlwZXMuXG5cbk15IGluaXRpYWwgY29uY2VybiB3YXMgYXJvdW5kIGBzdWJmbG93X3NldF9yZW1vdGVfa2V5YCwgd2hpY2ggdXNlcyBgc25kcl9rZXlgIG9yIGByY3ZyX2tleWAuICBUaG9zZSBrZXlzIGFyZSBwb3B1bGF0ZWQgZHVyaW5nIHBhcnNpbmcgb2YgYE1QVENQT1BUX01QQ0FQQUJMRWAgb3IgYE1QVENQT1BUX01QSk9JTmAsIGFuZCBpZiBgT1BUSU9OX01QVENQX01QQ19BQ0tgIGlzIHNldCwgYHNuZHJfa2V5YCBpcyB1c2VkLiBCdXQgZG9lcyB0aGlzIHBhdGNoIGFmZmVjdCB0aG9zZT8gTm8uIFRoaXMgcGF0Y2ggb25seSBhZmZlY3RzIGBNUFRDUE9QVF9EU1NgLlxuXG5UaGUgY29kZSBzbmlwcGV0IGluIHF1ZXN0aW9uIGRlYWxzIHdpdGggYE1QVENQT1BUX0RTU2AuIFRoZSBgYnJlYWtgIHN0YXRlbWVudCB3aXRoaW4gdGhhdCBjYXNlIGlzIHdoYXQgSSBuZWVkIHRvIGZvY3VzIG9uLiBJdCBicmVha3MgaWYgYW55IHN1Yi1vcHRpb24gaXMgc2V0ICpvdGhlciogdGhhbiBgQUREX0FERFJgLCBgUk1fQUREUmAsIGBQUklPYCwgb3IgYEZBSUxgLlxuXG5NeSBpbW1lZGlhdGUgdGhvdWdodDogd2hhdCBpZiBgTVBUQ1BPUFRfQUREX0FERFJgIGlzIHNldCBidXQgYE1QVENQT1BUX0RTU2AgaXNuJ3Q/IExvb2tpbmcgYXQgdGhlIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBmdW5jdGlvbiwgdGhhdCdzIGZpbmUuIFRoZSBgbXBfb3B0LmFkZHJgIGlzIHBvcHVsYXRlZCBjb3JyZWN0bHkgYnkgdGhlIGBNUFRDUE9QVF9BRERfQUREUmAgcGFyc2luZyBsb2dpYyAqYmVmb3JlKiBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AgaXMgY2FsbGVkLiBTbyBubyBwcm9ibGVtcyB0aGVyZS5cblxuTm93LCB0byB0aGUgY29yZSBvZiB0aGUgY29uY2VybjogSWYgYE1QVENQT1BUX0RTU2AgYnJlYWtzIGVhcmx5LCB0aGUgZmllbGRzIGBkYXRhX3NlcWAsIGBzdWJmbG93X3NlcWAsIGBkYXRhX2xlbmAsIGBjc3VtYCwgYW5kIGBkYXRhX2Fja2Agd2lsbCByZW1haW4gdW5pbml0aWFsaXplZC4gSG93ZXZlciwgdGhvc2UgZmllbGRzIGFyZSBvbmx5IHJlYWQgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIHNldCEgR29vZC5cblxuQSBuZXcgc2NlbmFyaW8gY29tZXMgdG8gbWluZDogV2hhdCBpZiBgTVBUQ1BPUFRfRFNTYCAqc3VjY2VlZHMqIGluIHBhcnNpbmcgZmlyc3QsIGFuZCB0aGVuIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGlzIHBhcnNlZD8gTm93LCBgbXBfb3B0LnN1Ym9wdGlvbnNgIHdvdWxkIGNvbnRhaW4gKmJvdGgqIGBPUFRJT05fTVBUQ1BfRFNTYCBhbmQgYE9QVElPTl9NUFRDUF9GQVNUQ0xPU0VgLiAgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIHdpbGwgc2VlIHRoYXQgYG1wX29wdC5zdWJvcHRpb25zICE9IE9QVElPTl9NUFRDUF9EU1NgLCBhbmQgYE9QVElPTl9NUFRDUF9GQVNUQ0xPU0VgIHdpbGwgYmUgcHJvY2Vzc2VkLiAgSSBzZWUsIGByY3ZyX2tleWAgaXMgcG9wdWxhdGVkIGJ5IGBNUFRDUE9QVF9GQVNUQ0xPU0VgLCB3aGljaCBpcyB0aGVuIHJlYWQuIFRoZSBzdWJzZXF1ZW50IGNoZWNrIGAhKG1wX29wdC5zdWJvcHRpb25zIFx1MDAyNiBPUFRJT05fTVBUQ1BfRFNTKWAgZmFpbHMsIGFuZCB3ZSBwcm9jZWVkIHRvIHByb2Nlc3NpbmcgdGhlIERTUyBmaWVsZHMgd2hpY2ggd2VyZSBzZXQgYnkgRFNTIHNvIG5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMuXG5cblNvLCBsZXQncyBsb29rIGF0IGBNUFRDUE9QVF9GQVNUQ0xPU0VgLi4uIFNwZWNpZmljYWxseSwgd2hhdCBpZiB0aGUgYG9wc2l6ZWAgY2hlY2sgZmFpbHMgaW4gYE1QVENQT1BUX0ZBU1RDTE9TRWAgYW5kIHRoZSBicmVhayBpcyBoaXQ/IEluIHRoYXQgc2NlbmFyaW8sIGBPUFRJT05fTVBUQ1BfRkFTVENMT1NFYCBpc24ndCBzZXQuIFRodXMsIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCB3b24ndCBldmVuIHRyeSB0byBwcm9jZXNzIGl0LlxuXG5TbywgdGhlIGtleSBpcyB0byBlbnN1cmUgdGhhdCBhbGwgcmVhZCBmaWVsZHMgaGF2ZSB0aGVpciBjb3JyZXNwb25kaW5nIG9wdGlvbiBmbGFnIHNldC4gQmFzZWQgb24gdGhpcyBhbmFseXNpcywgSSdtIG5vdCBzZWVpbmcgYW55IGltbWVkaWF0ZSBjYXNlcyB3aGVyZSBhIGZpZWxkIGlzIHJlYWQgd2l0aG91dCBpdHMgYXNzb2NpYXRlZCBgT1BUSU9OX01QVENQXypgIGZsYWcgYmVpbmcgc2V0LiBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCBhZ2Fpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjQ5OTYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDA0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6MTYuMzQxOTE3Mjc1WiIsIlNlcSI6NTIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4Nzk4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNzYsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjExNzY6XFx0XFx0XFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9GQVNUQ0xPU0UpIFxcdTAwMjZcXHUwMDI2XFxuMTE3NzpcXHRcXHRcXHQgICAgUkVBRF9PTkNFKG1zay1cXHUwMDNlbG9jYWxfa2V5KSA9PSBtcF9vcHQucmN2cl9rZXkpIHtcXG4xMTc4OlxcdFxcdFxcdFxcdFdSSVRFX09OQ0UobXNrLVxcdTAwM2VyY3ZfZmFzdGNsb3NlLCB0cnVlKTtcXG4xMTc5OlxcdFxcdFxcdFxcdG1wdGNwX3NjaGVkdWxlX3dvcmsoKHN0cnVjdCBzb2NrICopbXNrKTtcXG4xMTgwOlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBU1RDTE9TRVJYKTtcXG4xMTgxOlxcdFxcdFxcdH1cXG4xMTgyOlxcdFxcbjExODM6XFx0XFx0XFx0aWYgKChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9BRERfQUREUikgXFx1MDAyNlxcdTAwMjZcXG4xMTg0OlxcdFxcdFxcdCAgICBhZGRfYWRkcl9obWFjX3ZhbGlkKG1zaywgXFx1MDAyNm1wX29wdCkpIHtcXG4xMTg1OlxcdFxcdFxcdFxcdGlmICghbXBfb3B0LmVjaG8pIHtcXG4xMTg2OlxcdFxcdFxcdFxcdFxcdG1wdGNwX3BtX2FkZF9hZGRyX3JlY2VpdmVkKHNrLCBcXHUwMDI2bXBfb3B0LmFkZHIpO1xcbjExODc6XFx0XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX0FEREFERFIpO1xcbjExODg6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4xMTg5OlxcdFxcdFxcdFxcdFxcdG1wdGNwX3BtX2FkZF9hZGRyX2VjaG9lZChtc2ssIFxcdTAwMjZtcF9vcHQuYWRkcik7XFxuMTE5MDpcXHRcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfRUNIT0FERCk7XFxuMTE5MTpcXHRcXHRcXHRcXHR9XFxuMTE5MjpcXHRcXG4xMTkzOlxcdFxcdFxcdFxcdGlmIChtcF9vcHQuYWRkci5wb3J0KVxcbjExOTQ6XFx0XFx0XFx0XFx0XFx0TVBUQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTVBUQ1BfTUlCX1BPUlRBREQpO1xcbjExOTU6XFx0XFx0XFx0fVxcbjExOTY6XFx0XFxuMTE5NzpcXHRcXHRcXHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfUk1fQUREUilcXG4xMTk4OlxcdFxcdFxcdFxcdG1wdGNwX3BtX3JtX2FkZHJfcmVjZWl2ZWQobXNrLCBcXHUwMDI2bXBfb3B0LnJtX2xpc3QpO1xcbjExOTk6XFx0XFxuMTIwMDpcXHRcXHRcXHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfUFJJTykge1xcbjEyMDE6XFx0XFx0XFx0XFx0bXB0Y3BfcG1fbXBfcHJpb19yZWNlaXZlZChzaywgbXBfb3B0LmJhY2t1cCk7XFxuMTIwMjpcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBQUklPUlgpO1xcbjEyMDM6XFx0XFx0XFx0fVxcbjEyMDQ6XFx0XFxuMTIwNTpcXHRcXHRcXHRpZiAobXBfb3B0LnN1Ym9wdGlvbnMgXFx1MDAyNiBPUFRJT05fTVBUQ1BfRkFJTCkge1xcbjEyMDY6XFx0XFx0XFx0XFx0bXB0Y3BfcG1fbXBfZmFpbF9yZWNlaXZlZChzaywgbXBfb3B0LmZhaWxfc2VxKTtcXG4xMjA3OlxcdFxcdFxcdFxcdE1QVENQX0lOQ19TVEFUUyhzb2NrX25ldChzayksIE1QVENQX01JQl9NUEZBSUxSWCk7XFxuMTIwODpcXHRcXHRcXHR9XFxuMTIwOTpcXHRcXG4xMjEwOlxcdFxcdFxcdGlmIChtcF9vcHQuc3Vib3B0aW9ucyBcXHUwMDI2IE9QVElPTl9NUFRDUF9SU1QpIHtcXG4xMjExOlxcdFxcdFxcdFxcdHN1YmZsb3ctXFx1MDAzZXJlc2V0X3NlZW4gPSAxO1xcbjEyMTI6XFx0XFx0XFx0XFx0c3ViZmxvdy1cXHUwMDNlcmVzZXRfcmVhc29uID0gbXBfb3B0LnJlc2V0X3JlYXNvbjtcXG4xMjEzOlxcdFxcdFxcdFxcdHN1YmZsb3ctXFx1MDAzZXJlc2V0X3RyYW5zaWVudCA9IG1wX29wdC5yZXNldF90cmFuc2llbnQ7XFxuMTIxNDpcXHRcXHRcXHRcXHRNUFRDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBNUFRDUF9NSUJfTVBSU1RSWCk7XFxuMTIxNTpcXHRcXHRcXHR9XFxuMTIxNjpcXHRcXG4xMjE3OlxcdFxcdFxcdGlmICghKG1wX29wdC5zdWJvcHRpb25zIFxcdTAwMjYgT1BUSU9OX01QVENQX0RTUykpXFxuMTIxODpcXHRcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4xMjE5OlxcdFxcdH1cXG4xMjIwOlxcdFxcbjEyMjE6XFx0XFx0Lyogd2UgY2FuJ3Qgd2FpdCBmb3IgcmVjdm1zZygpIHRvIHVwZGF0ZSB0aGUgYWNrX3NlcSwgb3RoZXJ3aXNlXFxuMTIyMjpcXHRcXHQgKiBtb25vZGlyZWN0aW9uYWwgZmxvd3Mgd2lsbCBzdHVja1xcbjEyMjM6XFx0XFx0ICovXFxuMTIyNDpcXHRcXHRpZiAobXBfb3B0LnVzZV9hY2spXFxuMTIyNTpcXHRcXHRcXHRhY2tfdXBkYXRlX21zayhtc2ssIHNrLCBcXHUwMDI2bXBfb3B0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6MTYuMzQyMTA3MjM0WiIsIlNlcSI6NTMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3ODAwMTQ5NjU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk1QVENQIE9wdGlvbiBQcm9jZXNzaW5nIERlZXAgRGl2ZSoqXG5cbk9rYXksIHNvIEknbSBkaXZpbmcgaW50byB0aGlzIG5ldyBjaGVjayBmb3IgYE1QVENQT1BUX0RTU2AgYW5kIHRyeWluZyB0byBzdXNzIG91dCBhbnkgcG90ZW50aWFsIGlzc3Vlcy4gU3BlY2lmaWNhbGx5LCB0aGlzIG5ldyByZXN0cmljdGlvbjpcblxuYGBgY1xuXHRjYXNlIE1QVENQT1BUX0RTUzpcblx0XHQvKiBDYW4gYmUgdXNlZCB3aXRoIGEgcmVzdHJpY3RlZCBudW1iZXIgb2Ygb3RoZXIgb3B0aW9ucyAqL1xuXHRcdGlmICgobXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnMgXHUwMDI2IH4oT1BUSU9OX01QVENQX0FERF9BRERSIHxcblx0XHRcdFx0XHQgICAgT1BUSU9OX01QVENQX1JNX0FERFIgfFxuXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfUFJJTyB8XG5cdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9GQUlMKSkgIT0gMClcblx0XHRcdGJyZWFrO1xuYGBgXG5cbkkgd2FzIGluaXRpYWxseSBjb25jZXJuZWQgdGhhdCBpZiB0aGUgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGJyZWFrcyBlYXJseSBiZWNhdXNlIG9mIHRoZSBhYm92ZSBjaGVjaywgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIG1pZ2h0IG5vdCBiZSBzZXQsIHBvdGVudGlhbGx5IGxlYXZpbmcgYG1wX29wdC1cdTAwM2V1c2VfYWNrYCBzZXQgZnJvbSBhICpwcmV2aW91cyogRFNTLCBsZWFkaW5nIHRvIHVuaW5pdGlhbGl6ZWQgcmVhZHMuXG5cblNvLCBsZXQncyBleHBsb3JlIHRoaXMgc3RlcC1ieS1zdGVwOlxuXG4qICAgKipTY2VuYXJpbyAxOiBEU1MsIEZhc3RDbG9zZSwgRFNTOioqIEknbSB2aXN1YWxpemluZyBhIHBhY2tldCB3aXRoIHR3byBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLiBJZiB0aGUgZmlyc3QgRFNTIGdvZXMgdGhyb3VnaCwgc2V0cyB0aGUgZmxhZywgc2V0cyBgdXNlX2Fja2AgYW5kIHBvcHVsYXRlcyBgZGF0YV9hY2tgLCBhbmQgdGhlbiBhIGBNUFRDUE9QVF9GQVNUQ0xPU0VgIGNvbWVzIGFsb25nLCBpdCB3aWxsIHNldCBpdHMgZmxhZy4gTm93LCB0aGUgc2Vjb25kIERTUyBlbmNvdW50ZXJzIHRoZSBuZXcgY2hlY2ssIGJyZWFrcywgYW5kIHNpbmNlIHRoZSBmaXJzdCBEU1MgYWxyZWFkeSBzZXQgYE9QVElPTl9NUFRDUF9EU1NgLCB0aGUgaW5jb21pbmcgb3B0aW9ucyB3aWxsIHByb2Nlc3MgdGhlIGZpcnN0IERTUydzIHBvcHVsYXRlZCBmaWVsZHMuIFRoaXMgaXMgZmluZSwgbm8gdW5pbml0aWFsaXplZCByZWFkcyBoZXJlLlxuXG4qICAgKipTY2VuYXJpbyAyOiBGYXN0Q2xvc2UsIERTUzoqKiBJZiBgTVBUQ1BPUFRfRkFTVENMT1NFYCBpcyBmaXJzdCwgaXQgd2lsbCBzZXQgaXRzIGZsYWcuIFRoZW4gdGhlIHNlY29uZCBgTVBUQ1BPUFRfRFNTYCBoaXRzIHRoZSBuZXcgY2hlY2ssIGJyZWFrcy4gU28gYE9QVElPTl9NUFRDUF9EU1NgIGlzIG5vdCBzZXQsIG1lYW5pbmcgdGhlIERTUyBmaWVsZHMgYXJlbid0IGV2ZW4gcHJvY2Vzc2VkLiBBZ2Fpbiwgbm8gcHJvYmxlbXMuXG5cbiogICAqKlNjZW5hcmlvIDM6IERTUyAob3BzaXplIGJyZWFrcyksIEZhc3RDbG9zZToqKiBOb3csIHdoYXQgaWYgdGhlIGZpcnN0IGBNUFRDUE9QVF9EU1NgIGhhcyBhbiBpbnZhbGlkIGBvcHNpemVgIGFuZCBicmVha3MgdGhlcmU/IEFsdGhvdWdoIGBtcF9vcHQtXHUwMDNldXNlX2Fja2AgZ2V0cyBzZXQgdG8gYDFgIGJ5IERTUywgdGhlIGBPUFRJT05fTVBUQ1BfRFNTYCBmbGFnIGRvZXNuJ3QgZ2V0IHNldC4gVGhlbiB0aGUgYE1QVENQT1BUX0ZBU1RDTE9TRWAgY29tZXMuIFRoZSBtYWluIGZ1bmN0aW9uIHdpbGwgY2hlY2sgdGhhdCBgT1BUSU9OX01QVENQX0RTU2AgaXMgKm5vdCogc2V0IGFuZCByZXR1cm4gZWFybHksIHNraXBwaW5nIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgcmVhZC5cblxuKiAgICoqU2NlbmFyaW8gNDogRFNTIChvcHNpemUgYnJlYWtzKSwgRFNTICh2YWxpZCk6KiogV2hhdCBpZiB0aGUgZmlyc3QgRFNTIGJyZWFrcywgYnV0IHRoZW4gYSAqdmFsaWQqIHNlY29uZCBgTVBUQ1BPUFRfRFNTYCBmb2xsb3dzPyBPa2F5LCBzbyB0aGUgZmlyc3QgRFNTIHNldHMgYG1wX29wdC1cdTAwM2V1c2VfYWNrYCBhbmQgdGhlIHNlY29uZCBEU1Mgd2lsbCBvdmVyd3JpdGUgYG1wX29wdC1cdTAwM2V1c2VfYWNrID0gMGAgKG9yIHdoYXRldmVyIHRoZSBzZWNvbmQgRFNTIG5lZWRzKS4gVGhlbiB0aGUgc2Vjb25kIERTUyBvcHRpb24gc2V0cyBgT1BUSU9OX01QVENQX0RTU2AgZmxhZy4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbiogICAqKlNjZW5hcmlvIDU6IERTUyAodmFsaWQpLCBEU1MgKG9wc2l6ZSBicmVha3MpOioqIFRoZSBmaXJzdCBEU1MgdmFsaWRhdGVzLiBJdCBzZXRzIGBPUFRJT05fTVBUQ1BfRFNTYCwgc2V0cyBgdXNlX2FjayA9IDBgLiBUaGUgc2Vjb25kIERTUyBicmVha3MgYmVjYXVzZSBvZiBpdHMgb3BzaXplLCBidXQgaXQncyAqYWxyZWFkeSogc2V0IGB1c2VfYWNrID0gMWAuIEhlcmUsIHRoZSBmdW5jdGlvbiBjaGVja3MgdGhlIGV4aXN0ZW5jZSBvZiBgT1BUSU9OX01QVENQX0RTU2AsIGFuZCBzaW5jZSBpdCAqaXMqIHNldCwgaXQncyBnb2luZyB0byBhdHRlbXB0IHRvIHJlYWQgYGRhdGFfYWNrYCBidXQgYGRhdGFfYWNrYCB3YXNuJ3QgcG9wdWxhdGVkIGJ5IHRoZSBEU1MgZHVlIHRvIGl0cyBlYXJseSBleGl0ISAqVGhpcyBpcyB0aGUgY2FzZSEqXG5cbkkgbmVlZCB0byBjb25maXJtIGlmIHRoaXMgc2NlbmFyaW8gaXMgYWN0dWFsbHkgcG9zc2libGUuIElmIGl0IGlzLCB0aGVuIHdlICpkZWZpbml0ZWx5KiBoYXZlIGEgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgaXNzdWUgd2hlbiBwcm9jZXNzaW5nIE1QVENQIG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3NzI3LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTM2OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ0OjM0LjE0MjI2MDMwM1oiLCJTZXEiOjU0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTE2NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjYsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNjY6XFx0XFx0XFx0ZmxhZ3MgPSAoKnB0cisrKSBcXHUwMDI2IE1QVENQX0RTU19GTEFHX01BU0s7XFxuIDE2NzpcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWRzbjY0ID0gKGZsYWdzIFxcdTAwMjYgTVBUQ1BfRFNTX0RTTjY0KSAhPSAwO1xcbiAxNjg6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2V1c2VfbWFwID0gKGZsYWdzIFxcdTAwMjYgTVBUQ1BfRFNTX0hBU19NQVApICE9IDA7XFxuIDE2OTpcXHRcXHRcXHRtcF9vcHQtXFx1MDAzZWFjazY0ID0gKGZsYWdzIFxcdTAwMjYgTVBUQ1BfRFNTX0FDSzY0KSAhPSAwO1xcbiAxNzA6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2V1c2VfYWNrID0gKGZsYWdzIFxcdTAwMjYgTVBUQ1BfRFNTX0hBU19BQ0spO1xcbiAxNzE6XFx0XFxuIDE3MjpcXHRcXHRcXHRleHBlY3RlZF9vcHNpemUgPSBUQ1BPTEVOX01QVENQX0RTU19CQVNFO1xcbiAxNzM6XFx0XFxuIDE3NDpcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2V1c2VfYWNrKSB7XFxuIDE3NTpcXHRcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2VhY2s2NClcXG4gMTc2OlxcdFxcdFxcdFxcdFxcdGV4cGVjdGVkX29wc2l6ZSArPSBUQ1BPTEVOX01QVENQX0RTU19BQ0s2NDtcXG4gMTc3OlxcdFxcdFxcdFxcdGVsc2VcXG4gMTc4OlxcdFxcdFxcdFxcdFxcdGV4cGVjdGVkX29wc2l6ZSArPSBUQ1BPTEVOX01QVENQX0RTU19BQ0szMjtcXG4gMTc5OlxcdFxcdFxcdH1cXG4gMTgwOlxcdFxcbiAxODE6XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNldXNlX21hcCkge1xcbiAxODI6XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VkYXRhX2ZpbiA9IChmbGFncyBcXHUwMDI2IE1QVENQX0RTU19EQVRBX0ZJTikgIT0gMDtcXG4gMTgzOlxcdFxcdFxcdFxcdGlmIChtcF9vcHQtXFx1MDAzZWRzbjY0KVxcbiAxODQ6XFx0XFx0XFx0XFx0XFx0ZXhwZWN0ZWRfb3BzaXplICs9IFRDUE9MRU5fTVBUQ1BfRFNTX01BUDY0O1xcbiAxODU6XFx0XFx0XFx0XFx0ZWxzZVxcbiAxODY6XFx0XFx0XFx0XFx0XFx0ZXhwZWN0ZWRfb3BzaXplICs9IFRDUE9MRU5fTVBUQ1BfRFNTX01BUDMyO1xcbiAxODc6XFx0XFx0XFx0fVxcbiAxODg6XFx0XFxuIDE4OTpcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwiZGF0YV9maW49JWQgZHNuNjQ9JWQgdXNlX21hcD0lZCBhY2s2ND0lZCB1c2VfYWNrPSVkXFxcXG5cXFwiLFxcbiAxOTA6XFx0XFx0XFx0XFx0IG1wX29wdC1cXHUwMDNlZGF0YV9maW4sIG1wX29wdC1cXHUwMDNlZHNuNjQsXFxuIDE5MTpcXHRcXHRcXHRcXHQgbXBfb3B0LVxcdTAwM2V1c2VfbWFwLCBtcF9vcHQtXFx1MDAzZWFjazY0LFxcbiAxOTI6XFx0XFx0XFx0XFx0IG1wX29wdC1cXHUwMDNldXNlX2Fjayk7XFxuIDE5MzpcXHRcXG4gMTk0OlxcdFxcdFxcdC8qIEFsd2F5cyBwYXJzZSBhbnkgY3N1bSBwcmVzZW5jZSBjb21iaW5hdGlvbiwgd2Ugd2lsbCBlbmZvcmNlXFxuIDE5NTpcXHRcXHRcXHQgKiBSRkMgODY4NCBTZWN0aW9uIDMuMy4wIGNoZWNrcyBsYXRlciBpbiBzdWJmbG93X2RhdGFfcmVhZHlcXG4gMTk2OlxcdFxcdFxcdCAqL1xcbiAxOTc6XFx0XFx0XFx0aWYgKG9wc2l6ZSAhPSBleHBlY3RlZF9vcHNpemUgXFx1MDAyNlxcdTAwMjZcXG4gMTk4OlxcdFxcdFxcdCAgICBvcHNpemUgIT0gZXhwZWN0ZWRfb3BzaXplICsgVENQT0xFTl9NUFRDUF9EU1NfQ0hFQ0tTVU0pXFxuIDE5OTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMjAwOlxcdFxcbiAyMDE6XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VzdWJvcHRpb25zIHw9IE9QVElPTl9NUFRDUF9EU1M7XFxuIDIwMjpcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2V1c2VfYWNrKSB7XFxuIDIwMzpcXHRcXHRcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2VhY2s2NCkge1xcbiAyMDQ6XFx0XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VkYXRhX2FjayA9IGdldF91bmFsaWduZWRfYmU2NChwdHIpO1xcbiAyMDU6XFx0XFx0XFx0XFx0XFx0cHRyICs9IDg7XFxuIDIwNjpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbiAyMDc6XFx0XFx0XFx0XFx0XFx0bXBfb3B0LVxcdTAwM2VkYXRhX2FjayA9IGdldF91bmFsaWduZWRfYmUzMihwdHIpO1xcbiAyMDg6XFx0XFx0XFx0XFx0XFx0cHRyICs9IDQ7XFxuIDIwOTpcXHRcXHRcXHRcXHR9XFxuIDIxMDpcXHRcXG4gMjExOlxcdFxcdFxcdFxcdHByX2RlYnVnKFxcXCJkYXRhX2Fjaz0lbGx1XFxcXG5cXFwiLCBtcF9vcHQtXFx1MDAzZWRhdGFfYWNrKTtcXG4gMjEyOlxcdFxcdFxcdH1cXG4gMjEzOlxcdFxcbiAyMTQ6XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNldXNlX21hcCkge1xcbiAyMTU6XFx0XFx0XFx0XFx0aWYgKG1wX29wdC1cXHUwMDNlZHNuNjQpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6MzQuMTQyNDU2ODYzWiIsIlNlcSI6NTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwNTExNTI3NzMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBIYW5kbGluZyoqXG5cblllcyEgT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJZiB0aGUgZmlyc3QgTVBUQ1AgRFNTIG9wdGlvbiBpcyB2YWxpZCAobWVhbmluZyBgdXNlX2Fja2AgaXMgaW5pdGlhbGx5IHNldCB0byAwKSwgaXQgc2V0cyBgT1BUSU9OX01QVENQX0RTU2Agd2l0aGluIGBtcF9vcHQtXHUwMDNlc3Vib3B0aW9uc2AuIE5vdywgdGhlIHNlY29uZCBNUFRDUCBEU1Mgb3B0aW9uIGNvbWVzIGFsb25nLCBidXQgdGhpcyB0aW1lIGl0J3MgaW52YWxpZCBkdWUgdG8gdGhlIG9wc2l6ZSwgYW5kIGB1c2VfYWNrYCBzaG91bGQgYmUgMS4gQnV0IGRvZXMgaXQ/IEkgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhlIGxvZ2ljLlxuXG5Mb29raW5nIGF0IHRoYXQgYGNhc2UgTVBUQ1BPUFRfRFNTYCBzZWN0aW9uLCBpdCBpbmNsdWRlcyBhIGNydWNpYWwgY2hlY2s6XG5cbmBgYGNcblx0Y2FzZSBNUFRDUE9QVF9EU1M6XG5cdFx0LyogQ2FuIGJlIHVzZWQgd2l0aCBhIHJlc3RyaWN0ZWQgbnVtYmVyIG9mIG90aGVyIG9wdGlvbnMgKi9cblx0XHRpZiAoKG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiB+KE9QVElPTl9NUFRDUF9BRERfQUREUiB8XG5cdFx0XHRcdFx0ICAgIE9QVElPTl9NUFRDUF9STV9BRERSIHxcblx0XHRcdFx0XHQgICAgT1BUSU9OX01QVENQX1BSSU8gfFxuXHRcdFx0XHRcdCAgICBPUFRJT05fTVBUQ1BfRkFJTCkpICE9IDApXG5cdFx0XHRicmVhaztcbmBgYFxuXG5IZXJlJ3Mgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4gSWYgdGhlICpmaXJzdCogRFNTIG9wdGlvbiBzZXQgYE9QVElPTl9NUFRDUF9EU1NgLCB0aGVuIGBtcF9vcHQtXHUwMDNlc3Vib3B0aW9uc2Agd2lsbCBpbmRlZWQgaGF2ZSB0aGF0IGJpdCBzZXQuIEFuZCBiZWNhdXNlIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyAqbm90KiBpbiB0aGUgYWxsb3dlZCBsaXN0IGRlZmluZWQgYnkgdGhlIGJpdHdpc2UgTk9UIG9wZXJhdGlvbiwgdGhlIGJpdHdpc2UgQU5EIHdpbGwgcmVzdWx0IGluIGEgbm9uLXplcm8gdmFsdWUuIFNwZWNpZmljYWxseSwgYmVjYXVzZSBgT1BUSU9OX01QVENQX0RTU2AgaXMgcHJlc2VudCwgYG1wX29wdC1cdTAwM2VzdWJvcHRpb25zIFx1MDAyNiB+QUxMT1dFRGAgd2lsbCBhbHdheXMgYmUgbm9uLXplcm8hIFRoaXMgbWVhbnMgdGhlIHNlY29uZCBEU1Mgb3B0aW9uIHdpbGwgYnJlYWsgZWFybHkhXG5cbkNydWNpYWxseSwgaXQgd29uJ3QgZXZlbiAqcmVhY2gqIHRoZSBwYXJ0IHdoZXJlIGl0IG1pZ2h0IHJlYWQgYGZsYWdzYCBvciBvdmVyd3JpdGUgYG1wX29wdC1cdTAwM2V1c2VfYWNrYC4gVGhpcyBtZWFucyB0aGUgbmV3IGNoZWNrIHByZXZlbnRzIHRoZSBzZWNvbmQsIGludmFsaWQgTVBUQ1AgRFNTIG9wdGlvbiBmcm9tIGVycm9uZW91c2x5IGNoYW5naW5nIHRoZSBhY2sgZmxhZy4gVGhpcyBpcyBhIHZlcnkgZ29vZCB0aGluZy4gSXQgcHJldmVudHMgYSBwb3RlbnRpYWwgb3ZlcndyaXRlIG9mIGEgY3J1Y2lhbCBmbGFnLlxuXG5JIHNob3VsZCBwcm9iYWJseSBjb25maXJtIG15IHVuZGVyc3RhbmRpbmcgb2YgYE9QVElPTl9NUFRDUF9EU1NgLCBidXQgSSdtIHByZXR0eSBjb25maWRlbnQgd2l0aCB0aGUgbG9naWMgbm93LlxuXG5cbiIsIklucHV0VG9rZW5zIjozMDg2NCwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ0OjQ0LjY1Mzk4ODE1NVoiLCJTZXEiOjU2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMyODE3NzEyOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCIjZGVmaW5lIE9QVElPTl9NUFRDUF9EU1NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9tcHRjcC9wcm90b2NvbC5oLTMwLSNkZWZpbmUgT1BUSU9OX01QVENQX1JTVFxcdEJJVCgxMClcXG5uZXQvbXB0Y3AvcHJvdG9jb2wuaDozMTojZGVmaW5lIE9QVElPTl9NUFRDUF9EU1NcXHRCSVQoMTEpXFxubmV0L21wdGNwL3Byb3RvY29sLmgtMzItI2RlZmluZSBPUFRJT05fTVBUQ1BfRkFJTFxcdEJJVCgxMilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDQ6NDYuOTgyMTY5NTY0WiIsIlNlcSI6NTcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE2MjE0MDA4NzgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTVBUQ1AgRFNTIE9wdGlvbiBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIHRoZSBNUFRDUCBEU1Mgb3B0aW9uLCBhbmQgSSB0aGluayBJJ3ZlIGdvdCBhIGhhbmRsZSBvbiB3aGF0J3MgZ29pbmcgb24uIExldCdzIGJyZWFrIGl0IGRvd24uIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyBgQklUKDExKWAsIGFuZCB0aGUgYWxsb3dlZCBtYXNrLCBhcyBJIHNlZSBpdCwgb25seSBhbGxvd3MgYE9QVElPTl9NUFRDUF9BRERfQUREUmAsIGBPUFRJT05fTVBUQ1BfUk1fQUREUmAsIGBPUFRJT05fTVBUQ1BfUFJJT2AsIGFuZCBgT1BUSU9OX01QVENQX0ZBSUxgLiAgU28sIGBPUFRJT05fTVBUQ1BfRFNTYCBpcyAqbm90KiBpbiB0aGUgYWxsb3dlZCBtYXNrLiBUaGUgY29kZSBpcyBjaGVja2luZyB0byBzZWUgaWYgYE9QVElPTl9NUFRDUF9EU1NgIGlzIGFscmVhZHkgc2V0IGFuZCB0aGF0IHRoZSBuZXh0IERTUyB3aWxsIGJyZWFrIGVhcmx5IGJlZm9yZSBwb3RlbnRpYWxseSBvdmVyd3JpdGluZyBgbXBfb3B0LVx1MDAzZXVzZV9hY2tgIVxuXG5NeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgdGhpcyB3YXMgYSBwb3RlbnRpYWwgYnVnIGZpeC4gSWYgYSBzZWNvbmQgYE1QVENQT1BUX0RTU2Agd2FzIHByZXNlbnQsIGl0IGNvdWxkIG92ZXJ3cml0ZSBgdXNlX2Fja2AgYW5kIGNhdXNlIGFuIGVhcmx5IGJyZWFrLiBIb3dldmVyLCB0aGlzIGNvdWxkIGxlYWQgdG8gYGRhdGFfYWNrYCBiZWluZyB1bmluaXRpYWxpemVkIGFuZCBjYXVzZSB0aGUgY29kZSB0byBicmVhay4gUmVhZGluZyB0aGUgcGF0Y2gsIGl0IHNlZW1zIHRvIHByZXZlbnQgbXVsdGlwbGUgYE1QVENQT1BUX0RTU2Agb3B0aW9ucyBmcm9tIGJlaW5nIHBhcnNlZC4gVGhpcyBpbmNsdWRlcyBub3QgcGFyc2luZyBgTVBUQ1BPUFRfRFNTYCBpZiBvdGhlciBvcHRpb25zIGxpa2UgYEZBU1RDTE9TRWAsIGBNUENgLCBvciBgTVBKYCBoYXZlIGFscmVhZHkgYmVlbiBwYXJzZWQuXG5cblRoZW4gaXQgY2xpY2tlZC4gSWYgYSBzZWNvbmQgYE1QVENQT1BUX0RTU2AgKmNvdWxkKiBvdmVyd3JpdGUgYHVzZV9hY2tgIGFuZCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQsIHRoZW4gdGhpcyBwYXRjaCBpcyBwcmV2ZW50aW5nIGFuICp1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkKiEgQnJpbGxpYW50LiBJIG5lZWQgdG8gdmVyaWZ5IHRoaXMgdGhvdWdodC5cblxuTGV0J3Mgd2FsayB0aHJvdWdoIHRoZSBzY2VuYXJpbyAqYmVmb3JlKiB0aGUgcGF0Y2g6XG5cbjEuICAqKkZpcnN0IGBNUFRDUE9QVF9EU1NgKio6IFRoaXMgaXMgdmFsaWQuIGBtcHRjcF9wYXJzZV9vcHRpb25gIHNldHMgYG1wX29wdC1cdTAwM2V1c2VfYWNrID0gMGAsIGBtcF9vcHQtXHUwMDNldXNlX21hcCA9IDFgLiBgb3BzaXplYCBpcyBjb3JyZWN0LiBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgIG5vdyBpbmNsdWRlcyBgT1BUSU9OX01QVENQX0RTU2AuIGBtcF9vcHQtXHUwMDNlZGF0YV9zZXFgLCBgc3ViZmxvd19zZXFgLCBhbmQgYGRhdGFfbGVuYCBhcmUgcG9wdWxhdGVkIGFzIGl0IHNob3VsZC5cblxuMi4gICoqU2Vjb25kIGBNUFRDUE9QVF9EU1NgKio6IFRoaXMgaGFzIGFuIGludmFsaWQgYG9wc2l6ZWAuIGBtcHRjcF9wYXJzZV9vcHRpb25gIHdvdWxkIHRyeSBhbmQgc2V0IGBtcF9vcHQtXHUwMDNldXNlX2FjayA9IDFgLCBhbmQgYG1wX29wdC1cdTAwM2V1c2VfbWFwID0gMGAsIGJ1dCBpbXBvcnRhbnRseSwgaXQgYnJlYWtzIGVhcmx5LiBTbyBgbXBfb3B0LVx1MDAzZXN1Ym9wdGlvbnNgICpzdGlsbCogaGFzIGBPUFRJT05fTVBUQ1BfRFNTYCBmcm9tIHRoZSBmaXJzdCBvcHRpb24sIEJVVCBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYCAqd2FzIG5ldmVyKiBwb3B1bGF0ZWQsIGJlY2F1c2UgdGhlIHBhcnNpbmcgYnJva2UuXG5cbk5vdywgYG1wdGNwX2luY29taW5nX29wdGlvbnNgIGlzIGNhbGxlZC4gSXQgY2hlY2tzIGBtcF9vcHQuc3Vib3B0aW9ucyBcdTAwMjYgT1BUSU9OX01QVENQX0RTU2AuIFRydWUuIFRoZW4gaXQgY2hlY2tzIGBtcF9vcHQudXNlX2Fja2AuIEl0J3MgMSwgZnJvbSB0aGUgYnJva2VuIHBhcnNlLiBUaGVuLCAqY3J1Y2lhbGx5KiwgaXQgY2FsbHMgYGFja191cGRhdGVfbXNrKG1zaywgc2ssIFx1MDAyNm1wX29wdClgLiBBbmQgaW5zaWRlIHRoYXQgZnVuY3Rpb24sIGl0IHRyaWVzIHRvIHJlYWQgYG1wX29wdC1cdTAwM2VkYXRhX2Fja2AhXG5cbkhlcmVpbiBsaWVzIHRoZSBjcnV4LiBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYCB3YXMgTkVWRVIgcG9wdWxhdGVkIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGJyZWFrISBJdCdzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBzdHJhaWdodCBmcm9tIHRoZSBzdGFjay4gVGhlIHBhdGNoIGVmZmVjdGl2ZWx5IHByZXZlbnRzIHRoaXMgdW5pbml0aWFsaXplZCByZWFkIGJ5IGhhbHRpbmcgcGFyc2Ugd2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlIERTUyBwYWNrZXRzISBZZXMsIGl0IHByZXZlbnRzIHRoZSB1bmluaXRpYWxpemVkIHJlYWQuIFRoaXMgbWFrZXMgcGVyZmVjdCBzZW5zZSFcblxuXG4iLCJJbnB1dFRva2VucyI6MzE3OTYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NzAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDU6MDMuMTk2MTgxMzQ3WiIsIlNlcSI6NTgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5NjkyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbXB0Y3Avb3B0aW9ucy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEwODMsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEwODM6XFx0XFx0aWYgKGFmdGVyNjQobmV3X3duZF9lbmQsIG1zay1cXHUwMDNld25kX2VuZCkpXFxuMTA4NDpcXHRcXHRcXHRXUklURV9PTkNFKG1zay1cXHUwMDNld25kX2VuZCwgbmV3X3duZF9lbmQpO1xcbjEwODU6XFx0XFxuMTA4NjpcXHRcXHQvKiB0aGlzIGFzc3VtZXMgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpIGlzIGludm9rZWQgYWZ0ZXIgdGNwX2FjaygpICovXFxuMTA4NzpcXHRcXHRpZiAoYWZ0ZXI2NChtc2stXFx1MDAzZXduZF9lbmQsIHNuZF9ueHQpKVxcbjEwODg6XFx0XFx0XFx0X19tcHRjcF9jaGVja19wdXNoKHNrLCBzc2spO1xcbjEwODk6XFx0XFxuMTA5MDpcXHRcXHRpZiAoYWZ0ZXI2NChuZXdfc25kX3VuYSwgb2xkX3NuZF91bmEpKSB7XFxuMTA5MTpcXHRcXHRcXHRfX21wdGNwX3NuZF91bmFfdXBkYXRlKG1zaywgbmV3X3NuZF91bmEpO1xcbjEwOTI6XFx0XFx0XFx0X19tcHRjcF9kYXRhX2Fja2VkKHNrKTtcXG4xMDkzOlxcdFxcdH1cXG4xMDk0OlxcdFxcdG1zay1cXHUwMDNlbGFzdF9hY2tfcmVjdiA9IHRjcF9qaWZmaWVzMzI7XFxuMTA5NTpcXHRcXHRtcHRjcF9kYXRhX3VubG9jayhzayk7XFxuMTA5NjpcXHRcXG4xMDk3OlxcdFxcdHRyYWNlX2Fja191cGRhdGVfbXNrKG1wX29wdC1cXHUwMDNlZGF0YV9hY2ssXFxuMTA5ODpcXHRcXHRcXHRcXHQgICAgIG9sZF9zbmRfdW5hLCBuZXdfc25kX3VuYSxcXG4xMDk5OlxcdFxcdFxcdFxcdCAgICAgbmV3X3duZF9lbmQsIFJFQURfT05DRShtc2stXFx1MDAzZXduZF9lbmQpKTtcXG4xMTAwOlxcdH1cXG4xMTAxOlxcdFxcbjExMDI6XFx0Ym9vbCBtcHRjcF91cGRhdGVfcmN2X2RhdGFfZmluKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssIHU2NCBkYXRhX2Zpbl9zZXEsIGJvb2wgdXNlXzY0Yml0KVxcbjExMDM6XFx0e1xcbjExMDQ6XFx0XFx0LyogU2tpcCBpZiBEQVRBX0ZJTiB3YXMgYWxyZWFkeSByZWNlaXZlZC5cXG4xMTA1OlxcdFxcdCAqIElmIHVwZGF0aW5nIHNpbXVsdGFuZW91c2x5IHdpdGggdGhlIHJlY3Ztc2cgbG9vcCwgdmFsdWVzXFxuMTEwNjpcXHRcXHQgKiBzaG91bGQgbWF0Y2guIElmIHRoZXkgbWlzbWF0Y2gsIHRoZSBwZWVyIGlzIG1pc2JlaGF2aW5nIGFuZFxcbjExMDc6XFx0XFx0ICogd2Ugd2lsbCBwcmVmZXIgdGhlIG1vc3QgcmVjZW50IGluZm9ybWF0aW9uLlxcbjExMDg6XFx0XFx0ICovXFxuMTEwOTpcXHRcXHRpZiAoUkVBRF9PTkNFKG1zay1cXHUwMDNlcmN2X2RhdGFfZmluKSlcXG4xMTEwOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4xMTExOlxcdFxcbjExMTI6XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXJjdl9kYXRhX2Zpbl9zZXEsXFxuMTExMzpcXHRcXHRcXHQgICBtcHRjcF9leHBhbmRfc2VxKFJFQURfT05DRShtc2stXFx1MDAzZWFja19zZXEpLCBkYXRhX2Zpbl9zZXEsIHVzZV82NGJpdCkpO1xcbjExMTQ6XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXJjdl9kYXRhX2ZpbiwgMSk7XFxuMTExNTpcXHRcXG4xMTE2OlxcdFxcdHJldHVybiB0cnVlO1xcbjExMTc6XFx0fVxcbjExMTg6XFx0XFxuMTExOTpcXHRzdGF0aWMgYm9vbCBhZGRfYWRkcl9obWFjX3ZhbGlkKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXFxuMTEyMDpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqbXBfb3B0KVxcbjExMjE6XFx0e1xcbjExMjI6XFx0XFx0dTY0IGhtYWMgPSAwO1xcbjExMjM6XFx0XFxuMTEyNDpcXHRcXHRpZiAobXBfb3B0LVxcdTAwM2VlY2hvKVxcbjExMjU6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuMTEyNjpcXHRcXG4xMTI3OlxcdFxcdGhtYWMgPSBhZGRfYWRkcl9nZW5lcmF0ZV9obWFjKFJFQURfT05DRShtc2stXFx1MDAzZXJlbW90ZV9rZXkpLFxcbjExMjg6XFx0XFx0XFx0XFx0XFx0ICAgICAgUkVBRF9PTkNFKG1zay1cXHUwMDNlbG9jYWxfa2V5KSxcXG4xMTI5OlxcdFxcdFxcdFxcdFxcdCAgICAgIFxcdTAwMjZtcF9vcHQtXFx1MDAzZWFkZHIpO1xcbjExMzA6XFx0XFxuMTEzMTpcXHRcXHRwcl9kZWJ1ZyhcXFwibXNrPSVwLCBhaG1hYz0lbGx1LCBtcF9vcHQtXFx1MDAzZWFobWFjPSVsbHVcXFxcblxcXCIsXFxuMTEzMjpcXHRcXHRcXHQgbXNrLCBobWFjLCBtcF9vcHQtXFx1MDAzZWFobWFjKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTBUMTI6NDU6MDMuMTk2MzgwOTk3WiIsIlNlcSI6NTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc2NjA4NDIxMDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEZWJ1Z2dpbmcgYGFja191cGRhdGVfbXNrYCAtIEluaXRpYWwgSW5xdWlyeSoqXG5cbkFscmlnaHQsIGJlZm9yZSBJIGRpdmUgdG9vIGRlZXAgaW50byB0aGUgcHJvYmxlbSBhdCBoYW5kLCBJIG5lZWQgdG8gdGFrZSBhIHN0ZXAgYmFjayBhbmQgZ3JvdW5kIG15c2VsZi4gTXkgZmlyc3QgaW5zdGluY3QsIGJhc2VkIG9uIHRoZSBpbmNvbXBsZXRlIGNvbnRleHQsIGlzIHRvIGltbWVkaWF0ZWx5IGNoZWNrIHRoZSBlbnRyeSBwb2ludCwgdGhlIGluaXRpYWwgc2V0dXAgb2YgdGhlIGZ1bmN0aW9uLiBJIG5lZWQgdG8gc2VlIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24sIHRoZSBoZWFkLCB0byBrbm93IHdoYXTigJlzIGdvaW5nIG9uIGF0IHRoZSBvdXRzZXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgcGFyYW1ldGVycyBpdCB0YWtlcywgd2hhdCBpbml0aWFsaXphdGlvbnMgaXQgZG9lcywgYW5kIHdoYXQgdGhlIGZsb3cgb2YgdGhlIGNvZGUgaXMgZnJvbSB0aGUgYmVnaW5uaW5nLiBJJ20gZm9jdXNpbmcgb24gdGhhdCBzdGFydGluZyBwb2ludCwgYGFja191cGRhdGVfbXNrYCwgdG8gZ2V0IHRoZSBiaWcgcGljdHVyZS4gVGhpcyBpcyB0aGUgY3JpdGljYWwgc3RhcnRpbmcgcG9pbnQgdG8gdW5kZXJzdGFuZGluZyB3aHkgSSdtIGhlcmUuIFRoaXMgaW5pdGlhbCBjaGVjayB3aWxsIGdpdmUgbWUgY3J1Y2lhbCBjb250ZXh0IGZvciBmdXJ0aGVyIHRyb3VibGVzaG9vdGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQzNTEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ1OjEwLjg1NzIyNjE1NFoiLCJTZXEiOjYwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDUyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L21wdGNwL29wdGlvbnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDUwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMDUwOlxcdFxcdFxcdHJldHVybjtcXG4xMDUxOlxcdFxcbjEwNTI6XFx0XFx0LyogU29tZSBvdGhlciBzdWJmbG93IGdyZXcgdGhlIG1wdGNwLWxldmVsIHJ3aW4gc2luY2UgcmN2X3d1cCxcXG4xMDUzOlxcdFxcdCAqIHJlc3luYy5cXG4xMDU0OlxcdFxcdCAqL1xcbjEwNTU6XFx0XFx0dHAtXFx1MDAzZXJjdl93bmQgKz0gbXB0Y3BfcmN2X3duZCAtIHN1YmZsb3ctXFx1MDAzZXJjdl93bmRfc2VudDtcXG4xMDU2OlxcdFxcdHRjcF91cGRhdGVfbWF4X3Jjdl93bmRfc2VxKHRwKTtcXG4xMDU3OlxcdFxcdHN1YmZsb3ctXFx1MDAzZXJjdl93bmRfc2VudCA9IG1wdGNwX3Jjdl93bmQ7XFxuMTA1ODpcXHR9XFxuMTA1OTpcXHRcXG4xMDYwOlxcdHN0YXRpYyB2b2lkIGFja191cGRhdGVfbXNrKHN0cnVjdCBtcHRjcF9zb2NrICptc2ssXFxuMTA2MTpcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgc29jayAqc3NrLFxcbjEwNjI6XFx0XFx0XFx0XFx0ICAgc3RydWN0IG1wdGNwX29wdGlvbnNfcmVjZWl2ZWQgKm1wX29wdClcXG4xMDYzOlxcdHtcXG4xMDY0OlxcdFxcdHU2NCBuZXdfd25kX2VuZCwgbmV3X3NuZF91bmEsIHNuZF9ueHQgPSBSRUFEX09OQ0UobXNrLVxcdTAwM2VzbmRfbnh0KTtcXG4xMDY1OlxcdFxcdHN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKW1zaztcXG4xMDY2OlxcdFxcdHU2NCBvbGRfc25kX3VuYTtcXG4xMDY3OlxcdFxcbjEwNjg6XFx0XFx0bXB0Y3BfZGF0YV9sb2NrKHNrKTtcXG4xMDY5OlxcdFxcbjEwNzA6XFx0XFx0LyogYXZvaWQgYWNrIGV4cGFuc2lvbiBvbiB1cGRhdGUgY29uZmxpY3QsIHRvIHJlZHVjZSB0aGUgcmlzayBvZlxcbjEwNzE6XFx0XFx0ICogd3JvbmdseSBleHBhbmRpbmcgdG8gYSBmdXR1cmUgYWNrIHNlcXVlbmNlIG51bWJlciwgd2hpY2ggaXMgd2F5XFxuMTA3MjpcXHRcXHQgKiBtb3JlIGRhbmdlcm91cyB0aGFuIG1pc3NpbmcgYW4gYWNrXFxuMTA3MzpcXHRcXHQgKi9cXG4xMDc0OlxcdFxcdG9sZF9zbmRfdW5hID0gbXNrLVxcdTAwM2VzbmRfdW5hO1xcbjEwNzU6XFx0XFx0bmV3X3NuZF91bmEgPSBtcHRjcF9leHBhbmRfc2VxKG9sZF9zbmRfdW5hLCBtcF9vcHQtXFx1MDAzZWRhdGFfYWNrLCBtcF9vcHQtXFx1MDAzZWFjazY0KTtcXG4xMDc2OlxcdFxcbjEwNzc6XFx0XFx0LyogQUNLIGZvciBkYXRhIG5vdCBldmVuIHNlbnQgeWV0PyBJZ25vcmUuKi9cXG4xMDc4OlxcdFxcdGlmICh1bmxpa2VseShhZnRlcjY0KG5ld19zbmRfdW5hLCBzbmRfbnh0KSkpXFxuMTA3OTpcXHRcXHRcXHRuZXdfc25kX3VuYSA9IG9sZF9zbmRfdW5hO1xcbjEwODA6XFx0XFxuMTA4MTpcXHRcXHRuZXdfd25kX2VuZCA9IG5ld19zbmRfdW5hICsgdGNwX3NrKHNzayktXFx1MDAzZXNuZF93bmQ7XFxuMTA4MjpcXHRcXG4xMDgzOlxcdFxcdGlmIChhZnRlcjY0KG5ld193bmRfZW5kLCBtc2stXFx1MDAzZXduZF9lbmQpKVxcbjEwODQ6XFx0XFx0XFx0V1JJVEVfT05DRShtc2stXFx1MDAzZXduZF9lbmQsIG5ld193bmRfZW5kKTtcXG4xMDg1OlxcdFxcbjEwODY6XFx0XFx0LyogdGhpcyBhc3N1bWVzIG1wdGNwX2luY29taW5nX29wdGlvbnMoKSBpcyBpbnZva2VkIGFmdGVyIHRjcF9hY2soKSAqL1xcbjEwODc6XFx0XFx0aWYgKGFmdGVyNjQobXNrLVxcdTAwM2V3bmRfZW5kLCBzbmRfbnh0KSlcXG4xMDg4OlxcdFxcdFxcdF9fbXB0Y3BfY2hlY2tfcHVzaChzaywgc3NrKTtcXG4xMDg5OlxcdFxcbjEwOTA6XFx0XFx0aWYgKGFmdGVyNjQobmV3X3NuZF91bmEsIG9sZF9zbmRfdW5hKSkge1xcbjEwOTE6XFx0XFx0XFx0X19tcHRjcF9zbmRfdW5hX3VwZGF0ZShtc2ssIG5ld19zbmRfdW5hKTtcXG4xMDkyOlxcdFxcdFxcdF9fbXB0Y3BfZGF0YV9hY2tlZChzayk7XFxuMTA5MzpcXHRcXHR9XFxuMTA5NDpcXHRcXHRtc2stXFx1MDAzZWxhc3RfYWNrX3JlY3YgPSB0Y3BfamlmZmllczMyO1xcbjEwOTU6XFx0XFx0bXB0Y3BfZGF0YV91bmxvY2soc2spO1xcbjEwOTY6XFx0XFxuMTA5NzpcXHRcXHR0cmFjZV9hY2tfdXBkYXRlX21zayhtcF9vcHQtXFx1MDAzZWRhdGFfYWNrLFxcbjEwOTg6XFx0XFx0XFx0XFx0ICAgICBvbGRfc25kX3VuYSwgbmV3X3NuZF91bmEsXFxuMTA5OTpcXHRcXHRcXHRcXHQgICAgIG5ld193bmRfZW5kLCBSRUFEX09OQ0UobXNrLVxcdTAwM2V3bmRfZW5kKSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ1OjEwLjg1NzM3Mjc4NFoiLCJTZXEiOjYxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MjQ5ODY4NDM3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipVbmluaXRpYWxpemVkIE1lbW9yeSBWdWxuZXJhYmlsaXR5IGluIE1QVENQIERTUyBPcHRpb24gUGFyc2luZyoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBkaXNzZWN0aW5nIHRoaXMgY29kZSwgYW5kIGl0J3MgbG9va2luZyBsaWtlIHdlIGhhdmUgYSBjbGFzc2ljIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLiAgU3BlY2lmaWNhbGx5LCBpdCBzZWVtcyB0aGF0IGlmIGEgcGFja2V0IGNvbnRhaW5zIG11bHRpcGxlIE1QVENQIERTUyBvcHRpb25zLCBhbmQgdGhlIHNlY29uZCBvbmUgaXMgbWFsZm9ybWVkLCB3ZSBjYW4gZW5kIHVwIHJlYWRpbmcgdW5pbml0aWFsaXplZCBzdGFjayBtZW1vcnkuICBcblxuSGVyZSdzIHRoZSBnaXN0OiBgYWNrX3VwZGF0ZV9tc2tgIHJlYWRzIGBtcF9vcHQtXHUwMDNlZGF0YV9hY2tgIHRvIHVwZGF0ZSBgbXNrLVx1MDAzZXNuZF91bmFgLiAgSWYgYG1wX29wdC1cdTAwM2VkYXRhX2Fja2AgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdlIGNhbiBhY2tub3dsZWRnZSBpbnZhbGlkIGRhdGEsIG9yIGV2ZW4gd29yc2UsIHVzZSBhIGNvbXBsZXRlbHkgcmFuZG9tIHZhbHVlLiAgVGhlIHByb2JsZW0gYXJpc2VzIGluIGhvdyB3ZSBwYXJzZSBNUFRDUCBvcHRpb25zLiAgYG1wdGNwX2dldF9vcHRpb25zYCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBvcHRpb25zLCBhbmQgc2V0cyBmbGFncyBvbiBhIGBzdHJ1Y3QgbXB0Y3Bfb3B0aW9uc19yZWNlaXZlZCBtcF9vcHRgIHN0cnVjdHVyZSB0aGF0IGxpdmVzIG9uIHRoZSAqc3RhY2sqLiAgQ3J1Y2lhbGx5LCBub3QgYWxsIGZpZWxkcyBvZiB0aGlzIHN0cnVjdCBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybzsgb25seSB0aGUgYHN0YXR1c2AgZmllbGQgaXMgZXhwbGljaXRseSBjbGVhcmVkLlxuXG5MZXQncyBsb29rIGF0IGEgc2NlbmFyaW8gd2l0aCB0d28gRFNTIG9wdGlvbnM6IHRoZSBmaXJzdCBpcyBcImdvb2RcIiwgYnV0IHRoZSBzZWNvbmQgaXMgbWFsZm9ybWVkIChlLmcuLCBhIHdyb25nIHNpemUpLiBUaGUgZmlyc3QgRFNTIHdpbGwgY29ycmVjdGx5IHNldCBgT1BUSU9OX01QVENQX0RTU2AgYW5kIG1pZ2h0IHNldCBgdXNlX2FjayA9IDBgLiBUaGUgc2Vjb25kLCBtYWxmb3JtZWQgRFNTIG1pZ2h0IHNldCBgdXNlX2FjayA9IDFgIG9yIG90aGVyIGZsYWcsIGJ1dCBicmVhayBlYXJseSwgd2l0aG91dCBldmVyIGluaXRpYWxpemluZyBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYC4gIGBtcHRjcF9pbmNvbWluZ19vcHRpb25zYCAqc3RpbGwqIHNlZXMgYE9QVElPTl9NUFRDUF9EU1NgIHNldCBieSB0aGUgZmlyc3QgRFNTIG9wdGlvbiwgc28gdGhlIGZ1bmN0aW9uIHRoZW4gZ29lcyB0byB1c2UgdGhlIHBvdGVudGlhbGx5IG1vZGlmaWVkIGJpdGZpZWxkcywgYnV0IHRoZXNlIGJpdGZpZWxkcyBtYXkgaW5zdHJ1Y3QgdGhlIGZ1bmN0aW9uIHRvIHJlYWQgZnJvbSB0aGUgdW5pbml0aWFsaXplZCBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYCBmaWVsZC4gVGhpcyB1bmluaXRpYWxpemVkIHZhbHVlIGlzIHRoZW4gdXNlZCBpbiBhIGNyaXRpY2FsIHVwZGF0ZTogaXQncyB1c2VkIHRvIG1vZGlmeSBgbXNrLVx1MDAzZXNuZF91bmFgIHdoaWNoIGxlYWRzIHRvIGluY29ycmVjdCBhY2tub3dsZWRnZW1lbnQgb2YgZGF0YS4gVGhpcyBpcyB3aGVyZSB0aGlzIGdvZXMgZnJvbSBiYWQgdG8gcmVhbGx5IGJhZCFcblxuTm93LCBkb2VzIHRoaXMgbGVhayB0byB1c2VyIHNwYWNlPyBObywgaXQncyBhbiBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lIGlzc3VlLiBCdXQsIGlzIGl0IGNhdWdodCBieSBLQVNBTj8gTm8sIHRoYXQgaXMgbm90IEtBU0FOJ3Mgam9iLiBCdXQgS01TQU4gZG9lcyEgIEtNU0FOIHNwZWNpZmljYWxseSBjYXRjaGVzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzISBJZiBgbXBfb3B0LVx1MDAzZWRhdGFfYWNrYCBpcyB1bmluaXRpYWxpemVkLCBLTVNBTiB3aWxsIHRyaWdnZXIgYSB3YXJuaW5nLlxuXG5Mb29raW5nIG1vcmUgY2xvc2VseSBhdCB0aGUgY29kZSwgaXQgdHVybnMgb3V0IHRoYXQgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdDtgIGlzIGRlY2xhcmVkIG9uIHRoZSBzdGFjayBpbiBzZXZlcmFsIGtleSBmdW5jdGlvbnMgbGlrZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9uc2AsIGBzdWJmbG93X2NoZWNrX3JlcWAsIGBtcHRjcF9zdWJmbG93X2luaXRfY29va2llX3JlcWAsIGV0Yy4gSW4gYWxsIHRoZXNlIGNhc2VzLCBgbXBfb3B0YCBpcyB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gIFNvIGl0J3Mgbm90IGp1c3QgYSBzaW5nbGUgY29kZSBwYXRoLlxuXG5UaGUgcGF0Y2gncyBmaXggaW52b2x2ZXMgcmVzdHJpY3Rpbmcgd2hlbiBgTVBUQ1BPUFRfRFNTYCBjYW4gYmUgcGFyc2VkLiBJZiBpdCBkZXRlY3RzIGEgRFNTIG9wdGlvbiBhZnRlciBvdGhlciBzcGVjaWZpYyBvcHRpb25zLCBpdCBhYm9ydHMgcGFyc2luZyBpbW1lZGlhdGVseS4gIFRoaXMgcHJldmVudHMgdGhlIGNvcnJ1cHRlZCBiaXRmaWVsZHMuIFRoZXJlZm9yZSwgdGhlIHBhdGNoIHdpbGwgZml4IGEgYnVnIHdoZXJlIGFuIGludmFsaWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGNvdWxkIGNvcnJ1cHQgZmxhZ3Mgd2l0aG91dCBwb3B1bGF0aW5nIGRhdGEgZmllbGRzLCByZXN1bHRpbmcgaW4gdW5pbml0aWFsaXplZCBkYXRhIHJlYWRzLlxuXG5TbywgaW4gc3VtbWFyeSwgd2UncmUgdGFsa2luZyBhYm91dCB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSB1c2VkIGluIGEgY3JpdGljYWwgVENQIHN0YXRlIG1hY2hpbmUsIHdoaWNoIGNvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IGFja25vd2xlZGdlbWVudHMsIGRhdGEgY29ycnVwdGlvbiwgb3IgY29ubmVjdGlvbiBkcm9wcy4gVGhpcyBpcyB0ZXh0Ym9vayBLTVNBTiBtYXRlcmlhbCwgc28gbGV0J3MgZ2V0IGEgS01TQU4gZnV6emluZyBzZXNzaW9uIGdvaW5nIEFTQVAhIFRoZSBwYXRjaCAqc2hvdWxkKiBmaXggdGhpcyBieSByZXN0cmljdGluZyB0aGUgcGFyc2luZyBvZiBEU1Mgb3B0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzU1MDgsIk91dHB1dFRva2VucyI6NDY1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mzg4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEwVDEyOjQ1OjUzLjM1NjA2MDA0N1oiLCJTZXEiOjYyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVzdHJpY3RzIHRoZSBwYXJzaW5nIG9mIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gaW4gYG1wdGNwX3BhcnNlX29wdGlvbigpYCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvY2Vzc2VkIGlmIGNlcnRhaW4gb3RoZXIgb3B0aW9ucyAoaW5jbHVkaW5nIGFub3RoZXIgYE1QVENQT1BUX0RTU2ApIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZC5cXG5cXG5CZWZvcmUgdGhpcyBwYXRjaCwgaWYgYSBUQ1AgcGFja2V0IGNvbnRhaW5lZCBtdWx0aXBsZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLCBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHZ1bG5lcmFiaWxpdHkgY291bGQgYmUgdHJpZ2dlcmVkLiBUaGUgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdGAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBpbiBmdW5jdGlvbnMgbGlrZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpYC4gT25seSBpdHMgYHN0YXR1c2AgZmllbGQgKHdoaWNoIGNvbnRhaW5zIGJpdGZpZWxkcyBsaWtlIGB1c2VfYWNrYCBhbmQgYHVzZV9tYXBgKSBpcyB6ZXJvZWQsIGxlYXZpbmcgZGF0YSBmaWVsZHMgbGlrZSBgZGF0YV9hY2tgIGFuZCBgZGF0YV9zZXFgIHVuaW5pdGlhbGl6ZWQuXFxuXFxuSWYgYSB2YWxpZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gd2FzIHBhcnNlZCBmaXJzdCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDBgKSwgaXQgd291bGQgc2V0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgIGJ1dCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQuIElmIGEgc2Vjb25kLCBtYWxmb3JtZWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGZvbGxvd2VkIChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMWAgYnV0IGFuIGludmFsaWQgYG9wc2l6ZWApLCBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYml0ZmllbGQgdG8gYHVzZV9hY2sgPSAxYCBidXQgYnJlYWsgZWFybHkgYmVmb3JlIHBvcHVsYXRpbmcgdGhlIGBkYXRhX2Fja2AgZmllbGQuXFxuXFxuVGhlIGNhbGxlciB3b3VsZCB0aGVuIHNlZSB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgc2V0IChmcm9tIHRoZSBmaXJzdCBvcHRpb24pIGFuZCByZWFkIHRoZSB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSBmcm9tIGBkYXRhX2Fja2AgKGR1ZSB0byB0aGUgY29ycnVwdGVkIGB1c2VfYWNrID0gMWAgYml0ZmllbGQgZnJvbSB0aGUgc2Vjb25kIG9wdGlvbikuIFRoaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgd291bGQgdGhlbiBiZSB1c2VkIGluIGNvbnRyb2wgZmxvdyAoZS5nLiwgdXBkYXRpbmcgdGhlIHNlcXVlbmNlIG51bWJlciBgbXNrLVxcdTAwM2VzbmRfdW5hYCBpbiBgYWNrX3VwZGF0ZV9tc2soKWApIG9yIGNvcGllZCBpbnRvIHNrYiBleHRlbnNpb25zLlxcblxcblN0YW5kYXJkIEtBU0FOIGRvZXMgbm90IGRldGVjdCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGNhdGNoIHRoaXMgZXhhY3QgY2xhc3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVzdHJpY3RzIHRoZSBwYXJzaW5nIG9mIHRoZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gaW4gYG1wdGNwX3BhcnNlX29wdGlvbigpYCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvY2Vzc2VkIGlmIGNlcnRhaW4gb3RoZXIgb3B0aW9ucyAoaW5jbHVkaW5nIGFub3RoZXIgYE1QVENQT1BUX0RTU2ApIGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZC5cXG5cXG5CZWZvcmUgdGhpcyBwYXRjaCwgaWYgYSBUQ1AgcGFja2V0IGNvbnRhaW5lZCBtdWx0aXBsZSBgTVBUQ1BPUFRfRFNTYCBvcHRpb25zLCBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHZ1bG5lcmFiaWxpdHkgY291bGQgYmUgdHJpZ2dlcmVkLiBUaGUgYHN0cnVjdCBtcHRjcF9vcHRpb25zX3JlY2VpdmVkIG1wX29wdGAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBpbiBmdW5jdGlvbnMgbGlrZSBgbXB0Y3BfaW5jb21pbmdfb3B0aW9ucygpYC4gT25seSBpdHMgYHN0YXR1c2AgZmllbGQgKHdoaWNoIGNvbnRhaW5zIGJpdGZpZWxkcyBsaWtlIGB1c2VfYWNrYCBhbmQgYHVzZV9tYXBgKSBpcyB6ZXJvZWQsIGxlYXZpbmcgZGF0YSBmaWVsZHMgbGlrZSBgZGF0YV9hY2tgIGFuZCBgZGF0YV9zZXFgIHVuaW5pdGlhbGl6ZWQuXFxuXFxuSWYgYSB2YWxpZCBgTVBUQ1BPUFRfRFNTYCBvcHRpb24gd2FzIHBhcnNlZCBmaXJzdCAoZS5nLiwgd2l0aCBgdXNlX2FjayA9IDBgKSwgaXQgd291bGQgc2V0IHRoZSBgT1BUSU9OX01QVENQX0RTU2AgZmxhZyBpbiBgbXBfb3B0LnN1Ym9wdGlvbnNgIGJ1dCBsZWF2ZSBgZGF0YV9hY2tgIHVuaW5pdGlhbGl6ZWQuIElmIGEgc2Vjb25kLCBtYWxmb3JtZWQgYE1QVENQT1BUX0RTU2Agb3B0aW9uIGZvbGxvd2VkIChlLmcuLCB3aXRoIGB1c2VfYWNrID0gMWAgYnV0IGFuIGludmFsaWQgYG9wc2l6ZWApLCBgbXB0Y3BfcGFyc2Vfb3B0aW9uKClgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYml0ZmllbGQgdG8gYHVzZV9hY2sgPSAxYCBidXQgYnJlYWsgZWFybHkgYmVmb3JlIHBvcHVsYXRpbmcgdGhlIGBkYXRhX2Fja2AgZmllbGQuXFxuXFxuVGhlIGNhbGxlciB3b3VsZCB0aGVuIHNlZSB0aGUgYE9QVElPTl9NUFRDUF9EU1NgIGZsYWcgc2V0IChmcm9tIHRoZSBmaXJzdCBvcHRpb24pIGFuZCByZWFkIHRoZSB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeSBmcm9tIGBkYXRhX2Fja2AgKGR1ZSB0byB0aGUgY29ycnVwdGVkIGB1c2VfYWNrID0gMWAgYml0ZmllbGQgZnJvbSB0aGUgc2Vjb25kIG9wdGlvbikuIFRoaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgd291bGQgdGhlbiBiZSB1c2VkIGluIGNvbnRyb2wgZmxvdyAoZS5nLiwgdXBkYXRpbmcgdGhlIHNlcXVlbmNlIG51bWJlciBgbXNrLVxcdTAwM2VzbmRfdW5hYCBpbiBgYWNrX3VwZGF0ZV9tc2soKWApIG9yIGNvcGllZCBpbnRvIHNrYiBleHRlbnNpb25zLlxcblxcblN0YW5kYXJkIEtBU0FOIGRvZXMgbm90IGRldGVjdCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG1lbW9yeS4gS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGNhdGNoIHRoaXMgZXhhY3QgY2xhc3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowvxrql[1] Phase: Succeeded StartedAt: 2026-08-10 12:46:04 +0000 UTC FinishedAt: 2026-08-10 12:46:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-10 12:46:04 +0000 UTC FinishedAt: 2026-08-10 12:46:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2] Phase: Succeeded StartedAt: 2026-08-10 12:46:04 +0000 UTC FinishedAt: 2026-08-10 16:25:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 12:46:04 +0000 UTC FinishedAt: 2026-08-10 16:25:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 12:46:04 +0000 UTC FinishedAt: 2026-08-10 12:46:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 12:46:04 +0000 UTC FinishedAt: 2026-08-10 12:46:08 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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-workflowvxrql/series-workflowvxrql-convert-artifact-3094964402/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 12:46:14 +0000 UTC FinishedAt: 2026-08-10 13:02:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 12:46:14 +0000 UTC FinishedAt: 2026-08-10 13:02:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*5973dd11-353a-49ca-8c48-e97022d783ed,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-workflowvxrql/series-workflowvxrql-convert-artifact-3094964402/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": "39ebaedd-4e88-46ad-9508-685b108b6f1e", "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-workflowvxrql/series-workflowvxrql-build-action-1274395184/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 12:46:14 +0000 UTC FinishedAt: 2026-08-10 13:02: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:*5973dd11-353a-49ca-8c48-e97022d783ed,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-workflowvxrql/series-workflowvxrql-convert-artifact-3094964402/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": "39ebaedd-4e88-46ad-9508-685b108b6f1e", "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-workflowvxrql/series-workflowvxrql-build-action-1274395184/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:02:25 +0000 UTC FinishedAt: 2026-08-10 13:02:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:02:25 +0000 UTC FinishedAt: 2026-08-10 13:02:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:02:25 +0000 UTC FinishedAt: 2026-08-10 13:02:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:02:25 +0000 UTC FinishedAt: 2026-08-10 13:02:30 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-workflowvxrql/series-workflowvxrql-convert-artifact-3912260557/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:02:35 +0000 UTC FinishedAt: 2026-08-10 13:04:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:02:35 +0000 UTC FinishedAt: 2026-08-10 13:04:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*39ebaedd-4e88-46ad-9508-685b108b6f1e,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-workflowvxrql/series-workflowvxrql-build-action-1274395184/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-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:04:41 +0000 UTC FinishedAt: 2026-08-10 13:04:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:04:41 +0000 UTC FinishedAt: 2026-08-10 13:04:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:04:41 +0000 UTC FinishedAt: 2026-08-10 13:21:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:04:41 +0000 UTC FinishedAt: 2026-08-10 13:21:00 +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:*5973dd11-353a-49ca-8c48-e97022d783ed,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-workflowvxrql/series-workflowvxrql-convert-artifact-3912260557/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": "9eac00fd-6f84-448e-8f65-cae1c8a9e3fd", "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-workflowvxrql/series-workflowvxrql-build-action-4064774569/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:04:41 +0000 UTC FinishedAt: 2026-08-10 13:20:50 +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:*5973dd11-353a-49ca-8c48-e97022d783ed,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-workflowvxrql/series-workflowvxrql-convert-artifact-3912260557/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": "9eac00fd-6f84-448e-8f65-cae1c8a9e3fd", "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-workflowvxrql/series-workflowvxrql-build-action-4064774569/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:21:00 +0000 UTC FinishedAt: 2026-08-10 13:21:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:21:00 +0000 UTC FinishedAt: 2026-08-10 13:21:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:21:00 +0000 UTC FinishedAt: 2026-08-10 13:23:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:21:00 +0000 UTC FinishedAt: 2026-08-10 13:22:53 +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:*9eac00fd-6f84-448e-8f65-cae1c8a9e3fd,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-workflowvxrql/series-workflowvxrql-build-action-4064774569/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-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:23:03 +0000 UTC FinishedAt: 2026-08-10 16:25:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:23:03 +0000 UTC FinishedAt: 2026-08-10 16:25:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["mptcp_get_options","mptcp_incoming_options"],"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:*39ebaedd-4e88-46ad-9508-685b108b6f1e,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9eac00fd-6f84-448e-8f65-cae1c8a9e3fd,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-workflowvxrql/series-workflowvxrql-build-action-1274395184/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-workflowvxrql/series-workflowvxrql-build-action-4064774569/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:23:03 +0000 UTC FinishedAt: 2026-08-10 13:23:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:23:03 +0000 UTC FinishedAt: 2026-08-10 13:23:08 +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":["mptcp_get_options","mptcp_incoming_options"],"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-workflowvxrql/series-workflowvxrql-convert-artifact-183432370/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:23:03 +0000 UTC FinishedAt: 2026-08-10 13:23:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:23:03 +0000 UTC FinishedAt: 2026-08-10 13:23:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:23:03 +0000 UTC FinishedAt: 2026-08-10 13:23:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:23:13 +0000 UTC FinishedAt: 2026-08-10 16:25:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflowvxrql[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"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":["mptcp_get_options","mptcp_incoming_options"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"fcaeecb8b0cd44f77d03b28de0671258d4db18f8","config_name":"upstream-apparmor-kasan.config","enable_configs":["MPTCP"],"series_id":"61aa9e41-29c0-4079-8b1e-000255c141d1","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-08-10 13:23:13 +0000 UTC FinishedAt: 2026-08-10 16:25:36 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*39ebaedd-4e88-46ad-9508-685b108b6f1e,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9eac00fd-6f84-448e-8f65-cae1c8a9e3fd,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-workflowvxrql/series-workflowvxrql-build-action-1274395184/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-workflowvxrql/series-workflowvxrql-build-action-4064774569/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-workflowvxrql/series-workflowvxrql-convert-artifact-183432370/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,}