Name: series-workflow7pzhd Phase: Failed StartedAt: 2026-08-07 12:58:10 +0000 UTC FinishedAt: 2026-08-07 14:54:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[0] Phase: Succeeded StartedAt: 2026-08-07 12:58:10 +0000 UTC FinishedAt: 2026-08-07 13:03:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[0].run-triage Phase: Succeeded StartedAt: 2026-08-07 12:58:10 +0000 UTC FinishedAt: 2026-08-07 13:03:43 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "4fa4977a0d900f936bcae5cd2c510be5554e8dd6", "config_name": "upstream-apparmor-kasan.config", "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "4fa4977a0d900f936bcae5cd2c510be5554e8dd6", "config_name": "upstream-apparmor-kasan.config", "series_id": "e1de1dc2-9608-48e4-bb80-466bf033e3fe" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null }, { "base": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "4fa4977a0d900f936bcae5cd2c510be5554e8dd6", "config_name": "upstream-kmsan.config", "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "4fa4977a0d900f936bcae5cd2c510be5554e8dd6", "config_name": "upstream-kmsan.config", "series_id": "e1de1dc2-9608-48e4-bb80-466bf033e3fe" }, "track": "KMSAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [], "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+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGxlbmd0aCBjaGVjayBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXG5cbldpdGhvdXQgdGhpcyBjaGVjaywgaWYgYSB1c2VyIGluamVjdHMgYSBzaG9ydCBsaW5lYXIgcGFja2V0IChlLmcuLCAxMCBieXRlcykgdmlhIGEgVFVOL1RBUCBkZXZpY2Ugb3IgYW4gQUZfUEFDS0VUIHJhdyBzb2NrZXQsIGBldGhfdHlwZV90cmFucygpYCBjYWxscyBgZXRoX3NrYl9wdWxsX21hYygpYC4gYGV0aF9za2JfcHVsbF9tYWMoKWAgY2FsbHMgYHNrYl9wdWxsX2lubGluZShza2IsIEVUSF9ITEVOKWAuIElmIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAsIGBza2JfcHVsbF9pbmxpbmUoKWAgZmFpbHMgYW5kIHJldHVybnMgYE5VTExgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgYEJVR19PTmAgb3IgY3Jhc2guIGBldGhfc2tiX3B1bGxfbWFjKClgIGlnbm9yZXMgdGhpcyByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIGBza2ItXHUwMDNlZGF0YWAgcG9pbnRlci5cblxuYGV0aF90eXBlX3RyYW5zKClgIHRoZW4gcmVhZHMgYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIEJlY2F1c2UgdGhlIHNrYiBkYXRhIGJ1ZmZlciBpcyB0eXBpY2FsbHkgYWxsb2NhdGVkIHdpdGggYSBtdWNoIGxhcmdlciBzaXplIChlLmcuLCB2aWEgYGttYWxsb2NgKSwgdGhpcyByZWFkIGlzIHdlbGwgd2l0aGluIHRoZSBhbGxvY2F0aW9uIGJvdW5kcy4gVGhlcmVmb3JlLCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgaXQgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgbWVtb3J5IGJleW9uZCB0aGUgdXNlci1wcm92aWRlZCAxMCBieXRlcyBpcyB1bmluaXRpYWxpemVkLiBLTVNBTiB3aWxsIGRldGVjdCB0aGlzIGFzIGEgcmVhZCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRnVydGhlcm1vcmUsIHRoaXMgdW5pbml0aWFsaXplZCB2YWx1ZSBpcyBzdG9yZWQgaW4gYHNrYi1cdTAwM2Vwcm90b2NvbGAuIElmIHRoZSBwYWNrZXQgaXMgbGF0ZXIgcmVjZWl2ZWQgYnkgYW4gQUZfUEFDS0VUIHNvY2tldCwgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuXG5TaW5jZSB0aGlzIGlzc3VlIGRvZXMgbm90IGNhdXNlIGEgY3Jhc2gsIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB0cmlnZ2VyIGEgYEJVR19PTmAgZm9yIGxpbmVhciBwYWNrZXRzLCBpdCBjYW4gT05MWSBiZSBkZXRlY3RlZCBieSBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgdG8gZHJvcCBldGhlcm5ldCBmcmFtZXMgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGluIGV0aF90eXBlX3RyYW5zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgZXRoZXJuZXQgcmVjZWl2ZSBwYXRoLCBzbyBpdCBpcyB3b3J0aCBmdXp6aW5nLiBTaW5jZSBldGhfdHlwZV90cmFucyBpcyBhIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb24sIGl0IGlzIG5vdCBhZGRlZCB0byBGb2N1c1N5bWJvbHMgdG8gYXZvaWQgc2tld2luZyB0ZXN0IGRpc3RyaWJ1dGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAzZWQ1NTJjMGM2Y2RjNjgxNjc4MGIxY2E2OGY5OWMzOGM1YWJhN2RkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAxMjo1OToxNSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmNcbmluZGV4IGQ5ZmFhZGJlOWI2YzguLjg0OTE0NzA5YWMwNjEgMTAwNjQ0XG4tLS0gYS9uZXQvZXRoZXJuZXQvZXRoLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9ldGhlcm5ldC9ldGguY1xuQEAgLTE2MSw2ICYjNDM7MTYxLDEyIEBAIF9fYmUxNiBldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFx0c2tiLVx1MDAzZWRldiA9IGRldjtcbiBcdHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7XG4gXG4mIzQzO1x0aWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOKSkge1xuJiM0MztcdFx0bmV0X3dhcm5fcmF0ZWxpbWl0ZWQoXCYjMzQ7JXM6IGRyb3BwaW5nIGZyYW1lIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBmcm9tICVzXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgX19mdW5jX18sIGRldi1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7XG4gXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMjo1OTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgM2VkNTUyYzBjNmNkYzY4MTY3ODBiMWNhNjhmOTljMzhjNWFiYTdkZApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDcgMTI6NTk6MTUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmMKaW5kZXggZDlmYWFkYmU5YjZjOC4uODQ5MTQ3MDlhYzA2MSAxMDA2NDQKLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9ldGhlcm5ldC9ldGguYwpAQCAtMTYxLDYgJiM0MzsxNjEsMTIgQEAgX19iZTE2IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiAJc2tiLSZndDtkZXYgPSBkZXY7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAomIzQzOwlpZiAodW5saWtlbHkoc2tiX2hlYWRsZW4oc2tiKSAmbHQ7IEVUSF9ITEVOKSkgewomIzQzOwkJbmV0X3dhcm5fcmF0ZWxpbWl0ZWQoJiMzNDslczogZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGZyb20gJXNcbiYjMzQ7LAomIzQzOwkJCQkgICAgIF9fZnVuY19fLCBkZXYtJmd0O25hbWUpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAlldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7CiAJZXRoX3NrYl9wa3RfdHlwZShza2IsIGRldik7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAzNAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDMxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQYXRjaDogYGV0aF90eXBlX3RyYW5zYCBpbiBgbmV0L2V0aGVybmV0L2V0aC5jYCoqCgpPa2F5LCBzbyB0aGVyZSYjMzk7cyBhIHBhdGNoIGludHJvZHVjaW5nIGEgY2hlY2sgd2l0aGluIGBldGhfdHlwZV90cmFuc2AgaW4gYG5ldC9ldGhlcm5ldC9ldGguY2AuICBTcGVjaWZpY2FsbHksIHRoZSBjb2RlIG5vdyBsb29rcyBmb3IgcGFja2V0cyB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQg4oCTIGxlc3MgdGhhbiBgRVRIX0hMRU5gLiAgVGhlIGNoZWNrIGlzIHJpZ2h0IHRoZXJlLCBkcm9wcGluZyB0aGVzZSBzaG9ydCBmcmFtZXMuICBOb3csIGBldGhfdHlwZV90cmFuc2DigKYgdGhhdCYjMzk7cyAqZXZlcnl3aGVyZSouIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgZnVuY3Rpb24gZm9yIEV0aGVybmV0IGRyaXZlcnMsIGRvaW5nIHRoZSBjcml0aWNhbCB3b3JrIG9mIHNldHRpbmcgcGFja2V0IHR5cGUgYW5kIHB1bGxpbmcgb3V0IHRoZSBNQUMgaGVhZGVyLiAgRGVmaW5pdGVseSByZWFjaGFibGUsIGFuZCBteSBpbml0aWFsIGluc3RpbmN0IHNheXMgaXQmIzM5O3Mgd29ydGggZnV6emluZyBnaXZlbiB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UuCgpXYWl0IGEgc2Vjb25k4oCmICBgZXRoX3R5cGVfdHJhbnNgIGlzIGEgKmhvdC1wYXRoKiBmdW5jdGlvbi4gV2UgbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggdGhvc2UuIElmIGl0JiMzOTtzIGEgaG90IHBhdGgsIGxpc3RpbmcgaXQgaW4gYEZvY3VzU3ltYm9sc2AgbWlnaHQgc2tldyB0aGUgZnV6emluZyBkaXN0cmlidXRpb24sIHdoaWNoIHdlIHdhbnQgdG8gYXZvaWQuIFRoZSBkb2N1bWVudGF0aW9uIHNheXMsICYjMzQ7QXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuJiMzNDsKClNvLCBJIGNhbiBzdGlsbCBzYXkgdGhlIGNoYW5nZSBtYWtlcyBpdCBXb3J0aEZ1enppbmc9dHJ1ZSwgYnV0IEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGBGb2N1c1N5bWJvbHNgIGFyZSBlbXB0eS4gIFdlIGRvbiYjMzk7dCB3YW50IHRvIG92ZXItcHJpb3JpdGl6ZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmdXp6aW5nIHByb2Nlc3MuCgpMZXQmIzM5O3MgcXVpY2tseSBjaGVjayB0aGUgY29uZmlndXJhdGlvbi4gIGBuZXQvZXRoZXJuZXQvZXRoLmNgIGlzIGNvbXBpbGVkIHdoZW4gYENPTkZJR19FVEhFUk5FVGAgaXMgZW5hYmxlZCwgd2hpY2ggaXMgcHJldHR5IG11Y2ggZ3VhcmFudGVlZCBpbiBhbnkgYmFzaWMgc2V0dXAuIEkmIzM5O2xsIGRvdWJsZSBjaGVjayB0aGUgYG5ldC9ldGhlcm5ldC9NYWtlZmlsZWAganVzdCB0byBiZSBzdXJlIHRoZXJlJiMzOTtzIG5vdGhpbmcgZWxzZSBzcGVjaWZpYyB0aGF0IG1pZ2h0IGFmZmVjdCBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtldGgubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9ldGhlcm5ldC9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvZXRoZXJuZXQvTWFrZWZpbGUtNS1cbm5ldC9ldGhlcm5ldC9NYWtlZmlsZTo2Om9iai15XHRcdFx0XHRcdCYjNDM7PSBldGgub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3NjYKCQkJCQkJCW91dHB1dDogOTkKCQkJCQkJCXRob3VnaHRzOiAxNTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyB0aGUgRXRoZXJuZXQgUmVjZWl2ZSBQYXRoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgb2JqLXkgJiM0Mzs9IGV0aC5vYC4gVGhhdCBtZWFucyB0aGUgYGV0aGAgbW9kdWxlIGlzIGFsd2F5cyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIFJpZ2h0LCB0aGlzIG1ha2VzIGl0IGFuIGludGVyZXN0aW5nIHRhcmdldCBmb3IgZnV6emluZy4gR2l2ZW4gdGhlIGRlc2NyaXB0aW9uLCB0aGUgcGF0Y2ggaW50cm9kdWNlcyBhIGNoZWNrIHRvIGRpc2NhcmQgcGFja2V0cyB0aGF0IGFyZSB0b28gc2hvcnQsIGFuZCB0aGlzIHNvdW5kcyBsaWtlIGl0IGNvdWxkIHVuY292ZXIgc29tZSB2dWxuZXJhYmlsaXRpZXMuCgpOb3csIG15IG1pbmQgaXMgYWxyZWFkeSByYWNpbmcuIFNwZWNpZmljYWxseSwgYGV0aF90eXBlX3RyYW5zYCBnZXRzIGNhbGxlZCBmb3IgKmV2ZXJ5KiBFdGhlcm5ldCBwYWNrZXQgcmVjZWl2ZWQuIFRoYXQmIzM5O3MgYSBodWdlIGNvZGUgc3VyZmFjZSEgVGhlIGluaXRpYWwgdGhvdWdodCB3YXMsIHNob3VsZCB0aGlzIGJlIGluIGBGb2N1c1N5bWJvbHNgPyBIb3dldmVyLCB0aGF0IHdvdWxkIGFsbW9zdCBjZXJ0YWlubHkgc2tldyB0aGUgZnV6emluZyBkaXN0cmlidXRpb24gaGVhdmlseSB0b3dhcmRzIEV0aGVybmV0LCBhbmQgdGhhdCYjMzk7cyBub3Qgd2hhdCBJIHdhbnQuIFNvLCBgRm9jdXNTeW1ib2xzYCBuZWVkcyB0byBiZSBlbXB0eSBpbiB0aGlzIGNhc2UuIEFsc28sIGBFbmFibGVDb25maWdzYCBzaG91bGQgcHJvYmFibHkgYmUgZW1wdHkgdG9vLiBUaGUgY29yZSBvZiB0aGlzIGxvZ2ljIGlzIGluIHRoZSBldGhlcm5ldCByZWNlaXZlIHBhdGggd2hpY2ggaXMgZ2VuZXJpYy4KClNvLCB0aGUgcmVhc29uaW5nIGJvaWxzIGRvd24gdG8gdGhpczogVGhlIGNoYW5nZSBpbnRyb2R1Y2VzIGEgKmZ1bmN0aW9uYWwqIGNoZWNrIGluIGBldGhfdHlwZV90cmFuc2AuIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgY2hhbmdlIGluIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgcmVjZWl2ZWQgRXRoZXJuZXQgcGFja2V0cywgc28gZnV6emluZyBpcyBjZXJ0YWlubHkgd2FycmFudGVkLiBCdXQsIGJlY2F1c2UgYGV0aF90eXBlX3RyYW5zYCBpcyBhIGdlbmVyaWMsIGhvdC1wYXRoIGZ1bmN0aW9uLCBJIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIGhvdyBJIGNvbmZpZ3VyZSB0aGUgZnV6emluZyBwcm9jZXNzIHRvIGF2b2lkIHVuZHVlIGZvY3VzIG9uIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgdG8gZHJvcCBldGhlcm5ldCBmcmFtZXMgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGluIGV0aF90eXBlX3RyYW5zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgZXRoZXJuZXQgcmVjZWl2ZSBwYXRoLCBzbyBpdCBpcyB3b3J0aCBmdXp6aW5nLiBTaW5jZSBldGhfdHlwZV90cmFucyBpcyBhIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb24sIGl0IGlzIG5vdCBhZGRlZCB0byBGb2N1c1N5bWJvbHMgdG8gYXZvaWQgc2tld2luZyB0ZXN0IGRpc3RyaWJ1dGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjRtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgYSBsZW5ndGggY2hlY2sgYHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOYCBpbiBgZXRoX3R5cGVfdHJhbnMoKWAgdG8gcHJldmVudCBwcm9jZXNzaW5nIHBhY2tldHMgd2l0aCBhIGxpbmVhciBwYXJ0IHNob3J0ZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyICgxNCBieXRlcykuIFxuXG5XaXRob3V0IHRoaXMgY2hlY2ssIGlmIGEgdXNlciBpbmplY3RzIGEgc2hvcnQgbGluZWFyIHBhY2tldCAoZS5nLiwgMTAgYnl0ZXMpIHZpYSBhIFRVTi9UQVAgZGV2aWNlIG9yIGFuIEFGX1BBQ0tFVCByYXcgc29ja2V0LCBgZXRoX3R5cGVfdHJhbnMoKWAgY2FsbHMgYGV0aF9za2JfcHVsbF9tYWMoKWAuIGBldGhfc2tiX3B1bGxfbWFjKClgIGNhbGxzIGBza2JfcHVsbF9pbmxpbmUoc2tiLCBFVEhfSExFTilgLiBJZiBgc2tiLVx1MDAzZWxlbiBcdTAwM2MgRVRIX0hMRU5gLCBgc2tiX3B1bGxfaW5saW5lKClgIGZhaWxzIGFuZCByZXR1cm5zIGBOVUxMYCB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGBCVUdfT05gIG9yIGNyYXNoLiBgZXRoX3NrYl9wdWxsX21hYygpYCBpZ25vcmVzIHRoaXMgcmV0dXJuIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBgc2tiLVx1MDAzZWRhdGFgIHBvaW50ZXIuXG5cbmBldGhfdHlwZV90cmFucygpYCB0aGVuIHJlYWRzIGBldGgtXHUwMDNlaF9wcm90b2AgYXQgb2Zmc2V0IDEyLiBCZWNhdXNlIHRoZSBza2IgZGF0YSBidWZmZXIgaXMgdHlwaWNhbGx5IGFsbG9jYXRlZCB3aXRoIGEgbXVjaCBsYXJnZXIgc2l6ZSAoZS5nLiwgdmlhIGBrbWFsbG9jYCksIHRoaXMgcmVhZCBpcyB3ZWxsIHdpdGhpbiB0aGUgYWxsb2NhdGlvbiBib3VuZHMuIFRoZXJlZm9yZSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IGl0IGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cblxuSG93ZXZlciwgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIHVzZXItcHJvdmlkZWQgMTAgYnl0ZXMgaXMgdW5pbml0aWFsaXplZC4gS01TQU4gd2lsbCBkZXRlY3QgdGhpcyBhcyBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZ1cnRoZXJtb3JlLCB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUgaXMgc3RvcmVkIGluIGBza2ItXHUwMDNlcHJvdG9jb2xgLiBJZiB0aGUgcGFja2V0IGlzIGxhdGVyIHJlY2VpdmVkIGJ5IGFuIEFGX1BBQ0tFVCBzb2NrZXQsIGBza2ItXHUwMDNlcHJvdG9jb2xgIGlzIGNvcGllZCB0byBgc2xsX3Byb3RvY29sYCBpbiB0aGUgYHNvY2thZGRyX2xsYCBzdHJ1Y3R1cmUgYW5kIHJldHVybmVkIHRvIHVzZXIgc3BhY2UgdmlhIGByZWN2bXNnKClgLiBUaGlzIGNvbnN0aXR1dGVzIGEgZGlyZWN0IGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiAyIGJ5dGVzIG9mIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS5cblxuU2luY2UgdGhpcyBpc3N1ZSBkb2VzIG5vdCBjYXVzZSBhIGNyYXNoLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdHJpZ2dlciBhIGBCVUdfT05gIGZvciBsaW5lYXIgcGFja2V0cywgaXQgY2FuIE9OTFkgYmUgZGV0ZWN0ZWQgYnkgS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgM2VkNTUyYzBjNmNkYzY4MTY3ODBiMWNhNjhmOTljMzhjNWFiYTdkZApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDcgMTI6NTk6MTUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmMKaW5kZXggZDlmYWFkYmU5YjZjOC4uODQ5MTQ3MDlhYzA2MSAxMDA2NDQKLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9ldGhlcm5ldC9ldGguYwpAQCAtMTYxLDYgJiM0MzsxNjEsMTIgQEAgX19iZTE2IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiAJc2tiLSZndDtkZXYgPSBkZXY7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAomIzQzOwlpZiAodW5saWtlbHkoc2tiX2hlYWRsZW4oc2tiKSAmbHQ7IEVUSF9ITEVOKSkgewomIzQzOwkJbmV0X3dhcm5fcmF0ZWxpbWl0ZWQoJiMzNDslczogZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGZyb20gJXNcbiYjMzQ7LAomIzQzOwkJCQkgICAgIF9fZnVuY19fLCBkZXYtJmd0O25hbWUpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAlldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7CiAJZXRoX3NrYl9wa3RfdHlwZShza2IsIGRldik7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAzMQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDU0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV0aGVybmV0IEZyYW1lIExlbmd0aCBDaGVjayoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IGFkZHMgYSBjaGVjayBpbiBgZXRoX3R5cGVfdHJhbnNgIGZvciB0aGUgaGVhZCBsZW5ndGggb2YgYW4gYHNrYmAuIFNwZWNpZmljYWxseSwgYGlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpICZsdDsgRVRIX0hMRU4pKWAuICBUaGUgaWRlYSBpcyB0byBkcm9wIHRoZSBmcmFtZSBpZiB0aGUgaGVhZCBsZW5ndGggaXMgc21hbGxlciB0aGFuIGBFVEhfSExFTmAuICBNeSBpbml0aWFsIHRob3VnaHQgaXMsIHRoaXMgaXMgYSBib3VuZHMgY2hlY2ssIHJpZ2h0PyAgUHJldmVudGluZyBhbiBvdXQtb2YtYm91bmRzIGFjY2VzcyB3aGVuIGBldGhfc2tiX3B1bGxfbWFjKHNrYilgIGlzIGNhbGxlZCBsYXRlci4gIFdlIHB1bGwgdGhlIE1BQyBoZWFkZXIsIGFuZCBpZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbCwgYm9vbSwgT09CIHJlYWQuCgpJIHN0YXJ0IHRvIHdvbmRlciBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeSwgdGhvdWdoLiAgSWYgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gLCBpcyB0aGVyZSBhIHJpc2sgdGhhdCBgZXRoX3NrYl9wdWxsX21hY2AgbWlnaHQgdHJ5IHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnk/ICBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0aGF0IGlmIGl0JiMzOTtzICp0aGF0KiBzbWFsbCwgaXQmIzM5O3MgYW4gT09CIHJlYWQsIGFuZCBLQVNBTiB3aWxsIGZsYWcgdGhhdC4gSG93ZXZlciwgbWF5YmUgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgbGFyZ2VyLCBidXQgdGhlIGFjdHVhbCBwYWNrZXQgbGVuZ3RoIGlzIHNtYWxsZXI/ICBDb3VsZCB0aGVyZSBiZSBhIHNjZW5hcmlvIHdoZXJlIGl0JiMzOTtzIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBidXQgYmV5b25kIGBza2ItJmd0O2xlbmAgYW5kIHdlIGVuZCB1cCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgcGFkZGluZz8gIEJ1dCB3YWl0LCBLTVNBTiBpcyBkZXNpZ25lZCB0byBjYXRjaCB1bmluaXRpYWxpemVkIG1lbW9yeSwgcmlnaHQ/ICBLQVNBTiBoYW5kbGVzIHRoZSBPT0Igc3R1ZmYuIFRoaXMgcGF0Y2ggc2VlbXMgdG8gYmUgYWJvdXQgcHJldmVudGluZyByZWFkaW5nIGJleW9uZCB0aGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwYXJ0IG9mIHRoZSBgc2tiYCYjMzk7cyBoZWFkLgoKTGV0JiMzOTtzIGRpdmUgaW50byBgZXRoX3NrYl9wdWxsX21hY2AuICBBaCwgaXQgY2FsbHMgYHNrYl9wdWxsX2lubGluZShza2IsIEVUSF9ITEVOKWAuICBJZiBgc2tiLSZndDtsZW5gIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gLCBzb21ldGhpbmcgKmJhZCogbWlnaHQgaGFwcGVuLCBvciB3ZSBlbmQgdXAgcmVhZGluZyBgZXRoLSZndDtoX3Byb3RvYCB3aGljaCBpcyB0ZWNobmljYWxseSBvdXQtb2YtYm91bmRzIG9mIHRoZSBsaW5lYXIgcG9ydGlvbi4gSWYgaXQmIzM5O3MgKmJleW9uZCogdGhlIGFsbG9jYXRlZCBwYXJ0LCBLQVNBTiB3aWxsIGNhdGNoIHRoYXQuIEJ1dCB3aGF0IGlmIGl0JiMzOTtzIHdpdGhpbiB0aGUgYWxsb2NhdGlvbiwgYnV0IHBhc3QgdGhlIGFjdHVhbCBwYWNrZXQgZGF0YSAoYHNrYi0mZ3Q7bGVuYCk/IEtBU0FOIG1pZ2h0IG5vdCBjYXRjaCB0aGF0LCB1bmxlc3MgaXRzIHNrYiBpbnRlZ3JhdGlvbiBpcyBtb3JlIGV4dGVuc2l2ZS4gS01TQU4sIGhvd2V2ZXIsICpzaG91bGQqIGNhdGNoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlmIHdlJiMzOTtyZSByZWFkaW5nIHBhc3QgdGhlIHZhbGlkIGRhdGEuIFRoZSBtZW1vcnkgdGhlcmUgaXMgbGlrZWx5IHVuaW5pdGlhbGl6ZWQuCgpTbywgaXMgdGhpcyBwYXRjaCBwcmltYXJpbHkgYWJvdXQgcHJldmVudGluZyBPT0IgcmVhZHMgb3IgY2F0Y2hpbmcgdW5pbml0aWFsaXplZCBtZW1vcnk/IFRoZSBjb21taXQgbWVzc2FnZSBzYXlzICYjMzQ7ZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0JiMzNDsuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIE9PQiBpc3N1ZS4gYHNrYl9oZWFkbGVuKHNrYikgJmx0OyBFVEhfSExFTmAgbWVhbnMgdGhlIGxpbmVhciBwYXJ0IGlzIHRvbyBzaG9ydC4gSXQmIzM5O3MgYW4gT09CIHJlYWQvd3JpdGUuIEkgc2hvdWxkIHJlYWxseSBnbyBiYWNrIGFuZCBjaGVjayB0aGUgYGV0aF90eXBlX3RyYW5zYCBjb2RlIGl0c2VsZiBpbiBgbmV0L2V0aGVybmV0L2V0aC5jYCB0byBiZSBjb21wbGV0ZWx5IHN1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF9za2JfcHVsbF9tYWMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvZXRoZXJuZXQvZXRoLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2V0aGVybmV0L2V0aC5jPTE1NT1fX2JlMTYgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbi0tXG5uZXQvZXRoZXJuZXQvZXRoLmMtMTY5LVxubmV0L2V0aGVybmV0L2V0aC5jOjE3MDpcdGV0aCA9IGV0aF9za2JfcHVsbF9tYWMoc2tiKTtcbm5ldC9ldGhlcm5ldC9ldGguYy0xNzEtXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM1NQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgY29kZToKCioqRGl2aW5nIGludG8gdGhlIEV0aGVybmV0IFR5cGUgVHJhbnNsYXRvcioqCgpBbHJpZ2h0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgRXRoZXJuZXQgdHlwZXMgYXJlIGJlaW5nIGhhbmRsZWQuIExldCYjMzk7cyBzdGFydCBieSBkaWdnaW5nIGludG8gYGV0aF90eXBlX3RyYW5zYCB3aXRoaW4gYG5ldC9ldGhlcm5ldC9ldGguY2AuIFRoYXQgZnVuY3Rpb24mIzM5O3MgbGlrZWx5IHRoZSBrZXkgdG8gZmlndXJpbmcgb3V0IGhvdyByYXcgRXRoZXJuZXQgZnJhbWVzIGFyZSBjbGFzc2lmaWVkIGFuZCBwcm9jZXNzZWQsIEkmIzM5O20gdGhpbmtpbmcuIEkmIzM5O20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIGhvdyBpdCBtYXBzIEV0aGVyVHlwZSB2YWx1ZXMgdG8gcHJvdG9jb2wgaGFuZGxlcnM7IHVuZGVyc3RhbmRpbmcgdGhhdCB3aWxsIGJlIGNydWNpYWwgZm9yIGFueSBpbi1kZXB0aCBhbmFseXNpcyBvZiBFdGhlcm5ldCBmcmFtZSBwcm9jZXNzaW5nLiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBpbnB1dCBhcmd1bWVudHMsIHJldHVybiB2YWx1ZXMsIGFuZCBhbnkgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGl0IHVzZXMgdG8gbWFrZSB0aGVzZSBjcnVjaWFsIHRyYW5zbGF0aW9uIGRlY2lzaW9ucy4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvZXRoZXJuZXQvZXRoLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE1MDpcdCAqXG4gMTUxOlx0ICogVGhlIHJ1bGUgaGVyZSBpcyB0aGF0IHdlXG4gMTUyOlx0ICogYXNzdW1lIDgwMi4zIGlmIHRoZSB0eXBlIGZpZWxkIGlzIHNob3J0IGVub3VnaCB0byBiZSBhIGxlbmd0aC5cbiAxNTM6XHQgKiBUaGlzIGlzIG5vcm1hbCBwcmFjdGljZSBhbmQgd29ya3MgZm9yIGFueSAmIzM5O25vdyBpbiB1c2UmIzM5OyBwcm90b2NvbC5cbiAxNTQ6XHQgKi9cbiAxNTU6XHRfX2JlMTYgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbiAxNTY6XHR7XG4gMTU3Olx0XHRjb25zdCB1bnNpZ25lZCBzaG9ydCAqc2FwO1xuIDE1ODpcdFx0Y29uc3Qgc3RydWN0IGV0aGhkciAqZXRoO1xuIDE1OTpcdFx0X19iZTE2IHJlcztcbiAxNjA6XHRcbiAxNjE6XHRcdHNrYi1cdTAwM2VkZXYgPSBkZXY7XG4gMTYyOlx0XHRza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpO1xuIDE2MzpcdFxuIDE2NDpcdFx0aWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOKSkge1xuIDE2NTpcdFx0XHRuZXRfd2Fybl9yYXRlbGltaXRlZChcJiMzNDslczogZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGZyb20gJXNcXG5cJiMzNDssXG4gMTY2Olx0XHRcdFx0XHQgICAgIF9fZnVuY19fLCBkZXYtXHUwMDNlbmFtZSk7XG4gMTY3Olx0XHRcdHJldHVybiAwO1xuIDE2ODpcdFx0fVxuIDE2OTpcdFxuIDE3MDpcdFx0ZXRoID0gZXRoX3NrYl9wdWxsX21hYyhza2IpO1xuIDE3MTpcdFx0ZXRoX3NrYl9wa3RfdHlwZShza2IsIGRldik7XG4gMTcyOlx0XG4gMTczOlx0XHQvKlxuIDE3NDpcdFx0ICogU29tZSB2YXJpYW50cyBvZiBEU0EgdGFnZ2luZyBkb24mIzM5O3QgaGF2ZSBhbiBldGhlcnR5cGUgZmllbGRcbiAxNzU6XHRcdCAqIGF0IGFsbCwgc28gd2UgY2hlY2sgaGVyZSB3aGV0aGVyIG9uZSBvZiB0aG9zZSB0YWdnaW5nXG4gMTc2Olx0XHQgKiB2YXJpYW50cyBoYXMgYmVlbiBjb25maWd1cmVkIG9uIHRoZSByZWNlaXZpbmcgaW50ZXJmYWNlLFxuIDE3NzpcdFx0ICogYW5kIGlmIHNvLCBzZXQgc2tiLVx1MDAzZXByb3RvY29sIHdpdGhvdXQgbG9va2luZyBhdCB0aGUgcGFja2V0LlxuIDE3ODpcdFx0ICovXG4gMTc5Olx0XHRpZiAodW5saWtlbHkobmV0ZGV2X3VzZXNfZHNhKGRldikpKVxuIDE4MDpcdFx0XHRyZXR1cm4gaHRvbnMoRVRIX1BfWERTQSk7XG4gMTgxOlx0XG4gMTgyOlx0XHRpZiAobGlrZWx5KGV0aF9wcm90b19pc184MDJfMyhldGgtXHUwMDNlaF9wcm90bykpKVxuIDE4MzpcdFx0XHRyZXR1cm4gZXRoLVx1MDAzZWhfcHJvdG87XG4gMTg0Olx0XG4gMTg1Olx0XHQvKlxuIDE4NjpcdFx0ICogICAgICBUaGlzIGlzIGEgbWFnaWMgaGFjayB0byBzcG90IElQWCBwYWNrZXRzLiBPbGRlciBOb3ZlbGwgYnJlYWtzXG4gMTg3Olx0XHQgKiAgICAgIHRoZSBwcm90b2NvbCBkZXNpZ24gYW5kIHJ1bnMgSVBYIG92ZXIgODAyLjMgd2l0aG91dCBhbiA4MDIuMiBMTENcbiAxODg6XHRcdCAqICAgICAgbGF5ZXIuIFdlIGxvb2sgZm9yIEZGRkYgd2hpY2ggaXNuJiMzOTt0IGEgdXNlZCA4MDIuMiBTU0FQL0RTQVAuIFRoaXNcbiAxODk6XHRcdCAqICAgICAgd29uJiMzOTt0IHdvcmsgZm9yIGZhdWx0IHRvbGVyYW50IG5ldHdhcmUgYnV0IGRvZXMgZm9yIHRoZSByZXN0LlxuIDE5MDpcdFx0ICpcdFdlIHVzZSBza2ItXHUwMDNlZGV2IGFzIHRlbXBvcmFyeSBzdG9yYWdlIHRvIG5vdCBoaXRcbiAxOTE6XHRcdCAqXHRDT05GSUdfU1RBQ0tQUk9URUNUT1JfU1RST05HPXkgY29zdHMgb24gc29tZSBwbGF0Zm9ybXMuXG4gMTkyOlx0XHQgKi9cbiAxOTM6XHRcdHNhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZigqc2FwKSwgXHUwMDI2c2tiLVx1MDAzZWRldik7XG4gMTk0Olx0XHRyZXMgPSAoc2FwIFx1MDAyNlx1MDAyNiAqc2FwID09IDB4RkZGRikgPyBodG9ucyhFVEhfUF84MDJfMykgOiBodG9ucyhFVEhfUF84MDJfMik7XG4gMTk1Olx0XG4gMTk2Olx0XHQvKiByZXN0b3JlIHNrYi1cdTAwM2VkZXYgaW4gY2FzZSBpdCB3YXMgbWFuZ2xlZCBieSBza2JfaGVhZGVyX3BvaW50ZXIoKS4gKi9cbiAxOTc6XHRcdHNrYi1cdTAwM2VkZXYgPSBkZXY7XG4gMTk4Olx0XHRyZXR1cm4gcmVzO1xuIDE5OTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDQ0OQoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDM2NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgS2VybmVsIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGltbWVkaWF0ZWx5IHNlZSBhIHBvdGVudGlhbCBpc3N1ZSB3aXRoIGBldGhfc2tiX3B1bGxfbWFjYC4gSXQgc2VlbXMgbGlrZSB0aGUgZnVuY3Rpb24gaXMgZ3VhcmRlZCBhZ2FpbnN0IHB1bGxpbmcgdG9vIG11Y2ggZGF0YSwgc3BlY2lmaWNhbGx5IG1vcmUgdGhhbiB3aGF0JiMzOTtzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgYHNrYmAmIzM5O3MgaGVhZC4gSG93ZXZlciwgaWYgdGhlIGhlYWQgbGVuZ3RoIGlzIGFjdHVhbGx5ICpsZXNzKiB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoIChgRVRIX0hMRU5gKSwgaXQgd2lsbCB0cnkgdG8gcHVsbCBgRVRIX0hMRU5gIGJ5dGVzIGFueXdheS4gVGhpcyBtZWFucyBgc2tiLSZndDtkYXRhYCB3b3VsZCBnZXQgYWR2YW5jZWQgcGFzdCB0aGUgZW5kIG9mIHRoZSB2YWxpZCBsaW5lYXIgZGF0YSAob3IsIGF0IHRoZSB2ZXJ5IGxlYXN0LCBwb3RlbnRpYWxseSBwYXN0IGBza2ItJmd0O3RhaWxgKS4gVGhlbiwgdGhpcyBjb2RlIGF0dGVtcHRzIHRvIGFjY2VzcyBgZXRoLSZndDtoX3Byb3RvYC4gVGhpcyBmaWVsZCBpcyBhdCBhbiBvZmZzZXQgb2YgMTIgYnl0ZXMgd2l0aGluIHRoZSBFdGhlcm5ldCBoZWFkZXIuCgpJZiB0aGUgbGluZWFyIHBvcnRpb24gb2YgdGhlIGBza2JgIGlzIHNob3J0ZXIgdGhhbiAxNCBieXRlcywgdGhpcyBhY2Nlc3MgdG8gYGV0aC0mZ3Q7aF9wcm90b2Agd2lsbCBjYXVzZSBhbiBvdXQtb2YtYm91bmRzIHJlYWQuIENydWNpYWxseSwgSSYjMzk7bSB0aGlua2luZywgdGhpcyBtaWdodCAqbm90KiBpbW1lZGlhdGVseSBjcmFzaC4gSWYgdGhlIGBza2JgJiMzOTtzIGRhdGEgYnVmZmVyIHdhcyBhbGxvY2F0ZWQgd2l0aCBzb21lIHNsYWNrIChhbmQgaXQgdXN1YWxseSBpcywgZ2l2ZW4gbWluaW11bSBhbGxvY2F0aW9uIHNpemVzKSwgdGhlIG91dC1vZi1ib3VuZHMgcmVhZCBtaWdodCBoaXQgdmFsaWQgbWVtb3J5LCBub3QgYW4gdW5tYXBwZWQgcGFnZS4gU28sIHdlJiMzOTtyZSBub3QgZ3VhcmFudGVlZCBhIHBhZ2UgZmF1bHQuCgpCdXQsIHdvdWxkIEtBU0FOIGNhdGNoIHRoaXM/IEtBU0FOIGlzIHN1cHBvc2VkIHRvIHRyYWNrIG1lbW9yeSBhbGxvY2F0aW9ucy4gSWYgdGhlIHNrYiBidWZmZXIgd2FzIGFsbG9jYXRlZCB1c2luZyBga21hbGxvY2AsIEtBU0FOIHNob3VsZCBrbm93IGl0cyBzaXplLiBJJiMzOTttIHRoaW5raW5nIHRob3VnaCwgYHNrYi0mZ3Q7ZGF0YWAgbWlnaHQgYmUgd2l0aGluIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBidXQgdGhlIHZhbGlkIGRhdGEgb25seSBnb2VzIHVwIHRvIGBza2JfaGVhZGxlbihza2IpYC4gVGhlIGJ5dGVzIGJleW9uZCB0aGF0LCB1cCB0byB0aGUgZW5kIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBhcmUgZWl0aGVyIHVuaW5pdGlhbGl6ZWQgb3IgY29udGFpbiBvbGQgZGF0YS4gQWgsIHdhaXQgYSBtaW51dGUsIGRvZXNuJiMzOTt0IEtBU0FOIGRvIHNvbWUgc3BlY2lhbCBoYW5kbGluZyBmb3Igc2ticz8gRG9lc24mIzM5O3QgaXQgaGF2ZSBhbm5vdGF0aW9ucyBmb3Igc2ticz8KClllcyEgS0FTQU4gcG9pc29ucyB0aGUgdW51c2VkIHBhcnQgb2Ygc2tiIGRhdGEuIFNvLCBsZXQmIzM5O3MgY29uZmlybSB3aGV0aGVyIEtBU0FOIHBvaXNvbnMgc2tiIGRhdGEuIFRoaXMgaXMga2V5IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IHdvdWxkIGZsYWcgdGhpcyBwb3RlbnRpYWxseSBvdXQgb2YgYm91bmRzIHJlYWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2thc2FuXy4qc2tiJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9jb3JlL3NrYnVmZi5jPTI4ND1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpuYXBpX3NrYl9jYWNoZV9nZXQoYm9vbCBhbGxvYylcbi0tXG5uZXQvY29yZS9za2J1ZmYuYy0zMDUtXHRsb2NhbF91bmxvY2tfbmVzdGVkX2JoKFx1MDAyNm5hcGlfYWxsb2NfY2FjaGUuYmhfbG9jayk7XG5uZXQvY29yZS9za2J1ZmYuYzozMDY6XHRrYXNhbl9tZW1wb29sX3VucG9pc29uX29iamVjdChza2IsIHNrYnVmZl9jYWNoZV9zaXplKTtcbm5ldC9jb3JlL3NrYnVmZi5jLTMwNy1cbi0tXG5uZXQvY29yZS9za2J1ZmYuYz0zNDQ9dTMyIG5hcGlfc2tiX2NhY2hlX2dldF9idWxrKHZvaWQgKipza2JzLCB1MzIgbilcbi0tXG5uZXQvY29yZS9za2J1ZmYuYy0zNzgtXG5uZXQvY29yZS9za2J1ZmYuYzozNzk6XHRcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KHNrYnNbaV0sIHNrYnVmZl9jYWNoZV9zaXplKTtcbm5ldC9jb3JlL3NrYnVmZi5jLTM4MC1cdFx0c2tidWZmX2NsZWFyKHNrYnNbaV0pO1xuLS1cbm5ldC9jb3JlL3NrYnVmZi5jPTE0NjQ9c3RhdGljIHZvaWQgbmFwaV9za2JfY2FjaGVfcHV0KHN0cnVjdCBza19idWZmICpza2IpXG4tLVxubmV0L2NvcmUvc2tidWZmLmMtMTQ2Ny1cbm5ldC9jb3JlL3NrYnVmZi5jOjE0Njg6XHRpZiAoIWthc2FuX21lbXBvb2xfcG9pc29uX29iamVjdChza2IpKVxubmV0L2NvcmUvc2tidWZmLmMtMTQ2OS1cdFx0cmV0dXJuO1xuLS1cbm5ldC9jb3JlL3NrYnVmZi5jLTE0NzctXHRcdGZvciAoaSA9IHJlbWFpbmluZzsgaSBcdTAwM2MgTkFQSV9TS0JfQ0FDSEVfU0laRTsgaSYjNDM7JiM0MzspXG5uZXQvY29yZS9za2J1ZmYuYzoxNDc4Olx0XHRcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KG5jLVx1MDAzZXNrYl9jYWNoZVtpXSxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NzktXHRcdFx0XHRcdFx0c2tidWZmX2NhY2hlX3NpemUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NzUwCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS0FTQU4mIzM5O3MgUm9sZSBpbiBza19idWZmIFBvaXNvbmluZyoqCgpPa2F5LCBob2xkIG9uIGEgc2Vjb25kLiBJIG5lZWQgdG8gY2xhcmlmeSBzb21ldGhpbmcgYWJvdXQgYGthc2FuX21lbXBvb2xfcG9pc29uX29iamVjdGAuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGlzIHBvaXNvbnMgdGhlICpgc2tfYnVmZmAgc3RydWN0KiBpdHNlbGYgd2hlbiBpdCYjMzk7cyBhbGxvY2F0ZWQgZnJvbSBhIG1lbXBvb2wuIEJ1dCBpcyBLQVNBTiBhbHNvIHVzZWQgdG8gcG9pc29uIHRoZSAqZGF0YSBidWZmZXIqIHRoYXQmIzM5O3MgYXR0YWNoZWQgdG8gdGhlIGBza19idWZmYD8gVGhhdCYjMzk7cyB0aGUgY3J1Y2lhbCBwb2ludC4gSSBuZWVkIHRvIHZlcmlmeSBob3cgbWVtb3J5IGNvcnJ1cHRpb24gaXMgaGFuZGxlZCB3aXRoIHRoZSBkYXRhIGJ1ZmZlci4KCkxldCBtZSBxdWlja2x5IGRpdmUgaW50byBgbmV0L2NvcmUvc2tidWZmLmNgIGFuZCBodW50IGZvciBjYWxscyB0byBga2FzYW5fcG9pc29uYCBvciBhbnl0aGluZyBzaW1pbGFyIHRoYXQgaGFuZGxlcyBkYXRhIHBvaXNvbmluZyB3aXRoaW4gdGhlIGBza19idWZmYCYjMzk7cyBjb250ZXh0LiBUaGF0JiMzOTtzIHRoZSBtb3N0IGxpa2VseSBwbGFjZSB0byBmaW5kIHRoZSBhbnN3ZXIuIEl0JiMzOTtzIGEga2V5IGRldGFpbCBmb3IgY29ycmVjdGx5IGFzc2Vzc2luZyBwb3RlbnRpYWwgbWVtb3J5IGlzc3VlcyBhbmQgdnVsbmVyYWJpbGl0aWVzIGhlcmUuIEkmIzM5O20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGlmIHRoZXJlJiMzOTtzIGFueSBkaXN0aW5jdGlvbiBiZXR3ZWVuIG1lbXBvb2wtYWxsb2NhdGVkIGFuZCBvdGhlciBgc2tiYCBhbGxvY2F0aW9ucyB3aXRoIHJlc3BlY3QgdG8gS0FTQU4gcG9pc29uaW5nIG9mIHRoZSBkYXRhLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrYXNhbi4qcG9pc29uJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2NvcmUvc2tidWZmLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2NvcmUvc2tidWZmLmM9Mjg0PXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm5hcGlfc2tiX2NhY2hlX2dldChib29sIGFsbG9jKVxuLS1cbm5ldC9jb3JlL3NrYnVmZi5jLTMwNS1cdGxvY2FsX3VubG9ja19uZXN0ZWRfYmgoXHUwMDI2bmFwaV9hbGxvY19jYWNoZS5iaF9sb2NrKTtcbm5ldC9jb3JlL3NrYnVmZi5jOjMwNjpcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KHNrYiwgc2tidWZmX2NhY2hlX3NpemUpO1xubmV0L2NvcmUvc2tidWZmLmMtMzA3LVxuLS1cbm5ldC9jb3JlL3NrYnVmZi5jPTM0ND11MzIgbmFwaV9za2JfY2FjaGVfZ2V0X2J1bGsodm9pZCAqKnNrYnMsIHUzMiBuKVxuLS1cbm5ldC9jb3JlL3NrYnVmZi5jLTM3OC1cbm5ldC9jb3JlL3NrYnVmZi5jOjM3OTpcdFx0a2FzYW5fbWVtcG9vbF91bnBvaXNvbl9vYmplY3Qoc2tic1tpXSwgc2tidWZmX2NhY2hlX3NpemUpO1xubmV0L2NvcmUvc2tidWZmLmMtMzgwLVx0XHRza2J1ZmZfY2xlYXIoc2tic1tpXSk7XG4tLVxubmV0L2NvcmUvc2tidWZmLmM9MTQ2ND1zdGF0aWMgdm9pZCBuYXBpX3NrYl9jYWNoZV9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvY29yZS9za2J1ZmYuYy0xNDY3LVxubmV0L2NvcmUvc2tidWZmLmM6MTQ2ODpcdGlmICgha2FzYW5fbWVtcG9vbF9wb2lzb25fb2JqZWN0KHNrYikpXG5uZXQvY29yZS9za2J1ZmYuYy0xNDY5LVx0XHRyZXR1cm47XG4tLVxubmV0L2NvcmUvc2tidWZmLmMtMTQ3Ny1cdFx0Zm9yIChpID0gcmVtYWluaW5nOyBpIFx1MDAzYyBOQVBJX1NLQl9DQUNIRV9TSVpFOyBpJiM0MzsmIzQzOylcbm5ldC9jb3JlL3NrYnVmZi5jOjE0Nzg6XHRcdFx0a2FzYW5fbWVtcG9vbF91bnBvaXNvbl9vYmplY3QobmMtXHUwMDNlc2tiX2NhY2hlW2ldLFxubmV0L2NvcmUvc2tidWZmLmMtMTQ3OS1cdFx0XHRcdFx0XHRza2J1ZmZfY2FjaGVfc2l6ZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY1MjMKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0NjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4mIzM5O3MgUG90ZW50aWFsIEFkdmFudGFnZSBpbiBTS0IgRGF0YSBIYW5kbGluZyoqCgpPa2F5LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IGhvdyBLQVNBTiBhbmQgS01TQU4gaW50ZXJhY3Qgd2l0aCBTS0IgZGF0YSBidWZmZXJzLCBhbmQgc29tZXRoaW5nIHNlZW1zIHRvIGJlIGNsaWNraW5nLiBJbml0aWFsbHksIGl0IHNlZW1lZCBsaWtlIEtBU0FOIG1pZ2h0IG1pc3MgZXJyb3JzIHdoZW4gcmVhZGluZyBwYXN0IGBza2ItJmd0O3RhaWxgIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciwgYXMgaXQgb25seSBjaGVja3MgdGhlIG92ZXJhbGwgYWxsb2NhdGlvbiBzaXplLiBCdXQgdGhlbiBJIHJlbWVtYmVyZWQgS01TQU4mIzM5O3Mgcm9sZSBpbiBkZXRlY3RpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpJZiB0aGUgYHNrYi0mZ3Q7ZGF0YWAgYnVmZmVyIGlzIGFsbG9jYXRlZCB1c2luZyBga21hbGxvY2AgdGhlbiBLQVNBTiB3aWxsIHBvaXNvbiBwYXN0IHRoZSByZXF1ZXN0ZWQgc2l6ZSwgYnV0IHRoZSBpbXBvcnRhbnQgcG9pbnQgaGVyZSBpcyB0aGF0IHdoZW4gcmVhZGluZyBiZXlvbmQgYHNrYi0mZ3Q7dGFpbGAsIHdlJiMzOTtyZSBwb3RlbnRpYWxseSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCByaWdodD8gQW5kIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBjYXRjaCB0aGF0ISBJZiBpdCYjMzk7cyBhIG5ldyBhbGxvY2F0aW9uLCBLTVNBTiBzaG91bGQgbmFpbCBpdCwgc2luY2UgdGhlIGJ1ZmZlciB3aWxsIGJlIHVuaW5pdGlhbGl6ZWQuIFRob3VnaCwgaWYgdGhlIGJ1ZmZlciBpcyBiZWluZyByZXVzZWQsIEtNU0FOICptaWdodCogbWlzcyBpdCBzaW5jZSBpdCBvbmx5IHRyYWNrcyBpbml0aWFsaXphdGlvbiBhdCBhbGxvY2F0aW9uLgoKVGhpbmtpbmcgc3BlY2lmaWNhbGx5IGFib3V0IHRoZSByZWNlaXZlIHBhdGggYW5kIGhvdyBgZXRoX3R5cGVfdHJhbnNgIGZpdHMgaW4uIFRoZSBkcml2ZXIgZ3JhYnMgYSBidWZmZXIsIHJlY2VpdmVzIGEgcGFja2V0LCBhbmQgc2V0cyBgc2tiLSZndDtsZW5gLiBBbnl0aGluZyBiZXlvbmQgdGhhdCBpcyBlc3NlbnRpYWxseSAmIzM0O2dhcmJhZ2UmIzM0OyBsZWZ0IG92ZXIgZnJvbSB0aGUgcHJldmlvdXMgdXNlLCBvciBwYWRkaW5nIG5vdCB3cml0dGVuIGJ5IHRoZSBkZXZpY2UuIElmIERNQSBpcyB1c2VkLCB0aGUgZGV2aWNlIHdpbGwgd3JpdGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLCBhbmQgS01TQU4gd2lsbCB1bnBvaXNvbiB0aGF0IG1lbW9yeSwgYnV0IHRoZSByZXN0IHJlbWFpbnMgcG9pc29uZWQsIGhlbmNlIHVuaW5pdGlhbGl6ZWQsIHJpZ2h0PwoKU28sIGlmIGBldGhfdHlwZV90cmFuc2AgYXR0ZW1wdHMgdG8gcmVhZCwgc2F5LCBgZXRoLSZndDtoX3Byb3RvYCBiZXlvbmQgdGhlIHJlY2VpdmVkIGxlbmd0aCAoaS5lLiBiZXlvbmQgYHNrYi0mZ3Q7bGVuYCksIGl0IHNob3VsZCB0cmlnZ2VyIGEgS01TQU4gd2FybmluZywgc2luY2UgaXQmIzM5O3MgYW4gdW5pbml0aWFsaXplZCByZWFkISBUaGF0JiMzOTtzIGEgZ29vZCBmaW5kIQoKTm93LCBpcyB0aGlzIGEgS01TQU4tc3BlY2lmaWMgaXNzdWU/IFllcywgYmVjYXVzZSBLQVNBTiBpcyBsaWtlbHkgbm90IGdvaW5nIHRvIGNhdGNoIGl0LCBnaXZlbiB0aGUgbWVtb3J5IGFjY2VzcyBpcyB3aXRoaW4gdGhlIGFsbG9jYXRlZCBib3VuZHMuIEtBU0FOIGRvZXNuJiMzOTt0IGhhdmUgdGhlIHNhbWUgY29uY2VwdCBvZiAmIzM5O2xvZ2ljYWwmIzM5OyBzaXplLCBvbmx5IHRoZSBhbGxvY2F0ZWQgc2l6ZS4gSXQgbG9va3MgbGlrZSBpdCBib2lscyBkb3duIHRvIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpMZXQgbWUganVzdCBkb3VibGUtY2hlY2ssIGJ1dCBJIGRvbiYjMzk7dCBiZWxpZXZlIEtBU0FOIGhhcyB0aGUgYWJpbGl0eSB0byBwb2lzb24gU0tCIGRhdGEsIGJ1dCB0aGVyZSYjMzk7cyBhIHBhdGNoIHNlcmllcyBjYWxsZWQgJiMzNDtrYXNhbjogYWRkIHNrYiBkYXRhIHBvaXNvbmluZyYjMzQ7LiBJJiMzOTtsbCBoYXZlIHRvIGNoZWNrIGlmIHRoYXQgbGFuZGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2thc2FuLipza2ImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L3NrYnVmZi5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzUyNQoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBzdW1tYXJpemVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgYSBzZWFzb25lZCBwcm9mZXNzaW9uYWw6CgoqKkRpZ2dpbmcgaW50byBQb3RlbnRpYWwgS0FTQU4gSXNzdWVzIHdpdGggU0tCcyoqCgpBbHJpZ2h0LCB0aGUgaW5pdGlhbCBzY2FuIGZvciBga2FzYW4uKnNrYmAgaW4gYGluY2x1ZGUvbGludXgvc2tidWZmLmhgIGRpZG4mIzM5O3QgeWllbGQgYW55IGRpcmVjdCBoaXRzLiBUaGF0JiMzOTtzIG5vdCBlbnRpcmVseSB1bmV4cGVjdGVkLCBzb21ldGltZXMgdGhlc2UgdGhpbmdzIGFyZSBzdWJ0bHkgbmFtZWQgb3IgaW1wbGVtZW50ZWQgYWNyb3NzIG11bHRpcGxlIGZpbGVzLiBTbywgdGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgZGVlcGVyIGFuZCBzZWUgaWYgS0FTQU4gKEtlcm5lbCBBZGRyZXNzIFNhbml0aXplcikgaXMgYmVpbmcgdXRpbGl6ZWQgdG8gZGV0ZWN0IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBwcm9ibGVtcyBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBkYXRhIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIGBza2JgIChzb2NrZXQgYnVmZmVyKSBzdHJ1Y3R1cmVzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGVyZSBpcyBhbnkgS0FTQU4gcG9pc29uaW5nIGJlaW5nIGFwcGxpZWQgdG8gdGhlIHNrYiBkYXRhLiBJJiMzOTttIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBjbHVlcyB0aGVyZSB0byBkZXRlcm1pbmUgd2hldGhlciBLQVNBTiBpcyBiZWluZyBhY3RpdmVseSBsZXZlcmFnZWQgdG8gZW5zdXJlIHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBjcml0aWNhbCBuZXR3b3JraW5nIGRhdGEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2FzYW5fcG9pc29uLipza2ImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3NzkwCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNTgzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IGluIE5ldHdvcmsgUGFja2V0IFByb2Nlc3NpbmcqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gaG93IG5ldHdvcmsgZHJpdmVycyBoYW5kbGUgcGFja2V0IGRhdGEgYW5kIGhvdyBtZW1vcnkgc2FuaXRpemVycyBjb21lIGludG8gcGxheS4gSXQgc2VlbXMgS0FTQU4gaXNuJiMzOTt0IHRoZSBzaWx2ZXIgYnVsbGV0IGhlcmUsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJdCBkb2VzbiYjMzk7dCBjYXRjaCByZWFkcyBiZXlvbmQgYHNrYi0mZ3Q7dGFpbGAgb3IgYHNrYl9oZWFkbGVuYCBidXQgKndpdGhpbiogdGhlIGFsbG9jYXRlZCBidWZmZXIuIEtNU0FOLCBob3dldmVyLCAqZG9lcyogY2F0Y2ggaXQsIGJlY2F1c2UgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIGFjdHVhbCBwYWNrZXQgZGF0YSBpcyB1bmluaXRpYWxpemVkLgoKVGhlIGtleSBpcyB0aGlzOiBpZiBhIGRyaXZlciBhbGxvY2F0ZXMgYSBwYWdlIGZvciBhIHBhY2tldCwgdGhhdCBlbnRpcmUgcGFnZSBzdGFydHMgb3V0IHVuaW5pdGlhbGl6ZWQuIERNQSB3cml0ZXMgdGhlIGFjdHVhbCBwYWNrZXQgZGF0YSwgYW5kIEtNU0FOIHNwZWNpZmljYWxseSB1bnBvaXNvbnMgdGhhdCB3cml0dGVuIHBvcnRpb24uIFRoZSByZXN0LCBob3dldmVyLCByZW1haW5zIHVudG91Y2hlZCwgaGVuY2UgdW5pbml0aWFsaXplZC4KCk5vdywgdGFrZSBgZXRoX3R5cGVfdHJhbnNgIGZvciBleGFtcGxlLCB3aGljaCByZWFkcyBgZXRoLSZndDtoX3Byb3RvYCAoMiBieXRlcykuIElmIHRoZSBwYWNrZXQgaXMgc21hbGxlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoIChgRVRIX0hMRU5gKSwgdGhpcyByZWFkIGNvdWxkIGJlIGJleW9uZCBgc2tiX2hlYWRsZW4oc2tiKWAuIEJvb20sIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IQoKVGhhdCBgZXRoLSZndDtoX3Byb3RvYCB2YWx1ZSBpcyB0aGVuIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwcm90b2NvbC4gVGhpcyB2YWx1ZSBjb3VsZCBlbmQgdXAgaW4gYHNrYi0mZ3Q7cHJvdG9jb2xgLiBMYXRlciwgdGhpcyBgc2tiLSZndDtwcm90b2NvbGAgaXMgdXNlZCBmb3Igcm91dGluZyBvciBmaWx0ZXJpbmcsIGFuZCB0aGF0IGNvdWxkIGVhc2lseSBsZWFkIHRvIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJhc2VkIG9uIHRoYXQgdW5pbml0aWFsaXplZCBkYXRhLiBUaGF0JiMzOTtzIGEgcGVyZmVjdCBzY2VuYXJpbyBmb3IgS01TQU4gdG8gZmxhZyBhcyBhICYjMzQ7dXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUmIzM0OyBlcnJvci4KCkkgY29uZmlybWVkIG15IGh5cG90aGVzaXMgYnkgbG9va2luZyBhdCB0aGUgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBgZXRoX3R5cGVfdHJhbnNgIGZ1bmN0aW9uOgpgYGBjCglldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7CglldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTsKCgkvKiAuLi4gKi8KCWlmIChsaWtlbHkoZXRoX3Byb3RvX2lzXzgwMl8zKGV0aC0mZ3Q7aF9wcm90bykpKQoJCXJldHVybiBldGgtJmd0O2hfcHJvdG87CmBgYApJZiBgc2tiX2hlYWRsZW4oc2tiKWAgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmAsIHRoZW4gcmVhZGluZyBgZXRoLSZndDtoX3Byb3RvYCBpcyBnb2luZyB0byBiZSBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGF0IGBldGhfcHJvdG9faXNfODAyXzNgIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcHJvdG9jb2wgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDE1MzYuIENvbmRpdGlvbmFsIGJyYW5jaCBvbiB1bmluaXRpYWxpemVkIGRhdGEhIEtNU0FOIHdpbGwgKmRlZmluaXRlbHkqIGNhdGNoIHRoYXQuCgpNeSBuZXh0IHF1ZXN0aW9uIGlzLCB3aWxsIEtBU0FOIGNhdGNoIHRoaXM/IE5vLCBpdCB3b24mIzM5O3QuIFRoZSByZWFkIGlzIHdpdGhpbiB0aGUgYWxsb2NhdGlvbiBib3VuZHMuIFVzdWFsbHksIG5ldHdvcmsgZHJpdmVycyBhbGxvY2F0ZSBhdCBsZWFzdCBhIHBhZ2UgKDQwOTYgYnl0ZXMpIG9yIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byByZWNlaXZlIHBhY2tldHMuIEEgcGFja2V0IG9mIGxlc3MgdGhhbiAxNCBieXRlcyAoRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCkgZWFzaWx5IGZpdHMgd2l0aGluIHRoYXQgYWxsb2NhdGlvbi4gU28gdGhlIGBldGgtJmd0O2hfcHJvdG9gIHJlYWQgaGFwcGVucyB3aXRoaW4gdGhlIGFsbG9jYXRpb24uIEl0JiMzOTtzIEtNU0FOIHRoYXQgc2hpbmVzIGhlcmUgYmVjYXVzZSB0aGUgbWVtb3J5IGJleW9uZCB0aGUgcGFja2V0IGRhdGEgaXMgdW50b3VjaGVkIGFuZCB0aGVyZWZvcmUgdW5pbml0aWFsaXplZC4KCk5vdywgSSB3b25kZXIgaWYgYW5vdGhlciB0b29sIGNhdGNoZXMgdGhpcy4gTWF5YmUgdGhlcmUgaXMgYSBgQlVHX09OYCBpbiBgc2tiX3B1bGxgPyBJIHNob3VsZCBjaGVjayBgZXRoX3NrYl9wdWxsX21hY2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF9za2JfcHVsbF9tYWMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oPTYyMz1zdGF0aWMgaW5saW5lIHZvaWQgZXRoX3NrYl9wa3RfdHlwZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbmluY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaC02MzktXG5pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmg6NjQwOnN0YXRpYyBpbmxpbmUgc3RydWN0IGV0aGhkciAqZXRoX3NrYl9wdWxsX21hYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oLTY0MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkxNjYKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSYjMzk7bSB3ZWxsLXZlcnNlZCBpbiBrZXJuZWwgbmV0d29ya2luZyBpbnRlcm5hbHM6CgoqKkRpdmluZyBpbnRvIGBldGhfc2tiX3B1bGxfbWFjYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgcHVsbCB1cCB0aGUgc291cmNlIGNvZGUgZm9yIGBldGhfc2tiX3B1bGxfbWFjYC4gVGhpcyBmdW5jdGlvbiBuYW1lIGltbWVkaWF0ZWx5IHNjcmVhbXMgJiMzNDtFdGhlcm5ldCBhbmQgU0tCIG1hbmlwdWxhdGlvbiwmIzM0OyBzbyBpdCYjMzk7cyBsaWtlbHkgYSBrZXkgcGxheWVyIGluIHRoZSBkYXRhIGxpbmsgbGF5ZXIgd2l0aGluIHRoZSBrZXJuZWwmIzM5O3MgbmV0d29yayBzdGFjay4gSSYjMzk7bSBndWVzc2luZyBpdCYjMzk7cyByZXNwb25zaWJsZSBmb3IsIGF0IGEgbWluaW11bSwgaGFuZGxpbmcgdGhlIHB1bGxpbmcgb3IgYWR2YW5jZW1lbnQgb2YgdGhlIFNlY3VyZSBLZXJuZWwgQnVmZmVyIChTS0IpIHBvaW50ZXIgdG8gYWNjb3VudCBmb3IgdGhlIEV0aGVybmV0IE1BQyBoZWFkZXIuIFRoaXMgaXMgdGhlIHN0YWdlIHdoZXJlIHRoZSBrZXJuZWwgaXMgcHJvY2Vzc2luZyBhIHJlY2VpdmVkIEV0aGVybmV0IGZyYW1lLCBhbmQgbmVlZHMgdG8gbW92ZSBwYXN0IHRoZSBkZXN0aW5hdGlvbiBNQUMsIHNvdXJjZSBNQUMsIEV0aGVyVHlwZSwgYW5kIHBvdGVudGlhbGx5IFZMQU4gdGFncyAoaWYgcHJlc2VudCkgdG8gZ2V0IHRvIHRoZSBwYXlsb2FkLiBJdCYjMzk7cyB0aGUgZXNzZW50aWFsIGJyaWRnaW5nIHN0ZXAgYmV0d2VlbiB0aGUgcmF3IGZyYW1lIGRhdGEgYW5kIHRoZSBJUCBsYXllciBvciBoaWdoZXIgcHJvdG9jb2xzLgoKSSYjMzk7bGwgYmUgbG9va2luZyB0byB1bmRlcnN0YW5kOgoKKiAgICoqSG93IGl0IGhhbmRsZXMgdmFyaWFibGUtbGVuZ3RoIGhlYWRlcnM6KiogRG9lcyBpdCBkeW5hbWljYWxseSBhZGp1c3QgdGhlIFNLQiYjMzk7cyBkYXRhIHBvaW50ZXIgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIFZMQU4gdGFncyBvciBvdGhlciBleHRlbnNpb25zIGluIHRoZSBFdGhlcm5ldCBoZWFkZXI/IEFyZSB0aGVyZSBhbnkgY2hlY2tzIGZvciBtaW5pbXVtIGZyYW1lIHNpemVzIG9yIGZyYWdtZW50ZWQgZnJhbWVzPwoqICAgKipFcnJvciBoYW5kbGluZzoqKiBXaGF0IGhhcHBlbnMgaWYgdGhlIFNLQiBpcyB0b28gc21hbGwgdG8gY29udGFpbiBhIHZhbGlkIEV0aGVybmV0IGhlYWRlcj8gQXJlIHRoZXJlIGFueSBzYW5pdHkgY2hlY2tzIG9uIHRoZSBFdGhlclR5cGUgZmllbGQgdG8gZW5zdXJlIGl0JiMzOTtzIGEga25vd24gcHJvdG9jb2w/CiogICAqKlBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zOioqIElzIHRoaXMgYSBob3QgcGF0aD8gQXJlIHRoZXJlIG9wdGltaXphdGlvbnMgaW4gcGxhY2UgbGlrZSBwb3RlbnRpYWxseSBpbmxpbmluZyBNQUMgaGVhZGVyIG9mZnNldHMgdG8gYXZvaWQgYnJhbmNoIGNvbmRpdGlvbnM/IERvZXMgaXQgdXNlIGFueSB0ZWNobmlxdWVzIGxpa2UgcHJlZmV0Y2hpbmcgdG8gaW1wcm92ZSBjYWNoZSBiZWhhdmlvcj8KKiAgICoqSW50ZXJhY3Rpb24gd2l0aCBvdGhlciBmdW5jdGlvbnM6KiogSG93IGRvZXMgaXQgdGllIGludG8gdGhlIG92ZXJhbGwgcmVjZWl2ZSBwYXRoPyBJcyBpdCBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgTklDIGRyaXZlciwgb3IgdGhyb3VnaCBzb21lIGludGVybWVkaWF0ZSBsYXllcj8gRG9lcyBpdCB1cGRhdGUgYW55IG90aGVyIFNLQiBtZXRhZGF0YSB0aGF0IGRvd25zdHJlYW0gbGF5ZXJzIHJlbHkgb24/CgpJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHJhdyBpbmNvbWluZyBFdGhlcm5ldCBmcmFtZXMgYW5kIHRyYW5zbGF0ZXMgdGhlbSBpbnRvIGEgdXNhYmxlIGZvcm1hdCBmb3IgaGlnaGVyLWxldmVsIG5ldHdvcmsgcHJvdG9jb2xzLiBJdCYjMzk7cyBmdW5kYW1lbnRhbCB0byB0aGUgd2hvbGUgbmV0d29ya2luZyBwcm9jZXNzISBMZXQmIzM5O3MgZGlnIGluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYzNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjM1Olx0XHRcdFx0c2tiLVx1MDAzZXBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDtcbiA2MzY6XHRcdFx0fVxuIDYzNzpcdFx0fVxuIDYzODpcdH1cbiA2Mzk6XHRcbiA2NDA6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBldGhoZHIgKmV0aF9za2JfcHVsbF9tYWMoc3RydWN0IHNrX2J1ZmYgKnNrYilcbiA2NDE6XHR7XG4gNjQyOlx0XHRzdHJ1Y3QgZXRoaGRyICpldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi1cdTAwM2VkYXRhO1xuIDY0MzpcdFxuIDY0NDpcdFx0c2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pO1xuIDY0NTpcdFx0cmV0dXJuIGV0aDtcbiA2NDY6XHR9XG4gNjQ3Olx0XG4gNjQ4Olx0LyoqXG4gNjQ5Olx0ICogZXRoX3NrYl9wYWQgLSBQYWQgYnVmZmVyIHRvIG1pbmltdW0gbnVtYmVyIG9mIG9jdGV0cyBmb3IgRXRoZXJuZXQgZnJhbWVcbiA2NTA6XHQgKiBAc2tiOiBCdWZmZXIgdG8gcGFkXG4gNjUxOlx0ICpcbiA2NTI6XHQgKiBBbiBFdGhlcm5ldCBmcmFtZSBzaG91bGQgaGF2ZSBhIG1pbmltdW0gc2l6ZSBvZiA2MCBieXRlcy4gIFRoaXMgZnVuY3Rpb25cbiA2NTM6XHQgKiB0YWtlcyBzaG9ydCBmcmFtZXMgYW5kIHBhZHMgdGhlbSB3aXRoIHplcm9zIHVwIHRvIHRoZSA2MCBieXRlIGxpbWl0LlxuIDY1NDpcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5OTQzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyB0aGUgTmV0d29yayBQYWNrZXQgUHVsbCBPcGVyYXRpb24qKgoKUmlnaHQsIGBldGhfc2tiX3B1bGxfbWFjYC4uLiB0aGF0JiMzOTtzIHdoZXJlIHdlJiMzOTtyZSB5YW5raW5nIHRoZSBFdGhlcm5ldCBoZWFkZXIgb2ZmIGEgcGFja2V0LCBpc24mIzM5O3QgaXQ/IFRoZSBrZXkgbGluZSB0aGVyZSwgYXMgSSByZWNhbGwsIGlzIHRoZSBjYWxsIHRvIGBza2JfcHVsbF9pbmxpbmUoc2tiLCBFVEhfSExFTilgLiBPa2F5LCBzbyBgc2tiX3B1bGxfaW5saW5lYCBpcyBjbGVhcmx5IHRoZSB3b3JraG9yc2UgaGVyZS4gV2UmIzM5O3JlIGV4cGVjdGluZyBgRVRIX0hMRU5gLCB3aGljaCBpcyB0aGF0IHN0YW5kYXJkIEV0aGVybmV0IGhlYWRlciBsZW5ndGguLi4gMTQgb3IgMTUgYnl0ZXMsIGRlcGVuZGluZyBvbiB0aGUgVkxBTiBzaXR1YXRpb24uIFNvLCB0aGUga2VybmVsIGlzIGxpa2VseSBtYW5hZ2luZyBhIHNoYXJlZCBuZXR3b3JrIGJ1ZmZlciwgcmlnaHQ/IFdlJiMzOTtyZSB0YWtpbmcgdGhlIG1lbW9yeSBhdCB0aGUgaGVhZCBvZiB0aGUgYHNrYmAgYW5kIGFkdmFuY2luZyB0aGUgYGRhdGFgIHBvaW50ZXIgdG8gc2tpcCB0aGUgRXRoZXJuZXQgaGVhZGVyLiBMZXQmIzM5O3MgZGlnIGRlZXBlciBpbnRvIHRoZSBpbnRyaWNhY2llcyBvZiB3aGF0IGBza2JfcHVsbF9pbmxpbmVgIGlzIGRvaW5nLiBTcGVjaWZpY2FsbHksIGhvdyBpdCYjMzk7cyBiZWluZyBoYW5kbGVkIGhlcmUuIEkmIzM5O20ga2VlbiB0byBleGFtaW5lIGhvdyBpdCBpcyB3b3JraW5nIGhlcmUsIHNpbmNlIHdlIGFyZSBoYW5kbGluZyBhIGJ1ZmZlciBpbmxpbmUuIExldCYjMzk7cyBzZWUgaG93IHRoZXkgZG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NrYl9wdWxsX2lubGluZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvc2tidWZmLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9za2J1ZmYuaD0yODM2PXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqX19za2JfcHVsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKVxuLS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjg1MS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmg6Mjg1MjpzdGF0aWMgaW5saW5lIHZvaWQgKnNrYl9wdWxsX2lubGluZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODUzLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAzOTMKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBgc2tiX3B1bGxfaW5saW5lYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gaXQuIFRpbWUgdG8gZGlzc2VjdCBgc2tiX3B1bGxfaW5saW5lYC4gSSBrbm93IHRoaXMgZnVuY3Rpb24gaW50aW1hdGVseSwgYnV0IGl0JiMzOTtzIGFsd2F5cyB3b3J0aCBhIGZyZXNoIGxvb2suIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSByZWZyZXNoIHRoZSBtZW50YWwgbW9kZWwgb2YgaG93IGl0IG9wZXJhdGVzIG9uIGFuIGBza19idWZmYC4gSSYjMzk7bSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBpbXBsaWNhdGlvbnMgb2YgaW5saW5pbmcsIGVzcGVjaWFsbHkgYXJvdW5kIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBtZW1vcnkgYWxpZ25tZW50IGlzc3Vlcy4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0aGUgdHlwaWNhbCB1c2UgY2FzZXMgYW5kIGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgb3ZlcmFsbCBuZXR3b3JrIHN0YWNrIOKAkyB3aGF0IGxheWVycyByZWx5IG9uIGl0LCBhbmQgd2hhdCBhc3N1bXB0aW9ucyBhcmUgbWFkZSBhYm91dCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGFueSByZWNlbnQgY2hhbmdlcyBvciBkaXNjdXNzaW9ucyBJJiMzOTt2ZSBtaXNzZWQg4oCTIHBlcmhhcHMgbmV3IGFyY2hpdGVjdHVyZXMgb3Igb3B0aW1pemF0aW9ucyB0aGF0IGhhdmUgaW1wYWN0ZWQgaXRzIGJlaGF2aW9yLiBJdCYjMzk7cyB0aW1lIHRvIGNvbmZpcm0gbXkgYXNzdW1wdGlvbnMgYW5kIG1ha2Ugc3VyZSBteSB1bmRlcnN0YW5kaW5nIGlzIGNvbXBsZXRlbHkgc2hhcnAhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9za2J1ZmYuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI4NDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7Mjg0NTpcdFx0XHRza2JfZHVtcChLRVJOX0VSUiwgc2tiLCBmYWxzZSk7XG4yODQ2Olx0I2VuZGlmXG4yODQ3Olx0XHRcdEJVRygpO1xuMjg0ODpcdFx0fVxuMjg0OTpcdFx0cmV0dXJuIHNrYi1cdTAwM2VkYXRhICYjNDM7PSBsZW47XG4yODUwOlx0fVxuMjg1MTpcdFxuMjg1MjpcdHN0YXRpYyBpbmxpbmUgdm9pZCAqc2tiX3B1bGxfaW5saW5lKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pXG4yODUzOlx0e1xuMjg1NDpcdFx0cmV0dXJuIHVubGlrZWx5KGxlbiBcdTAwM2Ugc2tiLVx1MDAzZWxlbikgPyBOVUxMIDogX19za2JfcHVsbChza2IsIGxlbik7XG4yODU1Olx0fVxuMjg1NjpcdFxuMjg1NzpcdHZvaWQgKnNrYl9wdWxsX2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2l6ZV90IGxlbik7XG4yODU4Olx0XG4yODU5Olx0dm9pZCAqX19wc2tiX3B1bGxfdGFpbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZGVsdGEpO1xuMjg2MDpcdFxuMjg2MTpcdHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgZW51bSBza2JfZHJvcF9yZWFzb25cbjI4NjI6XHRwc2tiX21heV9wdWxsX3JlYXNvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKVxuMjg2MzpcdHtcbjI4NjQ6XHRcdERFQlVHX05FVF9XQVJOX09OX09OQ0UobGVuIFx1MDAzZSBJTlRfTUFYKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA5NjQKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA2ODcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBWdWxuZXJhYmlsaXR5KioKCk9rYXksIHNvIGBza2JfcHVsbF9pbmxpbmVgIHJldHVybmluZyBgTlVMTGAgd2hlbiB0aGUgcmVxdWVzdGVkIGxlbmd0aCAoYGxlbmApIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2tiJiMzOTtzIGN1cnJlbnQgbGVuZ3RoIChgc2tiLSZndDtsZW5gKSBpbW1lZGlhdGVseSBqdW1wcyBvdXQgYXQgbWUuIEFuZCBoZXJlJiMzOTtzIHRoZSBraWNrZXI6IGBldGhfc2tiX3B1bGxfbWFjYCBibGl0aGVseSAqaWdub3JlcyogdGhhdCBgTlVMTGAgcmV0dXJuISBUaGF0JiMzOTtzIGEgcmVkIGZsYWcuIFNwZWNpZmljYWxseSwgdGhpcyBjb2RlOgoKYGBgYwpzdGF0aWMgaW5saW5lIHN0cnVjdCBldGhoZHIgKmV0aF9za2JfcHVsbF9tYWMoc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItJmd0O2RhdGE7CgoJc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pOwoJcmV0dXJuIGV0aDsKfQpgYGAKCklmIGBFVEhfSExFTmAgKDE0IGJ5dGVzIGZvciBhbiBFdGhlcm5ldCBoZWFkZXIpIGlzIGdyZWF0ZXIgdGhhbiBgc2tiLSZndDtsZW5gLCBgc2tiX3B1bGxfaW5saW5lYCByZXR1cm5zIGBOVUxMYCBhbmQgKmRvZXNuJiMzOTt0KiBhZHZhbmNlIGBza2ItJmd0O2RhdGFgLiBCdXQgYGV0aF9za2JfcHVsbF9tYWNgIHN0aWxsIHJldHVybnMgdGhlIG9yaWdpbmFsLCBub3cgcG90ZW50aWFsbHkgaW52YWxpZCwgcG9pbnRlciBgZXRoYC4gVGhlbiwgYGV0aF90eXBlX3RyYW5zYCBoYXBwaWx5IGdvZXMgYWhlYWQgYW5kIHRyaWVzIHRvIHVzZSBgZXRoLSZndDtoX3Byb3RvYC4gVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLgoKSWYgYEVUSF9ITEVOICZndDsgc2tiLSZndDtsZW5gLCBkb2VzIHRoaXMgbmVjZXNzYXJpbHkgbWVhbiBgc2tiLSZndDtsZW5gIGlzIGxlc3MgdGhhbiAxND8gQWJzb2x1dGVseS4gVGhhdCBtZWFucyB0aGF0IGBldGgtJmd0O2hfcHJvdG9gLCB3aGljaCBpcyBhdCBvZmZzZXQgMTIgaW4gdGhlIGBldGhoZHJgIHN0cnVjdHVyZSwgZmFsbHMgKm91dHNpZGUqIHRoZSB2YWxpZCBkYXRhIHJlZ2lvbiBvZiB0aGUgc2tiLiBJZiBgc2tiLSZndDtsZW5gIGlzLCBzYXksIDEwIGJ5dGVzLCB0aGVuIGBldGgtJmd0O2hfcHJvdG9gIGF0IG9mZnNldCAxMiBpcyBhY2Nlc3NpbmcgbWVtb3J5IHRoYXQmIzM5O3MgYmV5b25kIHRoZSBkYXRhJiMzOTtzIGJvdW5kYXJ5LgoKVGhlIHF1ZXN0aW9uIHRoZW4gaXMsIHdpbGwgdGhpcyBiZSBjYXVnaHQ/IEtBU0FOIChLZXJuZWwgQWRkcmVzcyBTYW5pdGl6ZXIpIGxpa2VseSAqd29uJiMzOTt0KiBmbGFnIHRoaXMuIFRoZSBhbGxvY2F0ZWQgYnVmZmVyIGlzIHVzdWFsbHkgbXVjaCBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBkYXRhIGxlbmd0aC4gSG93ZXZlciwgS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSAqd2lsbCogbGlrZWx5IGNhdGNoIGl0IGJlY2F1c2UgdGhlIG1lbW9yeSBhdCBvZmZzZXQgMTIgbWlnaHQgdmVyeSB3ZWxsIGJlIHVuaW5pdGlhbGl6ZWQuCgpOb3csIHdoYXQgaWYgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gICpidXQqIGBza2ItJmd0O2xlbmAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBFVEhfSExFTmA/IEFoLCB0aGlzIG1lYW5zIHRoZSBwYWNrZXQgaXMgZnJhZ21lbnRlZCwgYW5kIHRoZSBsaW5lYXIgcGFydCBpcyBzaG9ydGVyIHRoYW4gMTQgYnl0ZXMuIEluIHRoaXMgY2FzZSwgYHNrYl9wdWxsX2lubGluZWAgd2lsbCBjYWxsIGBfX3NrYl9wdWxsKHNrYiwgRVRIX0hMRU4pYC4gTGV0JiMzOTtzIHJlZnJlc2ggb3VyIG1lbW9yeSBvZiB3aGF0IGBfX3NrYl9wdWxsYCBkb2VzOgoKYGBgYwpzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKl9fc2tiX3B1bGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKewoJc2tiLSZndDtsZW4gLT0gbGVuOwoJQlVHX09OKHNrYi0mZ3Q7bGVuICZsdDsgc2tiLSZndDtkYXRhX2xlbik7CglyZXR1cm4gc2tiLSZndDtkYXRhICYjNDM7PSBsZW47Cn0KYGBgCgpJZiBgc2tiX2hlYWRsZW4oc2tiKSAmbHQ7IEVUSF9ITEVOYCwgdGhlbiBgc2tiLSZndDtsZW4gLSBza2ItJmd0O2RhdGFfbGVuICZsdDsgRVRIX0hMRU5gLiBTbywgYHNrYi0mZ3Q7bGVuIC0gRVRIX0hMRU4gJmx0OyBza2ItJmd0O2RhdGFfbGVuYC4gVGhlIGBCVUdfT04oc2tiLSZndDtsZW4gJmx0OyBza2ItJmd0O2RhdGFfbGVuKWAgd2lsbCB0cmlnZ2VyLCBwcmV2ZW50aW5nIGZ1cnRoZXIgcHJvYmxlbXMuCgpTbywgKnRoYXQqIGBCVUdfT05gIHdpbGwgYmUgaGl0IGlmIGBza2JfaGVhZGxlbihza2IpICZsdDsgRVRIX0hMRU5gIGFuZCBgc2tiLSZndDtsZW4gJmd0Oz0gRVRIX0hMRU5gPyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGBza2JfaGVhZGxlbmAgYmVoYXZlcy4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtza2JfaGVhZGxlbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvc2tidWZmLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9za2J1ZmYuaD0yNTI3PXN0YXRpYyBpbmxpbmUgYm9vbCBza2JfaXNfbm9ubGluZWFyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXG4tLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yNTMxLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyNTMyOnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNrYl9oZWFkbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI1MzMte1xuLS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmg9MjU0Nj1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBza2JfcGFnZWxlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yNTQ3LXtcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6MjU0ODpcdHJldHVybiBza2JfaGVhZGxlbihza2IpICYjNDM7IF9fc2tiX3BhZ2VsZW4oc2tiKTtcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjU0OS19XG4tLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaD0yODYyPXBza2JfbWF5X3B1bGxfcmVhc29uKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pXG4tLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODY2LVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyODY3Olx0aWYgKGxpa2VseShsZW4gXHUwMDNjPSBza2JfaGVhZGxlbihza2IpKSlcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjg2OC1cdFx0cmV0dXJuIFNLQl9OT1RfRFJPUFBFRF9ZRVQ7XG4tLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODcyLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyODczOlx0aWYgKHVubGlrZWx5KCFfX3Bza2JfcHVsbF90YWlsKHNrYiwgbGVuIC0gc2tiX2hlYWRsZW4oc2tiKSkpKVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODc0LVx0XHRyZXR1cm4gU0tCX0RST1BfUkVBU09OX05PTUVNO1xuLS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmg9NDMyNT1za2JfaGVhZGVyX3BvaW50ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwgaW50IGxlbiwgdm9pZCAqYnVmZmVyKVxuLS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmgtNDMyNy1cdHJldHVybiBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgbGVuLCBza2ItXHUwMDNlZGF0YSxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6NDMyODpcdFx0XHRcdCAgICBza2JfaGVhZGxlbihza2IpLCBidWZmZXIpO1xuaW5jbHVkZS9saW51eC9za2J1ZmYuaC00MzI5LX1cbi0tXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oPTQzNDQ9c2tiX3BvaW50ZXJfaWZfbGluZWFyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsIGludCBsZW4pXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTQzNDUte1xuaW5jbHVkZS9saW51eC9za2J1ZmYuaDo0MzQ2Olx0aWYgKGxpa2VseShza2JfaGVhZGxlbihza2IpIC0gb2Zmc2V0IFx1MDAzZT0gbGVuKSlcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtNDM0Ny1cdFx0cmV0dXJuIHNrYi1cdTAwM2VkYXRhICYjNDM7IG9mZnNldDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMxMzAKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMsIGFzIHRob3VnaCB0aGVzZSBhcmUgKm15KiB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBza2JfaGVhZGxlbmAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGUgZGV0YWlscy4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3Mgd291bGQgYmUgc29tZXRoaW5nIGxpa2UgdGhpczoKCiYjMzQ7T2theSwgc28gd2UmIzM5O3JlIGxvb2tpbmcgYXQgYHNrYl9oZWFkbGVuYC4gU3RyYWlnaHQgYXdheSwgSSYjMzk7bSB0aGlua2luZywgdGhpcyBtdXN0IHJlbGF0ZSB0byB0aGUgTGludXgga2VybmVsJiMzOTtzIGBza19idWZmYCBzdHJ1Y3R1cmUsIHRoZSB3b3JraG9yc2UgZm9yIG5ldHdvcmsgcGFja2V0IGhhbmRsaW5nLiAgYGhlYWRsZW5gIHN1Z2dlc3RzIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdGhlIHNpemUgb2YgdGhlIGhlYWRlciBwb3J0aW9uIG9mIGFuIGBza2JgLiBUaGF0JiMzOTtzIHRoZSBtb3N0ICpsaWtlbHkqIGludGVycHJldGF0aW9uLCBnaXZlbiBteSBwYXN0IGV4cGVyaWVuY2UgYW5kIHRoZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb25zLiBMZXQmIzM5O3MgZGVsdmUgaW4gYW5kIHNlZSBpZiB0aGlzIGludHVpdGlvbiBpcyBjb3JyZWN0LiYjMzQ7CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9za2J1ZmYuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1MjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjUyNTpcdFxuMjUyNjpcdFxuMjUyNzpcdHN0YXRpYyBpbmxpbmUgYm9vbCBza2JfaXNfbm9ubGluZWFyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXG4yNTI4Olx0e1xuMjUyOTpcdFx0cmV0dXJuIHNrYi1cdTAwM2VkYXRhX2xlbjtcbjI1MzA6XHR9XG4yNTMxOlx0XG4yNTMyOlx0c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2tiX2hlYWRsZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcbjI1MzM6XHR7XG4yNTM0Olx0XHRyZXR1cm4gc2tiLVx1MDAzZWxlbiAtIHNrYi1cdTAwM2VkYXRhX2xlbjtcbjI1MzU6XHR9XG4yNTM2Olx0XG4yNTM3Olx0c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19za2JfcGFnZWxlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuMjUzODpcdHtcbjI1Mzk6XHRcdHVuc2lnbmVkIGludCBpLCBsZW4gPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU1NAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE2OTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBOZXR3b3JrIFBhY2tldCBQcm9jZXNzaW5nIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBrZXJuZWwgaXNzdWUgcmVsYXRlZCB0byBFdGhlcm5ldCBoZWFkZXIgaGFuZGxpbmcgYW5kIGl0JiMzOTtzIHF1aXRlIGludGVyZXN0aW5nLiBJdCBzZWVtcyB0aGUgY29yZSBwcm9ibGVtIGFyaXNlcyB3aGVuIGRlYWxpbmcgd2l0aCBuZXR3b3JrIHBhY2tldHMgd2hlcmUgdGhlIGxpbmVhciBwYXJ0IG9mIHRoZSBTS0IgKFNvY2tldCBCdWZmZXIpIGlzIHNob3J0ZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAoYEVUSF9ITEVOYCkuIExldCYjMzk7cyBicmVhayB0aGlzIGRvd246CgpGaXJzdCwgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGVzc2VudGlhbGx5IGBza2ItJmd0O2xlbiAtIHNrYi0mZ3Q7ZGF0YV9sZW5gLiBUaGUgdnVsbmVyYWJpbGl0eSBwb3BzIHVwIGlmIHRoaXMgdmFsdWUgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmAuIElmIHdlIGhhdmUgYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYCwgdGhlbiBgc2tiX3B1bGxfaW5saW5lYCBnZXRzIGNhbGxlZCB3aGljaCB1bHRpbWF0ZWx5IGNhbGxzIGBfX3NrYl9wdWxsYC4gSG93ZXZlciwgaWYgYHNrYi0mZ3Q7bGVuIC0gc2tiLSZndDtkYXRhX2xlbiAmbHQ7IEVUSF9ITEVOYCwgdGhlbiBgX19za2JfcHVsbGAgdHJpZ2dlcnMgYSBgQlVHX09OYCBiZWNhdXNlIHRoZSBsZW5ndGggY2FsY3VsYXRpb24gYmVjb21lcyBpbnZhbGlkIChgc2tiLSZndDtsZW5gIHdvdWxkIGJlIGxlc3MgdGhhbiBgc2tiLSZndDtkYXRhX2xlbmAgYWZ0ZXIgdGhlIHN1YnRyYWN0aW9uKS4gU3RhbmRhcmQgZnV6emluZywgc3BlY2lmaWNhbGx5IHN5emthbGxlciAod2l0aG91dCBLTVNBTiksIHNob3VsZCBjYXRjaCB0aGlzIGBCVUdfT05gLgoKQnV0LCB3aGF0IGlmIGBza2ItJmd0O2xlbiAmbHQ7IEVUSF9ITEVOYD8gSW4gdGhpcyBzY2VuYXJpbywgYHNrYl9wdWxsX2lubGluZWAgcmV0dXJucyBgTlVMTGAsIGJ5cGFzc2luZyBgX19za2JfcHVsbGAuIENydWNpYWxseSwgdGhpcyBhdm9pZHMgdGhlIGBCVUdfT05gLiBIZXJlLCBgZXRoX3NrYl9wdWxsX21hY2AgcmV0dXJucyBgc2tiLSZndDtkYXRhYCwgYW5kIGBldGhfdHlwZV90cmFuc2AgYXR0ZW1wdHMgdG8gcmVhZCBgZXRoLSZndDtoX3Byb3RvYC4gVGhlIGtleSBpcyB0aGF0IHNpbmNlIGBza2ItJmd0O2xlbiAmbHQ7IEVUSF9ITEVOYCwgYGV0aC0mZ3Q7aF9wcm90b2AgaXMgYmV5b25kIHRoZSBlbmQgb2Ygd2hhdCYjMzk7cyBjb25zaWRlcmVkIHRoZSAmIzM0O3ZhbGlkJiMzNDsgcGFja2V0IGRhdGEuCgpJbml0aWFsbHksIEkgd2FzIHdvcnJpZWQgYWJvdXQgYW4gb3V0LW9mLWJvdW5kcyByZWFkLCBidXQgdGhlIGRhdGEgaXMgc3RpbGwgd2l0aGluIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBqdXN0IGJleW9uZCB0aGUgcmVwb3J0ZWQgYHNrYi0mZ3Q7bGVuYC4gS0FTQU4gd29uJiMzOTt0IGNhdGNoIHRoaXMsIGJlY2F1c2UgaXQmIzM5O3Mgbm90IHRydWx5IG91dC1vZi1ib3VuZHMuIEhvd2V2ZXIsIEtNU0FOICp3aWxsKiBjYXRjaCBpdCBiZWNhdXNlIHRoZSBtZW1vcnkgYmV5b25kIGBza2ItJmd0O2xlbmAgaXMgdW5pbml0aWFsaXplZC4gVGhlIGtlcm5lbCBpcyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgoKVGhpcyByZWFkIG9mIHRoZSB1bmluaXRpYWxpemVkIHZhbHVlIGJlY29tZXMgdGhlIGBza2ItJmd0O3Byb3RvY29sYC4gSXQgdGhlbiBnZXRzIHVzZWQgaW4gYSBsYXRlciBzdGVwIGFuZCBiZWNvbWVzIGEgcmVwb3J0YWJsZSBLTVNBTiBpc3N1ZS4gVGhpcyBzZWVtcyB0byBiZSB0aGUgcHJpbWFyeSB3YXkgdG8gY2F0Y2ggaXQgYmVjYXVzZSBLQVNBTiBkb2VzbiYjMzk7dCB0cmFjayB1bmluaXRpYWxpemVkIG1lbW9yeSwgYW5kIHRoZXJlJiMzOTtzIG5vIGFjdHVhbCBvdXQtb2YtYm91bmRzIGFjY2Vzcy4KClRoZSBjb25zZXF1ZW5jZXMgY291bGQgYmUgaW50ZXJlc3RpbmcuIElmIGBldGgtJmd0O2hfcHJvdG9gIGlzIHVuaW5pdGlhbGl6ZWQsIHRoZSBwYWNrZXQgbWlnaHQgZ2V0IHJvdXRlZCB0byBhIHJhbmRvbSBwcm90b2NvbCBoYW5kbGVyLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIHBhY2tldCBkcm9wcyBieSBoYW5kbGVycyBzdWNoIGFzIElQdjQgdGhhdCBjaGVjayBgcHNrYl9tYXlfcHVsbGAuIFRoZSBwYWNrZXQgY291bGQgYmUgZHJvcHBlZCBkdWUgdG8gYW4gaW52YWxpZCBoZWFkZXIgbGVuZ3RoLiBObyBtZW1vcnkgY29ycnVwdGlvbiwganVzdCBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnksIGJ1dCBvbmx5IEtNU0FOIGNhbiBjYXRjaCB0aGlzLgoKTm93LCBsZXQmIzM5O3MgcmV2aXNpdCB0aGUgYEJVR19PTmAgc2NlbmFyaW8uIEl0JiMzOTtzIHRyaWdnZXJlZCB3aGVuIGBza2ItJmd0O2xlbiAmZ3Q7PSBFVEhfSExFTmAgYnV0IGBza2JfaGVhZGxlbihza2IpICZsdDsgRVRIX0hMRU5gLiBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIGEgTUFDIGhlYWRlciBpcyBzcGxpdCBhY3Jvc3MgdGhlIGxpbmVhciBwYXJ0IGFuZCB0aGUgZnJhZ21lbnRzIG9mIHRoZSBwYWNrZXQuIFN5emthbGxlciBjYXRjaGVzIHRoaXMuIEJ1dCBpZiBgc2tiLSZndDtsZW4gJmx0OyBFVEhfSExFTmAsIHRoZW4gdGhlIGBCVUdfT05gIGlzIGF2b2lkZWQsIGV4cG9zaW5nIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIHByb3Bvc2VkIHBhdGNoIG1pdGlnYXRlcyAqYm90aCogY2FzZXMgYnkgY2hlY2tpbmcgaWYgYHNrYl9oZWFkbGVuKHNrYikgJmx0OyBFVEhfSExFTmAsIGVmZmVjdGl2ZWx5IHByZXZlbnRpbmcgYm90aCB0aGUgYEJVR19PTmAgYW5kIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkLgoKSWYgc3RhbmRhcmQgZnV6emluZyBmb3VuZCB0aGUgaXNzdWUgdmlhIGBCVUdfT05gLCB0aGF0IG1lYW5zIHdlIGRvbiYjMzk7dCBuZWNlc3NhcmlseSBuZWVkIEtNU0FOLiBXYWl0ISBJcyB0aGF0IHJpZ2h0PwoKVGhlIHBhdGNoIGl0c2VsZiBpbmRpY2F0ZXMgdGhpczogYGlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpICZsdDsgRVRIX0hMRU4pKWAuIFRoaXMgd2lsbCB3YXJuLCBhbmQgcmV0dXJuIHplcm8uCgpTbywgaWYgc3l6a2FsbGVyIGZvdW5kIGl0IGFzIGEgYEJVR19PTmAsIGl0IHdvdWxkIGJlIHJlcG9ydGVkIGxpa2UgYGtlcm5lbCBCVUcgYXQgaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyODQ3IWAsIHdoaWNoIGlzIGluIGBfX3NrYl9wdWxsYC4gQnV0IHRoYXQgYEJVR19PTmAgaXMgb25seSB0cmlnZ2VyZWQgaWYgYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYCBhbmQgYHNrYl9oZWFkbGVuKHNrYikgJmx0OyBFVEhfSExFTmAuIENhbiBhIGRldmljZSByZWFsaXN0aWNhbGx5ICpyZWNlaXZlKiBzdWNoIGEgcGFja2V0IGJlZm9yZSBgZXRoX3R5cGVfdHJhbnNgPwoKVXN1YWxseSwgZGV2aWNlcyByZWNlaXZlIHRoZSBNQUMgaGVhZGVyIGluIHRoZSBsaW5lYXIgcGFydC4gSG93ZXZlciwgYSB2aXJ0dWFsIGRldmljZSBsaWtlIHR1bi90YXAgb3Igc29tZSBvdGhlciB2aXJ0dWFsIGRldmljZSAqY291bGQqIGluamVjdCBhIHBhY2tldCB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQgYW5kIGZyYWdtZW50cywgdGh1cyB0cmlnZ2VyaW5nIHRoZSBgQlVHX09OYC4KCkNvbnZlcnNlbHksIGlmIGEgZGV2aWNlIGluamVjdHMgYSBwYWNrZXQgd2l0aCBgc2tiLSZndDtsZW4gJmx0OyBFVEhfSExFTmAgYW5kIG5vIGZyYWdtZW50cywgaXQgKndvbiYjMzk7dCogdHJpZ2dlciB0aGUgYEJVR19PTmAsIGJ1dCBpdCAqd2lsbCogdHJpZ2dlcgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF90eXBlX3RyYW5zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdHVuLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdHVuLmM9MTY5NT1zdGF0aWMgc3NpemVfdCB0dW5fZ2V0X3VzZXIoc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biwgc3RydWN0IHR1bl9maWxlICp0ZmlsZSxcbi0tXG5kcml2ZXJzL25ldC90dW4uYy0xODQ5LVx0XHR9XG5kcml2ZXJzL25ldC90dW4uYzoxODUwOlx0XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi1cdTAwM2VkZXYpO1xuZHJpdmVycy9uZXQvdHVuLmMtMTg1MS1cdFx0YnJlYWs7XG4tLVxuZHJpdmVycy9uZXQvdHVuLmM9MjM4Mz1zdGF0aWMgaW50IHR1bl94ZHBfb25lKHN0cnVjdCB0dW5fc3RydWN0ICp0dW4sXG4tLVxuZHJpdmVycy9uZXQvdHVuLmMtMjQ3MS1cbmRyaXZlcnMvbmV0L3R1bi5jOjI0NzI6XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi1cdTAwM2VkZXYpO1xuZHJpdmVycy9uZXQvdHVuLmMtMjQ3My1cdHNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjUzNwoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhhdCBrZXJuZWwgY29kZToKCioqQ2hlY2tpbmcgYHR1bl9nZXRfdXNlcmAgZm9yIE1pbmltdW0gRnJhbWUgU2l6ZSBWaW9sYXRpb25zKioKCkFscmlnaHQsIEkgbmVlZCB0byB2ZXJpZnkgaG93IGB0dW5fZ2V0X3VzZXJgIGluIGBkcml2ZXJzL25ldC90dW4uY2AgaGFuZGxlcyBwYWNrZXRzIHdpdGggbGVuZ3RocyBzaG9ydGVyIHRoYW4gdGhlIHN0YW5kYXJkIEV0aGVybmV0IGhlYWRlciBsZW5ndGggKGBFVEhfSExFTmApLiBJIGtub3cgdGhhdCBFdGhlcm5ldCBmcmFtZXMgKm11c3QqIGhhdmUgYSBtaW5pbXVtIHNpemUsIGFuZCBpZiB3ZSYjMzk7cmUgc2VlaW5nIGFuIGlzc3VlLCBpdCYjMzk7cyBwb3NzaWJsZSB0aGF0IGB0dW5fZ2V0X3VzZXJgIGlzIGFsbG93aW5nIG9yIG1pc2ludGVycHJldGluZyBzaG9ydCBmcmFtZXMgY29taW5nIGZyb20gdXNlcnNwYWNlLiBJJiMzOTtsbCBuZWVkIHRvIGxvb2sgY2FyZWZ1bGx5IGF0IGhvdyB0aGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBidWZmZXIgc2l6ZXMsIGNvcGllcyBkYXRhLCBhbmQgcGVyZm9ybXMgYW55IGxlbmd0aCBjaGVja3MuIFNwZWNpZmljYWxseSwgSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgY29tcGFyaXNvbnMgYWdhaW5zdCBgRVRIX0hMRU5gIG9yIG90aGVyIHNpemUgY29uc3RyYWludHMuIEl0JiMzOTtzIGFsc28gaW1wb3J0YW50IHRvIGNvbnNpZGVyIGlmIGFueSBvdGhlciBsYXllcnMgYXJlIHJlbGllZCBvbiB0byBoYW5kbGUgdGhlIHNpemUgY29uc3RyYWludHMuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBubyBleHBsb2l0YWJsZSBjb25kaXRpb24gZXhpc3RzIGR1ZSB0byBhbiB1bmRlcnNpemVkIGZyYW1lIGJlaW5nIHBhc3NlZCB0aHJvdWdoLiBNeSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBhIHZ1bG5lcmFiaWxpdHkgZXhpc3RzIG9yIG5vdCwgYW5kIGhvdyBpdCBjYW4gYmUgbWl0aWdhdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L3R1bi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTg0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxODQwOlx0XHRcdHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7XG4xODQxOlx0XHRcdHNrYi1cdTAwM2Vwcm90b2NvbCA9IHBpLnByb3RvO1xuMTg0MjpcdFx0XHRza2ItXHUwMDNlZGV2ID0gdHVuLVx1MDAzZWRldjtcbjE4NDM6XHRcdFx0YnJlYWs7XG4xODQ0Olx0XHRjYXNlIElGRl9UQVA6XG4xODQ1Olx0XHRcdGlmIChmcmFncyBcdTAwMjZcdTAwMjYgIXBza2JfbWF5X3B1bGwoc2tiLCBFVEhfSExFTikpIHtcbjE4NDY6XHRcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMTg0NzpcdFx0XHRcdGRyb3BfcmVhc29uID0gU0tCX0RST1BfUkVBU09OX0hEUl9UUlVOQztcbjE4NDg6XHRcdFx0XHRnb3RvIGRyb3A7XG4xODQ5Olx0XHRcdH1cbjE4NTA6XHRcdFx0c2tiLVx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tXHUwMDNlZGV2KTtcbjE4NTE6XHRcdFx0YnJlYWs7XG4xODUyOlx0XHR9XG4xODUzOlx0XG4xODU0Olx0XHQvKiBjb3B5IHNrYl91YnVmX2luZm8gZm9yIGNhbGxiYWNrIHdoZW4gc2tiIGhhcyBubyBlcnJvciAqL1xuMTg1NTpcdFx0aWYgKHplcm9jb3B5KSB7XG4xODU2Olx0XHRcdHNrYl96Y29weV9pbml0KHNrYiwgbXNnX2NvbnRyb2wpO1xuMTg1NzpcdFx0fSBlbHNlIGlmIChtc2dfY29udHJvbCkge1xuMTg1ODpcdFx0XHRzdHJ1Y3QgdWJ1Zl9pbmZvICp1YXJnID0gbXNnX2NvbnRyb2w7XG4xODU5Olx0XHRcdHVhcmctXHUwMDNlb3BzLVx1MDAzZWNvbXBsZXRlKE5VTEwsIHVhcmcsIGZhbHNlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTcxODEKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0MzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVnVsbmVyYWJpbGl0eSBEaXNjb3ZlcmVkIGluIGB0dW5fZ2V0X3VzZXJgKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkmIzM5O20gbG9va2luZyBhdCBgdHVuX2dldF91c2VyYCBhbmQgc3BlY2lmaWNhbGx5IHRoaXMgc2VjdGlvbjoKCmBgYGMKCQljYXNlIElGRl9UQVA6CgkJCWlmIChmcmFncyAmYW1wOyZhbXA7ICFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0hMRU4pKSB7CgkJCQllcnIgPSAtRU5PTUVNOwoJCQkJZHJvcF9yZWFzb24gPSBTS0JfRFJPUF9SRUFTT05fSERSX1RSVU5DOwoJCQkJZ290byBkcm9wOwoJCQl9CgkJCXNrYi0mZ3Q7cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi0mZ3Q7ZGV2KTsKCQkJYnJlYWs7CmBgYAoKSW50ZXJlc3RpbmcuIEl0IGFwcGVhcnMgdGhhdCB0aGUgYHBza2JfbWF5X3B1bGxgIGNoZWNrIGlzICpvbmx5KiBwZXJmb3JtZWQgaWYgdGhlIGBmcmFnc2AgZmxhZyBpcyBzZXQuIFRoYXQgbWVhbnMsIGlmIGBmcmFnc2AgaXMgZmFsc2UsIGFuZCB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGEgbGluZWFyIHNrYiAobWVhbmluZyBubyBmcmFnbWVudGF0aW9uKSwgdGhlcmUmIzM5O3MgKm5vKiBsZW5ndGggY2hlY2sgYWdhaW5zdCBgRVRIX0hMRU5gICh3aGljaCBpcyAxNCBieXRlcykgZm9yIHRoZSBpbmNvbWluZyBwYWNrZXQuCgpTbywgaWYgYSBtYWxpY2lvdXMgdXNlciBpbmplY3RzIGEgKmxpbmVhciogcGFja2V0IHdpdGggYSBsZW5ndGggb2YgbGVzcyB0aGFuIDE0IGJ5dGVzIGludG8gdGhlIFRBUCBpbnRlcmZhY2UsIHRoZSBjb2RlIHdpbGwgaGFwcGlseSBjb250aW51ZSBhbmQgY2FsbCBgZXRoX3R5cGVfdHJhbnNgLiBUaGUgY3JpdGljYWwgaXNzdWUgaGVyZSBpcyB0aGF0IHNpbmNlIGBza2ItJmd0O2xlbmAgYW5kIGBza2JfaGVhZGxlbihza2IpYCBhcmUgYm90aCBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgdGhlIGBldGhfdHlwZV90cmFuc2AgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIHJlYWQgYmV5b25kIHRoZSBwcm92aWRlZCBkYXRhIGluIHRoZSBza2IuCgpNeSBpbml0aWFsIHRob3VnaHQgd2FzLCB3aWxsIHRoaXMgdHJpZ2dlciBhIGBCVUdfT05gIGluIGBza2JfcHVsbF9pbmxpbmVgPyBObywgYmVjYXVzZSBgc2tiX3B1bGxfaW5saW5lYCByZXR1cm5zIE5VTEwgaWYgeW91IHRyeSB0byBwdWxsIG1vcmUgZGF0YSB0aGFuIGF2YWlsYWJsZSB3aGljaCBwcm90ZWN0cyB0aGUgY29kZSBmcm9tIHRoZSBidWcuCgpJIHRoZW4gcmVhbGl6ZWQgdGhhdCBgZXRoX3NrYl9wdWxsX21hY2Agc2ltcGx5IHJldHVybnMgYHNrYi0mZ3Q7ZGF0YWAgYW5kIHRoZW4gYGV0aF90eXBlX3RyYW5zYCBhdHRlbXB0cyB0byByZWFkIGBldGgtJmd0O2hfcHJvdG9gIHdoaWNoIGlzIHVuaW5pdGlhbGl6ZWQhCgpDb3VsZCBLQVNBTiBjYXRjaCB0aGlzPyBJIGluaXRpYWxseSB0aG91Z2h0LCBwcm9iYWJseSBub3QuIFRoZSBsaW5lYXIgYnVmZmVyIGFsbG9jYXRlZCBieSBgdHVuX2dldF91c2VyYCBpcyB1c3VhbGx5IHF1aXRlIGxhcmdlIOKAkyBhIGZldyBodW5kcmVkIGJ5dGVzIGF0IGxlYXN0LCBvciBtYXliZSBhIGZ1bGwgcGFnZS4gU28sIGV2ZW4gaWYgdGhlIHVzZXIgcHJvdmlkZXMgbGVzcyB0aGFuIDE0IGJ5dGVzLCB0aGUgJiMzNDtleHRyYSYjMzQ7IGJ5dGVzIHdlIGFyZSByZWFkaW5nIHdvdWxkIGxpa2VseSBiZSB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gSSYjMzk7ZCBleHBlY3QgYW55IHJlYWQgYXQgb2Zmc2V0IDEyIHRvIGJlIHdpdGhpbiB0aGUgYnVmZmVyLgoKSG93ZXZlciwgYWZ0ZXIgYSBzZWNvbmQgcGFzcywgSSB0aGluayBLTVNBTiBtaWdodCBjYXRjaCB0aGlzISBUaGUgdXNlciBvbmx5IHByb3ZpZGVkIGEgc21hbGwgYW1vdW50IG9mIGRhdGEgKGxlc3MgdGhhbiAxNCBieXRlcykuIFRoZSByZXN0IG9mIHRoZSBidWZmZXIgaXMgdW5pbml0aWFsaXplZC4gV2UgbmVlZCB0byBjb25maXJtIHdoZXRoZXIgYHR1bl9hbGxvY19za2JgIHplcm9lcyB0aGUgYnVmZmVyICh3aGljaCB3b3VsZCBtYWtlIHRoaXMgYSByZWFkIG9mIHplcm9lcyByYXRoZXIgdGhhbiB1bmluaXRpYWxpemVkIG1lbW9yeSkgYnV0IGVpdGhlciB3YXksIHNpbmNlIHRoZSBwcm92aWRlZCBkYXRhIGlzbiYjMzk7dCBlbm91Z2gsIHdlIGFyZSByZWFkaW5nIG91dC1vZi1ib3VuZHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3R1bl9hbGxvY19za2ImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL25ldC90dW4uYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL25ldC90dW4uYz0xMzkyPXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdHVuX25hcGlfYWxsb2NfZnJhZ3Moc3RydWN0IHR1bl9maWxlICp0ZmlsZSxcbi0tXG5kcml2ZXJzL25ldC90dW4uYy0xNDQ4LSAqIGxpbmVhciBpcyBhIGhpbnQgYXMgdG8gaG93IG11Y2ggdG8gY29weSAodXN1YWxseSBoZWFkZXJzKS4gKi9cbmRyaXZlcnMvbmV0L3R1bi5jOjE0NDk6c3RhdGljIHN0cnVjdCBza19idWZmICp0dW5fYWxsb2Nfc2tiKHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXG5kcml2ZXJzL25ldC90dW4uYy0xNDUwLVx0XHRcdFx0ICAgICBzaXplX3QgcHJlcGFkLCBzaXplX3QgbGVuLFxuLS1cbmRyaXZlcnMvbmV0L3R1bi5jPTE2OTU9c3RhdGljIHNzaXplX3QgdHVuX2dldF91c2VyKHN0cnVjdCB0dW5fc3RydWN0ICp0dW4sIHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXG4tLVxuZHJpdmVycy9uZXQvdHVuLmMtMTc5NS1cbmRyaXZlcnMvbmV0L3R1bi5jOjE3OTY6XHRcdFx0c2tiID0gdHVuX2FsbG9jX3NrYih0ZmlsZSwgYWxpZ24sIGNvcHlsZW4sIGxpbmVhcixcbmRyaXZlcnMvbmV0L3R1bi5jLTE3OTctXHRcdFx0XHRcdCAgICBub2Jsb2NrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg1MTUKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSYjMzk7bSBkZWVwbHkgZmFtaWxpYXIgd2l0aCBuZXR3b3JraW5nIGFuZCBrZXJuZWwgaW50ZXJuYWxzLCBhbmQgZXNwZWNpYWxseSB0aGUgVFVOL1RBUCBkcml2ZXI6CgoqKkNoZWNraW5nIGB0dW5fYWxsb2Nfc2tiYCoqCgpSaWdodCwgbGV0JiMzOTtzIGRpdmUgcmlnaHQgaW4uIFRoZSBwaHJhc2UgJiMzNDtMZXQmIzM5O3MgY2hlY2sgYHR1bl9hbGxvY19za2JgJiMzNDsgaW1tZWRpYXRlbHkgc2lnbmFscyBhIHNwZWNpZmljIGFyZWEgb2YgaW50ZXJlc3Q6IHRoZSBhbGxvY2F0aW9uIG9mIFNLQnMgKFNvY2tldCBCdWZmZXJzKSB3aXRoaW4gdGhlIFRVTiBkcml2ZXIuIFRoaXMgaXMgYSBjcml0aWNhbCBwb2ludC4gYHR1bl9hbGxvY19za2JgIGlzIHRoZSBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG1lbW9yeSBzdHJ1Y3R1cmVzIHRoYXQgd2lsbCBob2xkIHRoZSBuZXR3b3JrIHBhY2tldHMgYmVpbmcgc2VudCB0byBhbmQgcmVjZWl2ZWQgZnJvbSB0aGUgdXNlci1zcGFjZSBhcHBsaWNhdGlvbiB2aWEgdGhlIFRVTiBpbnRlcmZhY2UuIEEgZGVlcCB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgaXMgcGFyYW1vdW50IHdoZW4gZGVhbGluZyB3aXRoIG5ldHdvcmsgcGVyZm9ybWFuY2UsIHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIG9yIGFueSBvZGQgYmVoYXZpb3IgaW4gYSBUVU4tYmFzZWQgc2V0dXAuCgpNeSBpbW1lZGlhdGUgdGhvdWdodHMgYXJlLCB3aGVyZSBleGFjdGx5IGRvIEkgd2FudCB0byAmIzM0O2NoZWNrJiMzNDsgdGhpcyBmdW5jdGlvbj8gSXMgdGhpcyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24gaXRzZWxmPyBQZXJoYXBzIEkmIzM5O20gbG9va2luZyBhdCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgd2l0aGluIHRoYXQgZnVuY3Rpb24uIEFyZSB0aGVyZSBhbnkgY29udGVudGlvbiBpc3N1ZXM/IERvIEkgd2FudCB0byBjaGVjayBpdHMgaW50ZXJhY3Rpb24gd2l0aCBvdGhlciBrZXJuZWwgY29tcG9uZW50cyBzdWNoIGFzIERNQSBvciBOVU1BPyBJcyB0aGVyZSBhIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWd5IEkgc2hvdWxkIGV4YW1pbmUgY2xvc2VseSBmb3IgcG9zc2libGUgaW1wcm92ZW1lbnRzIG9yIG1pc2NvbmZpZ3VyYXRpb25zPwoKSSBwcm9iYWJseSBoYXZlIGEgc3BlY2lmaWMgY29uY2VybiBpbiBtaW5kLiBJcyB0aGVyZSBhIHBlcmZvcm1hbmNlIHByb2JsZW0gd2l0aCBhIHBhcnRpY3VsYXIgd29ya2xvYWQ/IEFyZSBwYWNrZXRzIGJlaW5nIGRyb3BwZWQ/IEFyZSB0aGVyZSBhbnkgcmVwb3J0cyBvZiBtZW1vcnkgbGVha3M/IElzIGl0IGFib3V0IG92ZXJhbGwgdGhyb3VnaHB1dCwgbGF0ZW5jeSwgb3Igc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgcmVsYXRlZCB0byBidWZmZXIgYWxsb2NhdGlvbj8gVGhlIGNvbnRleHQgb2YgdGhlIGNoZWNrIHdvdWxkIGluZmx1ZW5jZSB3aGVyZSB0byBiZWdpbiB0aGUgaW5zcGVjdGlvbi4gSSYjMzk7ZCBuZWVkIHRvIGNvbnNpZGVyIHRoZSBzeXN0ZW0mIzM5O3MgaGFyZHdhcmUgY29uZmlndXJhdGlvbiwgdGhlIHVzZXItc3BhY2UgYXBwbGljYXRpb24sIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgZmFjdG9ycyB0byBmb3JtdWxhdGUgYSB1c2VmdWwgaHlwb3RoZXNpcyBhYm91dCBgdHVuX2FsbG9jX3NrYmAuCgpVbHRpbWF0ZWx5LCBpdCB3b3VsZCBkZXBlbmQgb24gd2hlcmUgSSB3b3VsZCBsaWtlIHRvIGxvb2ssIGJlIGl0IHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVneSwgYnVmZmVyIGFsaWdubWVudCBpc3N1ZXMsIG9yIGNvbmN1cnJlbnQgYWNjZXNzIHRvIGRhdGEgc3RydWN0dXJlcy4gV2hhdGV2ZXIgdGhlIGNvbmNlcm4sIGB0dW5fYWxsb2Nfc2tiYCBpcyB0aGUgcGxhY2UgdG8gc3RhcnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdHVuLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNDQ5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE0NDk6XHRzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnR1bl9hbGxvY19za2Ioc3RydWN0IHR1bl9maWxlICp0ZmlsZSxcbjE0NTA6XHRcdFx0XHRcdCAgICAgc2l6ZV90IHByZXBhZCwgc2l6ZV90IGxlbixcbjE0NTE6XHRcdFx0XHRcdCAgICAgc2l6ZV90IGxpbmVhciwgaW50IG5vYmxvY2spXG4xNDUyOlx0e1xuMTQ1MzpcdFx0c3RydWN0IHNvY2sgKnNrID0gdGZpbGUtXHUwMDNlc29ja2V0LnNrO1xuMTQ1NDpcdFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcbjE0NTU6XHRcdGludCBlcnI7XG4xNDU2Olx0XG4xNDU3Olx0XHQvKiBVbmRlciBhIHBhZ2U/ICBEb24mIzM5O3QgYm90aGVyIHdpdGggcGFnZWQgc2tiLiAqL1xuMTQ1ODpcdFx0aWYgKHByZXBhZCAmIzQzOyBsZW4gXHUwMDNjIFBBR0VfU0laRSlcbjE0NTk6XHRcdFx0bGluZWFyID0gbGVuO1xuMTQ2MDpcdFxuMTQ2MTpcdFx0aWYgKGxlbiAtIGxpbmVhciBcdTAwM2UgTUFYX1NLQl9GUkFHUyAqIChQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIFBBR0VfQUxMT0NfQ09TVExZX09SREVSKSlcbjE0NjI6XHRcdFx0bGluZWFyID0gbGVuIC0gTUFYX1NLQl9GUkFHUyAqIChQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIFBBR0VfQUxMT0NfQ09TVExZX09SREVSKTtcbjE0NjM6XHRcdHNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9wc2tiKHNrLCBwcmVwYWQgJiM0MzsgbGluZWFyLCBsZW4gLSBsaW5lYXIsIG5vYmxvY2ssXG4xNDY0Olx0XHRcdFx0XHQgICBcdTAwMjZlcnIsIFBBR0VfQUxMT0NfQ09TVExZX09SREVSKTtcbjE0NjU6XHRcdGlmICghc2tiKVxuMTQ2NjpcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuMTQ2NzpcdFxuMTQ2ODpcdFx0c2tiX3Jlc2VydmUoc2tiLCBwcmVwYWQpO1xuMTQ2OTpcdFx0c2tiX3B1dChza2IsIGxpbmVhcik7XG4xNDcwOlx0XHRza2ItXHUwMDNlZGF0YV9sZW4gPSBsZW4gLSBsaW5lYXI7XG4xNDcxOlx0XHRza2ItXHUwMDNlbGVuICYjNDM7PSBsZW4gLSBsaW5lYXI7XG4xNDcyOlx0XG4xNDczOlx0XHRyZXR1cm4gc2tiO1xuMTQ3NDpcdH1cbjE0NzU6XHRcbjE0NzY6XHRzdGF0aWMgdm9pZCB0dW5fcnhfYmF0Y2hlZChzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLCBzdHJ1Y3QgdHVuX2ZpbGUgKnRmaWxlLFxuMTQ3NzpcdFx0XHRcdCAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBtb3JlKVxuMTQ3ODpcdHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTk0NzIKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAzOTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtNU0FOIEJ1ZyoqCgpPa2F5LCBzbyBoZXJlJiMzOTtzIHdoYXQgSSYjMzk7bSB0aGlua2luZy4gVGhpcyBgc29ja19hbGxvY19zZW5kX3Bza2JgIGZ1bmN0aW9uIGlzIGFsbG9jYXRpbmcgdGhlIHNvY2tldCBidWZmZXIgKHNrYiksIGJ1dCBpdCAqZG9lc24mIzM5O3QqIHplcm8gb3V0IHRoZSBkYXRhIGJ1ZmZlci4gVGhhdCBtZWFucyBldmVyeXRoaW5nIGJleW9uZCB0aGUgaW5pdGlhbCAmIzM5O2xpbmVhciYjMzk7IGRhdGEsIHdoaWNoIGlzIG91ciAmIzM5O2xlbiYjMzk7LCBpcyBqdXN0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBOb3csIGB0dW5fZ2V0X3VzZXJgIHRoZW4gY29waWVzICYjMzk7bGVuJiMzOTsgYnl0ZXMgZnJvbSB1c2VyIHNwYWNlIGludG8gdGhpcyBidWZmZXIuIFRoZSBieXRlcyBiZXlvbmQgJiMzOTtsZW4mIzM5OyAqcmVtYWluKiB1bmluaXRpYWxpemVkLiBUaGF0JiMzOTtzIHRoZSBrZXkuCgpUaGVuLCB3ZSBoYXZlIGBldGhfdHlwZV90cmFuc2AgcmVhZGluZyBgZXRoLSZndDtoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIElmIG91ciAmIzM5O2xlbiYjMzk7IGlzIGxlc3MgdGhhbiAxNCBieXRlcywgaXQmIzM5O3MgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSEgVGhpcyAqc2NyZWFtcyogS01TQU4gYnVnLCBhIGNsYXNzaWMgb25lLgoKV2FpdCwgZGlkIHN5emthbGxlciBhY3R1YWxseSBmaW5kIHRoaXMgb25lIHdpdGggS0FTQU4/IElmIEtBU0FOIGlzbiYjMzk7dCBjYXRjaGluZyBpdCwgYW5kIHRoYXQgYEJVR19PTmAgaXNuJiMzOTt0IGZpcmluZywgdGhlbiB0aGUgb25seSB3YXkgc3l6a2FsbGVyIHdvdWxkIGhhdmUgZm91bmQgaXQgd291bGQgYmUgdGhyb3VnaCBLTVNBTi4gVGhhdCYjMzk7cyBpbnRlcmVzdGluZy4KCk5vdywgd2FpdCwgd2hhdCBpZiBgZnJhZ3NgIGlzIHRydWU/IElmIGBmcmFnc2AgaXMgdHJ1ZSwgdGhlbiBgdHVuX2dldF91c2VyYCBjYWxscyBgcHNrYl9tYXlfcHVsbChza2IsIEVUSF9ITEVOKWAuIElmIHRoYXQgZmFpbHMsIHRoZSBwYWNrZXQgZ2V0cyBkcm9wcGVkLCBubyBoYXJtLiBJZiBpdCAqc3VjY2VlZHMqLCB3ZSBrbm93IHRoYXQgYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYCBhbmQgYHNrYl9oZWFkbGVuKHNrYikgJmd0Oz0gRVRIX0hMRU5gLiBTbywgZXZlbiBpZiBgZnJhZ3NgIGlzIHRydWUsIHRoZSBgQlVHX09OYCBpc24mIzM5O3QgdHJpZ2dlcmVkIGluIGB0dW5fZ2V0X3VzZXJgIQoKV2FpdCwgd2FpdC4gSWYgYGZyYWdzYCBpcyB0cnVlLCBgcHNrYl9tYXlfcHVsbGAgZW5zdXJlcyBgc2tiX2hlYWRsZW4oc2tiKSAmZ3Q7PSBFVEhfSExFTmAuIFRoYXQmIzM5O3MgdGhlIHJlYWwgcG9pbnQuIFNvIGBCVUdfT05gIGlzIG5ldmVyIHRyaWdnZXJlZCBmcm9tIGB0dW5fZ2V0X3VzZXJgLgoKT2theSwgaXMgdGhlcmUgYW5vdGhlciBjYWxsZXIgb2YgYGV0aF90eXBlX3RyYW5zYCB0aGF0IGNvdWxkIGJlIHRyaWdnZXJlZCB0aGlzIHdheT8gV2hhdCBhYm91dCBgcGFja2V0X3NuZGAgaW4gYG5ldC9wYWNrZXQvYWZfcGFja2V0LmNgPyBUaGF0IHNlZW1zIGxpa2UgYSBsb2dpY2FsIG5leHQgc3RlcCB0byBleGFtaW5lLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF90eXBlX3RyYW5zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3BhY2tldC9hZl9wYWNrZXQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMzk0CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUuIE15IG1pbmQgaXMganVtcGluZyBhcm91bmQgYSBiaXQgaGVyZSwgdHJ5aW5nIHRvIHBpZWNlIHRoaXMgdG9nZXRoZXIuLi4KCioqSW52ZXN0aWdhdGluZyBQYWNrZXQgUmVjZXB0aW9uIEZsb3cqKgoKSG9sZCBvbiBhIHNlY29uZC4uLiBJIHdhcyB1bmRlciB0aGUgaW1wcmVzc2lvbiB0aGF0IGBwYWNrZXRfc25kYCB3YXMgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIG91dGJvdW5kIHBhY2tldCBwcm9jZXNzaW5nLCBidXQgbm93IGl0IG9jY3VycyB0byBtZSB0aGF0IGl0ICoqZG9lc24mIzM5O3QqKiBhY3R1YWxseSBjYWxsIGBldGhfdHlwZV90cmFuc2AgZGlyZWN0bHksIHdoaWNoIGlzIHdoZXJlIHRoZSBFdGhlcm5ldCB0eXBlIGRldGVybWluYXRpb24gdXN1YWxseSBoYXBwZW5zLiBUaGF0JiMzOTtzIGEga2V5IHBpZWNlIG1pc3NpbmcgZnJvbSBteSBtZW50YWwgbW9kZWwhIFdoZXJlICpkb2VzKiB0aGF0IGhhcHBlbiBpbiB0aGUgdHlwaWNhbCBwYXRoPwoKQWxyaWdodCwgbGV0JiMzOTtzIGJhY2sgdXAgYW5kIHJldGhpbmsgdGhpcy4gTWF5YmUgaXQmIzM5O3Mgbm90IHRoZSB0cmFuc21pc3Npb24gc2lkZSBJIG5lZWQgdG8gZm9jdXMgb24gcmlnaHQgbm93LiBQZXJoYXBzIG15IGF0dGVudGlvbiBzaG91bGQgc2hpZnQgdG8gdGhlIHZpcnR1YWwgbmV0d29yayBkZXZpY2Ugc2lkZSBmb3IgcmVjZXB0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gd2hhdCBmdW5jdGlvbiBpcyB1c2VkIGZvciBpbmNvbWluZyBwYWNrZXQgcHJvY2Vzc2luZy4gSSYjMzk7bSBnb2luZyB0byBsb29rIGF0IGBkcml2ZXJzL25ldC92aXJ0aW9fbmV0LmNgLCBzcGVjaWZpY2FsbHkgYHZpcnRuZXRfcmVjZWl2ZWAuIEl0IGZlZWxzIGxpa2UgdGhhdCYjMzk7cyB0aGUgbW9yZSByZWxldmFudCBhcmVhIGdpdmVuIHRoZSBmbG93IG9mIHRyYWZmaWMgSSYjMzk7bSBleHBlY3RpbmcuIEhvcGVmdWxseSwgYHZpcnRuZXRfcmVjZWl2ZWAgaXMgd2hlcmUgdGhlIHBhY2tldCB0eXBlIGlzIGRldGVybWluZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF90eXBlX3RyYW5zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdmlydGlvX25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYz0yMDMwPXN0YXRpYyB2b2lkIG1lcmdlYWJsZV9idWZfZnJlZShzdHJ1Y3QgcmVjZWl2ZV9xdWV1ZSAqcnEsIGludCBudW1fYnVmLFxuLS1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMDU2LSAqICAyLiB4ZHBfYnVpbGRfc2tiX2Zyb21fZnJhbWUoKSBkb2VzIG1vcmUgY2hlY2tzIHRoYXQgd2UgZG9uJiMzOTt0IG5lZWQsXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM6MjA1NzogKiAgICAgbGlrZSBldGhfdHlwZV90cmFucygpICh3aGljaCB2aXJ0aW8tbmV0IGRvZXMgaW4gcmVjZWl2ZV9idWYoKSkuXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjA1OC0gKi9cbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjUwMD1zdGF0aWMgdm9pZCB2aXJ0bmV0X3JlY2VpdmVfZG9uZShzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSwgc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLFxuLS1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNTI4LVx0c2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHZxMnJ4cShycS1cdTAwM2V2cSkpO1xuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jOjI1Mjk6XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7XG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjUzMC1cdHByX2RlYnVnKFwmIzM0O1JlY2VpdmluZyBza2IgcHJvdG8gMHglMDR4IGxlbiAlaSB0eXBlICVpXFxuXCYjMzQ7LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTAxOAoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZToKCioqQ2hlY2tpbmcgdGhlIEZvdW5kYXRpb246IFJlY2VpdmUgQ29tcGxldGlvbiBJbmRpY2F0b3JzKioKClJpZ2h0LCBiZWZvcmUgZGl2aW5nIGRlZXBlciwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJiMzOTttIGdyb3VuZGVkLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIHRoZSBmdW5kYW1lbnRhbCBpbmRpY2F0b3JzIG9mIHJlY2VpdmUgY29tcGxldGlvbi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgdHdvIGNyaXRpY2FsIGVsZW1lbnRzIHRoYXQgbGlrZWx5IHNpZ25hbCB3aGV0aGVyIGEgcmVjZWl2ZSBvcGVyYXRpb24gaGFzIGZpbmFsaXplZC4gVGhpcyBjb3VsZCBiZSBjaGVja2luZyB0aGUgc3RhdGUgb2YgYSBkYXRhIGJ1ZmZlciAoYHJlY2VpdmVfYnVmYCkgaXRzZWxmLiBPciBhIGRlZGljYXRlZCBmbGFnIG9yIHZhcmlhYmxlIGluZGljYXRpbmcgdGhhdCBhIHJlY2VwdGlvbiBpcyBgdmlydG5ldF9yZWNlaXZlX2RvbmVgLiBFc3NlbnRpYWxseSBJIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGlmIHRoZSByZWNlaXZlciBpcyBmaW5pc2hlZCBmb3IgYSBuZXcgaW5jb21pbmcgZGF0YS4gV2l0aG91dCBjb25maXJtaW5nIGVpdGhlciB0aGUgYnVmZmVyIHN0YXR1cyBvciByZWNlcHRpb24gc3RhdHVzLCB0aGVyZSYjMzk7cyBubyBzZW5zZSBpbiBwcm9jZWVkaW5nIHdpdGggYW55IGRlZXBlciBhbmFseXNpcyBvZiB0aGUgbmV0d29yayBpbnRlcmFjdGlvbi4gVGhpcyBwcmVsaW1pbmFyeSBzdGVwIGlzIGNydWNpYWwgdG8gYXZvaWQgY2hhc2luZyBnaG9zdHMgb3IgZHJhd2luZyBjb25jbHVzaW9ucyBiYXNlZCBvbiBpbmNvbXBsZXRlIGRhdGEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdmlydGlvX25ldC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjUxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNTE1Olx0XHRcdGdvdG8gZnJhbWVfZXJyO1xuMjUxNjpcdFx0fVxuMjUxNzpcdFxuMjUxODpcdFx0aWYgKHZpcnRpb19uZXRfaGRyX3RubF90b19za2Ioc2tiLCBcdTAwMjZoZHItXHUwMDNldG5sX2hkciwgdmktXHUwMDNlcnhfdG5sLFxuMjUxOTpcdFx0XHRcdFx0ICAgICAgdmktXHUwMDNlcnhfdG5sX2NzdW0sXG4yNTIwOlx0XHRcdFx0XHQgICAgICB2aXJ0aW9faXNfbGl0dGxlX2VuZGlhbih2aS1cdTAwM2V2ZGV2KSkpIHtcbjI1MjE6XHRcdFx0bmV0X3dhcm5fcmF0ZWxpbWl0ZWQoXCYjMzQ7JXM6IGJhZCBnc286IHR5cGU6ICV4LCBzaXplOiAldSwgZmxhZ3MgJXggdHVubmVsICVkIHRubCBjc3VtICVkXFxuXCYjMzQ7LFxuMjUyMjpcdFx0XHRcdFx0ICAgICBkZXYtXHUwMDNlbmFtZSwgaGRyLVx1MDAzZWhkci5nc29fdHlwZSxcbjI1MjM6XHRcdFx0XHRcdCAgICAgaGRyLVx1MDAzZWhkci5nc29fc2l6ZSwgaGRyLVx1MDAzZWhkci5mbGFncyxcbjI1MjQ6XHRcdFx0XHRcdCAgICAgdmktXHUwMDNlcnhfdG5sLCB2aS1cdTAwM2VyeF90bmxfY3N1bSk7XG4yNTI1Olx0XHRcdGdvdG8gZnJhbWVfZXJyO1xuMjUyNjpcdFx0fVxuMjUyNzpcdFxuMjUyODpcdFx0c2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHZxMnJ4cShycS1cdTAwM2V2cSkpO1xuMjUyOTpcdFx0c2tiLVx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpO1xuMjUzMDpcdFx0cHJfZGVidWcoXCYjMzQ7UmVjZWl2aW5nIHNrYiBwcm90byAweCUwNHggbGVuICVpIHR5cGUgJWlcXG5cJiMzNDssXG4yNTMxOlx0XHRcdCBudG9ocyhza2ItXHUwMDNlcHJvdG9jb2wpLCBza2ItXHUwMDNlbGVuLCBza2ItXHUwMDNlcGt0X3R5cGUpO1xuMjUzMjpcdFxuMjUzMzpcdFx0bmFwaV9ncm9fcmVjZWl2ZShcdTAwMjZycS1cdTAwM2VuYXBpLCBza2IpO1xuMjUzNDpcdFx0cmV0dXJuO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTY3MAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE0OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBWaXJ0aW8tTmV0IFBhY2tldCBWdWxuZXJhYmlsaXR5KioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIGhvdyB2aXJ0aW8tbmV0IGhhbmRsZXMgaW5jb21pbmcgcGFja2V0cywgc3BlY2lmaWNhbGx5IHRob3NlIHRoYXQgbWlnaHQgYmUgbWFsZm9ybWVkLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gdmlydGlvLW5ldCBnZXRzIGEgcGFja2V0IHNob3J0ZXIgdGhhbiAxNCBieXRlcy4gSXQganVtcHMgdG8gYGV0aF90eXBlX3RyYW5zYCwgcmlnaHQ/IFRoZSBxdWVzdGlvbiBpcywgd2lsbCB0aGF0IHRyaWdnZXIgYSBgQlVHX09OYD8gSSYjMzk7bSB0cnlpbmcgdG8gYmUgdmVyeSBwcmVjaXNlIGhlcmUgYW5kIGF2b2lkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLgoKSSYjMzk7bSBjb25zaWRlcmluZyBhIGxpbmVhciBwYWNrZXQgbm93LiBJZiB0aGUgcGFja2V0IGlzIGxpbmVhciwgSSB0aGluayBpdCYjMzk7cyBsaWtlbHkgdGhhdCBgc2tiLSZndDtsZW5gIHdvdWxkIGJlIGxlc3MgdGhhbiBgRVRIX0hMRU5gLCB3aGljaCBpcyAxNC4gQWxzbyBgc2tiX2hlYWRsZW4oc2tiKWAgd2lsbCBiZSBsZXNzIHRoYW4gYEVUSF9ITEVOYC4gU28sIGluIHRoaXMgc2NlbmFyaW8sIEkmIzM5O20gcHJldHR5IHN1cmUgdGhhdCBpdCB3b24mIzM5O3QgdHJpZ2dlciBhIGBCVUdfT05gLiBIb3dldmVyLCBpdCBXSUxMIGxlYWQgdG8gdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgcmVhZCwgd2hpY2ggaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZC4KCk5vdyBJJiMzOTttIGZvY3VzaW5nIG9uIGZyYWdtZW50ZWQgcGFja2V0cy4gV2l0aCBmcmFnbWVudGF0aW9uLCBgcmVjZWl2ZV9tZXJnZWFibGVgIGNvbWVzIGludG8gcGxheS4gQ291bGQgYHJlY2VpdmVfbWVyZ2VhYmxlYCBwb3NzaWJseSBidWlsZCBhbiBza2Igd2hlcmUgYHNrYi0mZ3Q7bGVuYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYEVUSF9ITEVOYCBidXQgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gPyBUaGF0IHNlZW1zIGxpa2UgYSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eS4gSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoYXQgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIGl0JiMzOTtzIGhhbmRsZWQuIFNvLCB0aGF0JiMzOTtzIHdoYXQgSSYjMzk7bSBnb2luZyB0byBsb29rIGF0IG5leHQg4oCTIGNhbiB0aGlzIGZ1bmN0aW9uIGNyZWF0ZSB0aGlzIGNvbmRpdGlvbj8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmVjZWl2ZV9tZXJnZWFibGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdmlydGlvX25ldC5jPTIxODY9c3RhdGljIHZvaWQgKm1lcmdlYWJsZV94ZHBfZ2V0X2J1ZihzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjI2My1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYzoyMjY0OnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcmVjZWl2ZV9tZXJnZWFibGVfeGRwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjI2NS1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjMyNj1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnZpcnRuZXRfc2tiX2FwcGVuZF9mcmFnKHN0cnVjdCByZWNlaXZlX3F1ZXVlICpycSxcbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjM3NS1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYzoyMzc2OnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcmVjZWl2ZV9tZXJnZWFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMzc3LVx0XHRcdFx0XHQgc3RydWN0IHZpcnRuZXRfaW5mbyAqdmksXG4tLVxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTI0MDUtXHRcdGlmICh4ZHBfcHJvZykge1xuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jOjI0MDY6XHRcdFx0aGVhZF9za2IgPSByZWNlaXZlX21lcmdlYWJsZV94ZHAoZGV2LCB2aSwgcnEsIHhkcF9wcm9nLCBidWYsIGN0eCxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNDA3LVx0XHRcdFx0XHRcdFx0IGxlbiwgeGRwX3htaXQsIHN0YXRzKTtcbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjU0MT1zdGF0aWMgdm9pZCByZWNlaXZlX2J1ZihzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSwgc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLFxuLS1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNTc3LVx0XHRmbGFncyA9ICgoc3RydWN0IHZpcnRpb19uZXRfY29tbW9uX2hkciAqKWJ1ZiktXHUwMDNlaGRyLmZsYWdzO1xuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jOjI1Nzg6XHRcdHNrYiA9IHJlY2VpdmVfbWVyZ2VhYmxlKGRldiwgdmksIHJxLCBidWYsIGN0eCwgbGVuLCB4ZHBfeG1pdCxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNTc5LVx0XHRcdFx0XHRzdGF0cyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNjg2CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTU1NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEltcGxpY2F0aW9ucyBvZiBhIE5ldHdvcmsgUGFja2V0IFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgc28gaGVyZSYjMzk7cyB0aGUgc2l0dWF0aW9uIGFzIEkgc2VlIGl0LiBJdCBsb29rcyBsaWtlIHdpdGggdmlydGlvLW5ldCwgaWYgYSBwYWNrZXQgYXJyaXZlcyBmcmFnbWVudGVkIGFuZCB0aGUgZmlyc3QgYnVmZmVyIGlzIHRpbnksIHRoZW4gYHJlY2VpdmVfbWVyZ2VhYmxlYCBidWlsZHMgYW4gU0tCIHdoZXJlIHRoZSBoZWFkZXIgaXMgc21hbGwsIGJ1dCB0aGUgdG90YWwgbGVuZ3RoIGlzIGxhcmdlci4gIFRoaXMgdGhlbiBnZXRzIHBhc3NlZCB0byBgZXRoX3R5cGVfdHJhbnNgLiBUaGUgcHJvYmxlbSBzdXJmYWNlcyB3aGVuIGBza2JfcHVsbF9pbmxpbmVgIGNhbGxzIGBfX3NrYl9wdWxsYC4gIGBfX3NrYl9wdWxsYCBzdWJ0cmFjdHMgdGhlIEV0aGVybmV0IGhlYWRlciBsZW5ndGggZnJvbSBgc2tiLSZndDtsZW5gLiAgSWYgdGhlIGhlYWRlciBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBpbml0aWFsIGxpbmVhciBkYXRhLCB3ZSBoaXQgYSBgQlVHX09OYCBiZWNhdXNlIHRoZSBuZXcgYHNrYi0mZ3Q7bGVuYCB3b3VsZCBiZSBsZXNzIHRoYW4gYHNrYi0mZ3Q7ZGF0YV9sZW5gLCBpbmRpY2F0aW5nIHRoZSBwYWNrZXQmIzM5O3MgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiBpdHMgZGF0YS4KCk5vdywgc3l6a2FsbGVyICpjYW4qIGZpbmQgdGhpcyBgQlVHX09OYCBzY2VuYXJpbyB3aXRob3V0IEtNU0FOLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gQnV0LCBJIHNlZSB0aGF0IGEgcGF0Y2ggZXhpc3RzIHdoaWNoIGNoZWNrcyBgc2tiX2hlYWRsZW4oc2tiKWAgYWdhaW5zdCBgRVRIX0hMRU5gLCBwcmV2ZW50aW5nIGJvdGggdGhlIGBCVUdfT05gIHdoZW4gYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYCBhbmQgdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgd2hlbiBgc2tiLSZndDtsZW4gJmx0OyBFVEhfSExFTmAuCgpTbyB0aGUgcXVlc3Rpb24gaXMsIGRpZCBzeXprYWxsZXIgZGlzY292ZXIgdGhlIGBCVUdfT05gIG9yIHRoZSBLTVNBTiBpc3N1ZT8gSWYgaXQgd2FzIHRoZSBgQlVHX09OYCwgd2UgZG9uJiMzOTt0ICpzdHJpY3RseSogbmVlZCBLTVNBTiwgcmlnaHQ/IFN0YW5kYXJkIGZ1enppbmcgdG9vbHMgd291bGQgbGlrZWx5IGNhdGNoIHRoYXQuIEJ1dCwgd2FpdCwgaXMgdGhlcmUgYSBjYXNlIHdoZXJlIGBza2ItJmd0O2xlbiAmbHQ7IEVUSF9ITEVOYCBpcyB0aGUgKm9ubHkqIHdheSB0byB0cmlnZ2VyIGEgYnVnPyBBaCwgeWVzISBJZiBhIGRldmljZSBvbmx5IGhhbmRsZXMgbGluZWFyIHBhY2tldHMsIHRoYXQgY29uZGl0aW9uIGlzIHRoZSAqb25seSogd2F5LgoKVGFrZSBgdHVuX2dldF91c2VyYCB3aXRoIGBJRkZfVEFQYCBhbmQgYGZyYWdzID09IGZhbHNlYCBmb3IgZXhhbXBsZSwgd2hpY2ggY3JlYXRlcyBhIGxpbmVhciBTS0Igd2l0aCBgc2tiLSZndDtsZW4gJmx0OyBFVEhfSExFTmAuICBObyBgQlVHX09OYCBoZXJlLiBJdCBjYWxscyBgZXRoX3R5cGVfdHJhbnNgIGFuZCBwcm9jZWVkcyB0byByZWFkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBLTVNBTiBjYXRjaGVzIHRoYXQuIFN5emthbGxlciwgd2l0aG91dCBLTVNBTiwgd29uJiMzOTt0IGZpbmQgKnRoYXQqIGJ1ZyBiZWNhdXNlIGl0IG1pZ2h0IGJyYW5jaCBvbiB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZSwgYnV0IG5vIGNyYXNoLiBCdXQsIGlmIGBldGhfdHlwZV90cmFuc2AgaXMgY29tbW9uLCBhbmQgdGhlIGZ1enplciBmb3VuZCBhIGBCVUdfT05gIHRocm91Z2ggdmlydGlvLW5ldCBvciBhbm90aGVyIGRyaXZlciBjcmVhdGluZyBmcmFnbWVudGVkIFNLQnMgd2l0aCBzaG9ydCBsaW5lYXIgcGFydHMsIHRoZW4gaXQgZXNzZW50aWFsbHkgZm91bmQgdGhlIHVuZGVybHlpbmcgdnVsbmVyYWJpbGl0eSB0aHJvdWdoIGFub3RoZXIgZHJpdmVyLCBhbmQgd2UgZG9uJiMzOTt0IG5lZWQgS01TQU4gdG8gZmluZCB0aGF0LgoKT2theSwgYmFjayB0byBgdHVuX2dldF91c2VyYC4gSWYgYGZyYWdzID09IHRydWVgLCBpdCAqZG9lcyogY2hlY2sgYHBza2JfbWF5X3B1bGxgLCBzbyB3ZSYjMzk7cmUgc2FmZSB0aGVyZS4gQnV0IHdpdGggYGZyYWdzID09IGZhbHNlYCwgaXQgY3JlYXRlcyBhIGxpbmVhciBTS0IsIGBza2ItJmd0O2xlbiAmbHQ7IEVUSF9ITEVOYCwgY2FsbHMgYGV0aF90eXBlX3RyYW5zYCwgYW5kIHRoZSBidWcgaXMgdGhhdCB0aGUgc3lzdGVtIG5vdyByZWFkcyB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhpcyAqb25seSogZ2V0cyBjYXVnaHQgYnkgS01TQU4sIHdoaWNoIGlzIGltcG9ydGFudC4KCkFyZSB0aGVyZSBvdGhlciBkcml2ZXJzIGF0IHJpc2s/IE1hbnkgZHJpdmVycyBhc3N1bWUgcGFja2V0cyBzbWFsbGVyIHRoYW4gMTQgYnl0ZXMgYXJlIGRyb3BwZWQuIFZpcnR1YWwgZHJpdmVycyBsaWtlIGB2ZXRoYCwgYGxvb3BiYWNrYCwgYW5kIGB3aXJlZ3VhcmRgICptaWdodCogbm90LiBUaGUgcGF0Y2ggZml4ZXMgdGhpcy4gU28sIGlmIGEgZHJpdmVyIGNyZWF0ZXMgYSBsaW5lYXIgU0tCIHdpdGggYHNrYi0mZ3Q7bGVuICZsdDsgRVRIX0hMRU5gLCBLTVNBTiBjYXRjaGVzIGl0LiBGcmFnbWVudGVkIFNLQnMgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0PyBgQlVHX09OYC4KClRoZSBjb3JlIHF1ZXN0aW9uIGlzIHRoaXMgcGF0Y2ggYW5kIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGNhdWdodCAqb25seSogYnkgS01TQU4uIFllcy4gUmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRvIGBza2ItJmd0O3Byb3RvY29sYCAoYWxsb2NhdGVkIGJ5IGBrbWFsbG9jYCBvciBwYWdlIGFsbG9jYXRvciBhbmQgbm90IHplcm9lZCkgY2FuIGxlYWQgdG8gcm91dGluZyB0aGUgcGFja2V0IHRvIGFuIGFyYml0cmFyeSBwcm90b2NvbCBoYW5kbGVyLiBUaGlzIGlzIGEgdXNlLW9mLXVuaW5pdGlhbGl6ZWQgdmFsdWUhIEtNU0FOIGlzICpkZXNpZ25lZCogdG8gZmluZCB0aGlzLgoKQW5kIHdhaXQgYSBzZWNvbmQuIElmIGBza2ItJmd0O3Byb3RvY29sYCBpcyB1bmluaXRpYWxpemVkLCBpdCBjb3VsZCBnbyB0byBhIHBhY2tldCBzb2NrZXQgKEFGX1BBQ0tFVCkuIFRoZSB1c2VyICpjb3VsZCogdGhlbiByZWNlaXZlIHRoZSBwYWNrZXQgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZnJvbSBgc2xsX3Byb3RvY29sYCBpbiB0aGUgYHNvY2thZGRyX2xsYCByZXR1cm5lZCBieSBgcmVjdmZyb21gLiBUaGF0IGlzIGEgZGlyZWN0IGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiAyIGJ5dGVzISBXb3cuIEkgbmVlZCB0byB2ZXJpZnkgdGhpcy4uLiB0aW1lIHRvIGNoZWNrIGBwYWNrZXRfcmN2YCBpbiBgbmV0L3BhY2tldC9hZl9wYWNrZXQuY2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NsbF9wcm90b2NvbCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9wYWNrZXQvYWZfcGFja2V0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3BhY2tldC9hZl9wYWNrZXQuYz0yMTMzPXN0YXRpYyBpbnQgcGFja2V0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjIwNi1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6MjIwNzpcdC8qIHNsbC1cdTAwM2VzbGxfZmFtaWx5IGFuZCBzbGwtXHUwMDNlc2xsX3Byb3RvY29sIGFyZSBzZXQgaW4gcGFja2V0X3JlY3Ztc2coKS5cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjIwOC1cdCAqIFVzZSB0aGVpciBzcGFjZSBmb3Igc3RvcmluZyB0aGUgb3JpZ2luYWwgc2tiIGxlbmd0aC5cbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTIyNDY9c3RhdGljIGludCB0cGFja2V0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjQ3NS1cdHNsbC1cdTAwM2VzbGxfaGF0eXBlID0gZGV2LVx1MDAzZXR5cGU7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjI0NzY6XHRzbGwtXHUwMDNlc2xsX3Byb3RvY29sID0gKHNrLVx1MDAzZXNrX3R5cGUgPT0gU09DS19ER1JBTSkgP1xubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yNDc3LVx0XHR2bGFuX2dldF9wcm90b2NvbF9kZ3JhbShza2IpIDogc2tiLVx1MDAzZXByb3RvY29sO1xuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MjczNj1zdGF0aWMgaW50IHRwYWNrZXRfc25kKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sIHN0cnVjdCBtc2doZHIgKm1zZylcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI3NzYtXHRcdFx0Z290byBvdXQ7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjI3Nzc6XHRcdHByb3RvXHQ9IHNhZGRyLVx1MDAzZXNsbF9wcm90b2NvbDtcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjc3OC1cdFx0ZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChcdTAwMjZwby1cdTAwM2VzayksIHNhZGRyLVx1MDAzZXNsbF9pZmluZGV4KTtcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTI5NjY9c3RhdGljIGludCBwYWNrZXRfc25kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbilcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI5OTUtXHRcdFx0Z290byBvdXQ7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjI5OTY6XHRcdHByb3RvXHQ9IHNhZGRyLVx1MDAzZXNsbF9wcm90b2NvbDtcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjk5Ny1cdFx0ZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChzayksIHNhZGRyLVx1MDAzZXNsbF9pZmluZGV4KTtcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTMzMzM9c3RhdGljIGludCBwYWNrZXRfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqdWFkZHIsIGludCBhZGRyX2xlbilcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMzNDYtXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjMzNDc6XHRyZXR1cm4gcGFja2V0X2RvX2JpbmQoc2ssIE5VTEwsIHNsbC1cdTAwM2VzbGxfaWZpbmRleCwgc2xsLVx1MDAzZXNsbF9wcm90b2NvbCk7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMzNDgtfVxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MzQzOD1zdGF0aWMgaW50IHBhY2tldF9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbixcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTM1MTAtXHRcdHNsbC1cdTAwM2VzbGxfZmFtaWx5ID0gQUZfUEFDS0VUO1xubmV0L3BhY2tldC9hZl9wYWNrZXQuYzozNTExOlx0XHRzbGwtXHUwMDNlc2xsX3Byb3RvY29sID0gKHNvY2stXHUwMDNldHlwZSA9PSBTT0NLX0RHUkFNKSA/XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTM1MTItXHRcdFx0dmxhbl9nZXRfcHJvdG9jb2xfZGdyYW0oc2tiKSA6IHNrYi1cdTAwM2Vwcm90b2NvbDtcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTM2MjM9c3RhdGljIGludCBwYWNrZXRfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLFxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzYzNy1cdHNsbC1cdTAwM2VzbGxfaWZpbmRleCA9IGlmaW5kZXg7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjM2Mzg6XHRzbGwtXHUwMDNlc2xsX3Byb3RvY29sID0gUkVBRF9PTkNFKHBvLVx1MDAzZW51bSk7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTM2MzktXHRzbGwtXHUwMDNlc2xsX3BrdHR5cGUgPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjE0OQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDk1NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBIERlZXAgRGl2ZSBpbnRvIGEgS2VybmVsIEluZm9ybWF0aW9uIExlYWsqKgoKT2theSwgc28gSSYjMzk7dmUgc3R1bWJsZWQgdXBvbiBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaW4gYHBhY2tldF9yZWN2bXNnYC4gSWYgYHNrYi0mZ3Q7cHJvdG9jb2xgIGlzbiYjMzk7dCBpbml0aWFsaXplZCwgaXQmIzM5O3MgY29waWVkIGRpcmVjdGx5IGludG8gYHNsbC0mZ3Q7c2xsX3Byb3RvY29sYCBhbmQgc2VudCBzdHJhaWdodCB0byB1c2VyIHNwYWNlIHZpYSBgbXNnLSZndDttc2dfbmFtZWDigJRzcGVjaWZpY2FsbHksIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZS4gVGhpcyBsb29rcyBsaWtlIGEgc3RyYWlnaHRmb3J3YXJkIGtlcm5lbC10by11c2VyIGluZm9ybWF0aW9uIGxlYWssIGFuZCB0aGUga2lja2VyPyBJdCYjMzk7cyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnksIHR3byBieXRlcyBvZiBpdCEgVGhhdCBtZWFucyBLQVNBTiB3b24mIzM5O3QgY2F0Y2ggaXQuIEl0JiMzOTtzIEtNU0FOJiMzOTtzIHRlcnJpdG9yeSEKCkJ1dCwgaG9sZCBvbiBhIHNlY29uZC4uLiBpcyB0aGUgbWVtb3J5ICphY3R1YWxseSogdW5pbml0aWFsaXplZD8gTGV0JiMzOTtzIHRyYWNlIGl0IGJhY2suIFdoZW4gYHR1bl9hbGxvY19za2JgIGFsbG9jYXRlcyB0aGUgYHNrYmAsIGl0IGdvZXMgdGhyb3VnaCBgc29ja19hbGxvY19zZW5kX3Bza2JgLCB3aGljaCB1c2VzIGBhbGxvY19za2Jfd2l0aF9mcmFnc2AuIFRoaXMsIGluIHR1cm4sIHVzZXMgYGttZW1fY2FjaGVfYWxsb2Nfbm9kZWAgZm9yIHRoZSBgc2tiYCBpdHNlbGYgYW5kIGBrbWFsbG9jX3Jlc2VydmVgIGZvciB0aGUgZGF0YSBidWZmZXIuIEFuZCB0aGUgY3J1Y2lhbCBiaXQ/IGBrbWFsbG9jX3Jlc2VydmVgIHVzZXMgYGttYWxsb2Nfbm9kZV90cmFja19jYWxsZXJgIChvciBzb21ldGhpbmcgc2ltaWxhciksIHdoaWNoICpkb2VzbiYjMzk7dCogemVybyB0aGUgbWVtb3J5IHVubGVzcyBgX19HRlBfWkVST2AgaXMgcGFzc2VkLiBBbmQsIGd1ZXNzIHdoYXQ/IGBzb2NrX2FsbG9jX3NlbmRfcHNrYmAgKmRvZXNuJiMzOTt0KiBwYXNzIGBfX0dGUF9aRVJPYC4gU28sIHllcywgdGhlIGRhdGEgYnVmZmVyIGlzIHVuaW5pdGlhbGl6ZWQuCgpOb3csIGB0dW5fZ2V0X3VzZXJgIGNvcGllcyBgbGVuYCBieXRlcyBmcm9tIHVzZXIgc3BhY2UgdXNpbmcgYHNrYl9jb3B5X2RhdGFncmFtX2Zyb21faXRlcmAuIFRoZSBieXRlcyBiZXlvbmQgYGxlbmAgcmVtYWluIHVudG91Y2hlZOKAlHN0aWxsIHVuaW5pdGlhbGl6ZWQuIFRoZW4sIGBldGhfdHlwZV90cmFuc2AgY29tZXMgaW50byBwbGF5LCByZWFkaW5nIGBldGgtJmd0O2hfcHJvdG9gIGF0IG9mZnNldCAxMi4gSWYgYGxlbiAmbHQ7IDE0YCwgaXQmIzM5O3MgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhhdCB1bmluaXRpYWxpemVkIHZhbHVlIGdldHMgYXNzaWduZWQgdG8gYHNrYi0mZ3Q7cHJvdG9jb2xgLiBUaGUgcGFja2V0IHRoZW4gcGFzc2VzIHRocm91Z2ggYG5ldGlmX3J4YCBvciBgbmV0aWZfcmVjZWl2ZV9za2JgLgoKSGVyZSYjMzk7cyB3aGVyZSBpdCBhbGwgY29ubmVjdHM6IElmIHRoZXJlJiMzOTtzIGFuIEFGX1BBQ0tFVCBzb2NrZXQgc25pZmZpbmcgdGhlIGludGVyZmFjZSwgaXQgcmVjZWl2ZXMgdGhpcyBwYWNrZXQuIFRoZSB1c2VyIHRoZW4gcmVhZHMgZnJvbSB0aGUgQUZfUEFDS0VUIHNvY2tldCBhbmQgZ2V0cyB0aG9zZSBqdWljeSwgdW5pbml0aWFsaXplZCAyIGJ5dGVzIGluIGBzbGxfcHJvdG9jb2xgLiBCaW5nbyEgVGhpcyBpcyBhIGNvbXBsZXRlbHkgbGVnaXRpbWF0ZSBpbmZvLWxlYWssIGFuZCBpdCYjMzk7cyBzb2xlbHkgY2F1Z2h0IGJ5IEtNU0FOLgoKTGV0JiMzOTtzIGRvIHNvbWUgbW9yZSBkaWdnaW5nLiBDYW4gYHR1bl9nZXRfdXNlcmAgYWN0dWFsbHkgc2VuZCBhIHBhY2tldCB3aXRoIGBsZW4gJmx0OyAxNGAgdG8gYGV0aF90eXBlX3RyYW5zYD8KCkxvb2tpbmcgYXQgYHR1bl9nZXRfdXNlcmA6IEkgY2FuIHNlZSB0aGUgY29uZGl0aW9uYWw6CmBgYGMKCWlmICh0dW4tJmd0O2ZsYWdzICZhbXA7IElGRl9WTkVUX0hEUikgewoJCS8vIHJlYWRzIHZuZXQgaGVhZGVyCgl9CgoJLy8gLi4uCglza2IgPSB0dW5fYWxsb2Nfc2tiKHRmaWxlLCBhbGlnbiwgY29weWxlbiwgbGluZWFyLCBub2Jsb2NrKTsKCS8vIC4uLgoJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1fZnJvbV9pdGVyKHNrYiwgMCwgZnJvbSwgbGVuKTsKCS8vIC4uLgoJc3dpdGNoICh0dW4tJmd0O2ZsYWdzICZhbXA7IFRVTl9UWVBFX01BU0spIHsKCWNhc2UgSUZGX1RVTjoKCQkvLyAuLi4KCQlicmVhazsKCWNhc2UgSUZGX1RBUDoKCQlpZiAoZnJhZ3MgJmFtcDsmYW1wOyAhcHNrYl9tYXlfcHVsbChza2IsIEVUSF9ITEVOKSkgewoJCQkvLyAuLi4KCQl9CgkJc2tiLSZndDtwcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgdHVuLSZndDtkZXYpOwoJCWJyZWFrOwoJfQpgYGAKClllcywgaXQgbG9va3MgbGlrZSBpZiBgdHVuLSZndDtmbGFncyAmYW1wOyBUVU5fVFlQRV9NQVNLYCBpcyBzZXQgdG8gYElGRl9UQVBgLCBhbmQgYGZyYWdzYCBpcyBmYWxzZSAod2hpY2ggaXMgdGhlIGNhc2UgaWYgdGhlIHBhY2tldCBmaXRzIHdpdGhpbiB0aGUgbGluZWFyIHBvcnRpb24sIG1lYW5pbmcgaWYgaXRzIGxlc3MgdGhhbiAxNCBieXRlcyksIHRoZW4gaXQgY2FsbHMgYGV0aF90eXBlX3RyYW5zKHNrYiwgdHVuLSZndDtkZXYpYCB3aXRob3V0IGEgY2hlY2sgaWYgYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYC4KClNvLCBhIHVzZXIgY2FuIHdyaXRlLCBzYXksIDEwIGJ5dGVzIHRvIGEgVEFQIGRldmljZS4gVGhlIFRBUCBkZXZpY2Ugd2lsbCBhbGxvY2F0ZSBhbiBgc2tiYCwgY29weSAxMCBieXRlcywgYW5kIHRoZW4gY2FsbCBgZXRoX3R5cGVfdHJhbnNgLiBUaGUgYGV0aF90eXBlX3RyYW5zYCBmdW5jdGlvbiByZWFkcyB0aG9zZSAyIGJ5dGVzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGF0IG9mZnNldCAxMi4gVGhlbiwgdGhlIHBhY2tldCBnZXRzIGluamVjdGVkIGludG8gdGhlIG5ldHdvcmsgc3RhY2suIEFuIEFGX1BBQ0tFVCBzb2NrZXQgY2FuIHJlY2VpdmUgaXQgYW5kIGxlYWsgdGhlIDIgYnl0ZXMuIFRoaXMgaXMsIGluZGVlZCwgYSBwZXJmZWN0IEtNU0FOIGJ1Zy4KCk9rYXksIG5vdywgYXJlIHRoZXJlIGFueSBvdGhlciBjYWxscyB0byBgZXRoX3R5cGVfdHJhbnNgIHdpdGggYHNrYi0mZ3Q7bGVuICZsdDsgRVRIX0hMRU5gPyBJIG5lZWQgdG8gY2hlY2suIExldCYjMzk7cyBsb29rIGF0IGBsb29wYmFja194bWl0YCBpbiBgZHJpdmVycy9uZXQvbG9vcGJhY2suY2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF90eXBlX3RyYW5zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvbG9vcGJhY2suYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL25ldC9sb29wYmFjay5jPTcwPXN0YXRpYyBuZXRkZXZfdHhfdCBsb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpza2IsXG4tLVxuZHJpdmVycy9uZXQvbG9vcGJhY2suYy04Ni1cbmRyaXZlcnMvbmV0L2xvb3BiYWNrLmM6ODc6XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7XG5kcml2ZXJzL25ldC9sb29wYmFjay5jLTg4LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODI1OQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDMzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIExvb3BiYWNrIFRyYW5zbWlzc2lvbiBQYXRoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGxvb3BiYWNrX3htaXRgIGZ1bmN0aW9uLCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0cyBhcmUgYXJvdW5kIGhvdyBpdCBoYW5kbGVzIGluY29taW5nIHBhY2tldHMuIEZpcnN0LCBpdCB0aW1lc3RhbXBzIHRoZSBgc2tiYCBhbmQgY2xlYXJzIHRoZSB0aW1lc3RhbXAgdG8gYXZvaWQgaXNzdWVzIHdpdGggZGlmZmVyZW50IGNsb2NrIGJhc2VzLiBJdCB0aGVuIG9ycGhhbnMgdGhlIGBza2JgIGFuZCBlbnN1cmVzIHRoZSBkZXN0aW5hdGlvbiBpcyByZWZjb3VudGVkLCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIFRoZSBrZXkgcGFydCBpcyB0aGF0IGBldGhfdHlwZV90cmFuc2AgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgcHJvdG9jb2wuCgpNeSBjb25jZXJuIGhlcmUgaXMgcmVnYXJkaW5nIHBhY2tldHMgd2l0aCB1bnVzdWFsIHNpemVzLiBJIGtub3cgdGhhdCBpZiBhIHBhY2tldCB3aXRoIGEgbGVuZ3RoIGxlc3MgdGhhbiBgRVRIX0hMRU5gIGlzIHNlbnQgb3ZlciBsb29wYmFjaywgYGV0aF90eXBlX3RyYW5zYCB3aWxsIGJlIGNhbGxlZC4gVGhhdCYjMzk7cyBmaW5lIGluIG1vc3Qgc2NlbmFyaW9zIGJlY2F1c2UgcGFja2V0cyBnZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbCBhcmUgdXN1YWxseSB3ZWxsLWZvcm1lZC4gSG93ZXZlciwgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgZWRnZSBjYXNlcy4gV2hhdCBpZiBhIHJhdyBwYWNrZXQgaXMgc2VudCB1c2luZyBhbiBBRl9QQUNLRVQgc29ja2V0IHdpdGggYSBzaG9ydCBsZW5ndGgsIGxlc3MgdGhhbiB0aGUgbWluaW11bSBFdGhlcm5ldCBmcmFtZSBzaXplLCB3aGljaCBpcyAxNCBieXRlcz8gSW4gdGhhdCBjYXNlLCBgbG9vcGJhY2tfeG1pdGAgd291bGQgYmUgY2FsbGVkIHdpdGggYW4gaW52YWxpZCBwYWNrZXQuCgpUaGUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzLCBob3cgZG9lcyB0aGF0IGV2ZW4gaGFwcGVuPyBEb2VzIHRoZSBwYWNrZXQgc29ja2V0IGNvZGUgcHJldmVudCBpdCBmcm9tIGhhcHBlbmluZz8gRG9lcyBpdCBmaWx0ZXIgb3V0IHRoZXNlIHNob3J0ZXIgcGFja2V0cz8gSSBzZWVtIHRvIHJlY2FsbCB0aGF0IHBhY2tldCBzZW5kLCBgcGFja2V0X3NuZGAsIGRvZXMgc29tZSBsZW5ndGggY2hlY2tzLiBMZXQgbWUgcXVpY2tseSB2ZXJpZnkgaWYgdGhlIHBhY2tldCBzZW5kIHBhdGggY2hlY2tzIHdoZXRoZXIgdGhlIGxlbmd0aCBpcyBhdCBsZWFzdCBgZGV2LSZndDtoYXJkX2hlYWRlcl9sZW5gIGJlZm9yZSBpdCBnZXRzIHRvIHRoaXMgcG9pbnQuIFRoYXQgd291bGQgZXhwbGFpbiBpdC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBjaGVjayBgcGFja2V0X3NuZGAgdG8gY29uZmlybSB0aGUgYmVoYXZpb3IuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2Rldi1cdTAwM2VoYXJkX2hlYWRlcl9sZW4mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvcGFja2V0L2FmX3BhY2tldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9wYWNrZXQvYWZfcGFja2V0LmM9NTQxPXN0YXRpYyB1MTYgdmxhbl9nZXRfdGNpKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXG4tLVxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy01NTUtXHQgKi9cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6NTU2Olx0aWYgKGRldi1cdTAwM2VtaW5faGVhZGVyX2xlbiA9PSBkZXYtXHUwMDNlaGFyZF9oZWFkZXJfbGVuKVxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzo1NTc6XHRcdGhlYWRlcl9sZW4gPSBkZXYtXHUwMDNlaGFyZF9oZWFkZXJfbGVuO1xubmV0L3BhY2tldC9hZl9wYWNrZXQuYy01NTgtXHRlbHNlIGlmIChpc192bGFuX2RldihkZXYpKVxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MTk2MD1zdGF0aWMgaW50IHBhY2tldF9zZW5kbXNnX3Nwa3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjAxNS1cdGlmICghc2tiKVxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzoyMDE2Olx0XHRoYXJkX2hlYWRlcl9sZW4gPSBSRUFEX09OQ0UoZGV2LVx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTIwMTctXG4tLVxubmV0L3BhY2tldC9hZl9wYWNrZXQuYz0yNzM2PXN0YXRpYyBpbnQgdHBhY2tldF9zbmQoc3RydWN0IHBhY2tldF9zb2NrICpwbywgc3RydWN0IG1zZ2hkciAqbXNnKVxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjgwMC1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6MjgwMTpcdGhhcmRfaGVhZGVyX2xlbiA9IFJFQURfT05DRShkZXYtXHUwMDNlaGFyZF9oZWFkZXJfbGVuKTtcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjgwMi1cdGlmIChwby1cdTAwM2Vzay5za19zb2NrZXQtXHUwMDNldHlwZSA9PSBTT0NLX1JBVylcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTI5NjY9c3RhdGljIGludCBwYWNrZXRfc25kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbilcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMwMTktXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjMwMjA6XHRoYXJkX2hlYWRlcl9sZW4gPSBSRUFEX09OQ0UoZGV2LVx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMwMjEtXHRpZiAoc29jay1cdTAwM2V0eXBlID09IFNPQ0tfUkFXKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTQ4NwoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDkxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBQYWNrZXQgVHJhbnNtaXNzaW9uIGFuZCBIZWFkZXIgU3BhY2UqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYHBhY2tldF9zbmRgIGZ1bmN0aW9uLCBzcGVjaWZpY2FsbHkgaG93IGl0IGhhbmRsZXMgcmVzZXJ2aW5nIHNwYWNlIHdpdGhpbiBhIHNvY2tldCBidWZmZXIgYmVmb3JlIHRyYW5zbWlzc2lvbi4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgdGhpczogaXQgY2FsY3VsYXRlcyB0aGUgcmVzZXJ2ZWQgc3BhY2UgKGByZXNlcnZlYCkgYmFzZWQgb24gdGhlIHNvY2tldCB0eXBlLiBSYXcgc29ja2V0cyBnZXQgYSBzaW1wbGUgYGhhcmRfaGVhZGVyX2xlbmAsIHdoaWxlIG90aGVyIHNvY2tldCB0eXBlcyBhbHNvIGNvbnNpZGVyIHRoZSBkZXZpY2UmIzM5O3MgdGFpbHJvb20uIFRoYXQmIzM5O3MgZmluZSDigJMgc3RhbmRhcmQgcHJhY3RpY2UgdG8gYWNjb21tb2RhdGUgZm9yIGhlYWRlcnMuCgpCdXQgdGhlIHF1ZXN0aW9uIGlzLCBkb2VzIHRoaXMgc3BhY2UgcmVzZXJ2YXRpb24gKmVuZm9yY2UqIGEgbWluaW11bSBsZW5ndGggZm9yIHRoZSBwYWNrZXQ/IERvZXMgaXQgZW5zdXJlIHRoYXQgdGhlIGRhdGEgbGVuZ3RoIChgbGVuYCkgaXMgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIGBoYXJkX2hlYWRlcl9sZW5gPyBBIHBhY2tldCB3aXRoIGEgZGF0YSBsZW5ndGggc2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGhlYWRlciBsZW5ndGggd291bGQgYmUuLi5wcm9ibGVtYXRpYywgdG8gc2F5IHRoZSBsZWFzdC4gSXQmIzM5O3MgYSBmdW5kYW1lbnRhbCByZXF1aXJlbWVudC4gU28sIEkgbmVlZCB0byBnbyBiYWNrIGFuZCB0aG9yb3VnaGx5IGV4YW1pbmUgdGhlIGBwYWNrZXRfc25kYCBmdW5jdGlvbiB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBleHBsaWNpdCBsZW5ndGggY2hlY2tzIGluIHBsYWNlIHRvIHByZXZlbnQgdGhpcyBwb3RlbnRpYWxseSBkaXNhc3Ryb3VzIHNjZW5hcmlvLiBMZXQmIzM5O3MgZGlnIGluIGFuZCBzZWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3BhY2tldC9hZl9wYWNrZXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMwMTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MzAxMDpcdFx0aWYgKHVubGlrZWx5KCEoZGV2LVx1MDAzZWZsYWdzIFx1MDAyNiBJRkZfVVApKSlcbjMwMTE6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMzAxMjpcdFxuMzAxMzpcdFx0c29ja2NtX2luaXQoXHUwMDI2c29ja2MsIHNrKTtcbjMwMTQ6XHRcdGlmIChtc2ctXHUwMDNlbXNnX2NvbnRyb2xsZW4pIHtcbjMwMTU6XHRcdFx0ZXJyID0gc29ja19jbXNnX3NlbmQoc2ssIG1zZywgXHUwMDI2c29ja2MpO1xuMzAxNjpcdFx0XHRpZiAodW5saWtlbHkoZXJyKSlcbjMwMTc6XHRcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4zMDE4Olx0XHR9XG4zMDE5Olx0XG4zMDIwOlx0XHRoYXJkX2hlYWRlcl9sZW4gPSBSRUFEX09OQ0UoZGV2LVx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XG4zMDIxOlx0XHRpZiAoc29jay1cdTAwM2V0eXBlID09IFNPQ0tfUkFXKVxuMzAyMjpcdFx0XHRyZXNlcnZlID0gaGFyZF9oZWFkZXJfbGVuO1xuMzAyMzpcdFx0aWYgKHZuZXRfaGRyX3N6KSB7XG4zMDI0Olx0XHRcdGVyciA9IHBhY2tldF9zbmRfdm5ldF9wYXJzZShtc2csIFx1MDAyNmxlbiwgXHUwMDI2dm5ldF9oZHIsIHZuZXRfaGRyX3N6KTtcbjMwMjU6XHRcdFx0aWYgKGVycilcbjMwMjY6XHRcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4zMDI3Olx0XHR9XG4zMDI4Olx0XG4zMDI5Olx0XHRpZiAodW5saWtlbHkoc29ja19mbGFnKHNrLCBTT0NLX05PRkNTKSkpIHtcbjMwMzA6XHRcdFx0aWYgKCFuZXRpZl9zdXBwb3J0c19ub2ZjcyhkZXYpKSB7XG4zMDMxOlx0XHRcdFx0ZXJyID0gLUVQUk9UT05PU1VQUE9SVDtcbjMwMzI6XHRcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4zMDMzOlx0XHRcdH1cbjMwMzQ6XHRcdFx0ZXh0cmFfbGVuID0gNDsgLyogV2UmIzM5O3JlIGRvaW5nIG91ciBvd24gQ1JDICovXG4zMDM1Olx0XHR9XG4zMDM2Olx0XG4zMDM3Olx0XHRlcnIgPSAtRU1TR1NJWkU7XG4zMDM4Olx0XHRpZiAoIXZuZXRfaGRyLmdzb190eXBlIFx1MDAyNlx1MDAyNlxuMzAzOTpcdFx0ICAgIChsZW4gXHUwMDNlIGRldi1cdTAwM2VtdHUgJiM0MzsgcmVzZXJ2ZSAmIzQzOyBWTEFOX0hMRU4gJiM0MzsgZXh0cmFfbGVuKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzAzMTEKCQkJCQkJCW91dHB1dDogNDY2CgkJCQkJCQl0aG91Z2h0czogMjE0NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgS01TQU4gTmVjZXNzaXR5KioKCk9rYXksIGhlcmUmIzM5O3MgdGhlIGJyZWFrZG93biwgYXMgSSBzZWUgaXQuIFRoZXJlJiMzOTtzIGEgY3JpdGljYWwgb3ZlcnNpZ2h0IGluIHRoZSBwYWNrZXQgcmVjZXB0aW9uIHBhdGgsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIHBhY2tldHMgd2l0aCBsaW5lYXIgZGF0YSBsZW5ndGhzIHNob3J0ZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyIHNpemUgKDE0IGJ5dGVzKS4gTXkgaW52ZXN0aWdhdGlvbiByZXZlYWxzIGEgY2xlYXIgaW5mb3JtYXRpb24gbGVhayB0aGF0JiMzOTtzIHVuaXF1ZWx5IGRldGVjdGFibGUgYnkgS01TQU4uCgpIZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzczogSW5pdGlhbGx5LCBJIG5vdGljZWQgdGhhdCBgcGFja2V0X3NuZGAgZG9lc24mIzM5O3QgZXhwbGljaXRseSBjaGVjayBmb3IgcGFja2V0cyB3aXRoIGEgbGVuZ3RoIGxlc3MgdGhhbiB0aGUgaGFyZCBoZWFkZXIgbGVuZ3RoIHdoZW4gdXNpbmcgYFNPQ0tfUkFXYCBvbiBgQUZfUEFDS0VUYC4gVGhpcyBvcGVucyB0aGUgZG9vciBmb3IgdXNlcnMgdG8gY3JhZnQgdmVyeSBzaG9ydCBwYWNrZXRzIOKAkyBldmVuIHplcm8tYnl0ZSBvbmVzIOKAkyB3aGljaCBhcmUgdGhlbiBwYXNzZWQgZG93bnN0cmVhbSB0byBgZGV2X3F1ZXVlX3htaXRgLiBJbiB0aGUgYGxvb3BiYWNrYCBkZXZpY2UgY2FzZSwgdGhlc2UgcGFja2V0cyB1bHRpbWF0ZWx5IHJlYWNoIGBldGhfdHlwZV90cmFuc2AgdmlhIGBsb29wYmFja194bWl0YC4KClRoZSBjb3JlIGlzc3VlIGxpZXMgaW4gaG93IGBldGhfdHlwZV90cmFuc2AgaGFuZGxlcyB0aGVzZSBtYWxmb3JtZWQgcGFja2V0cy4gSXQgcmVhZHMgYGV0aC0mZ3Q7aF9wcm90b2Agd2l0aG91dCBwcm9wZXIgbGVuZ3RoIHZhbGlkYXRpb24uIFNpbmNlIHRoZSBrZXJuZWwgYWxsb2NhdGVzIHRoZSBTS0Igd2l0aCBga21hbGxvY2AgKHdpdGhvdXQgYF9fR0ZQX1pFUk9gKSwgdGhlIG1lbW9yeSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHVzZXItcHJvdmlkZWQgZGF0YSBpcyB1bmluaXRpYWxpemVkLiBUaGlzIGlzIHRoZSBjcnV4IG9mIHRoZSBwcm9ibGVtLgoKYGV0aF9za2JfcHVsbF9tYWNgIGNhbGxzIGBza2JfcHVsbF9pbmxpbmVgLiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaXplIG9mIHRoZSBTS0IgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmAsIGluIHdoaWNoIGNhc2UgYSByZWFkIHBhc3QgdGhlIGFsbG9jYXRlZCBidWZmZXIgb2NjdXJzLiBIb3dldmVyLCB0aGlzIGRvZXNuJiMzOTt0IHRyaWdnZXIgYEJVR19PTmAgb3IgS0FTQU4sIGJlY2F1c2UgdGhlIGRhdGEgaXNuJiMzOTt0IG91dCBvZiBib3VuZHMg4oCTIGl0JiMzOTtzIGp1c3QgdW5pbml0aWFsaXplZCB3aXRoaW4gdGhlIGFsbG9jYXRlZCBTS0IgYnVmZmVyLiBUaGUga2V5IGlzIHRoYXQgYHNrYl9wdWxsX2lubGluZWAgZG9lc24mIzM5O3QgcmV0dXJuIGFuIGVycm9yIGhlcmUsIGl0IGNvbnRpbnVlcy4KClRoaXMgdW5pbml0aWFsaXplZCBgaF9wcm90b2AgdmFsdWUgZ2V0cyBzaWxlbnRseSBwcm9wYWdhdGVkLiBgZXRoX3R5cGVfdHJhbnNgIHJlYWRzIHRoZSAyIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgdGhhdCBhcmUgcGFydCBvZiBgaF9wcm90b2AgYW5kIHRoZW4gc3RvcmVzIGl0IGludG8gYHNrYi0mZ3Q7cHJvdG9jb2xgLiBUaGlzIGBza2ItJmd0O3Byb3RvY29sYCB2YWx1ZSBpcyB0aGVuIGxlYWtlZCB0byB1c2VyIHNwYWNlIHZpYSBgcGFja2V0X3JlY3Ztc2dgLgoKVGhlIGNydWNpYWwgdGhpbmcgaXMgdGhpcyBsZWFrICppc24mIzM5O3QqIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGZ1enppbmcgb3IgS0FTQU4gYmVjYXVzZSBpdCBkb2VzbiYjMzk7dCBpbnZvbHZlIGFueSBvdXQtb2YtYm91bmRzIHJlYWRzIG9yIGNyYXNoZXMuIEtBU0FOIG9ubHkgdHJhY2tzIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzLCBzbyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5ICp3aXRoaW4qIGEgdmFsaWQgYWxsb2NhdGlvbiBpc24mIzM5O3QgY2F1Z2h0LiBLTVNBTiwgaG93ZXZlciwgKmRvZXMqIHRyYWNrIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLgoKVGhpcyBpcyBhIHRleHRib29rIGNhc2Ugd2hlcmUgS01TQU4gaXMgZXNzZW50aWFsLiBJdCYjMzk7cyB0aGUgb25seSB0b29sIHRoYXQgcmVsaWFibHkgaWRlbnRpZmllcyB0aGlzIHZ1bG5lcmFiaWxpdHkuIFN0YW5kYXJkIGZ1enppbmcsIG9yIGZ1enppbmcgd2l0aCBLQVNBTiwgd2lsbCBtaXNzIHRoaXMsIGxlYWRpbmcgdG8gYSBzaWxlbnQga2VybmVsIGluZm8tbGVhay4KCk5vdyBJIGFtIGdvaW5nIHRvIHN1bW1hcml6ZSB0aGUgcHJvY2VzcyBvZiB0aGlzIGluZm9ybWF0aW9uIGxlYWs6CgoxLiAgQSBzaG9ydCBwYWNrZXQgKGUuZy4sIDEwIGJ5dGVzKSBpcyBjcmFmdGVkIGJ5IGEgdXNlci4KMi4gIFRoZSBwYWNrZXQgYnlwYXNzZXMgYSBsZW5ndGggY2hlY2suCjMuICBUaGUgcGFja2V0IGNhbGxzIGBldGhfdHlwZV90cmFuc2AsIHdoZXJlIGl0IGlzIGhhbmRsZWQgd2l0aG91dCBzdWZmaWNpZW50IGxlbmd0aCB2YWxpZGF0aW9uLgo0LiAgVGhlIHBhY2tldHMgZW5kIHVwIGNhbGxpbmcgYHNrYl9wdWxsX2lubGluZWAuCjUuICBVbmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIGZyb20gdGhlIGBTS0JgIGRhdGEgYnVmZmVyIHdoZW4gYGV0aC0mZ3Q7aF9wcm90b2AgaXMgcmVhZC4KNi4gIFRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyB0aGVuIGNvcGllZCB0byB0aGUgYHNrYi0mZ3Q7cHJvdG9jb2xgIGZpZWxkLgo3LiAgVGhlIHBhY2tldCBpcyByZWNlaXZlZCBieSBhbm90aGVyIGBBRl9QQUNLRVRgIHNvY2tldC4KOC4gIFRoZSBgc2tiLSZndDtwcm90b2NvbGAgZmllbGQgaXMgY29waWVkIHRvIGBzbGwtJmd0O3NsbF9wcm90b2NvbGAuCjkuICBUaGUgYHNsbC0mZ3Q7c2xsX3Byb3RvY29sYCBmaWVsZCBpcyBsZWFrZWQgdG8gdXNlcnNwYWNlLgoxMC4gVGhlIHJlc3VsdCBpcyBhIGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4KClRoaXMgcGF0Y2gsIHNwZWNpZmljYWxseSBieSBkcm9wcGluZyB0aGUgc2hvcnQgbGluZWFyIHBhY2tldCwgZml4ZXMgYSBzZXJpb3VzIGlzc3VlLgoKSSBjYW4gY29uZmlybSB0aGF0IHRoZSBgc2tiLSZndDtwcm90b2NvbGAgdmFsdWUgKmlzKiBpbmRlZWQgbGVha2VkIHRvIHVzZXIgc3BhY2UsIHByb3ZpZGluZyBhIHJlcHJvZHVjaWJsZSBhbmQgZXhwbG9pdGFibGUga2VybmVsIGluZm8tbGVhay4gVGhlIGBzb2NrYWRkcl9sbGAgc3RydWN0dXJlIGFuZCBpdHMgY29udGVudHMsIGluY2x1ZGluZyB0aGUgbm93LWNvbXByb21pc2VkIGBzbGwtJmd0O3NsbF9wcm90b2NvbGAsIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZS4KCkluIHN1bW1hcnk6IEkgc2VlIGBOZWVkc0tNU0FOID0gdHJ1ZWAuIFRoaXMgcGF0Y2ggZml4ZXMgYSB2dWxuZXJhYmlsaXR5IHRoYXQgaXMgb25seSBkZXRlY3RlZCBieSBLTVNBTi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGxlbmd0aCBjaGVjayBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXG5cbldpdGhvdXQgdGhpcyBjaGVjaywgaWYgYSB1c2VyIGluamVjdHMgYSBzaG9ydCBsaW5lYXIgcGFja2V0IChlLmcuLCAxMCBieXRlcykgdmlhIGEgVFVOL1RBUCBkZXZpY2Ugb3IgYW4gQUZfUEFDS0VUIHJhdyBzb2NrZXQsIGBldGhfdHlwZV90cmFucygpYCBjYWxscyBgZXRoX3NrYl9wdWxsX21hYygpYC4gYGV0aF9za2JfcHVsbF9tYWMoKWAgY2FsbHMgYHNrYl9wdWxsX2lubGluZShza2IsIEVUSF9ITEVOKWAuIElmIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAsIGBza2JfcHVsbF9pbmxpbmUoKWAgZmFpbHMgYW5kIHJldHVybnMgYE5VTExgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgYEJVR19PTmAgb3IgY3Jhc2guIGBldGhfc2tiX3B1bGxfbWFjKClgIGlnbm9yZXMgdGhpcyByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIGBza2ItXHUwMDNlZGF0YWAgcG9pbnRlci5cblxuYGV0aF90eXBlX3RyYW5zKClgIHRoZW4gcmVhZHMgYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIEJlY2F1c2UgdGhlIHNrYiBkYXRhIGJ1ZmZlciBpcyB0eXBpY2FsbHkgYWxsb2NhdGVkIHdpdGggYSBtdWNoIGxhcmdlciBzaXplIChlLmcuLCB2aWEgYGttYWxsb2NgKSwgdGhpcyByZWFkIGlzIHdlbGwgd2l0aGluIHRoZSBhbGxvY2F0aW9uIGJvdW5kcy4gVGhlcmVmb3JlLCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgaXQgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgbWVtb3J5IGJleW9uZCB0aGUgdXNlci1wcm92aWRlZCAxMCBieXRlcyBpcyB1bmluaXRpYWxpemVkLiBLTVNBTiB3aWxsIGRldGVjdCB0aGlzIGFzIGEgcmVhZCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRnVydGhlcm1vcmUsIHRoaXMgdW5pbml0aWFsaXplZCB2YWx1ZSBpcyBzdG9yZWQgaW4gYHNrYi1cdTAwM2Vwcm90b2NvbGAuIElmIHRoZSBwYWNrZXQgaXMgbGF0ZXIgcmVjZWl2ZWQgYnkgYW4gQUZfUEFDS0VUIHNvY2tldCwgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuXG5TaW5jZSB0aGlzIGlzc3VlIGRvZXMgbm90IGNhdXNlIGEgY3Jhc2gsIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB0cmlnZ2VyIGEgYEJVR19PTmAgZm9yIGxpbmVhciBwYWNrZXRzLCBpdCBjYW4gT05MWSBiZSBkZXRlY3RlZCBieSBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGxlbmd0aCBjaGVjayBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXG5cbldpdGhvdXQgdGhpcyBjaGVjaywgaWYgYSB1c2VyIGluamVjdHMgYSBzaG9ydCBsaW5lYXIgcGFja2V0IChlLmcuLCAxMCBieXRlcykgdmlhIGEgVFVOL1RBUCBkZXZpY2Ugb3IgYW4gQUZfUEFDS0VUIHJhdyBzb2NrZXQsIGBldGhfdHlwZV90cmFucygpYCBjYWxscyBgZXRoX3NrYl9wdWxsX21hYygpYC4gYGV0aF9za2JfcHVsbF9tYWMoKWAgY2FsbHMgYHNrYl9wdWxsX2lubGluZShza2IsIEVUSF9ITEVOKWAuIElmIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAsIGBza2JfcHVsbF9pbmxpbmUoKWAgZmFpbHMgYW5kIHJldHVybnMgYE5VTExgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgYEJVR19PTmAgb3IgY3Jhc2guIGBldGhfc2tiX3B1bGxfbWFjKClgIGlnbm9yZXMgdGhpcyByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIGBza2ItXHUwMDNlZGF0YWAgcG9pbnRlci5cblxuYGV0aF90eXBlX3RyYW5zKClgIHRoZW4gcmVhZHMgYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIEJlY2F1c2UgdGhlIHNrYiBkYXRhIGJ1ZmZlciBpcyB0eXBpY2FsbHkgYWxsb2NhdGVkIHdpdGggYSBtdWNoIGxhcmdlciBzaXplIChlLmcuLCB2aWEgYGttYWxsb2NgKSwgdGhpcyByZWFkIGlzIHdlbGwgd2l0aGluIHRoZSBhbGxvY2F0aW9uIGJvdW5kcy4gVGhlcmVmb3JlLCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgaXQgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgbWVtb3J5IGJleW9uZCB0aGUgdXNlci1wcm92aWRlZCAxMCBieXRlcyBpcyB1bmluaXRpYWxpemVkLiBLTVNBTiB3aWxsIGRldGVjdCB0aGlzIGFzIGEgcmVhZCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRnVydGhlcm1vcmUsIHRoaXMgdW5pbml0aWFsaXplZCB2YWx1ZSBpcyBzdG9yZWQgaW4gYHNrYi1cdTAwM2Vwcm90b2NvbGAuIElmIHRoZSBwYWNrZXQgaXMgbGF0ZXIgcmVjZWl2ZWQgYnkgYW4gQUZfUEFDS0VUIHNvY2tldCwgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuXG5TaW5jZSB0aGlzIGlzc3VlIGRvZXMgbm90IGNhdXNlIGEgY3Jhc2gsIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB0cmlnZ2VyIGEgYEJVR19PTmAgZm9yIGxpbmVhciBwYWNrZXRzLCBpdCBjYW4gT05MWSBiZSBkZXRlY3RlZCBieSBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToxNi4wOTU2ODgzM1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1MjEwNjg2OTc2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbGVuZ3RoIGNoZWNrIGBza2JfaGVhZGxlbihza2IpIFxcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXFxuXFxuV2l0aG91dCB0aGlzIGNoZWNrLCBpZiBhIHVzZXIgaW5qZWN0cyBhIHNob3J0IGxpbmVhciBwYWNrZXQgKGUuZy4sIDEwIGJ5dGVzKSB2aWEgYSBUVU4vVEFQIGRldmljZSBvciBhbiBBRl9QQUNLRVQgcmF3IHNvY2tldCwgYGV0aF90eXBlX3RyYW5zKClgIGNhbGxzIGBldGhfc2tiX3B1bGxfbWFjKClgLiBgZXRoX3NrYl9wdWxsX21hYygpYCBjYWxscyBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gSWYgYHNrYi1cXHUwMDNlbGVuIFxcdTAwM2MgRVRIX0hMRU5gLCBgc2tiX3B1bGxfaW5saW5lKClgIGZhaWxzIGFuZCByZXR1cm5zIGBOVUxMYCB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGBCVUdfT05gIG9yIGNyYXNoLiBgZXRoX3NrYl9wdWxsX21hYygpYCBpZ25vcmVzIHRoaXMgcmV0dXJuIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBgc2tiLVxcdTAwM2VkYXRhYCBwb2ludGVyLlxcblxcbmBldGhfdHlwZV90cmFucygpYCB0aGVuIHJlYWRzIGBldGgtXFx1MDAzZWhfcHJvdG9gIGF0IG9mZnNldCAxMi4gQmVjYXVzZSB0aGUgc2tiIGRhdGEgYnVmZmVyIGlzIHR5cGljYWxseSBhbGxvY2F0ZWQgd2l0aCBhIG11Y2ggbGFyZ2VyIHNpemUgKGUuZy4sIHZpYSBga21hbGxvY2ApLCB0aGlzIHJlYWQgaXMgd2VsbCB3aXRoaW4gdGhlIGFsbG9jYXRpb24gYm91bmRzLiBUaGVyZWZvcmUsIEtBU0FOIHdpbGwgTk9UIGRldGVjdCBpdCBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIHVzZXItcHJvdmlkZWQgMTAgYnl0ZXMgaXMgdW5pbml0aWFsaXplZC4gS01TQU4gd2lsbCBkZXRlY3QgdGhpcyBhcyBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZ1cnRoZXJtb3JlLCB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUgaXMgc3RvcmVkIGluIGBza2ItXFx1MDAzZXByb3RvY29sYC4gSWYgdGhlIHBhY2tldCBpcyBsYXRlciByZWNlaXZlZCBieSBhbiBBRl9QQUNLRVQgc29ja2V0LCBgc2tiLVxcdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxcblxcblNpbmNlIHRoaXMgaXNzdWUgZG9lcyBub3QgY2F1c2UgYSBjcmFzaCwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIHRyaWdnZXIgYSBgQlVHX09OYCBmb3IgbGluZWFyIHBhY2tldHMsIGl0IGNhbiBPTkxZIGJlIGRldGVjdGVkIGJ5IEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToxNi4wOTU2OTUyNVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzkyOTQ1NjI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgM2VkNTUyYzBjNmNkYzY4MTY3ODBiMWNhNjhmOTljMzhjNWFiYTdkZFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIEF1ZyA3IDEyOjU5OjE1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9ldGguYyBiL25ldC9ldGhlcm5ldC9ldGguY1xcbmluZGV4IGQ5ZmFhZGJlOWI2YzguLjg0OTE0NzA5YWMwNjEgMTAwNjQ0XFxuLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jXFxuKysrIGIvbmV0L2V0aGVybmV0L2V0aC5jXFxuQEAgLTE2MSw2ICsxNjEsMTIgQEAgX19iZTE2IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXFxuIFxcdHNrYi1cXHUwMDNlZGV2ID0gZGV2O1xcbiBcXHRza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpO1xcbiBcXG4rXFx0aWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXFx1MDAzYyBFVEhfSExFTikpIHtcXG4rXFx0XFx0bmV0X3dhcm5fcmF0ZWxpbWl0ZWQoXFxcIiVzOiBkcm9wcGluZyBmcmFtZSB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQgZnJvbSAlc1xcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICBfX2Z1bmNfXywgZGV2LVxcdTAwM2VuYW1lKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuIFxcdGV0aCA9IGV0aF9za2JfcHVsbF9tYWMoc2tiKTtcXG4gXFx0ZXRoX3NrYl9wa3RfdHlwZShza2IsIGRldik7XFxuIFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToxNi40ODkzMDY0MDdaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxMTIyMzcyOTY4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAzZWQ1NTJjMGM2Y2RjNjgxNjc4MGIxY2E2OGY5OWMzOGM1YWJhN2RkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAxMjo1OToxNSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9ldGguYyBiL25ldC9ldGhlcm5ldC9ldGguY1xuaW5kZXggZDlmYWFkYmU5YjZjOC4uODQ5MTQ3MDlhYzA2MSAxMDA2NDRcbi0tLSBhL25ldC9ldGhlcm5ldC9ldGguY1xuKysrIGIvbmV0L2V0aGVybmV0L2V0aC5jXG5AQCAtMTYxLDYgKzE2MSwxMiBAQCBfX2JlMTYgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbiBcdHNrYi1cdTAwM2VkZXYgPSBkZXY7XG4gXHRza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpO1xuIFxuK1x0aWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOKSkge1xuK1x0XHRuZXRfd2Fybl9yYXRlbGltaXRlZChcIiVzOiBkcm9wcGluZyBmcmFtZSB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQgZnJvbSAlc1xcblwiLFxuK1x0XHRcdFx0ICAgICBfX2Z1bmNfXywgZGV2LVx1MDAzZW5hbWUpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbiBcdGV0aCA9IGV0aF9za2JfcHVsbF9tYWMoc2tiKTtcbiBcdGV0aF9za2JfcGt0X3R5cGUoc2tiLCBkZXYpO1xuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6MTYuNDg5MzA4NDc4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTkzMDU4ODg3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQYXRjaDogYGV0aF90eXBlX3RyYW5zYCBpbiBgbmV0L2V0aGVybmV0L2V0aC5jYCoqXG5cbk9rYXksIHNvIHRoZXJlJ3MgYSBwYXRjaCBpbnRyb2R1Y2luZyBhIGNoZWNrIHdpdGhpbiBgZXRoX3R5cGVfdHJhbnNgIGluIGBuZXQvZXRoZXJuZXQvZXRoLmNgLiAgU3BlY2lmaWNhbGx5LCB0aGUgY29kZSBub3cgbG9va3MgZm9yIHBhY2tldHMgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IOKAkyBsZXNzIHRoYW4gYEVUSF9ITEVOYC4gIFRoZSBjaGVjayBpcyByaWdodCB0aGVyZSwgZHJvcHBpbmcgdGhlc2Ugc2hvcnQgZnJhbWVzLiAgTm93LCBgZXRoX3R5cGVfdHJhbnNg4oCmIHRoYXQncyAqZXZlcnl3aGVyZSouIEl0J3MgYSBmdW5kYW1lbnRhbCBmdW5jdGlvbiBmb3IgRXRoZXJuZXQgZHJpdmVycywgZG9pbmcgdGhlIGNyaXRpY2FsIHdvcmsgb2Ygc2V0dGluZyBwYWNrZXQgdHlwZSBhbmQgcHVsbGluZyBvdXQgdGhlIE1BQyBoZWFkZXIuICBEZWZpbml0ZWx5IHJlYWNoYWJsZSwgYW5kIG15IGluaXRpYWwgaW5zdGluY3Qgc2F5cyBpdCdzIHdvcnRoIGZ1enppbmcgZ2l2ZW4gdGhlIGZ1bmN0aW9uYWwgY2hhbmdlLlxuXG5XYWl0IGEgc2Vjb25k4oCmICBgZXRoX3R5cGVfdHJhbnNgIGlzIGEgKmhvdC1wYXRoKiBmdW5jdGlvbi4gV2UgbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggdGhvc2UuIElmIGl0J3MgYSBob3QgcGF0aCwgbGlzdGluZyBpdCBpbiBgRm9jdXNTeW1ib2xzYCBtaWdodCBza2V3IHRoZSBmdXp6aW5nIGRpc3RyaWJ1dGlvbiwgd2hpY2ggd2Ugd2FudCB0byBhdm9pZC4gVGhlIGRvY3VtZW50YXRpb24gc2F5cywgXCJBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cIlxuXG5TbywgSSBjYW4gc3RpbGwgc2F5IHRoZSBjaGFuZ2UgbWFrZXMgaXQgV29ydGhGdXp6aW5nPXRydWUsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBgRm9jdXNTeW1ib2xzYCBhcmUgZW1wdHkuICBXZSBkb24ndCB3YW50IHRvIG92ZXItcHJpb3JpdGl6ZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmdXp6aW5nIHByb2Nlc3MuXG5cbkxldCdzIHF1aWNrbHkgY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24uICBgbmV0L2V0aGVybmV0L2V0aC5jYCBpcyBjb21waWxlZCB3aGVuIGBDT05GSUdfRVRIRVJORVRgIGlzIGVuYWJsZWQsIHdoaWNoIGlzIHByZXR0eSBtdWNoIGd1YXJhbnRlZWQgaW4gYW55IGJhc2ljIHNldHVwLiBJJ2xsIGRvdWJsZSBjaGVjayB0aGUgYG5ldC9ldGhlcm5ldC9NYWtlZmlsZWAganVzdCB0byBiZSBzdXJlIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHNwZWNpZmljIHRoYXQgbWlnaHQgYWZmZWN0IGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDM0LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzExLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6MjIuNDE5ODk5NTM3WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzNzAyMjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV0aC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9ldGhlcm5ldC9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvZXRoZXJuZXQvTWFrZWZpbGUtNS1cXG5uZXQvZXRoZXJuZXQvTWFrZWZpbGU6NjpvYmoteVxcdFxcdFxcdFxcdFxcdCs9IGV0aC5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEyOjU5OjIyLjQ2MzYwNjA1NVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUyNDk0MDI3OTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyB0aGUgRXRoZXJuZXQgUmVjZWl2ZSBQYXRoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYG9iai15ICs9IGV0aC5vYC4gVGhhdCBtZWFucyB0aGUgYGV0aGAgbW9kdWxlIGlzIGFsd2F5cyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIFJpZ2h0LCB0aGlzIG1ha2VzIGl0IGFuIGludGVyZXN0aW5nIHRhcmdldCBmb3IgZnV6emluZy4gR2l2ZW4gdGhlIGRlc2NyaXB0aW9uLCB0aGUgcGF0Y2ggaW50cm9kdWNlcyBhIGNoZWNrIHRvIGRpc2NhcmQgcGFja2V0cyB0aGF0IGFyZSB0b28gc2hvcnQsIGFuZCB0aGlzIHNvdW5kcyBsaWtlIGl0IGNvdWxkIHVuY292ZXIgc29tZSB2dWxuZXJhYmlsaXRpZXMuXG5cbk5vdywgbXkgbWluZCBpcyBhbHJlYWR5IHJhY2luZy4gU3BlY2lmaWNhbGx5LCBgZXRoX3R5cGVfdHJhbnNgIGdldHMgY2FsbGVkIGZvciAqZXZlcnkqIEV0aGVybmV0IHBhY2tldCByZWNlaXZlZC4gVGhhdCdzIGEgaHVnZSBjb2RlIHN1cmZhY2UhIFRoZSBpbml0aWFsIHRob3VnaHQgd2FzLCBzaG91bGQgdGhpcyBiZSBpbiBgRm9jdXNTeW1ib2xzYD8gSG93ZXZlciwgdGhhdCB3b3VsZCBhbG1vc3QgY2VydGFpbmx5IHNrZXcgdGhlIGZ1enppbmcgZGlzdHJpYnV0aW9uIGhlYXZpbHkgdG93YXJkcyBFdGhlcm5ldCwgYW5kIHRoYXQncyBub3Qgd2hhdCBJIHdhbnQuIFNvLCBgRm9jdXNTeW1ib2xzYCBuZWVkcyB0byBiZSBlbXB0eSBpbiB0aGlzIGNhc2UuIEFsc28sIGBFbmFibGVDb25maWdzYCBzaG91bGQgcHJvYmFibHkgYmUgZW1wdHkgdG9vLiBUaGUgY29yZSBvZiB0aGlzIGxvZ2ljIGlzIGluIHRoZSBldGhlcm5ldCByZWNlaXZlIHBhdGggd2hpY2ggaXMgZ2VuZXJpYy5cblxuU28sIHRoZSByZWFzb25pbmcgYm9pbHMgZG93biB0byB0aGlzOiBUaGUgY2hhbmdlIGludHJvZHVjZXMgYSAqZnVuY3Rpb25hbCogY2hlY2sgaW4gYGV0aF90eXBlX3RyYW5zYC4gSXQncyBhIGZ1bmRhbWVudGFsIGNoYW5nZSBpbiBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIHJlY2VpdmVkIEV0aGVybmV0IHBhY2tldHMsIHNvIGZ1enppbmcgaXMgY2VydGFpbmx5IHdhcnJhbnRlZC4gQnV0LCBiZWNhdXNlIGBldGhfdHlwZV90cmFuc2AgaXMgYSBnZW5lcmljLCBob3QtcGF0aCBmdW5jdGlvbiwgSSBuZWVkIHRvIGJlIGNhcmVmdWwgd2l0aCBob3cgSSBjb25maWd1cmUgdGhlIGZ1enppbmcgcHJvY2VzcyB0byBhdm9pZCB1bmR1ZSBmb2N1cyBvbiBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc2NiwiT3V0cHV0VG9rZW5zIjo5OSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToyNy43MTMwMTI0MjVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMzYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBjaGVjayB0byBkcm9wIGV0aGVybmV0IGZyYW1lcyB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQgaW4gZXRoX3R5cGVfdHJhbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBldGhlcm5ldCByZWNlaXZlIHBhdGgsIHNvIGl0IGlzIHdvcnRoIGZ1enppbmcuIFNpbmNlIGV0aF90eXBlX3RyYW5zIGlzIGEgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbiwgaXQgaXMgbm90IGFkZGVkIHRvIEZvY3VzU3ltYm9scyB0byBhdm9pZCBza2V3aW5nIHRlc3QgZGlzdHJpYnV0aW9ucy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToyNy43MTMwMzc5NzVaIiwiU2VxIjo3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQwNDg5NTA0MDQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6MjcuNzEzNTM0NzA1WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MjQwNDg5MDAxMzA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbGVuZ3RoIGNoZWNrIGBza2JfaGVhZGxlbihza2IpIFxcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXFxuXFxuV2l0aG91dCB0aGlzIGNoZWNrLCBpZiBhIHVzZXIgaW5qZWN0cyBhIHNob3J0IGxpbmVhciBwYWNrZXQgKGUuZy4sIDEwIGJ5dGVzKSB2aWEgYSBUVU4vVEFQIGRldmljZSBvciBhbiBBRl9QQUNLRVQgcmF3IHNvY2tldCwgYGV0aF90eXBlX3RyYW5zKClgIGNhbGxzIGBldGhfc2tiX3B1bGxfbWFjKClgLiBgZXRoX3NrYl9wdWxsX21hYygpYCBjYWxscyBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gSWYgYHNrYi1cXHUwMDNlbGVuIFxcdTAwM2MgRVRIX0hMRU5gLCBgc2tiX3B1bGxfaW5saW5lKClgIGZhaWxzIGFuZCByZXR1cm5zIGBOVUxMYCB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGBCVUdfT05gIG9yIGNyYXNoLiBgZXRoX3NrYl9wdWxsX21hYygpYCBpZ25vcmVzIHRoaXMgcmV0dXJuIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBgc2tiLVxcdTAwM2VkYXRhYCBwb2ludGVyLlxcblxcbmBldGhfdHlwZV90cmFucygpYCB0aGVuIHJlYWRzIGBldGgtXFx1MDAzZWhfcHJvdG9gIGF0IG9mZnNldCAxMi4gQmVjYXVzZSB0aGUgc2tiIGRhdGEgYnVmZmVyIGlzIHR5cGljYWxseSBhbGxvY2F0ZWQgd2l0aCBhIG11Y2ggbGFyZ2VyIHNpemUgKGUuZy4sIHZpYSBga21hbGxvY2ApLCB0aGlzIHJlYWQgaXMgd2VsbCB3aXRoaW4gdGhlIGFsbG9jYXRpb24gYm91bmRzLiBUaGVyZWZvcmUsIEtBU0FOIHdpbGwgTk9UIGRldGVjdCBpdCBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIHVzZXItcHJvdmlkZWQgMTAgYnl0ZXMgaXMgdW5pbml0aWFsaXplZC4gS01TQU4gd2lsbCBkZXRlY3QgdGhpcyBhcyBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZ1cnRoZXJtb3JlLCB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUgaXMgc3RvcmVkIGluIGBza2ItXFx1MDAzZXByb3RvY29sYC4gSWYgdGhlIHBhY2tldCBpcyBsYXRlciByZWNlaXZlZCBieSBhbiBBRl9QQUNLRVQgc29ja2V0LCBgc2tiLVxcdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxcblxcblNpbmNlIHRoaXMgaXNzdWUgZG9lcyBub3QgY2F1c2UgYSBjcmFzaCwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIHRyaWdnZXIgYSBgQlVHX09OYCBmb3IgbGluZWFyIHBhY2tldHMsIGl0IGNhbiBPTkxZIGJlIGRldGVjdGVkIGJ5IEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgM2VkNTUyYzBjNmNkYzY4MTY3ODBiMWNhNjhmOTljMzhjNWFiYTdkZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDcgMTI6NTk6MTUgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmNcbmluZGV4IGQ5ZmFhZGJlOWI2YzguLjg0OTE0NzA5YWMwNjEgMTAwNjQ0XG4tLS0gYS9uZXQvZXRoZXJuZXQvZXRoLmNcbisrKyBiL25ldC9ldGhlcm5ldC9ldGguY1xuQEAgLTE2MSw2ICsxNjEsMTIgQEAgX19iZTE2IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXG4gXHRza2ItXHUwMDNlZGV2ID0gZGV2O1xuIFx0c2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTtcbiBcbitcdGlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpIFx1MDAzYyBFVEhfSExFTikpIHtcbitcdFx0bmV0X3dhcm5fcmF0ZWxpbWl0ZWQoXCIlczogZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGZyb20gJXNcXG5cIixcbitcdFx0XHRcdCAgICAgX19mdW5jX18sIGRldi1cdTAwM2VuYW1lKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4gXHRldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7XG4gXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEyOjU5OjI3LjcxMzUzNzEzNVoiLCJTZXEiOjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjk1NTg4NDA5NzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFdGhlcm5ldCBGcmFtZSBMZW5ndGggQ2hlY2sqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgYWRkcyBhIGNoZWNrIGluIGBldGhfdHlwZV90cmFuc2AgZm9yIHRoZSBoZWFkIGxlbmd0aCBvZiBhbiBgc2tiYC4gU3BlY2lmaWNhbGx5LCBgaWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOKSlgLiAgVGhlIGlkZWEgaXMgdG8gZHJvcCB0aGUgZnJhbWUgaWYgdGhlIGhlYWQgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiBgRVRIX0hMRU5gLiAgTXkgaW5pdGlhbCB0aG91Z2h0IGlzLCB0aGlzIGlzIGEgYm91bmRzIGNoZWNrLCByaWdodD8gIFByZXZlbnRpbmcgYW4gb3V0LW9mLWJvdW5kcyBhY2Nlc3Mgd2hlbiBgZXRoX3NrYl9wdWxsX21hYyhza2IpYCBpcyBjYWxsZWQgbGF0ZXIuICBXZSBwdWxsIHRoZSBNQUMgaGVhZGVyLCBhbmQgaWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwsIGJvb20sIE9PQiByZWFkLlxuXG5JIHN0YXJ0IHRvIHdvbmRlciBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeSwgdGhvdWdoLiAgSWYgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gLCBpcyB0aGVyZSBhIHJpc2sgdGhhdCBgZXRoX3NrYl9wdWxsX21hY2AgbWlnaHQgdHJ5IHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnk/ICBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0aGF0IGlmIGl0J3MgKnRoYXQqIHNtYWxsLCBpdCdzIGFuIE9PQiByZWFkLCBhbmQgS0FTQU4gd2lsbCBmbGFnIHRoYXQuIEhvd2V2ZXIsIG1heWJlIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIGxhcmdlciwgYnV0IHRoZSBhY3R1YWwgcGFja2V0IGxlbmd0aCBpcyBzbWFsbGVyPyAgQ291bGQgdGhlcmUgYmUgYSBzY2VuYXJpbyB3aGVyZSBpdCdzIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBidXQgYmV5b25kIGBza2ItXHUwMDNlbGVuYCBhbmQgd2UgZW5kIHVwIHJlYWRpbmcgdW5pbml0aWFsaXplZCBwYWRkaW5nPyAgQnV0IHdhaXQsIEtNU0FOIGlzIGRlc2lnbmVkIHRvIGNhdGNoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCByaWdodD8gIEtBU0FOIGhhbmRsZXMgdGhlIE9PQiBzdHVmZi4gVGhpcyBwYXRjaCBzZWVtcyB0byBiZSBhYm91dCBwcmV2ZW50aW5nIHJlYWRpbmcgYmV5b25kIHRoZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHBhcnQgb2YgdGhlIGBza2JgJ3MgaGVhZC5cblxuTGV0J3MgZGl2ZSBpbnRvIGBldGhfc2tiX3B1bGxfbWFjYC4gIEFoLCBpdCBjYWxscyBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gIElmIGBza2ItXHUwMDNlbGVuYCBpcyBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgc29tZXRoaW5nICpiYWQqIG1pZ2h0IGhhcHBlbiwgb3Igd2UgZW5kIHVwIHJlYWRpbmcgYGV0aC1cdTAwM2VoX3Byb3RvYCB3aGljaCBpcyB0ZWNobmljYWxseSBvdXQtb2YtYm91bmRzIG9mIHRoZSBsaW5lYXIgcG9ydGlvbi4gSWYgaXQncyAqYmV5b25kKiB0aGUgYWxsb2NhdGVkIHBhcnQsIEtBU0FOIHdpbGwgY2F0Y2ggdGhhdC4gQnV0IHdoYXQgaWYgaXQncyB3aXRoaW4gdGhlIGFsbG9jYXRpb24sIGJ1dCBwYXN0IHRoZSBhY3R1YWwgcGFja2V0IGRhdGEgKGBza2ItXHUwMDNlbGVuYCk/IEtBU0FOIG1pZ2h0IG5vdCBjYXRjaCB0aGF0LCB1bmxlc3MgaXRzIHNrYiBpbnRlZ3JhdGlvbiBpcyBtb3JlIGV4dGVuc2l2ZS4gS01TQU4sIGhvd2V2ZXIsICpzaG91bGQqIGNhdGNoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlmIHdlJ3JlIHJlYWRpbmcgcGFzdCB0aGUgdmFsaWQgZGF0YS4gVGhlIG1lbW9yeSB0aGVyZSBpcyBsaWtlbHkgdW5pbml0aWFsaXplZC5cblxuU28sIGlzIHRoaXMgcGF0Y2ggcHJpbWFyaWx5IGFib3V0IHByZXZlbnRpbmcgT09CIHJlYWRzIG9yIGNhdGNoaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBUaGUgY29tbWl0IG1lc3NhZ2Ugc2F5cyBcImRyb3BwaW5nIGZyYW1lIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydFwiLiBUaGF0J3MgYSBjbGFzc2ljIE9PQiBpc3N1ZS4gYHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOYCBtZWFucyB0aGUgbGluZWFyIHBhcnQgaXMgdG9vIHNob3J0LiBJdCdzIGFuIE9PQiByZWFkL3dyaXRlLiBJIHNob3VsZCByZWFsbHkgZ28gYmFjayBhbmQgY2hlY2sgdGhlIGBldGhfdHlwZV90cmFuc2AgY29kZSBpdHNlbGYgaW4gYG5ldC9ldGhlcm5ldC9ldGguY2AgdG8gYmUgY29tcGxldGVseSBzdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDMxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTQ2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6MzcuMjcyMzgyMTA1WiIsIlNlcSI6MTAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODczNTE4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJldGhfc2tiX3B1bGxfbWFjXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9ldGhlcm5ldC9ldGguY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvZXRoZXJuZXQvZXRoLmM9MTU1PV9fYmUxNiBldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxcbi0tXFxubmV0L2V0aGVybmV0L2V0aC5jLTE2OS1cXG5uZXQvZXRoZXJuZXQvZXRoLmM6MTcwOlxcdGV0aCA9IGV0aF9za2JfcHVsbF9tYWMoc2tiKTtcXG5uZXQvZXRoZXJuZXQvZXRoLmMtMTcxLVxcdGV0aF9za2JfcGt0X3R5cGUoc2tiLCBkZXYpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OTozNy4zMjExMjI4NDRaIiwiU2VxIjoxMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzY4NjUyODI2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgY29kZTpcblxuKipEaXZpbmcgaW50byB0aGUgRXRoZXJuZXQgVHlwZSBUcmFuc2xhdG9yKipcblxuQWxyaWdodCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IEV0aGVybmV0IHR5cGVzIGFyZSBiZWluZyBoYW5kbGVkLiBMZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gYGV0aF90eXBlX3RyYW5zYCB3aXRoaW4gYG5ldC9ldGhlcm5ldC9ldGguY2AuIFRoYXQgZnVuY3Rpb24ncyBsaWtlbHkgdGhlIGtleSB0byBmaWd1cmluZyBvdXQgaG93IHJhdyBFdGhlcm5ldCBmcmFtZXMgYXJlIGNsYXNzaWZpZWQgYW5kIHByb2Nlc3NlZCwgSSdtIHRoaW5raW5nLiBJJ20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIGhvdyBpdCBtYXBzIEV0aGVyVHlwZSB2YWx1ZXMgdG8gcHJvdG9jb2wgaGFuZGxlcnM7IHVuZGVyc3RhbmRpbmcgdGhhdCB3aWxsIGJlIGNydWNpYWwgZm9yIGFueSBpbi1kZXB0aCBhbmFseXNpcyBvZiBFdGhlcm5ldCBmcmFtZSBwcm9jZXNzaW5nLiBJJ2xsIG5lZWQgdG8gY2FyZWZ1bGx5IGV4YW1pbmUgdGhlIGlucHV0IGFyZ3VtZW50cywgcmV0dXJuIHZhbHVlcywgYW5kIGFueSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgaXQgdXNlcyB0byBtYWtlIHRoZXNlIGNydWNpYWwgdHJhbnNsYXRpb24gZGVjaXNpb25zLiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzNTUsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OTo0MS4wMDc2NTMzNzRaIiwiU2VxIjoxMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzAzNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2V0aGVybmV0L2V0aC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE1MDpcXHQgKlxcbiAxNTE6XFx0ICogVGhlIHJ1bGUgaGVyZSBpcyB0aGF0IHdlXFxuIDE1MjpcXHQgKiBhc3N1bWUgODAyLjMgaWYgdGhlIHR5cGUgZmllbGQgaXMgc2hvcnQgZW5vdWdoIHRvIGJlIGEgbGVuZ3RoLlxcbiAxNTM6XFx0ICogVGhpcyBpcyBub3JtYWwgcHJhY3RpY2UgYW5kIHdvcmtzIGZvciBhbnkgJ25vdyBpbiB1c2UnIHByb3RvY29sLlxcbiAxNTQ6XFx0ICovXFxuIDE1NTpcXHRfX2JlMTYgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcXG4gMTU2OlxcdHtcXG4gMTU3OlxcdFxcdGNvbnN0IHVuc2lnbmVkIHNob3J0ICpzYXA7XFxuIDE1ODpcXHRcXHRjb25zdCBzdHJ1Y3QgZXRoaGRyICpldGg7XFxuIDE1OTpcXHRcXHRfX2JlMTYgcmVzO1xcbiAxNjA6XFx0XFxuIDE2MTpcXHRcXHRza2ItXFx1MDAzZWRldiA9IGRldjtcXG4gMTYyOlxcdFxcdHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7XFxuIDE2MzpcXHRcXG4gMTY0OlxcdFxcdGlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpIFxcdTAwM2MgRVRIX0hMRU4pKSB7XFxuIDE2NTpcXHRcXHRcXHRuZXRfd2Fybl9yYXRlbGltaXRlZChcXFwiJXM6IGRyb3BwaW5nIGZyYW1lIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBmcm9tICVzXFxcXG5cXFwiLFxcbiAxNjY6XFx0XFx0XFx0XFx0XFx0ICAgICBfX2Z1bmNfXywgZGV2LVxcdTAwM2VuYW1lKTtcXG4gMTY3OlxcdFxcdFxcdHJldHVybiAwO1xcbiAxNjg6XFx0XFx0fVxcbiAxNjk6XFx0XFxuIDE3MDpcXHRcXHRldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7XFxuIDE3MTpcXHRcXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcXG4gMTcyOlxcdFxcbiAxNzM6XFx0XFx0LypcXG4gMTc0OlxcdFxcdCAqIFNvbWUgdmFyaWFudHMgb2YgRFNBIHRhZ2dpbmcgZG9uJ3QgaGF2ZSBhbiBldGhlcnR5cGUgZmllbGRcXG4gMTc1OlxcdFxcdCAqIGF0IGFsbCwgc28gd2UgY2hlY2sgaGVyZSB3aGV0aGVyIG9uZSBvZiB0aG9zZSB0YWdnaW5nXFxuIDE3NjpcXHRcXHQgKiB2YXJpYW50cyBoYXMgYmVlbiBjb25maWd1cmVkIG9uIHRoZSByZWNlaXZpbmcgaW50ZXJmYWNlLFxcbiAxNzc6XFx0XFx0ICogYW5kIGlmIHNvLCBzZXQgc2tiLVxcdTAwM2Vwcm90b2NvbCB3aXRob3V0IGxvb2tpbmcgYXQgdGhlIHBhY2tldC5cXG4gMTc4OlxcdFxcdCAqL1xcbiAxNzk6XFx0XFx0aWYgKHVubGlrZWx5KG5ldGRldl91c2VzX2RzYShkZXYpKSlcXG4gMTgwOlxcdFxcdFxcdHJldHVybiBodG9ucyhFVEhfUF9YRFNBKTtcXG4gMTgxOlxcdFxcbiAxODI6XFx0XFx0aWYgKGxpa2VseShldGhfcHJvdG9faXNfODAyXzMoZXRoLVxcdTAwM2VoX3Byb3RvKSkpXFxuIDE4MzpcXHRcXHRcXHRyZXR1cm4gZXRoLVxcdTAwM2VoX3Byb3RvO1xcbiAxODQ6XFx0XFxuIDE4NTpcXHRcXHQvKlxcbiAxODY6XFx0XFx0ICogICAgICBUaGlzIGlzIGEgbWFnaWMgaGFjayB0byBzcG90IElQWCBwYWNrZXRzLiBPbGRlciBOb3ZlbGwgYnJlYWtzXFxuIDE4NzpcXHRcXHQgKiAgICAgIHRoZSBwcm90b2NvbCBkZXNpZ24gYW5kIHJ1bnMgSVBYIG92ZXIgODAyLjMgd2l0aG91dCBhbiA4MDIuMiBMTENcXG4gMTg4OlxcdFxcdCAqICAgICAgbGF5ZXIuIFdlIGxvb2sgZm9yIEZGRkYgd2hpY2ggaXNuJ3QgYSB1c2VkIDgwMi4yIFNTQVAvRFNBUC4gVGhpc1xcbiAxODk6XFx0XFx0ICogICAgICB3b24ndCB3b3JrIGZvciBmYXVsdCB0b2xlcmFudCBuZXR3YXJlIGJ1dCBkb2VzIGZvciB0aGUgcmVzdC5cXG4gMTkwOlxcdFxcdCAqXFx0V2UgdXNlIHNrYi1cXHUwMDNlZGV2IGFzIHRlbXBvcmFyeSBzdG9yYWdlIHRvIG5vdCBoaXRcXG4gMTkxOlxcdFxcdCAqXFx0Q09ORklHX1NUQUNLUFJPVEVDVE9SX1NUUk9ORz15IGNvc3RzIG9uIHNvbWUgcGxhdGZvcm1zLlxcbiAxOTI6XFx0XFx0ICovXFxuIDE5MzpcXHRcXHRzYXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoKnNhcCksIFxcdTAwMjZza2ItXFx1MDAzZWRldik7XFxuIDE5NDpcXHRcXHRyZXMgPSAoc2FwIFxcdTAwMjZcXHUwMDI2ICpzYXAgPT0gMHhGRkZGKSA/IGh0b25zKEVUSF9QXzgwMl8zKSA6IGh0b25zKEVUSF9QXzgwMl8yKTtcXG4gMTk1OlxcdFxcbiAxOTY6XFx0XFx0LyogcmVzdG9yZSBza2ItXFx1MDAzZWRldiBpbiBjYXNlIGl0IHdhcyBtYW5nbGVkIGJ5IHNrYl9oZWFkZXJfcG9pbnRlcigpLiAqL1xcbiAxOTc6XFx0XFx0c2tiLVxcdTAwM2VkZXYgPSBkZXY7XFxuIDE5ODpcXHRcXHRyZXR1cm4gcmVzO1xcbiAxOTk6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OTo0MS4wMDc3MjU1MzRaIiwiU2VxIjoxMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzYwNjMxNDcwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgS2VybmVsIFZ1bG5lcmFiaWxpdHkqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSBzZWUgYSBwb3RlbnRpYWwgaXNzdWUgd2l0aCBgZXRoX3NrYl9wdWxsX21hY2AuIEl0IHNlZW1zIGxpa2UgdGhlIGZ1bmN0aW9uIGlzIGd1YXJkZWQgYWdhaW5zdCBwdWxsaW5nIHRvbyBtdWNoIGRhdGEsIHNwZWNpZmljYWxseSBtb3JlIHRoYW4gd2hhdCdzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgYHNrYmAncyBoZWFkLiBIb3dldmVyLCBpZiB0aGUgaGVhZCBsZW5ndGggaXMgYWN0dWFsbHkgKmxlc3MqIHRoYW4gdGhlIEV0aGVybmV0IGhlYWRlciBsZW5ndGggKGBFVEhfSExFTmApLCBpdCB3aWxsIHRyeSB0byBwdWxsIGBFVEhfSExFTmAgYnl0ZXMgYW55d2F5LiBUaGlzIG1lYW5zIGBza2ItXHUwMDNlZGF0YWAgd291bGQgZ2V0IGFkdmFuY2VkIHBhc3QgdGhlIGVuZCBvZiB0aGUgdmFsaWQgbGluZWFyIGRhdGEgKG9yLCBhdCB0aGUgdmVyeSBsZWFzdCwgcG90ZW50aWFsbHkgcGFzdCBgc2tiLVx1MDAzZXRhaWxgKS4gVGhlbiwgdGhpcyBjb2RlIGF0dGVtcHRzIHRvIGFjY2VzcyBgZXRoLVx1MDAzZWhfcHJvdG9gLiBUaGlzIGZpZWxkIGlzIGF0IGFuIG9mZnNldCBvZiAxMiBieXRlcyB3aXRoaW4gdGhlIEV0aGVybmV0IGhlYWRlci5cblxuSWYgdGhlIGxpbmVhciBwb3J0aW9uIG9mIHRoZSBgc2tiYCBpcyBzaG9ydGVyIHRoYW4gMTQgYnl0ZXMsIHRoaXMgYWNjZXNzIHRvIGBldGgtXHUwMDNlaF9wcm90b2Agd2lsbCBjYXVzZSBhbiBvdXQtb2YtYm91bmRzIHJlYWQuIENydWNpYWxseSwgSSdtIHRoaW5raW5nLCB0aGlzIG1pZ2h0ICpub3QqIGltbWVkaWF0ZWx5IGNyYXNoLiBJZiB0aGUgYHNrYmAncyBkYXRhIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHdpdGggc29tZSBzbGFjayAoYW5kIGl0IHVzdWFsbHkgaXMsIGdpdmVuIG1pbmltdW0gYWxsb2NhdGlvbiBzaXplcyksIHRoZSBvdXQtb2YtYm91bmRzIHJlYWQgbWlnaHQgaGl0IHZhbGlkIG1lbW9yeSwgbm90IGFuIHVubWFwcGVkIHBhZ2UuIFNvLCB3ZSdyZSBub3QgZ3VhcmFudGVlZCBhIHBhZ2UgZmF1bHQuXG5cbkJ1dCwgd291bGQgS0FTQU4gY2F0Y2ggdGhpcz8gS0FTQU4gaXMgc3VwcG9zZWQgdG8gdHJhY2sgbWVtb3J5IGFsbG9jYXRpb25zLiBJZiB0aGUgc2tiIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHVzaW5nIGBrbWFsbG9jYCwgS0FTQU4gc2hvdWxkIGtub3cgaXRzIHNpemUuIEknbSB0aGlua2luZyB0aG91Z2gsIGBza2ItXHUwMDNlZGF0YWAgbWlnaHQgYmUgd2l0aGluIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBidXQgdGhlIHZhbGlkIGRhdGEgb25seSBnb2VzIHVwIHRvIGBza2JfaGVhZGxlbihza2IpYC4gVGhlIGJ5dGVzIGJleW9uZCB0aGF0LCB1cCB0byB0aGUgZW5kIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBhcmUgZWl0aGVyIHVuaW5pdGlhbGl6ZWQgb3IgY29udGFpbiBvbGQgZGF0YS4gQWgsIHdhaXQgYSBtaW51dGUsIGRvZXNuJ3QgS0FTQU4gZG8gc29tZSBzcGVjaWFsIGhhbmRsaW5nIGZvciBza2JzPyBEb2Vzbid0IGl0IGhhdmUgYW5ub3RhdGlvbnMgZm9yIHNrYnM/XG5cblllcyEgS0FTQU4gcG9pc29ucyB0aGUgdW51c2VkIHBhcnQgb2Ygc2tiIGRhdGEuIFNvLCBsZXQncyBjb25maXJtIHdoZXRoZXIgS0FTQU4gcG9pc29ucyBza2IgZGF0YS4gVGhpcyBpcyBrZXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd291bGQgZmxhZyB0aGlzIHBvdGVudGlhbGx5IG91dCBvZiBib3VuZHMgcmVhZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDQ0OSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEyOjU5OjQ4LjYxNDA0Mzc0OFoiLCJTZXEiOjE0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjAzNDQ3MTEzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrYXNhbl8uKnNrYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2NvcmUvc2tidWZmLmM9Mjg0PXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm5hcGlfc2tiX2NhY2hlX2dldChib29sIGFsbG9jKVxcbi0tXFxubmV0L2NvcmUvc2tidWZmLmMtMzA1LVxcdGxvY2FsX3VubG9ja19uZXN0ZWRfYmgoXFx1MDAyNm5hcGlfYWxsb2NfY2FjaGUuYmhfbG9jayk7XFxubmV0L2NvcmUvc2tidWZmLmM6MzA2OlxcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KHNrYiwgc2tidWZmX2NhY2hlX3NpemUpO1xcbm5ldC9jb3JlL3NrYnVmZi5jLTMwNy1cXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jPTM0ND11MzIgbmFwaV9za2JfY2FjaGVfZ2V0X2J1bGsodm9pZCAqKnNrYnMsIHUzMiBuKVxcbi0tXFxubmV0L2NvcmUvc2tidWZmLmMtMzc4LVxcbm5ldC9jb3JlL3NrYnVmZi5jOjM3OTpcXHRcXHRrYXNhbl9tZW1wb29sX3VucG9pc29uX29iamVjdChza2JzW2ldLCBza2J1ZmZfY2FjaGVfc2l6ZSk7XFxubmV0L2NvcmUvc2tidWZmLmMtMzgwLVxcdFxcdHNrYnVmZl9jbGVhcihza2JzW2ldKTtcXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jPTE0NjQ9c3RhdGljIHZvaWQgbmFwaV9za2JfY2FjaGVfcHV0KHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvY29yZS9za2J1ZmYuYy0xNDY3LVxcbm5ldC9jb3JlL3NrYnVmZi5jOjE0Njg6XFx0aWYgKCFrYXNhbl9tZW1wb29sX3BvaXNvbl9vYmplY3Qoc2tiKSlcXG5uZXQvY29yZS9za2J1ZmYuYy0xNDY5LVxcdFxcdHJldHVybjtcXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NzctXFx0XFx0Zm9yIChpID0gcmVtYWluaW5nOyBpIFxcdTAwM2MgTkFQSV9TS0JfQ0FDSEVfU0laRTsgaSsrKVxcbm5ldC9jb3JlL3NrYnVmZi5jOjE0Nzg6XFx0XFx0XFx0a2FzYW5fbWVtcG9vbF91bnBvaXNvbl9vYmplY3QobmMtXFx1MDAzZXNrYl9jYWNoZVtpXSxcXG5uZXQvY29yZS9za2J1ZmYuYy0xNDc5LVxcdFxcdFxcdFxcdFxcdFxcdHNrYnVmZl9jYWNoZV9zaXplKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6NTAuNjQ4NTE5OTk4WiIsIlNlcSI6MTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNTQ4MzcwNTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS0FTQU4ncyBSb2xlIGluIHNrX2J1ZmYgUG9pc29uaW5nKipcblxuT2theSwgaG9sZCBvbiBhIHNlY29uZC4gSSBuZWVkIHRvIGNsYXJpZnkgc29tZXRoaW5nIGFib3V0IGBrYXNhbl9tZW1wb29sX3BvaXNvbl9vYmplY3RgLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhpcyBwb2lzb25zIHRoZSAqYHNrX2J1ZmZgIHN0cnVjdCogaXRzZWxmIHdoZW4gaXQncyBhbGxvY2F0ZWQgZnJvbSBhIG1lbXBvb2wuIEJ1dCBpcyBLQVNBTiBhbHNvIHVzZWQgdG8gcG9pc29uIHRoZSAqZGF0YSBidWZmZXIqIHRoYXQncyBhdHRhY2hlZCB0byB0aGUgYHNrX2J1ZmZgPyBUaGF0J3MgdGhlIGNydWNpYWwgcG9pbnQuIEkgbmVlZCB0byB2ZXJpZnkgaG93IG1lbW9yeSBjb3JydXB0aW9uIGlzIGhhbmRsZWQgd2l0aCB0aGUgZGF0YSBidWZmZXIuXG5cbkxldCBtZSBxdWlja2x5IGRpdmUgaW50byBgbmV0L2NvcmUvc2tidWZmLmNgIGFuZCBodW50IGZvciBjYWxscyB0byBga2FzYW5fcG9pc29uYCBvciBhbnl0aGluZyBzaW1pbGFyIHRoYXQgaGFuZGxlcyBkYXRhIHBvaXNvbmluZyB3aXRoaW4gdGhlIGBza19idWZmYCdzIGNvbnRleHQuIFRoYXQncyB0aGUgbW9zdCBsaWtlbHkgcGxhY2UgdG8gZmluZCB0aGUgYW5zd2VyLiBJdCdzIGEga2V5IGRldGFpbCBmb3IgY29ycmVjdGx5IGFzc2Vzc2luZyBwb3RlbnRpYWwgbWVtb3J5IGlzc3VlcyBhbmQgdnVsbmVyYWJpbGl0aWVzIGhlcmUuIEknbSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaWYgdGhlcmUncyBhbnkgZGlzdGluY3Rpb24gYmV0d2VlbiBtZW1wb29sLWFsbG9jYXRlZCBhbmQgb3RoZXIgYHNrYmAgYWxsb2NhdGlvbnMgd2l0aCByZXNwZWN0IHRvIEtBU0FOIHBvaXNvbmluZyBvZiB0aGUgZGF0YS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTc1MCwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEyOjU5OjU0LjgwMzM2MzQyNFoiLCJTZXEiOjE2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDYyNjE2MTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2FzYW4uKnBvaXNvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvY29yZS9za2J1ZmYuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvY29yZS9za2J1ZmYuYz0yODQ9c3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqbmFwaV9za2JfY2FjaGVfZ2V0KGJvb2wgYWxsb2MpXFxuLS1cXG5uZXQvY29yZS9za2J1ZmYuYy0zMDUtXFx0bG9jYWxfdW5sb2NrX25lc3RlZF9iaChcXHUwMDI2bmFwaV9hbGxvY19jYWNoZS5iaF9sb2NrKTtcXG5uZXQvY29yZS9za2J1ZmYuYzozMDY6XFx0a2FzYW5fbWVtcG9vbF91bnBvaXNvbl9vYmplY3Qoc2tiLCBza2J1ZmZfY2FjaGVfc2l6ZSk7XFxubmV0L2NvcmUvc2tidWZmLmMtMzA3LVxcbi0tXFxubmV0L2NvcmUvc2tidWZmLmM9MzQ0PXUzMiBuYXBpX3NrYl9jYWNoZV9nZXRfYnVsayh2b2lkICoqc2ticywgdTMyIG4pXFxuLS1cXG5uZXQvY29yZS9za2J1ZmYuYy0zNzgtXFxubmV0L2NvcmUvc2tidWZmLmM6Mzc5OlxcdFxcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KHNrYnNbaV0sIHNrYnVmZl9jYWNoZV9zaXplKTtcXG5uZXQvY29yZS9za2J1ZmYuYy0zODAtXFx0XFx0c2tidWZmX2NsZWFyKHNrYnNbaV0pO1xcbi0tXFxubmV0L2NvcmUvc2tidWZmLmM9MTQ2ND1zdGF0aWMgdm9pZCBuYXBpX3NrYl9jYWNoZV9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NjctXFxubmV0L2NvcmUvc2tidWZmLmM6MTQ2ODpcXHRpZiAoIWthc2FuX21lbXBvb2xfcG9pc29uX29iamVjdChza2IpKVxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NjktXFx0XFx0cmV0dXJuO1xcbi0tXFxubmV0L2NvcmUvc2tidWZmLmMtMTQ3Ny1cXHRcXHRmb3IgKGkgPSByZW1haW5pbmc7IGkgXFx1MDAzYyBOQVBJX1NLQl9DQUNIRV9TSVpFOyBpKyspXFxubmV0L2NvcmUvc2tidWZmLmM6MTQ3ODpcXHRcXHRcXHRrYXNhbl9tZW1wb29sX3VucG9pc29uX29iamVjdChuYy1cXHUwMDNlc2tiX2NhY2hlW2ldLFxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NzktXFx0XFx0XFx0XFx0XFx0XFx0c2tidWZmX2NhY2hlX3NpemUpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OTo1NC44NDk2MzI0OTNaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODYyNjE1NzQ0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTidzIFBvdGVudGlhbCBBZHZhbnRhZ2UgaW4gU0tCIERhdGEgSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgaG93IEtBU0FOIGFuZCBLTVNBTiBpbnRlcmFjdCB3aXRoIFNLQiBkYXRhIGJ1ZmZlcnMsIGFuZCBzb21ldGhpbmcgc2VlbXMgdG8gYmUgY2xpY2tpbmcuIEluaXRpYWxseSwgaXQgc2VlbWVkIGxpa2UgS0FTQU4gbWlnaHQgbWlzcyBlcnJvcnMgd2hlbiByZWFkaW5nIHBhc3QgYHNrYi1cdTAwM2V0YWlsYCB3aXRoaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIsIGFzIGl0IG9ubHkgY2hlY2tzIHRoZSBvdmVyYWxsIGFsbG9jYXRpb24gc2l6ZS4gQnV0IHRoZW4gSSByZW1lbWJlcmVkIEtNU0FOJ3Mgcm9sZSBpbiBkZXRlY3RpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbklmIHRoZSBgc2tiLVx1MDAzZWRhdGFgIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGttYWxsb2NgIHRoZW4gS0FTQU4gd2lsbCBwb2lzb24gcGFzdCB0aGUgcmVxdWVzdGVkIHNpemUsIGJ1dCB0aGUgaW1wb3J0YW50IHBvaW50IGhlcmUgaXMgdGhhdCB3aGVuIHJlYWRpbmcgYmV5b25kIGBza2ItXHUwMDNldGFpbGAsIHdlJ3JlIHBvdGVudGlhbGx5IHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnksIHJpZ2h0PyBBbmQgS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGNhdGNoIHRoYXQhIElmIGl0J3MgYSBuZXcgYWxsb2NhdGlvbiwgS01TQU4gc2hvdWxkIG5haWwgaXQsIHNpbmNlIHRoZSBidWZmZXIgd2lsbCBiZSB1bmluaXRpYWxpemVkLiBUaG91Z2gsIGlmIHRoZSBidWZmZXIgaXMgYmVpbmcgcmV1c2VkLCBLTVNBTiAqbWlnaHQqIG1pc3MgaXQgc2luY2UgaXQgb25seSB0cmFja3MgaW5pdGlhbGl6YXRpb24gYXQgYWxsb2NhdGlvbi5cblxuVGhpbmtpbmcgc3BlY2lmaWNhbGx5IGFib3V0IHRoZSByZWNlaXZlIHBhdGggYW5kIGhvdyBgZXRoX3R5cGVfdHJhbnNgIGZpdHMgaW4uIFRoZSBkcml2ZXIgZ3JhYnMgYSBidWZmZXIsIHJlY2VpdmVzIGEgcGFja2V0LCBhbmQgc2V0cyBgc2tiLVx1MDAzZWxlbmAuIEFueXRoaW5nIGJleW9uZCB0aGF0IGlzIGVzc2VudGlhbGx5IFwiZ2FyYmFnZVwiIGxlZnQgb3ZlciBmcm9tIHRoZSBwcmV2aW91cyB1c2UsIG9yIHBhZGRpbmcgbm90IHdyaXR0ZW4gYnkgdGhlIGRldmljZS4gSWYgRE1BIGlzIHVzZWQsIHRoZSBkZXZpY2Ugd2lsbCB3cml0ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIGFuZCBLTVNBTiB3aWxsIHVucG9pc29uIHRoYXQgbWVtb3J5LCBidXQgdGhlIHJlc3QgcmVtYWlucyBwb2lzb25lZCwgaGVuY2UgdW5pbml0aWFsaXplZCwgcmlnaHQ/XG5cblNvLCBpZiBgZXRoX3R5cGVfdHJhbnNgIGF0dGVtcHRzIHRvIHJlYWQsIHNheSwgYGV0aC1cdTAwM2VoX3Byb3RvYCBiZXlvbmQgdGhlIHJlY2VpdmVkIGxlbmd0aCAoaS5lLiBiZXlvbmQgYHNrYi1cdTAwM2VsZW5gKSwgaXQgc2hvdWxkIHRyaWdnZXIgYSBLTVNBTiB3YXJuaW5nLCBzaW5jZSBpdCdzIGFuIHVuaW5pdGlhbGl6ZWQgcmVhZCEgVGhhdCdzIGEgZ29vZCBmaW5kIVxuXG5Ob3csIGlzIHRoaXMgYSBLTVNBTi1zcGVjaWZpYyBpc3N1ZT8gWWVzLCBiZWNhdXNlIEtBU0FOIGlzIGxpa2VseSBub3QgZ29pbmcgdG8gY2F0Y2ggaXQsIGdpdmVuIHRoZSBtZW1vcnkgYWNjZXNzIGlzIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGJvdW5kcy4gS0FTQU4gZG9lc24ndCBoYXZlIHRoZSBzYW1lIGNvbmNlcHQgb2YgJ2xvZ2ljYWwnIHNpemUsIG9ubHkgdGhlIGFsbG9jYXRlZCBzaXplLiBJdCBsb29rcyBsaWtlIGl0IGJvaWxzIGRvd24gdG8gdGhlIHVzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuTGV0IG1lIGp1c3QgZG91YmxlLWNoZWNrLCBidXQgSSBkb24ndCBiZWxpZXZlIEtBU0FOIGhhcyB0aGUgYWJpbGl0eSB0byBwb2lzb24gU0tCIGRhdGEsIGJ1dCB0aGVyZSdzIGEgcGF0Y2ggc2VyaWVzIGNhbGxlZCBcImthc2FuOiBhZGQgc2tiIGRhdGEgcG9pc29uaW5nXCIuIEknbGwgaGF2ZSB0byBjaGVjayBpZiB0aGF0IGxhbmRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjUyMywiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDowMy40NzU4MTEzMDZaIiwiU2VxIjoxOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzOTQ3MTU5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrYXNhbi4qc2tiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbGludXgvc2tidWZmLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjAzLjUxOTc2Nzg4NVoiLCJTZXEiOjE5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNTU5MzA4MjE0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBhIHNlYXNvbmVkIHByb2Zlc3Npb25hbDpcblxuKipEaWdnaW5nIGludG8gUG90ZW50aWFsIEtBU0FOIElzc3VlcyB3aXRoIFNLQnMqKlxuXG5BbHJpZ2h0LCB0aGUgaW5pdGlhbCBzY2FuIGZvciBga2FzYW4uKnNrYmAgaW4gYGluY2x1ZGUvbGludXgvc2tidWZmLmhgIGRpZG4ndCB5aWVsZCBhbnkgZGlyZWN0IGhpdHMuIFRoYXQncyBub3QgZW50aXJlbHkgdW5leHBlY3RlZCwgc29tZXRpbWVzIHRoZXNlIHRoaW5ncyBhcmUgc3VidGx5IG5hbWVkIG9yIGltcGxlbWVudGVkIGFjcm9zcyBtdWx0aXBsZSBmaWxlcy4gU28sIHRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGRlZXBlciBhbmQgc2VlIGlmIEtBU0FOIChLZXJuZWwgQWRkcmVzcyBTYW5pdGl6ZXIpIGlzIGJlaW5nIHV0aWxpemVkIHRvIGRldGVjdCBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gcHJvYmxlbXMgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgZGF0YSBidWZmZXJzIGFzc29jaWF0ZWQgd2l0aCBgc2tiYCAoc29ja2V0IGJ1ZmZlcikgc3RydWN0dXJlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlcmUgaXMgYW55IEtBU0FOIHBvaXNvbmluZyBiZWluZyBhcHBsaWVkIHRvIHRoZSBza2IgZGF0YS4gSSdtIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBjbHVlcyB0aGVyZSB0byBkZXRlcm1pbmUgd2hldGhlciBLQVNBTiBpcyBiZWluZyBhY3RpdmVseSBsZXZlcmFnZWQgdG8gZW5zdXJlIHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBjcml0aWNhbCBuZXR3b3JraW5nIGRhdGEuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc1MjUsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDowNy4wNzkwODAxMTlaIiwiU2VxIjoyMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMzY1NDc0ODcsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImthc2FuX3BvaXNvbi4qc2tiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDA6MDkuMjE1NjM0NTM2WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMTU4OTgwMzg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IGluIE5ldHdvcmsgUGFja2V0IFByb2Nlc3NpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyBuZXR3b3JrIGRyaXZlcnMgaGFuZGxlIHBhY2tldCBkYXRhIGFuZCBob3cgbWVtb3J5IHNhbml0aXplcnMgY29tZSBpbnRvIHBsYXkuIEl0IHNlZW1zIEtBU0FOIGlzbid0IHRoZSBzaWx2ZXIgYnVsbGV0IGhlcmUsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJdCBkb2Vzbid0IGNhdGNoIHJlYWRzIGJleW9uZCBgc2tiLVx1MDAzZXRhaWxgIG9yIGBza2JfaGVhZGxlbmAgYnV0ICp3aXRoaW4qIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBLTVNBTiwgaG93ZXZlciwgKmRvZXMqIGNhdGNoIGl0LCBiZWNhdXNlIHRoZSBtZW1vcnkgYmV5b25kIHRoZSBhY3R1YWwgcGFja2V0IGRhdGEgaXMgdW5pbml0aWFsaXplZC5cblxuVGhlIGtleSBpcyB0aGlzOiBpZiBhIGRyaXZlciBhbGxvY2F0ZXMgYSBwYWdlIGZvciBhIHBhY2tldCwgdGhhdCBlbnRpcmUgcGFnZSBzdGFydHMgb3V0IHVuaW5pdGlhbGl6ZWQuIERNQSB3cml0ZXMgdGhlIGFjdHVhbCBwYWNrZXQgZGF0YSwgYW5kIEtNU0FOIHNwZWNpZmljYWxseSB1bnBvaXNvbnMgdGhhdCB3cml0dGVuIHBvcnRpb24uIFRoZSByZXN0LCBob3dldmVyLCByZW1haW5zIHVudG91Y2hlZCwgaGVuY2UgdW5pbml0aWFsaXplZC5cblxuTm93LCB0YWtlIGBldGhfdHlwZV90cmFuc2AgZm9yIGV4YW1wbGUsIHdoaWNoIHJlYWRzIGBldGgtXHUwMDNlaF9wcm90b2AgKDIgYnl0ZXMpLiBJZiB0aGUgcGFja2V0IGlzIHNtYWxsZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAoYEVUSF9ITEVOYCksIHRoaXMgcmVhZCBjb3VsZCBiZSBiZXlvbmQgYHNrYl9oZWFkbGVuKHNrYilgLiBCb29tLCB1bmluaXRpYWxpemVkIG1lbW9yeSFcblxuVGhhdCBgZXRoLVx1MDAzZWhfcHJvdG9gIHZhbHVlIGlzIHRoZW4gdXNlZCB0byBkZXRlcm1pbmUgdGhlIHByb3RvY29sLiBUaGlzIHZhbHVlIGNvdWxkIGVuZCB1cCBpbiBgc2tiLVx1MDAzZXByb3RvY29sYC4gTGF0ZXIsIHRoaXMgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXMgdXNlZCBmb3Igcm91dGluZyBvciBmaWx0ZXJpbmcsIGFuZCB0aGF0IGNvdWxkIGVhc2lseSBsZWFkIHRvIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJhc2VkIG9uIHRoYXQgdW5pbml0aWFsaXplZCBkYXRhLiBUaGF0J3MgYSBwZXJmZWN0IHNjZW5hcmlvIGZvciBLTVNBTiB0byBmbGFnIGFzIGEgXCJ1c2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZVwiIGVycm9yLlxuXG5JIGNvbmZpcm1lZCBteSBoeXBvdGhlc2lzIGJ5IGxvb2tpbmcgYXQgdGhlIGNvZGUsIHNwZWNpZmljYWxseSB0aGUgYGV0aF90eXBlX3RyYW5zYCBmdW5jdGlvbjpcbmBgYGNcblx0ZXRoID0gZXRoX3NrYl9wdWxsX21hYyhza2IpO1xuXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcblxuXHQvKiAuLi4gKi9cblx0aWYgKGxpa2VseShldGhfcHJvdG9faXNfODAyXzMoZXRoLVx1MDAzZWhfcHJvdG8pKSlcblx0XHRyZXR1cm4gZXRoLVx1MDAzZWhfcHJvdG87XG5gYGBcbklmIGBza2JfaGVhZGxlbihza2IpYCBpcyBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgdGhlbiByZWFkaW5nIGBldGgtXHUwMDNlaF9wcm90b2AgaXMgZ29pbmcgdG8gYmUgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhhdCBgZXRoX3Byb3RvX2lzXzgwMl8zYCBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIHByb3RvY29sIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNTM2LiBDb25kaXRpb25hbCBicmFuY2ggb24gdW5pbml0aWFsaXplZCBkYXRhISBLTVNBTiB3aWxsICpkZWZpbml0ZWx5KiBjYXRjaCB0aGF0LlxuXG5NeSBuZXh0IHF1ZXN0aW9uIGlzLCB3aWxsIEtBU0FOIGNhdGNoIHRoaXM/IE5vLCBpdCB3b24ndC4gVGhlIHJlYWQgaXMgd2l0aGluIHRoZSBhbGxvY2F0aW9uIGJvdW5kcy4gVXN1YWxseSwgbmV0d29yayBkcml2ZXJzIGFsbG9jYXRlIGF0IGxlYXN0IGEgcGFnZSAoNDA5NiBieXRlcykgb3IgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIHJlY2VpdmUgcGFja2V0cy4gQSBwYWNrZXQgb2YgbGVzcyB0aGFuIDE0IGJ5dGVzIChFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoKSBlYXNpbHkgZml0cyB3aXRoaW4gdGhhdCBhbGxvY2F0aW9uLiBTbyB0aGUgYGV0aC1cdTAwM2VoX3Byb3RvYCByZWFkIGhhcHBlbnMgd2l0aGluIHRoZSBhbGxvY2F0aW9uLiBJdCdzIEtNU0FOIHRoYXQgc2hpbmVzIGhlcmUgYmVjYXVzZSB0aGUgbWVtb3J5IGJleW9uZCB0aGUgcGFja2V0IGRhdGEgaXMgdW50b3VjaGVkIGFuZCB0aGVyZWZvcmUgdW5pbml0aWFsaXplZC5cblxuTm93LCBJIHdvbmRlciBpZiBhbm90aGVyIHRvb2wgY2F0Y2hlcyB0aGlzLiBNYXliZSB0aGVyZSBpcyBhIGBCVUdfT05gIGluIGBza2JfcHVsbGA/IEkgc2hvdWxkIGNoZWNrIGBldGhfc2tiX3B1bGxfbWFjYC5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzc5MCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU4MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDoxOS4zNzQ2MTczMjRaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Mzc4MjU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV0aF9za2JfcHVsbF9tYWNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaD02MjM9c3RhdGljIGlubGluZSB2b2lkIGV0aF9za2JfcGt0X3R5cGUoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbmluY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaC02MzktXFxuaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oOjY0MDpzdGF0aWMgaW5saW5lIHN0cnVjdCBldGhoZHIgKmV0aF9za2JfcHVsbF9tYWMoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgtNjQxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDA6MTkuNDIwMDAwNDQyWiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUxMDg1OTY3NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSdtIHdlbGwtdmVyc2VkIGluIGtlcm5lbCBuZXR3b3JraW5nIGludGVybmFsczpcblxuKipEaXZpbmcgaW50byBgZXRoX3NrYl9wdWxsX21hY2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBwdWxsIHVwIHRoZSBzb3VyY2UgY29kZSBmb3IgYGV0aF9za2JfcHVsbF9tYWNgLiBUaGlzIGZ1bmN0aW9uIG5hbWUgaW1tZWRpYXRlbHkgc2NyZWFtcyBcIkV0aGVybmV0IGFuZCBTS0IgbWFuaXB1bGF0aW9uLFwiIHNvIGl0J3MgbGlrZWx5IGEga2V5IHBsYXllciBpbiB0aGUgZGF0YSBsaW5rIGxheWVyIHdpdGhpbiB0aGUga2VybmVsJ3MgbmV0d29yayBzdGFjay4gSSdtIGd1ZXNzaW5nIGl0J3MgcmVzcG9uc2libGUgZm9yLCBhdCBhIG1pbmltdW0sIGhhbmRsaW5nIHRoZSBwdWxsaW5nIG9yIGFkdmFuY2VtZW50IG9mIHRoZSBTZWN1cmUgS2VybmVsIEJ1ZmZlciAoU0tCKSBwb2ludGVyIHRvIGFjY291bnQgZm9yIHRoZSBFdGhlcm5ldCBNQUMgaGVhZGVyLiBUaGlzIGlzIHRoZSBzdGFnZSB3aGVyZSB0aGUga2VybmVsIGlzIHByb2Nlc3NpbmcgYSByZWNlaXZlZCBFdGhlcm5ldCBmcmFtZSwgYW5kIG5lZWRzIHRvIG1vdmUgcGFzdCB0aGUgZGVzdGluYXRpb24gTUFDLCBzb3VyY2UgTUFDLCBFdGhlclR5cGUsIGFuZCBwb3RlbnRpYWxseSBWTEFOIHRhZ3MgKGlmIHByZXNlbnQpIHRvIGdldCB0byB0aGUgcGF5bG9hZC4gSXQncyB0aGUgZXNzZW50aWFsIGJyaWRnaW5nIHN0ZXAgYmV0d2VlbiB0aGUgcmF3IGZyYW1lIGRhdGEgYW5kIHRoZSBJUCBsYXllciBvciBoaWdoZXIgcHJvdG9jb2xzLlxuXG5JJ2xsIGJlIGxvb2tpbmcgdG8gdW5kZXJzdGFuZDpcblxuKiAgICoqSG93IGl0IGhhbmRsZXMgdmFyaWFibGUtbGVuZ3RoIGhlYWRlcnM6KiogRG9lcyBpdCBkeW5hbWljYWxseSBhZGp1c3QgdGhlIFNLQidzIGRhdGEgcG9pbnRlciBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgVkxBTiB0YWdzIG9yIG90aGVyIGV4dGVuc2lvbnMgaW4gdGhlIEV0aGVybmV0IGhlYWRlcj8gQXJlIHRoZXJlIGFueSBjaGVja3MgZm9yIG1pbmltdW0gZnJhbWUgc2l6ZXMgb3IgZnJhZ21lbnRlZCBmcmFtZXM/XG4qICAgKipFcnJvciBoYW5kbGluZzoqKiBXaGF0IGhhcHBlbnMgaWYgdGhlIFNLQiBpcyB0b28gc21hbGwgdG8gY29udGFpbiBhIHZhbGlkIEV0aGVybmV0IGhlYWRlcj8gQXJlIHRoZXJlIGFueSBzYW5pdHkgY2hlY2tzIG9uIHRoZSBFdGhlclR5cGUgZmllbGQgdG8gZW5zdXJlIGl0J3MgYSBrbm93biBwcm90b2NvbD9cbiogICAqKlBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zOioqIElzIHRoaXMgYSBob3QgcGF0aD8gQXJlIHRoZXJlIG9wdGltaXphdGlvbnMgaW4gcGxhY2UgbGlrZSBwb3RlbnRpYWxseSBpbmxpbmluZyBNQUMgaGVhZGVyIG9mZnNldHMgdG8gYXZvaWQgYnJhbmNoIGNvbmRpdGlvbnM/IERvZXMgaXQgdXNlIGFueSB0ZWNobmlxdWVzIGxpa2UgcHJlZmV0Y2hpbmcgdG8gaW1wcm92ZSBjYWNoZSBiZWhhdmlvcj9cbiogICAqKkludGVyYWN0aW9uIHdpdGggb3RoZXIgZnVuY3Rpb25zOioqIEhvdyBkb2VzIGl0IHRpZSBpbnRvIHRoZSBvdmVyYWxsIHJlY2VpdmUgcGF0aD8gSXMgaXQgY2FsbGVkIGRpcmVjdGx5IGZyb20gdGhlIE5JQyBkcml2ZXIsIG9yIHRocm91Z2ggc29tZSBpbnRlcm1lZGlhdGUgbGF5ZXI/IERvZXMgaXQgdXBkYXRlIGFueSBvdGhlciBTS0IgbWV0YWRhdGEgdGhhdCBkb3duc3RyZWFtIGxheWVycyByZWx5IG9uP1xuXG5JIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHJhdyBpbmNvbWluZyBFdGhlcm5ldCBmcmFtZXMgYW5kIHRyYW5zbGF0ZXMgdGhlbSBpbnRvIGEgdXNhYmxlIGZvcm1hdCBmb3IgaGlnaGVyLWxldmVsIG5ldHdvcmsgcHJvdG9jb2xzLiBJdCdzIGZ1bmRhbWVudGFsIHRvIHRoZSB3aG9sZSBuZXR3b3JraW5nIHByb2Nlc3MhIExldCdzIGRpZyBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTE2NiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjI0LjUyODYwMDgzWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNTQwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmhcIixcbiAgXCJGaXJzdExpbmVcIjogNjM1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjM1OlxcdFxcdFxcdFxcdHNrYi1cXHUwMDNlcGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUO1xcbiA2MzY6XFx0XFx0XFx0fVxcbiA2Mzc6XFx0XFx0fVxcbiA2Mzg6XFx0fVxcbiA2Mzk6XFx0XFxuIDY0MDpcXHRzdGF0aWMgaW5saW5lIHN0cnVjdCBldGhoZHIgKmV0aF9za2JfcHVsbF9tYWMoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4gNjQxOlxcdHtcXG4gNjQyOlxcdFxcdHN0cnVjdCBldGhoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLVxcdTAwM2VkYXRhO1xcbiA2NDM6XFx0XFxuIDY0NDpcXHRcXHRza2JfcHVsbF9pbmxpbmUoc2tiLCBFVEhfSExFTik7XFxuIDY0NTpcXHRcXHRyZXR1cm4gZXRoO1xcbiA2NDY6XFx0fVxcbiA2NDc6XFx0XFxuIDY0ODpcXHQvKipcXG4gNjQ5OlxcdCAqIGV0aF9za2JfcGFkIC0gUGFkIGJ1ZmZlciB0byBtaW5pbXVtIG51bWJlciBvZiBvY3RldHMgZm9yIEV0aGVybmV0IGZyYW1lXFxuIDY1MDpcXHQgKiBAc2tiOiBCdWZmZXIgdG8gcGFkXFxuIDY1MTpcXHQgKlxcbiA2NTI6XFx0ICogQW4gRXRoZXJuZXQgZnJhbWUgc2hvdWxkIGhhdmUgYSBtaW5pbXVtIHNpemUgb2YgNjAgYnl0ZXMuICBUaGlzIGZ1bmN0aW9uXFxuIDY1MzpcXHQgKiB0YWtlcyBzaG9ydCBmcmFtZXMgYW5kIHBhZHMgdGhlbSB3aXRoIHplcm9zIHVwIHRvIHRoZSA2MCBieXRlIGxpbWl0LlxcbiA2NTQ6XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjI0LjUyODcxMDE4MVoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MzM5OTEzNTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQW5hbHl6aW5nIHRoZSBOZXR3b3JrIFBhY2tldCBQdWxsIE9wZXJhdGlvbioqXG5cblJpZ2h0LCBgZXRoX3NrYl9wdWxsX21hY2AuLi4gdGhhdCdzIHdoZXJlIHdlJ3JlIHlhbmtpbmcgdGhlIEV0aGVybmV0IGhlYWRlciBvZmYgYSBwYWNrZXQsIGlzbid0IGl0PyBUaGUga2V5IGxpbmUgdGhlcmUsIGFzIEkgcmVjYWxsLCBpcyB0aGUgY2FsbCB0byBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gT2theSwgc28gYHNrYl9wdWxsX2lubGluZWAgaXMgY2xlYXJseSB0aGUgd29ya2hvcnNlIGhlcmUuIFdlJ3JlIGV4cGVjdGluZyBgRVRIX0hMRU5gLCB3aGljaCBpcyB0aGF0IHN0YW5kYXJkIEV0aGVybmV0IGhlYWRlciBsZW5ndGguLi4gMTQgb3IgMTUgYnl0ZXMsIGRlcGVuZGluZyBvbiB0aGUgVkxBTiBzaXR1YXRpb24uIFNvLCB0aGUga2VybmVsIGlzIGxpa2VseSBtYW5hZ2luZyBhIHNoYXJlZCBuZXR3b3JrIGJ1ZmZlciwgcmlnaHQ/IFdlJ3JlIHRha2luZyB0aGUgbWVtb3J5IGF0IHRoZSBoZWFkIG9mIHRoZSBgc2tiYCBhbmQgYWR2YW5jaW5nIHRoZSBgZGF0YWAgcG9pbnRlciB0byBza2lwIHRoZSBFdGhlcm5ldCBoZWFkZXIuIExldCdzIGRpZyBkZWVwZXIgaW50byB0aGUgaW50cmljYWNpZXMgb2Ygd2hhdCBgc2tiX3B1bGxfaW5saW5lYCBpcyBkb2luZy4gU3BlY2lmaWNhbGx5LCBob3cgaXQncyBiZWluZyBoYW5kbGVkIGhlcmUuIEknbSBrZWVuIHRvIGV4YW1pbmUgaG93IGl0IGlzIHdvcmtpbmcgaGVyZSwgc2luY2Ugd2UgYXJlIGhhbmRsaW5nIGEgYnVmZmVyIGlubGluZS4gTGV0J3Mgc2VlIGhvdyB0aGV5IGRvIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5OTQzLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDoyOC44Njg2MjU3MTJaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MDc2ODc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNrYl9wdWxsX2lubGluZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL2xpbnV4L3NrYnVmZi5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvc2tidWZmLmg9MjgzNj1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKl9fc2tiX3B1bGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbilcXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjg1MS1cXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjI4NTI6c3RhdGljIGlubGluZSB2b2lkICpza2JfcHVsbF9pbmxpbmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbilcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI4NTMte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDoyOC45MTM3MDg2WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MDM0MTQ3OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBza2JfcHVsbF9pbmxpbmVgKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gaXQuIFRpbWUgdG8gZGlzc2VjdCBgc2tiX3B1bGxfaW5saW5lYC4gSSBrbm93IHRoaXMgZnVuY3Rpb24gaW50aW1hdGVseSwgYnV0IGl0J3MgYWx3YXlzIHdvcnRoIGEgZnJlc2ggbG9vay4gSSdtIGdvaW5nIHRvIHF1aWNrbHkgcmVmcmVzaCB0aGUgbWVudGFsIG1vZGVsIG9mIGhvdyBpdCBvcGVyYXRlcyBvbiBhbiBgc2tfYnVmZmAuIEknbSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBpbXBsaWNhdGlvbnMgb2YgaW5saW5pbmcsIGVzcGVjaWFsbHkgYXJvdW5kIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBtZW1vcnkgYWxpZ25tZW50IGlzc3Vlcy4gSSdsbCBuZWVkIHRvIHJlbWVtYmVyIHRoZSB0eXBpY2FsIHVzZSBjYXNlcyBhbmQgaG93IHRoaXMgZnVuY3Rpb24gZml0cyBpbnRvIHRoZSBvdmVyYWxsIG5ldHdvcmsgc3RhY2sg4oCTIHdoYXQgbGF5ZXJzIHJlbHkgb24gaXQsIGFuZCB3aGF0IGFzc3VtcHRpb25zIGFyZSBtYWRlIGFib3V0IHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQuIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBhbnkgcmVjZW50IGNoYW5nZXMgb3IgZGlzY3Vzc2lvbnMgSSd2ZSBtaXNzZWQg4oCTIHBlcmhhcHMgbmV3IGFyY2hpdGVjdHVyZXMgb3Igb3B0aW1pemF0aW9ucyB0aGF0IGhhdmUgaW1wYWN0ZWQgaXRzIGJlaGF2aW9yLiBJdCdzIHRpbWUgdG8gY29uZmlybSBteSBhc3N1bXB0aW9ucyBhbmQgbWFrZSBzdXJlIG15IHVuZGVyc3RhbmRpbmcgaXMgY29tcGxldGVseSBzaGFycCFcblxuXG4iLCJJbnB1dFRva2VucyI6MTAzOTMsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDozMi40MTcxMjYxNTZaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg4MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbGludXgvc2tidWZmLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMjg0NSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjg0NTpcXHRcXHRcXHRza2JfZHVtcChLRVJOX0VSUiwgc2tiLCBmYWxzZSk7XFxuMjg0NjpcXHQjZW5kaWZcXG4yODQ3OlxcdFxcdFxcdEJVRygpO1xcbjI4NDg6XFx0XFx0fVxcbjI4NDk6XFx0XFx0cmV0dXJuIHNrYi1cXHUwMDNlZGF0YSArPSBsZW47XFxuMjg1MDpcXHR9XFxuMjg1MTpcXHRcXG4yODUyOlxcdHN0YXRpYyBpbmxpbmUgdm9pZCAqc2tiX3B1bGxfaW5saW5lKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pXFxuMjg1MzpcXHR7XFxuMjg1NDpcXHRcXHRyZXR1cm4gdW5saWtlbHkobGVuIFxcdTAwM2Ugc2tiLVxcdTAwM2VsZW4pID8gTlVMTCA6IF9fc2tiX3B1bGwoc2tiLCBsZW4pO1xcbjI4NTU6XFx0fVxcbjI4NTY6XFx0XFxuMjg1NzpcXHR2b2lkICpza2JfcHVsbF9kYXRhKHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBsZW4pO1xcbjI4NTg6XFx0XFxuMjg1OTpcXHR2b2lkICpfX3Bza2JfcHVsbF90YWlsKHN0cnVjdCBza19idWZmICpza2IsIGludCBkZWx0YSk7XFxuMjg2MDpcXHRcXG4yODYxOlxcdHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgZW51bSBza2JfZHJvcF9yZWFzb25cXG4yODYyOlxcdHBza2JfbWF5X3B1bGxfcmVhc29uKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pXFxuMjg2MzpcXHR7XFxuMjg2NDpcXHRcXHRERUJVR19ORVRfV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDNlIElOVF9NQVgpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDozMi40MTc0MTYxOTZaIiwiU2VxIjoyOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTAzNDUwMTIzOTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgc28gYHNrYl9wdWxsX2lubGluZWAgcmV0dXJuaW5nIGBOVUxMYCB3aGVuIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIChgbGVuYCkgaXMgZ3JlYXRlciB0aGFuIHRoZSBza2IncyBjdXJyZW50IGxlbmd0aCAoYHNrYi1cdTAwM2VsZW5gKSBpbW1lZGlhdGVseSBqdW1wcyBvdXQgYXQgbWUuIEFuZCBoZXJlJ3MgdGhlIGtpY2tlcjogYGV0aF9za2JfcHVsbF9tYWNgIGJsaXRoZWx5ICppZ25vcmVzKiB0aGF0IGBOVUxMYCByZXR1cm4hIFRoYXQncyBhIHJlZCBmbGFnLiBTcGVjaWZpY2FsbHksIHRoaXMgY29kZTpcblxuYGBgY1xuc3RhdGljIGlubGluZSBzdHJ1Y3QgZXRoaGRyICpldGhfc2tiX3B1bGxfbWFjKHN0cnVjdCBza19idWZmICpza2IpXG57XG5cdHN0cnVjdCBldGhoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLVx1MDAzZWRhdGE7XG5cblx0c2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pO1xuXHRyZXR1cm4gZXRoO1xufVxuYGBgXG5cbklmIGBFVEhfSExFTmAgKDE0IGJ5dGVzIGZvciBhbiBFdGhlcm5ldCBoZWFkZXIpIGlzIGdyZWF0ZXIgdGhhbiBgc2tiLVx1MDAzZWxlbmAsIGBza2JfcHVsbF9pbmxpbmVgIHJldHVybnMgYE5VTExgIGFuZCAqZG9lc24ndCogYWR2YW5jZSBgc2tiLVx1MDAzZWRhdGFgLiBCdXQgYGV0aF9za2JfcHVsbF9tYWNgIHN0aWxsIHJldHVybnMgdGhlIG9yaWdpbmFsLCBub3cgcG90ZW50aWFsbHkgaW52YWxpZCwgcG9pbnRlciBgZXRoYC4gVGhlbiwgYGV0aF90eXBlX3RyYW5zYCBoYXBwaWx5IGdvZXMgYWhlYWQgYW5kIHRyaWVzIHRvIHVzZSBgZXRoLVx1MDAzZWhfcHJvdG9gLiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuXG5cbklmIGBFVEhfSExFTiBcdTAwM2Ugc2tiLVx1MDAzZWxlbmAsIGRvZXMgdGhpcyBuZWNlc3NhcmlseSBtZWFuIGBza2ItXHUwMDNlbGVuYCBpcyBsZXNzIHRoYW4gMTQ/IEFic29sdXRlbHkuIFRoYXQgbWVhbnMgdGhhdCBgZXRoLVx1MDAzZWhfcHJvdG9gLCB3aGljaCBpcyBhdCBvZmZzZXQgMTIgaW4gdGhlIGBldGhoZHJgIHN0cnVjdHVyZSwgZmFsbHMgKm91dHNpZGUqIHRoZSB2YWxpZCBkYXRhIHJlZ2lvbiBvZiB0aGUgc2tiLiBJZiBgc2tiLVx1MDAzZWxlbmAgaXMsIHNheSwgMTAgYnl0ZXMsIHRoZW4gYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIgaXMgYWNjZXNzaW5nIG1lbW9yeSB0aGF0J3MgYmV5b25kIHRoZSBkYXRhJ3MgYm91bmRhcnkuXG5cblRoZSBxdWVzdGlvbiB0aGVuIGlzLCB3aWxsIHRoaXMgYmUgY2F1Z2h0PyBLQVNBTiAoS2VybmVsIEFkZHJlc3MgU2FuaXRpemVyKSBsaWtlbHkgKndvbid0KiBmbGFnIHRoaXMuIFRoZSBhbGxvY2F0ZWQgYnVmZmVyIGlzIHVzdWFsbHkgbXVjaCBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBkYXRhIGxlbmd0aC4gSG93ZXZlciwgS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSAqd2lsbCogbGlrZWx5IGNhdGNoIGl0IGJlY2F1c2UgdGhlIG1lbW9yeSBhdCBvZmZzZXQgMTIgbWlnaHQgdmVyeSB3ZWxsIGJlIHVuaW5pdGlhbGl6ZWQuXG5cbk5vdywgd2hhdCBpZiBgc2tiX2hlYWRsZW4oc2tiKWAgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmAgKmJ1dCogYHNrYi1cdTAwM2VsZW5gIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgRVRIX0hMRU5gPyBBaCwgdGhpcyBtZWFucyB0aGUgcGFja2V0IGlzIGZyYWdtZW50ZWQsIGFuZCB0aGUgbGluZWFyIHBhcnQgaXMgc2hvcnRlciB0aGFuIDE0IGJ5dGVzLiBJbiB0aGlzIGNhc2UsIGBza2JfcHVsbF9pbmxpbmVgIHdpbGwgY2FsbCBgX19za2JfcHVsbChza2IsIEVUSF9ITEVOKWAuIExldCdzIHJlZnJlc2ggb3VyIG1lbW9yeSBvZiB3aGF0IGBfX3NrYl9wdWxsYCBkb2VzOlxuXG5gYGBjXG5zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKl9fc2tiX3B1bGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbilcbntcblx0c2tiLVx1MDAzZWxlbiAtPSBsZW47XG5cdEJVR19PTihza2ItXHUwMDNlbGVuIFx1MDAzYyBza2ItXHUwMDNlZGF0YV9sZW4pO1xuXHRyZXR1cm4gc2tiLVx1MDAzZWRhdGEgKz0gbGVuO1xufVxuYGBgXG5cbklmIGBza2JfaGVhZGxlbihza2IpIFx1MDAzYyBFVEhfSExFTmAsIHRoZW4gYHNrYi1cdTAwM2VsZW4gLSBza2ItXHUwMDNlZGF0YV9sZW4gXHUwMDNjIEVUSF9ITEVOYC4gU28sIGBza2ItXHUwMDNlbGVuIC0gRVRIX0hMRU4gXHUwMDNjIHNrYi1cdTAwM2VkYXRhX2xlbmAuIFRoZSBgQlVHX09OKHNrYi1cdTAwM2VsZW4gXHUwMDNjIHNrYi1cdTAwM2VkYXRhX2xlbilgIHdpbGwgdHJpZ2dlciwgcHJldmVudGluZyBmdXJ0aGVyIHByb2JsZW1zLlxuXG5TbywgKnRoYXQqIGBCVUdfT05gIHdpbGwgYmUgaGl0IGlmIGBza2JfaGVhZGxlbihza2IpIFx1MDAzYyBFVEhfSExFTmAgYW5kIGBza2ItXHUwMDNlbGVuIFx1MDAzZT0gRVRIX0hMRU5gPyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGBza2JfaGVhZGxlbmAgYmVoYXZlcy4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDk2NCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY4NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjQyLjc2MjQzMTAwOFoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDM3MTc4NzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2tiX2hlYWRsZW5cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9za2J1ZmYuaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3NrYnVmZi5oPTI1Mjc9c3RhdGljIGlubGluZSBib29sIHNrYl9pc19ub25saW5lYXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjUzMS1cXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjI1MzI6c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2tiX2hlYWRsZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI1MzMte1xcbi0tXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaD0yNTQ2PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNrYl9wYWdlbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yNTQ3LXtcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjI1NDg6XFx0cmV0dXJuIHNrYl9oZWFkbGVuKHNrYikgKyBfX3NrYl9wYWdlbGVuKHNrYik7XFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yNTQ5LX1cXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg9Mjg2Mj1wc2tiX21heV9wdWxsX3JlYXNvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKVxcbi0tXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODY2LVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6Mjg2NzpcXHRpZiAobGlrZWx5KGxlbiBcXHUwMDNjPSBza2JfaGVhZGxlbihza2IpKSlcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI4NjgtXFx0XFx0cmV0dXJuIFNLQl9OT1RfRFJPUFBFRF9ZRVQ7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI4NzItXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyODczOlxcdGlmICh1bmxpa2VseSghX19wc2tiX3B1bGxfdGFpbChza2IsIGxlbiAtIHNrYl9oZWFkbGVuKHNrYikpKSlcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI4NzQtXFx0XFx0cmV0dXJuIFNLQl9EUk9QX1JFQVNPTl9OT01FTTtcXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg9NDMyNT1za2JfaGVhZGVyX3BvaW50ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwgaW50IGxlbiwgdm9pZCAqYnVmZmVyKVxcbi0tXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC00MzI3LVxcdHJldHVybiBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgbGVuLCBza2ItXFx1MDAzZWRhdGEsXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDo0MzI4OlxcdFxcdFxcdFxcdCAgICBza2JfaGVhZGxlbihza2IpLCBidWZmZXIpO1xcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtNDMyOS19XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oPTQzNDQ9c2tiX3BvaW50ZXJfaWZfbGluZWFyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsIGludCBsZW4pXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC00MzQ1LXtcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjQzNDY6XFx0aWYgKGxpa2VseShza2JfaGVhZGxlbihza2IpIC0gb2Zmc2V0IFxcdTAwM2U9IGxlbikpXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC00MzQ3LVxcdFxcdHJldHVybiBza2ItXFx1MDAzZWRhdGEgKyBvZmZzZXQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjQyLjgwNjE1Mjg0N1oiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjM5NDc5MjAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggdGhpcywgYXMgdGhvdWdoIHRoZXNlIGFyZSAqbXkqIHRob3VnaHRzOlxuXG4qKkFuYWx5emluZyBgc2tiX2hlYWRsZW5gKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGUgZGV0YWlscy4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3Mgd291bGQgYmUgc29tZXRoaW5nIGxpa2UgdGhpczpcblxuXCJPa2F5LCBzbyB3ZSdyZSBsb29raW5nIGF0IGBza2JfaGVhZGxlbmAuIFN0cmFpZ2h0IGF3YXksIEknbSB0aGlua2luZywgdGhpcyBtdXN0IHJlbGF0ZSB0byB0aGUgTGludXgga2VybmVsJ3MgYHNrX2J1ZmZgIHN0cnVjdHVyZSwgdGhlIHdvcmtob3JzZSBmb3IgbmV0d29yayBwYWNrZXQgaGFuZGxpbmcuICBgaGVhZGxlbmAgc3VnZ2VzdHMgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgcG9ydGlvbiBvZiBhbiBgc2tiYC4gVGhhdCdzIHRoZSBtb3N0ICpsaWtlbHkqIGludGVycHJldGF0aW9uLCBnaXZlbiBteSBwYXN0IGV4cGVyaWVuY2UgYW5kIHRoZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb25zLiBMZXQncyBkZWx2ZSBpbiBhbmQgc2VlIGlmIHRoaXMgaW50dWl0aW9uIGlzIGNvcnJlY3QuXCJcblxuXG4iLCJJbnB1dFRva2VucyI6MTMxMzAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDo0Ni40NDU2MzQyNTlaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzI2NDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbGludXgvc2tidWZmLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMjUyNSxcbiAgXCJMaW5lQ291bnRcIjogMTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjUyNTpcXHRcXG4yNTI2OlxcdFxcbjI1Mjc6XFx0c3RhdGljIGlubGluZSBib29sIHNrYl9pc19ub25saW5lYXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4yNTI4OlxcdHtcXG4yNTI5OlxcdFxcdHJldHVybiBza2ItXFx1MDAzZWRhdGFfbGVuO1xcbjI1MzA6XFx0fVxcbjI1MzE6XFx0XFxuMjUzMjpcXHRzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBza2JfaGVhZGxlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjI1MzM6XFx0e1xcbjI1MzQ6XFx0XFx0cmV0dXJuIHNrYi1cXHUwMDNlbGVuIC0gc2tiLVxcdTAwM2VkYXRhX2xlbjtcXG4yNTM1OlxcdH1cXG4yNTM2OlxcdFxcbjI1Mzc6XFx0c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19za2JfcGFnZWxlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjI1Mzg6XFx0e1xcbjI1Mzk6XFx0XFx0dW5zaWduZWQgaW50IGksIGxlbiA9IDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjQ2LjQ0NTk2MjY3OVoiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzk0MTAwMTcyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE5ldHdvcmsgUGFja2V0IFByb2Nlc3NpbmcgVnVsbmVyYWJpbGl0eSoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBrZXJuZWwgaXNzdWUgcmVsYXRlZCB0byBFdGhlcm5ldCBoZWFkZXIgaGFuZGxpbmcgYW5kIGl0J3MgcXVpdGUgaW50ZXJlc3RpbmcuIEl0IHNlZW1zIHRoZSBjb3JlIHByb2JsZW0gYXJpc2VzIHdoZW4gZGVhbGluZyB3aXRoIG5ldHdvcmsgcGFja2V0cyB3aGVyZSB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIFNLQiAoU29ja2V0IEJ1ZmZlcikgaXMgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoIChgRVRIX0hMRU5gKS4gTGV0J3MgYnJlYWsgdGhpcyBkb3duOlxuXG5GaXJzdCwgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGVzc2VudGlhbGx5IGBza2ItXHUwMDNlbGVuIC0gc2tiLVx1MDAzZWRhdGFfbGVuYC4gVGhlIHZ1bG5lcmFiaWxpdHkgcG9wcyB1cCBpZiB0aGlzIHZhbHVlIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gLiBJZiB3ZSBoYXZlIGBza2ItXHUwMDNlbGVuIFx1MDAzZT0gRVRIX0hMRU5gLCB0aGVuIGBza2JfcHVsbF9pbmxpbmVgIGdldHMgY2FsbGVkIHdoaWNoIHVsdGltYXRlbHkgY2FsbHMgYF9fc2tiX3B1bGxgLiBIb3dldmVyLCBpZiBgc2tiLVx1MDAzZWxlbiAtIHNrYi1cdTAwM2VkYXRhX2xlbiBcdTAwM2MgRVRIX0hMRU5gLCB0aGVuIGBfX3NrYl9wdWxsYCB0cmlnZ2VycyBhIGBCVUdfT05gIGJlY2F1c2UgdGhlIGxlbmd0aCBjYWxjdWxhdGlvbiBiZWNvbWVzIGludmFsaWQgKGBza2ItXHUwMDNlbGVuYCB3b3VsZCBiZSBsZXNzIHRoYW4gYHNrYi1cdTAwM2VkYXRhX2xlbmAgYWZ0ZXIgdGhlIHN1YnRyYWN0aW9uKS4gU3RhbmRhcmQgZnV6emluZywgc3BlY2lmaWNhbGx5IHN5emthbGxlciAod2l0aG91dCBLTVNBTiksIHNob3VsZCBjYXRjaCB0aGlzIGBCVUdfT05gLlxuXG5CdXQsIHdoYXQgaWYgYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYD8gSW4gdGhpcyBzY2VuYXJpbywgYHNrYl9wdWxsX2lubGluZWAgcmV0dXJucyBgTlVMTGAsIGJ5cGFzc2luZyBgX19za2JfcHVsbGAuIENydWNpYWxseSwgdGhpcyBhdm9pZHMgdGhlIGBCVUdfT05gLiBIZXJlLCBgZXRoX3NrYl9wdWxsX21hY2AgcmV0dXJucyBgc2tiLVx1MDAzZWRhdGFgLCBhbmQgYGV0aF90eXBlX3RyYW5zYCBhdHRlbXB0cyB0byByZWFkIGBldGgtXHUwMDNlaF9wcm90b2AuIFRoZSBrZXkgaXMgdGhhdCBzaW5jZSBgc2tiLVx1MDAzZWxlbiBcdTAwM2MgRVRIX0hMRU5gLCBgZXRoLVx1MDAzZWhfcHJvdG9gIGlzIGJleW9uZCB0aGUgZW5kIG9mIHdoYXQncyBjb25zaWRlcmVkIHRoZSBcInZhbGlkXCIgcGFja2V0IGRhdGEuXG5cbkluaXRpYWxseSwgSSB3YXMgd29ycmllZCBhYm91dCBhbiBvdXQtb2YtYm91bmRzIHJlYWQsIGJ1dCB0aGUgZGF0YSBpcyBzdGlsbCB3aXRoaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIsIGp1c3QgYmV5b25kIHRoZSByZXBvcnRlZCBgc2tiLVx1MDAzZWxlbmAuIEtBU0FOIHdvbid0IGNhdGNoIHRoaXMsIGJlY2F1c2UgaXQncyBub3QgdHJ1bHkgb3V0LW9mLWJvdW5kcy4gSG93ZXZlciwgS01TQU4gKndpbGwqIGNhdGNoIGl0IGJlY2F1c2UgdGhlIG1lbW9yeSBiZXlvbmQgYHNrYi1cdTAwM2VsZW5gIGlzIHVuaW5pdGlhbGl6ZWQuIFRoZSBrZXJuZWwgaXMgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhpcyByZWFkIG9mIHRoZSB1bmluaXRpYWxpemVkIHZhbHVlIGJlY29tZXMgdGhlIGBza2ItXHUwMDNlcHJvdG9jb2xgLiBJdCB0aGVuIGdldHMgdXNlZCBpbiBhIGxhdGVyIHN0ZXAgYW5kIGJlY29tZXMgYSByZXBvcnRhYmxlIEtNU0FOIGlzc3VlLiBUaGlzIHNlZW1zIHRvIGJlIHRoZSBwcmltYXJ5IHdheSB0byBjYXRjaCBpdCBiZWNhdXNlIEtBU0FOIGRvZXNuJ3QgdHJhY2sgdW5pbml0aWFsaXplZCBtZW1vcnksIGFuZCB0aGVyZSdzIG5vIGFjdHVhbCBvdXQtb2YtYm91bmRzIGFjY2Vzcy5cblxuVGhlIGNvbnNlcXVlbmNlcyBjb3VsZCBiZSBpbnRlcmVzdGluZy4gSWYgYGV0aC1cdTAwM2VoX3Byb3RvYCBpcyB1bmluaXRpYWxpemVkLCB0aGUgcGFja2V0IG1pZ2h0IGdldCByb3V0ZWQgdG8gYSByYW5kb20gcHJvdG9jb2wgaGFuZGxlciwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBwYWNrZXQgZHJvcHMgYnkgaGFuZGxlcnMgc3VjaCBhcyBJUHY0IHRoYXQgY2hlY2sgYHBza2JfbWF5X3B1bGxgLiBUaGUgcGFja2V0IGNvdWxkIGJlIGRyb3BwZWQgZHVlIHRvIGFuIGludmFsaWQgaGVhZGVyIGxlbmd0aC4gTm8gbWVtb3J5IGNvcnJ1cHRpb24sIGp1c3QgYSByZWFkIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBidXQgb25seSBLTVNBTiBjYW4gY2F0Y2ggdGhpcy5cblxuTm93LCBsZXQncyByZXZpc2l0IHRoZSBgQlVHX09OYCBzY2VuYXJpby4gSXQncyB0cmlnZ2VyZWQgd2hlbiBgc2tiLVx1MDAzZWxlbiBcdTAwM2U9IEVUSF9ITEVOYCBidXQgYHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOYC4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBhIE1BQyBoZWFkZXIgaXMgc3BsaXQgYWNyb3NzIHRoZSBsaW5lYXIgcGFydCBhbmQgdGhlIGZyYWdtZW50cyBvZiB0aGUgcGFja2V0LiBTeXprYWxsZXIgY2F0Y2hlcyB0aGlzLiBCdXQgaWYgYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYCwgdGhlbiB0aGUgYEJVR19PTmAgaXMgYXZvaWRlZCwgZXhwb3NpbmcgdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUgcHJvcG9zZWQgcGF0Y2ggbWl0aWdhdGVzICpib3RoKiBjYXNlcyBieSBjaGVja2luZyBpZiBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU5gLCBlZmZlY3RpdmVseSBwcmV2ZW50aW5nIGJvdGggdGhlIGBCVUdfT05gIGFuZCB0aGUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZC5cblxuSWYgc3RhbmRhcmQgZnV6emluZyBmb3VuZCB0aGUgaXNzdWUgdmlhIGBCVUdfT05gLCB0aGF0IG1lYW5zIHdlIGRvbid0IG5lY2Vzc2FyaWx5IG5lZWQgS01TQU4uIFdhaXQhIElzIHRoYXQgcmlnaHQ/XG5cblRoZSBwYXRjaCBpdHNlbGYgaW5kaWNhdGVzIHRoaXM6IGBpZiAodW5saWtlbHkoc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU4pKWAuIFRoaXMgd2lsbCB3YXJuLCBhbmQgcmV0dXJuIHplcm8uXG5cblNvLCBpZiBzeXprYWxsZXIgZm91bmQgaXQgYXMgYSBgQlVHX09OYCwgaXQgd291bGQgYmUgcmVwb3J0ZWQgbGlrZSBga2VybmVsIEJVRyBhdCBpbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjI4NDchYCwgd2hpY2ggaXMgaW4gYF9fc2tiX3B1bGxgLiBCdXQgdGhhdCBgQlVHX09OYCBpcyBvbmx5IHRyaWdnZXJlZCBpZiBgc2tiLVx1MDAzZWxlbiBcdTAwM2U9IEVUSF9ITEVOYCBhbmQgYHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOYC4gQ2FuIGEgZGV2aWNlIHJlYWxpc3RpY2FsbHkgKnJlY2VpdmUqIHN1Y2ggYSBwYWNrZXQgYmVmb3JlIGBldGhfdHlwZV90cmFuc2A/XG5cblVzdWFsbHksIGRldmljZXMgcmVjZWl2ZSB0aGUgTUFDIGhlYWRlciBpbiB0aGUgbGluZWFyIHBhcnQuIEhvd2V2ZXIsIGEgdmlydHVhbCBkZXZpY2UgbGlrZSB0dW4vdGFwIG9yIHNvbWUgb3RoZXIgdmlydHVhbCBkZXZpY2UgKmNvdWxkKiBpbmplY3QgYSBwYWNrZXQgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGFuZCBmcmFnbWVudHMsIHRodXMgdHJpZ2dlcmluZyB0aGUgYEJVR19PTmAuXG5cbkNvbnZlcnNlbHksIGlmIGEgZGV2aWNlIGluamVjdHMgYSBwYWNrZXQgd2l0aCBgc2tiLVx1MDAzZWxlbiBcdTAwM2MgRVRIX0hMRU5gIGFuZCBubyBmcmFnbWVudHMsIGl0ICp3b24ndCogdHJpZ2dlciB0aGUgYEJVR19PTmAsIGJ1dCBpdCAqd2lsbCogdHJpZ2dlclxuXG4iLCJJbnB1dFRva2VucyI6MTM1NTQsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjk5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDE6MjQuMzg2OTY4NDIxWiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTk2MDEyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJldGhfdHlwZV90cmFuc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL25ldC90dW4uY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC90dW4uYz0xNjk1PXN0YXRpYyBzc2l6ZV90IHR1bl9nZXRfdXNlcihzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLCBzdHJ1Y3QgdHVuX2ZpbGUgKnRmaWxlLFxcbi0tXFxuZHJpdmVycy9uZXQvdHVuLmMtMTg0OS1cXHRcXHR9XFxuZHJpdmVycy9uZXQvdHVuLmM6MTg1MDpcXHRcXHRza2ItXFx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tXFx1MDAzZWRldik7XFxuZHJpdmVycy9uZXQvdHVuLmMtMTg1MS1cXHRcXHRicmVhaztcXG4tLVxcbmRyaXZlcnMvbmV0L3R1bi5jPTIzODM9c3RhdGljIGludCB0dW5feGRwX29uZShzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLFxcbi0tXFxuZHJpdmVycy9uZXQvdHVuLmMtMjQ3MS1cXG5kcml2ZXJzL25ldC90dW4uYzoyNDcyOlxcdHNrYi1cXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi1cXHUwMDNlZGV2KTtcXG5kcml2ZXJzL25ldC90dW4uYy0yNDczLVxcdHNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMToyNC40NDg5MzM3MDlaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDE2NTI0OTU0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoYXQga2VybmVsIGNvZGU6XG5cbioqQ2hlY2tpbmcgYHR1bl9nZXRfdXNlcmAgZm9yIE1pbmltdW0gRnJhbWUgU2l6ZSBWaW9sYXRpb25zKipcblxuQWxyaWdodCwgSSBuZWVkIHRvIHZlcmlmeSBob3cgYHR1bl9nZXRfdXNlcmAgaW4gYGRyaXZlcnMvbmV0L3R1bi5jYCBoYW5kbGVzIHBhY2tldHMgd2l0aCBsZW5ndGhzIHNob3J0ZXIgdGhhbiB0aGUgc3RhbmRhcmQgRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAoYEVUSF9ITEVOYCkuIEkga25vdyB0aGF0IEV0aGVybmV0IGZyYW1lcyAqbXVzdCogaGF2ZSBhIG1pbmltdW0gc2l6ZSwgYW5kIGlmIHdlJ3JlIHNlZWluZyBhbiBpc3N1ZSwgaXQncyBwb3NzaWJsZSB0aGF0IGB0dW5fZ2V0X3VzZXJgIGlzIGFsbG93aW5nIG9yIG1pc2ludGVycHJldGluZyBzaG9ydCBmcmFtZXMgY29taW5nIGZyb20gdXNlcnNwYWNlLiBJJ2xsIG5lZWQgdG8gbG9vayBjYXJlZnVsbHkgYXQgaG93IHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGJ1ZmZlciBzaXplcywgY29waWVzIGRhdGEsIGFuZCBwZXJmb3JtcyBhbnkgbGVuZ3RoIGNoZWNrcy4gU3BlY2lmaWNhbGx5LCBJJ2xsIGJlIGxvb2tpbmcgZm9yIGNvbXBhcmlzb25zIGFnYWluc3QgYEVUSF9ITEVOYCBvciBvdGhlciBzaXplIGNvbnN0cmFpbnRzLiBJdCdzIGFsc28gaW1wb3J0YW50IHRvIGNvbnNpZGVyIGlmIGFueSBvdGhlciBsYXllcnMgYXJlIHJlbGllZCBvbiB0byBoYW5kbGUgdGhlIHNpemUgY29uc3RyYWludHMuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBubyBleHBsb2l0YWJsZSBjb25kaXRpb24gZXhpc3RzIGR1ZSB0byBhbiB1bmRlcnNpemVkIGZyYW1lIGJlaW5nIHBhc3NlZCB0aHJvdWdoLiBNeSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBhIHZ1bG5lcmFiaWxpdHkgZXhpc3RzIG9yIG5vdCwgYW5kIGhvdyBpdCBjYW4gYmUgbWl0aWdhdGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjUzNywiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjI4LjYxNDE4NTQ4NVoiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzIxNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy9uZXQvdHVuLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTg0MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTg0MDpcXHRcXHRcXHRza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpO1xcbjE4NDE6XFx0XFx0XFx0c2tiLVxcdTAwM2Vwcm90b2NvbCA9IHBpLnByb3RvO1xcbjE4NDI6XFx0XFx0XFx0c2tiLVxcdTAwM2VkZXYgPSB0dW4tXFx1MDAzZWRldjtcXG4xODQzOlxcdFxcdFxcdGJyZWFrO1xcbjE4NDQ6XFx0XFx0Y2FzZSBJRkZfVEFQOlxcbjE4NDU6XFx0XFx0XFx0aWYgKGZyYWdzIFxcdTAwMjZcXHUwMDI2ICFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0hMRU4pKSB7XFxuMTg0NjpcXHRcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbjE4NDc6XFx0XFx0XFx0XFx0ZHJvcF9yZWFzb24gPSBTS0JfRFJPUF9SRUFTT05fSERSX1RSVU5DO1xcbjE4NDg6XFx0XFx0XFx0XFx0Z290byBkcm9wO1xcbjE4NDk6XFx0XFx0XFx0fVxcbjE4NTA6XFx0XFx0XFx0c2tiLVxcdTAwM2Vwcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgdHVuLVxcdTAwM2VkZXYpO1xcbjE4NTE6XFx0XFx0XFx0YnJlYWs7XFxuMTg1MjpcXHRcXHR9XFxuMTg1MzpcXHRcXG4xODU0OlxcdFxcdC8qIGNvcHkgc2tiX3VidWZfaW5mbyBmb3IgY2FsbGJhY2sgd2hlbiBza2IgaGFzIG5vIGVycm9yICovXFxuMTg1NTpcXHRcXHRpZiAoemVyb2NvcHkpIHtcXG4xODU2OlxcdFxcdFxcdHNrYl96Y29weV9pbml0KHNrYiwgbXNnX2NvbnRyb2wpO1xcbjE4NTc6XFx0XFx0fSBlbHNlIGlmIChtc2dfY29udHJvbCkge1xcbjE4NTg6XFx0XFx0XFx0c3RydWN0IHVidWZfaW5mbyAqdWFyZyA9IG1zZ19jb250cm9sO1xcbjE4NTk6XFx0XFx0XFx0dWFyZy1cXHUwMDNlb3BzLVxcdTAwM2Vjb21wbGV0ZShOVUxMLCB1YXJnLCBmYWxzZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjI4LjYxNDMxODg0NVoiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4OTU5OTkyOTc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlZ1bG5lcmFiaWxpdHkgRGlzY292ZXJlZCBpbiBgdHVuX2dldF91c2VyYCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gSSdtIGxvb2tpbmcgYXQgYHR1bl9nZXRfdXNlcmAgYW5kIHNwZWNpZmljYWxseSB0aGlzIHNlY3Rpb246XG5cbmBgYGNcblx0XHRjYXNlIElGRl9UQVA6XG5cdFx0XHRpZiAoZnJhZ3MgXHUwMDI2XHUwMDI2ICFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0hMRU4pKSB7XG5cdFx0XHRcdGVyciA9IC1FTk9NRU07XG5cdFx0XHRcdGRyb3BfcmVhc29uID0gU0tCX0RST1BfUkVBU09OX0hEUl9UUlVOQztcblx0XHRcdFx0Z290byBkcm9wO1xuXHRcdFx0fVxuXHRcdFx0c2tiLVx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tXHUwMDNlZGV2KTtcblx0XHRcdGJyZWFrO1xuYGBgXG5cbkludGVyZXN0aW5nLiBJdCBhcHBlYXJzIHRoYXQgdGhlIGBwc2tiX21heV9wdWxsYCBjaGVjayBpcyAqb25seSogcGVyZm9ybWVkIGlmIHRoZSBgZnJhZ3NgIGZsYWcgaXMgc2V0LiBUaGF0IG1lYW5zLCBpZiBgZnJhZ3NgIGlzIGZhbHNlLCBhbmQgd2UncmUgZGVhbGluZyB3aXRoIGEgbGluZWFyIHNrYiAobWVhbmluZyBubyBmcmFnbWVudGF0aW9uKSwgdGhlcmUncyAqbm8qIGxlbmd0aCBjaGVjayBhZ2FpbnN0IGBFVEhfSExFTmAgKHdoaWNoIGlzIDE0IGJ5dGVzKSBmb3IgdGhlIGluY29taW5nIHBhY2tldC5cblxuU28sIGlmIGEgbWFsaWNpb3VzIHVzZXIgaW5qZWN0cyBhICpsaW5lYXIqIHBhY2tldCB3aXRoIGEgbGVuZ3RoIG9mIGxlc3MgdGhhbiAxNCBieXRlcyBpbnRvIHRoZSBUQVAgaW50ZXJmYWNlLCB0aGUgY29kZSB3aWxsIGhhcHBpbHkgY29udGludWUgYW5kIGNhbGwgYGV0aF90eXBlX3RyYW5zYC4gVGhlIGNyaXRpY2FsIGlzc3VlIGhlcmUgaXMgdGhhdCBzaW5jZSBgc2tiLVx1MDAzZWxlbmAgYW5kIGBza2JfaGVhZGxlbihza2IpYCBhcmUgYm90aCBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgdGhlIGBldGhfdHlwZV90cmFuc2AgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIHJlYWQgYmV5b25kIHRoZSBwcm92aWRlZCBkYXRhIGluIHRoZSBza2IuXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMsIHdpbGwgdGhpcyB0cmlnZ2VyIGEgYEJVR19PTmAgaW4gYHNrYl9wdWxsX2lubGluZWA/IE5vLCBiZWNhdXNlIGBza2JfcHVsbF9pbmxpbmVgIHJldHVybnMgTlVMTCBpZiB5b3UgdHJ5IHRvIHB1bGwgbW9yZSBkYXRhIHRoYW4gYXZhaWxhYmxlIHdoaWNoIHByb3RlY3RzIHRoZSBjb2RlIGZyb20gdGhlIGJ1Zy5cblxuSSB0aGVuIHJlYWxpemVkIHRoYXQgYGV0aF9za2JfcHVsbF9tYWNgIHNpbXBseSByZXR1cm5zIGBza2ItXHUwMDNlZGF0YWAgYW5kIHRoZW4gYGV0aF90eXBlX3RyYW5zYCBhdHRlbXB0cyB0byByZWFkIGBldGgtXHUwMDNlaF9wcm90b2Agd2hpY2ggaXMgdW5pbml0aWFsaXplZCFcblxuQ291bGQgS0FTQU4gY2F0Y2ggdGhpcz8gSSBpbml0aWFsbHkgdGhvdWdodCwgcHJvYmFibHkgbm90LiBUaGUgbGluZWFyIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgYHR1bl9nZXRfdXNlcmAgaXMgdXN1YWxseSBxdWl0ZSBsYXJnZSDigJMgYSBmZXcgaHVuZHJlZCBieXRlcyBhdCBsZWFzdCwgb3IgbWF5YmUgYSBmdWxsIHBhZ2UuIFNvLCBldmVuIGlmIHRoZSB1c2VyIHByb3ZpZGVzIGxlc3MgdGhhbiAxNCBieXRlcywgdGhlIFwiZXh0cmFcIiBieXRlcyB3ZSBhcmUgcmVhZGluZyB3b3VsZCBsaWtlbHkgYmUgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuIEknZCBleHBlY3QgYW55IHJlYWQgYXQgb2Zmc2V0IDEyIHRvIGJlIHdpdGhpbiB0aGUgYnVmZmVyLlxuXG5Ib3dldmVyLCBhZnRlciBhIHNlY29uZCBwYXNzLCBJIHRoaW5rIEtNU0FOIG1pZ2h0IGNhdGNoIHRoaXMhIFRoZSB1c2VyIG9ubHkgcHJvdmlkZWQgYSBzbWFsbCBhbW91bnQgb2YgZGF0YSAobGVzcyB0aGFuIDE0IGJ5dGVzKS4gVGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciBpcyB1bmluaXRpYWxpemVkLiBXZSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciBgdHVuX2FsbG9jX3NrYmAgemVyb2VzIHRoZSBidWZmZXIgKHdoaWNoIHdvdWxkIG1ha2UgdGhpcyBhIHJlYWQgb2YgemVyb2VzIHJhdGhlciB0aGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5KSBidXQgZWl0aGVyIHdheSwgc2luY2UgdGhlIHByb3ZpZGVkIGRhdGEgaXNuJ3QgZW5vdWdoLCB3ZSBhcmUgcmVhZGluZyBvdXQtb2YtYm91bmRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzE4MSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjM3LjU3NDMxNjA2OVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTM1OTkyODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHVuX2FsbG9jX3NrYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL25ldC90dW4uY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC90dW4uYz0xMzkyPXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdHVuX25hcGlfYWxsb2NfZnJhZ3Moc3RydWN0IHR1bl9maWxlICp0ZmlsZSxcXG4tLVxcbmRyaXZlcnMvbmV0L3R1bi5jLTE0NDgtICogbGluZWFyIGlzIGEgaGludCBhcyB0byBob3cgbXVjaCB0byBjb3B5ICh1c3VhbGx5IGhlYWRlcnMpLiAqL1xcbmRyaXZlcnMvbmV0L3R1bi5jOjE0NDk6c3RhdGljIHN0cnVjdCBza19idWZmICp0dW5fYWxsb2Nfc2tiKHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXFxuZHJpdmVycy9uZXQvdHVuLmMtMTQ1MC1cXHRcXHRcXHRcXHQgICAgIHNpemVfdCBwcmVwYWQsIHNpemVfdCBsZW4sXFxuLS1cXG5kcml2ZXJzL25ldC90dW4uYz0xNjk1PXN0YXRpYyBzc2l6ZV90IHR1bl9nZXRfdXNlcihzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLCBzdHJ1Y3QgdHVuX2ZpbGUgKnRmaWxlLFxcbi0tXFxuZHJpdmVycy9uZXQvdHVuLmMtMTc5NS1cXG5kcml2ZXJzL25ldC90dW4uYzoxNzk2OlxcdFxcdFxcdHNrYiA9IHR1bl9hbGxvY19za2IodGZpbGUsIGFsaWduLCBjb3B5bGVuLCBsaW5lYXIsXFxuZHJpdmVycy9uZXQvdHVuLmMtMTc5Ny1cXHRcXHRcXHRcXHRcXHQgICAgbm9ibG9jayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjM3LjYyNzkyMDMxN1oiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MTYzNjQ4NzU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGFzc3VtaW5nIEknbSBkZWVwbHkgZmFtaWxpYXIgd2l0aCBuZXR3b3JraW5nIGFuZCBrZXJuZWwgaW50ZXJuYWxzLCBhbmQgZXNwZWNpYWxseSB0aGUgVFVOL1RBUCBkcml2ZXI6XG5cbioqQ2hlY2tpbmcgYHR1bl9hbGxvY19za2JgKipcblxuUmlnaHQsIGxldCdzIGRpdmUgcmlnaHQgaW4uIFRoZSBwaHJhc2UgXCJMZXQncyBjaGVjayBgdHVuX2FsbG9jX3NrYmBcIiBpbW1lZGlhdGVseSBzaWduYWxzIGEgc3BlY2lmaWMgYXJlYSBvZiBpbnRlcmVzdDogdGhlIGFsbG9jYXRpb24gb2YgU0tCcyAoU29ja2V0IEJ1ZmZlcnMpIHdpdGhpbiB0aGUgVFVOIGRyaXZlci4gVGhpcyBpcyBhIGNyaXRpY2FsIHBvaW50LiBgdHVuX2FsbG9jX3NrYmAgaXMgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbWVtb3J5IHN0cnVjdHVyZXMgdGhhdCB3aWxsIGhvbGQgdGhlIG5ldHdvcmsgcGFja2V0cyBiZWluZyBzZW50IHRvIGFuZCByZWNlaXZlZCBmcm9tIHRoZSB1c2VyLXNwYWNlIGFwcGxpY2F0aW9uIHZpYSB0aGUgVFVOIGludGVyZmFjZS4gQSBkZWVwIHVuZGVyc3RhbmRpbmcgb2YgdGhpcyBpcyBwYXJhbW91bnQgd2hlbiBkZWFsaW5nIHdpdGggbmV0d29yayBwZXJmb3JtYW5jZSwgcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgb3IgYW55IG9kZCBiZWhhdmlvciBpbiBhIFRVTi1iYXNlZCBzZXR1cC5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHRzIGFyZSwgd2hlcmUgZXhhY3RseSBkbyBJIHdhbnQgdG8gXCJjaGVja1wiIHRoaXMgZnVuY3Rpb24/IElzIHRoaXMgYWJvdXQgdGhlIGltcGxlbWVudGF0aW9uIGl0c2VsZj8gUGVyaGFwcyBJJ20gbG9va2luZyBhdCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgd2l0aGluIHRoYXQgZnVuY3Rpb24uIEFyZSB0aGVyZSBhbnkgY29udGVudGlvbiBpc3N1ZXM/IERvIEkgd2FudCB0byBjaGVjayBpdHMgaW50ZXJhY3Rpb24gd2l0aCBvdGhlciBrZXJuZWwgY29tcG9uZW50cyBzdWNoIGFzIERNQSBvciBOVU1BPyBJcyB0aGVyZSBhIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWd5IEkgc2hvdWxkIGV4YW1pbmUgY2xvc2VseSBmb3IgcG9zc2libGUgaW1wcm92ZW1lbnRzIG9yIG1pc2NvbmZpZ3VyYXRpb25zP1xuXG5JIHByb2JhYmx5IGhhdmUgYSBzcGVjaWZpYyBjb25jZXJuIGluIG1pbmQuIElzIHRoZXJlIGEgcGVyZm9ybWFuY2UgcHJvYmxlbSB3aXRoIGEgcGFydGljdWxhciB3b3JrbG9hZD8gQXJlIHBhY2tldHMgYmVpbmcgZHJvcHBlZD8gQXJlIHRoZXJlIGFueSByZXBvcnRzIG9mIG1lbW9yeSBsZWFrcz8gSXMgaXQgYWJvdXQgb3ZlcmFsbCB0aHJvdWdocHV0LCBsYXRlbmN5LCBvciBzcGVjaWZpYyBlcnJvciBtZXNzYWdlcyByZWxhdGVkIHRvIGJ1ZmZlciBhbGxvY2F0aW9uPyBUaGUgY29udGV4dCBvZiB0aGUgY2hlY2sgd291bGQgaW5mbHVlbmNlIHdoZXJlIHRvIGJlZ2luIHRoZSBpbnNwZWN0aW9uLiBJJ2QgbmVlZCB0byBjb25zaWRlciB0aGUgc3lzdGVtJ3MgaGFyZHdhcmUgY29uZmlndXJhdGlvbiwgdGhlIHVzZXItc3BhY2UgYXBwbGljYXRpb24sIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgZmFjdG9ycyB0byBmb3JtdWxhdGUgYSB1c2VmdWwgaHlwb3RoZXNpcyBhYm91dCBgdHVuX2FsbG9jX3NrYmAuXG5cblVsdGltYXRlbHksIGl0IHdvdWxkIGRlcGVuZCBvbiB3aGVyZSBJIHdvdWxkIGxpa2UgdG8gbG9vaywgYmUgaXQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWd5LCBidWZmZXIgYWxpZ25tZW50IGlzc3Vlcywgb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gZGF0YSBzdHJ1Y3R1cmVzLiBXaGF0ZXZlciB0aGUgY29uY2VybiwgYHR1bl9hbGxvY19za2JgIGlzIHRoZSBwbGFjZSB0byBzdGFydC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg1MTUsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMTo0NC43OTE1NzI1MjVaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE5MTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvbmV0L3R1bi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE0NDksXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE0NDk6XFx0c3RhdGljIHN0cnVjdCBza19idWZmICp0dW5fYWxsb2Nfc2tiKHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXFxuMTQ1MDpcXHRcXHRcXHRcXHRcXHQgICAgIHNpemVfdCBwcmVwYWQsIHNpemVfdCBsZW4sXFxuMTQ1MTpcXHRcXHRcXHRcXHRcXHQgICAgIHNpemVfdCBsaW5lYXIsIGludCBub2Jsb2NrKVxcbjE0NTI6XFx0e1xcbjE0NTM6XFx0XFx0c3RydWN0IHNvY2sgKnNrID0gdGZpbGUtXFx1MDAzZXNvY2tldC5zaztcXG4xNDU0OlxcdFxcdHN0cnVjdCBza19idWZmICpza2I7XFxuMTQ1NTpcXHRcXHRpbnQgZXJyO1xcbjE0NTY6XFx0XFxuMTQ1NzpcXHRcXHQvKiBVbmRlciBhIHBhZ2U/ICBEb24ndCBib3RoZXIgd2l0aCBwYWdlZCBza2IuICovXFxuMTQ1ODpcXHRcXHRpZiAocHJlcGFkICsgbGVuIFxcdTAwM2MgUEFHRV9TSVpFKVxcbjE0NTk6XFx0XFx0XFx0bGluZWFyID0gbGVuO1xcbjE0NjA6XFx0XFxuMTQ2MTpcXHRcXHRpZiAobGVuIC0gbGluZWFyIFxcdTAwM2UgTUFYX1NLQl9GUkFHUyAqIChQQUdFX1NJWkUgXFx1MDAzY1xcdTAwM2MgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpKVxcbjE0NjI6XFx0XFx0XFx0bGluZWFyID0gbGVuIC0gTUFYX1NLQl9GUkFHUyAqIChQQUdFX1NJWkUgXFx1MDAzY1xcdTAwM2MgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpO1xcbjE0NjM6XFx0XFx0c2tiID0gc29ja19hbGxvY19zZW5kX3Bza2Ioc2ssIHByZXBhZCArIGxpbmVhciwgbGVuIC0gbGluZWFyLCBub2Jsb2NrLFxcbjE0NjQ6XFx0XFx0XFx0XFx0XFx0ICAgXFx1MDAyNmVyciwgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpO1xcbjE0NjU6XFx0XFx0aWYgKCFza2IpXFxuMTQ2NjpcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xcbjE0Njc6XFx0XFxuMTQ2ODpcXHRcXHRza2JfcmVzZXJ2ZShza2IsIHByZXBhZCk7XFxuMTQ2OTpcXHRcXHRza2JfcHV0KHNrYiwgbGluZWFyKTtcXG4xNDcwOlxcdFxcdHNrYi1cXHUwMDNlZGF0YV9sZW4gPSBsZW4gLSBsaW5lYXI7XFxuMTQ3MTpcXHRcXHRza2ItXFx1MDAzZWxlbiArPSBsZW4gLSBsaW5lYXI7XFxuMTQ3MjpcXHRcXG4xNDczOlxcdFxcdHJldHVybiBza2I7XFxuMTQ3NDpcXHR9XFxuMTQ3NTpcXHRcXG4xNDc2OlxcdHN0YXRpYyB2b2lkIHR1bl9yeF9iYXRjaGVkKHN0cnVjdCB0dW5fc3RydWN0ICp0dW4sIHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXFxuMTQ3NzpcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbW9yZSlcXG4xNDc4OlxcdHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDE6NDQuNzkxODE5NzA1WiIsIlNlcSI6NDEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgyMDY0MTQ1NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtNU0FOIEJ1ZyoqXG5cbk9rYXksIHNvIGhlcmUncyB3aGF0IEknbSB0aGlua2luZy4gVGhpcyBgc29ja19hbGxvY19zZW5kX3Bza2JgIGZ1bmN0aW9uIGlzIGFsbG9jYXRpbmcgdGhlIHNvY2tldCBidWZmZXIgKHNrYiksIGJ1dCBpdCAqZG9lc24ndCogemVybyBvdXQgdGhlIGRhdGEgYnVmZmVyLiBUaGF0IG1lYW5zIGV2ZXJ5dGhpbmcgYmV5b25kIHRoZSBpbml0aWFsICdsaW5lYXInIGRhdGEsIHdoaWNoIGlzIG91ciAnbGVuJywgaXMganVzdCB1bmluaXRpYWxpemVkIG1lbW9yeS4gTm93LCBgdHVuX2dldF91c2VyYCB0aGVuIGNvcGllcyAnbGVuJyBieXRlcyBmcm9tIHVzZXIgc3BhY2UgaW50byB0aGlzIGJ1ZmZlci4gVGhlIGJ5dGVzIGJleW9uZCAnbGVuJyAqcmVtYWluKiB1bmluaXRpYWxpemVkLiBUaGF0J3MgdGhlIGtleS5cblxuVGhlbiwgd2UgaGF2ZSBgZXRoX3R5cGVfdHJhbnNgIHJlYWRpbmcgYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIElmIG91ciAnbGVuJyBpcyBsZXNzIHRoYW4gMTQgYnl0ZXMsIGl0J3MgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSEgVGhpcyAqc2NyZWFtcyogS01TQU4gYnVnLCBhIGNsYXNzaWMgb25lLlxuXG5XYWl0LCBkaWQgc3l6a2FsbGVyIGFjdHVhbGx5IGZpbmQgdGhpcyBvbmUgd2l0aCBLQVNBTj8gSWYgS0FTQU4gaXNuJ3QgY2F0Y2hpbmcgaXQsIGFuZCB0aGF0IGBCVUdfT05gIGlzbid0IGZpcmluZywgdGhlbiB0aGUgb25seSB3YXkgc3l6a2FsbGVyIHdvdWxkIGhhdmUgZm91bmQgaXQgd291bGQgYmUgdGhyb3VnaCBLTVNBTi4gVGhhdCdzIGludGVyZXN0aW5nLlxuXG5Ob3csIHdhaXQsIHdoYXQgaWYgYGZyYWdzYCBpcyB0cnVlPyBJZiBgZnJhZ3NgIGlzIHRydWUsIHRoZW4gYHR1bl9nZXRfdXNlcmAgY2FsbHMgYHBza2JfbWF5X3B1bGwoc2tiLCBFVEhfSExFTilgLiBJZiB0aGF0IGZhaWxzLCB0aGUgcGFja2V0IGdldHMgZHJvcHBlZCwgbm8gaGFybS4gSWYgaXQgKnN1Y2NlZWRzKiwgd2Uga25vdyB0aGF0IGBza2ItXHUwMDNlbGVuIFx1MDAzZT0gRVRIX0hMRU5gIGFuZCBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2U9IEVUSF9ITEVOYC4gU28sIGV2ZW4gaWYgYGZyYWdzYCBpcyB0cnVlLCB0aGUgYEJVR19PTmAgaXNuJ3QgdHJpZ2dlcmVkIGluIGB0dW5fZ2V0X3VzZXJgIVxuXG5XYWl0LCB3YWl0LiBJZiBgZnJhZ3NgIGlzIHRydWUsIGBwc2tiX21heV9wdWxsYCBlbnN1cmVzIGBza2JfaGVhZGxlbihza2IpIFx1MDAzZT0gRVRIX0hMRU5gLiBUaGF0J3MgdGhlIHJlYWwgcG9pbnQuIFNvIGBCVUdfT05gIGlzIG5ldmVyIHRyaWdnZXJlZCBmcm9tIGB0dW5fZ2V0X3VzZXJgLlxuXG5Pa2F5LCBpcyB0aGVyZSBhbm90aGVyIGNhbGxlciBvZiBgZXRoX3R5cGVfdHJhbnNgIHRoYXQgY291bGQgYmUgdHJpZ2dlcmVkIHRoaXMgd2F5PyBXaGF0IGFib3V0IGBwYWNrZXRfc25kYCBpbiBgbmV0L3BhY2tldC9hZl9wYWNrZXQuY2A/IFRoYXQgc2VlbXMgbGlrZSBhIGxvZ2ljYWwgbmV4dCBzdGVwIHRvIGV4YW1pbmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NDcyLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzkzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDE6NTIuOTk4MjM3NTMxWiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDA3NDY0ODcsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV0aF90eXBlX3RyYW5zXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9wYWNrZXQvYWZfcGFja2V0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjUzLjA5ODk5MzQ3OFoiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NTM4MzQ0ODY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBzZWUuIE15IG1pbmQgaXMganVtcGluZyBhcm91bmQgYSBiaXQgaGVyZSwgdHJ5aW5nIHRvIHBpZWNlIHRoaXMgdG9nZXRoZXIuLi5cblxuKipJbnZlc3RpZ2F0aW5nIFBhY2tldCBSZWNlcHRpb24gRmxvdyoqXG5cbkhvbGQgb24gYSBzZWNvbmQuLi4gSSB3YXMgdW5kZXIgdGhlIGltcHJlc3Npb24gdGhhdCBgcGFja2V0X3NuZGAgd2FzIHRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGZvciBvdXRib3VuZCBwYWNrZXQgcHJvY2Vzc2luZywgYnV0IG5vdyBpdCBvY2N1cnMgdG8gbWUgdGhhdCBpdCAqKmRvZXNuJ3QqKiBhY3R1YWxseSBjYWxsIGBldGhfdHlwZV90cmFuc2AgZGlyZWN0bHksIHdoaWNoIGlzIHdoZXJlIHRoZSBFdGhlcm5ldCB0eXBlIGRldGVybWluYXRpb24gdXN1YWxseSBoYXBwZW5zLiBUaGF0J3MgYSBrZXkgcGllY2UgbWlzc2luZyBmcm9tIG15IG1lbnRhbCBtb2RlbCEgV2hlcmUgKmRvZXMqIHRoYXQgaGFwcGVuIGluIHRoZSB0eXBpY2FsIHBhdGg/XG5cbkFscmlnaHQsIGxldCdzIGJhY2sgdXAgYW5kIHJldGhpbmsgdGhpcy4gTWF5YmUgaXQncyBub3QgdGhlIHRyYW5zbWlzc2lvbiBzaWRlIEkgbmVlZCB0byBmb2N1cyBvbiByaWdodCBub3cuIFBlcmhhcHMgbXkgYXR0ZW50aW9uIHNob3VsZCBzaGlmdCB0byB0aGUgdmlydHVhbCBuZXR3b3JrIGRldmljZSBzaWRlIGZvciByZWNlcHRpb24uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB3aGF0IGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGluY29taW5nIHBhY2tldCBwcm9jZXNzaW5nLiBJJ20gZ29pbmcgdG8gbG9vayBhdCBgZHJpdmVycy9uZXQvdmlydGlvX25ldC5jYCwgc3BlY2lmaWNhbGx5IGB2aXJ0bmV0X3JlY2VpdmVgLiBJdCBmZWVscyBsaWtlIHRoYXQncyB0aGUgbW9yZSByZWxldmFudCBhcmVhIGdpdmVuIHRoZSBmbG93IG9mIHRyYWZmaWMgSSdtIGV4cGVjdGluZy4gSG9wZWZ1bGx5LCBgdmlydG5ldF9yZWNlaXZlYCBpcyB3aGVyZSB0aGUgcGFja2V0IHR5cGUgaXMgZGV0ZXJtaW5lZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAzOTQsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMTo1Ny42MzczNDE2MDNaIiwiU2VxIjo0NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY4OTQ4NzA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV0aF90eXBlX3RyYW5zXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjAzMD1zdGF0aWMgdm9pZCBtZXJnZWFibGVfYnVmX2ZyZWUoc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLCBpbnQgbnVtX2J1ZixcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMDU2LSAqICAyLiB4ZHBfYnVpbGRfc2tiX2Zyb21fZnJhbWUoKSBkb2VzIG1vcmUgY2hlY2tzIHRoYXQgd2UgZG9uJ3QgbmVlZCxcXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM6MjA1NzogKiAgICAgbGlrZSBldGhfdHlwZV90cmFucygpICh3aGljaCB2aXJ0aW8tbmV0IGRvZXMgaW4gcmVjZWl2ZV9idWYoKSkuXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTIwNTgtICovXFxuLS1cXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjUwMD1zdGF0aWMgdm9pZCB2aXJ0bmV0X3JlY2VpdmVfZG9uZShzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSwgc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLFxcbi0tXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTI1MjgtXFx0c2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHZxMnJ4cShycS1cXHUwMDNldnEpKTtcXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM6MjUyOTpcXHRza2ItXFx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpO1xcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNTMwLVxcdHByX2RlYnVnKFxcXCJSZWNlaXZpbmcgc2tiIHByb3RvIDB4JTA0eCBsZW4gJWkgdHlwZSAlaVxcXFxuXFxcIixcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDE6NTcuNzA2Mjk2NjUxWiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5MzYyODI5NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZTpcblxuKipDaGVja2luZyB0aGUgRm91bmRhdGlvbjogUmVjZWl2ZSBDb21wbGV0aW9uIEluZGljYXRvcnMqKlxuXG5SaWdodCwgYmVmb3JlIGRpdmluZyBkZWVwZXIsIEkgbmVlZCB0byBtYWtlIHN1cmUgSSdtIGdyb3VuZGVkLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIHRoZSBmdW5kYW1lbnRhbCBpbmRpY2F0b3JzIG9mIHJlY2VpdmUgY29tcGxldGlvbi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgdHdvIGNyaXRpY2FsIGVsZW1lbnRzIHRoYXQgbGlrZWx5IHNpZ25hbCB3aGV0aGVyIGEgcmVjZWl2ZSBvcGVyYXRpb24gaGFzIGZpbmFsaXplZC4gVGhpcyBjb3VsZCBiZSBjaGVja2luZyB0aGUgc3RhdGUgb2YgYSBkYXRhIGJ1ZmZlciAoYHJlY2VpdmVfYnVmYCkgaXRzZWxmLiBPciBhIGRlZGljYXRlZCBmbGFnIG9yIHZhcmlhYmxlIGluZGljYXRpbmcgdGhhdCBhIHJlY2VwdGlvbiBpcyBgdmlydG5ldF9yZWNlaXZlX2RvbmVgLiBFc3NlbnRpYWxseSBJIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGlmIHRoZSByZWNlaXZlciBpcyBmaW5pc2hlZCBmb3IgYSBuZXcgaW5jb21pbmcgZGF0YS4gV2l0aG91dCBjb25maXJtaW5nIGVpdGhlciB0aGUgYnVmZmVyIHN0YXR1cyBvciByZWNlcHRpb24gc3RhdHVzLCB0aGVyZSdzIG5vIHNlbnNlIGluIHByb2NlZWRpbmcgd2l0aCBhbnkgZGVlcGVyIGFuYWx5c2lzIG9mIHRoZSBuZXR3b3JrIGludGVyYWN0aW9uLiBUaGlzIHByZWxpbWluYXJ5IHN0ZXAgaXMgY3J1Y2lhbCB0byBhdm9pZCBjaGFzaW5nIGdob3N0cyBvciBkcmF3aW5nIGNvbmNsdXNpb25zIGJhc2VkIG9uIGluY29tcGxldGUgZGF0YS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEwMTgsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjowMS42NDI1ODM0NTRaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzI3OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTE1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNTE1OlxcdFxcdFxcdGdvdG8gZnJhbWVfZXJyO1xcbjI1MTY6XFx0XFx0fVxcbjI1MTc6XFx0XFxuMjUxODpcXHRcXHRpZiAodmlydGlvX25ldF9oZHJfdG5sX3RvX3NrYihza2IsIFxcdTAwMjZoZHItXFx1MDAzZXRubF9oZHIsIHZpLVxcdTAwM2VyeF90bmwsXFxuMjUxOTpcXHRcXHRcXHRcXHRcXHQgICAgICB2aS1cXHUwMDNlcnhfdG5sX2NzdW0sXFxuMjUyMDpcXHRcXHRcXHRcXHRcXHQgICAgICB2aXJ0aW9faXNfbGl0dGxlX2VuZGlhbih2aS1cXHUwMDNldmRldikpKSB7XFxuMjUyMTpcXHRcXHRcXHRuZXRfd2Fybl9yYXRlbGltaXRlZChcXFwiJXM6IGJhZCBnc286IHR5cGU6ICV4LCBzaXplOiAldSwgZmxhZ3MgJXggdHVubmVsICVkIHRubCBjc3VtICVkXFxcXG5cXFwiLFxcbjI1MjI6XFx0XFx0XFx0XFx0XFx0ICAgICBkZXYtXFx1MDAzZW5hbWUsIGhkci1cXHUwMDNlaGRyLmdzb190eXBlLFxcbjI1MjM6XFx0XFx0XFx0XFx0XFx0ICAgICBoZHItXFx1MDAzZWhkci5nc29fc2l6ZSwgaGRyLVxcdTAwM2VoZHIuZmxhZ3MsXFxuMjUyNDpcXHRcXHRcXHRcXHRcXHQgICAgIHZpLVxcdTAwM2VyeF90bmwsIHZpLVxcdTAwM2VyeF90bmxfY3N1bSk7XFxuMjUyNTpcXHRcXHRcXHRnb3RvIGZyYW1lX2VycjtcXG4yNTI2OlxcdFxcdH1cXG4yNTI3OlxcdFxcbjI1Mjg6XFx0XFx0c2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHZxMnJ4cShycS1cXHUwMDNldnEpKTtcXG4yNTI5OlxcdFxcdHNrYi1cXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7XFxuMjUzMDpcXHRcXHRwcl9kZWJ1ZyhcXFwiUmVjZWl2aW5nIHNrYiBwcm90byAweCUwNHggbGVuICVpIHR5cGUgJWlcXFxcblxcXCIsXFxuMjUzMTpcXHRcXHRcXHQgbnRvaHMoc2tiLVxcdTAwM2Vwcm90b2NvbCksIHNrYi1cXHUwMDNlbGVuLCBza2ItXFx1MDAzZXBrdF90eXBlKTtcXG4yNTMyOlxcdFxcbjI1MzM6XFx0XFx0bmFwaV9ncm9fcmVjZWl2ZShcXHUwMDI2cnEtXFx1MDAzZW5hcGksIHNrYik7XFxuMjUzNDpcXHRcXHRyZXR1cm47XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAyOjAxLjY0MjkxNDkxNFoiLCJTZXEiOjQ3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NTExMzExMzQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFZpcnRpby1OZXQgUGFja2V0IFZ1bG5lcmFiaWxpdHkqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyB2aXJ0aW8tbmV0IGhhbmRsZXMgaW5jb21pbmcgcGFja2V0cywgc3BlY2lmaWNhbGx5IHRob3NlIHRoYXQgbWlnaHQgYmUgbWFsZm9ybWVkLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gdmlydGlvLW5ldCBnZXRzIGEgcGFja2V0IHNob3J0ZXIgdGhhbiAxNCBieXRlcy4gSXQganVtcHMgdG8gYGV0aF90eXBlX3RyYW5zYCwgcmlnaHQ/IFRoZSBxdWVzdGlvbiBpcywgd2lsbCB0aGF0IHRyaWdnZXIgYSBgQlVHX09OYD8gSSdtIHRyeWluZyB0byBiZSB2ZXJ5IHByZWNpc2UgaGVyZSBhbmQgYXZvaWQgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuXG5cbkknbSBjb25zaWRlcmluZyBhIGxpbmVhciBwYWNrZXQgbm93LiBJZiB0aGUgcGFja2V0IGlzIGxpbmVhciwgSSB0aGluayBpdCdzIGxpa2VseSB0aGF0IGBza2ItXHUwMDNlbGVuYCB3b3VsZCBiZSBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgd2hpY2ggaXMgMTQuIEFsc28gYHNrYl9oZWFkbGVuKHNrYilgIHdpbGwgYmUgbGVzcyB0aGFuIGBFVEhfSExFTmAuIFNvLCBpbiB0aGlzIHNjZW5hcmlvLCBJJ20gcHJldHR5IHN1cmUgdGhhdCBpdCB3b24ndCB0cmlnZ2VyIGEgYEJVR19PTmAuIEhvd2V2ZXIsIGl0IFdJTEwgbGVhZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB3aGljaCBpcyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIG5lZWQgdG8ga2VlcCBpbiBtaW5kLlxuXG5Ob3cgSSdtIGZvY3VzaW5nIG9uIGZyYWdtZW50ZWQgcGFja2V0cy4gV2l0aCBmcmFnbWVudGF0aW9uLCBgcmVjZWl2ZV9tZXJnZWFibGVgIGNvbWVzIGludG8gcGxheS4gQ291bGQgYHJlY2VpdmVfbWVyZ2VhYmxlYCBwb3NzaWJseSBidWlsZCBhbiBza2Igd2hlcmUgYHNrYi1cdTAwM2VsZW5gIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgRVRIX0hMRU5gIGJ1dCBgc2tiX2hlYWRsZW4oc2tiKWAgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmA/IFRoYXQgc2VlbXMgbGlrZSBhIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5LiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhhdCBmdW5jdGlvbiB0byBtYWtlIHN1cmUgaXQncyBoYW5kbGVkLiBTbywgdGhhdCdzIHdoYXQgSSdtIGdvaW5nIHRvIGxvb2sgYXQgbmV4dCDigJMgY2FuIHRoaXMgZnVuY3Rpb24gY3JlYXRlIHRoaXMgY29uZGl0aW9uP1xuXG5cbiIsIklucHV0VG9rZW5zIjoyMTY3MCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAyOjA3LjE1NDIyOTI2WiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NzY5Mzg4OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJyZWNlaXZlX21lcmdlYWJsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL25ldC92aXJ0aW9fbmV0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9uZXQvdmlydGlvX25ldC5jPTIxODY9c3RhdGljIHZvaWQgKm1lcmdlYWJsZV94ZHBfZ2V0X2J1ZihzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMjYzLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYzoyMjY0OnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcmVjZWl2ZV9tZXJnZWFibGVfeGRwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTIyNjUtXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYz0yMzI2PXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdmlydG5ldF9za2JfYXBwZW5kX2ZyYWcoc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLFxcbi0tXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTIzNzUtXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jOjIzNzY6c3RhdGljIHN0cnVjdCBza19idWZmICpyZWNlaXZlX21lcmdlYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMzc3LVxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNDA1LVxcdFxcdGlmICh4ZHBfcHJvZykge1xcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYzoyNDA2OlxcdFxcdFxcdGhlYWRfc2tiID0gcmVjZWl2ZV9tZXJnZWFibGVfeGRwKGRldiwgdmksIHJxLCB4ZHBfcHJvZywgYnVmLCBjdHgsXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTI0MDctXFx0XFx0XFx0XFx0XFx0XFx0XFx0IGxlbiwgeGRwX3htaXQsIHN0YXRzKTtcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYz0yNTQxPXN0YXRpYyB2b2lkIHJlY2VpdmVfYnVmKHN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpLCBzdHJ1Y3QgcmVjZWl2ZV9xdWV1ZSAqcnEsXFxuLS1cXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjU3Ny1cXHRcXHRmbGFncyA9ICgoc3RydWN0IHZpcnRpb19uZXRfY29tbW9uX2hkciAqKWJ1ZiktXFx1MDAzZWhkci5mbGFncztcXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM6MjU3ODpcXHRcXHRza2IgPSByZWNlaXZlX21lcmdlYWJsZShkZXYsIHZpLCBycSwgYnVmLCBjdHgsIGxlbiwgeGRwX3htaXQsXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTI1NzktXFx0XFx0XFx0XFx0XFx0c3RhdHMpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjowNy4yMjE5MjczNjhaIiwiU2VxIjo0OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjA0MTUxMTcyMjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBJbXBsaWNhdGlvbnMgb2YgYSBOZXR3b3JrIFBhY2tldCBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgc28gaGVyZSdzIHRoZSBzaXR1YXRpb24gYXMgSSBzZWUgaXQuIEl0IGxvb2tzIGxpa2Ugd2l0aCB2aXJ0aW8tbmV0LCBpZiBhIHBhY2tldCBhcnJpdmVzIGZyYWdtZW50ZWQgYW5kIHRoZSBmaXJzdCBidWZmZXIgaXMgdGlueSwgdGhlbiBgcmVjZWl2ZV9tZXJnZWFibGVgIGJ1aWxkcyBhbiBTS0Igd2hlcmUgdGhlIGhlYWRlciBpcyBzbWFsbCwgYnV0IHRoZSB0b3RhbCBsZW5ndGggaXMgbGFyZ2VyLiAgVGhpcyB0aGVuIGdldHMgcGFzc2VkIHRvIGBldGhfdHlwZV90cmFuc2AuIFRoZSBwcm9ibGVtIHN1cmZhY2VzIHdoZW4gYHNrYl9wdWxsX2lubGluZWAgY2FsbHMgYF9fc2tiX3B1bGxgLiAgYF9fc2tiX3B1bGxgIHN1YnRyYWN0cyB0aGUgRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCBmcm9tIGBza2ItXHUwMDNlbGVuYC4gIElmIHRoZSBoZWFkZXIgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5pdGlhbCBsaW5lYXIgZGF0YSwgd2UgaGl0IGEgYEJVR19PTmAgYmVjYXVzZSB0aGUgbmV3IGBza2ItXHUwMDNlbGVuYCB3b3VsZCBiZSBsZXNzIHRoYW4gYHNrYi1cdTAwM2VkYXRhX2xlbmAsIGluZGljYXRpbmcgdGhlIHBhY2tldCdzIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gaXRzIGRhdGEuXG5cbk5vdywgc3l6a2FsbGVyICpjYW4qIGZpbmQgdGhpcyBgQlVHX09OYCBzY2VuYXJpbyB3aXRob3V0IEtNU0FOLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gQnV0LCBJIHNlZSB0aGF0IGEgcGF0Y2ggZXhpc3RzIHdoaWNoIGNoZWNrcyBgc2tiX2hlYWRsZW4oc2tiKWAgYWdhaW5zdCBgRVRIX0hMRU5gLCBwcmV2ZW50aW5nIGJvdGggdGhlIGBCVUdfT05gIHdoZW4gYHNrYi1cdTAwM2VsZW4gXHUwMDNlPSBFVEhfSExFTmAgYW5kIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHdoZW4gYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYC5cblxuU28gdGhlIHF1ZXN0aW9uIGlzLCBkaWQgc3l6a2FsbGVyIGRpc2NvdmVyIHRoZSBgQlVHX09OYCBvciB0aGUgS01TQU4gaXNzdWU/IElmIGl0IHdhcyB0aGUgYEJVR19PTmAsIHdlIGRvbid0ICpzdHJpY3RseSogbmVlZCBLTVNBTiwgcmlnaHQ/IFN0YW5kYXJkIGZ1enppbmcgdG9vbHMgd291bGQgbGlrZWx5IGNhdGNoIHRoYXQuIEJ1dCwgd2FpdCwgaXMgdGhlcmUgYSBjYXNlIHdoZXJlIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAgaXMgdGhlICpvbmx5KiB3YXkgdG8gdHJpZ2dlciBhIGJ1Zz8gQWgsIHllcyEgSWYgYSBkZXZpY2Ugb25seSBoYW5kbGVzIGxpbmVhciBwYWNrZXRzLCB0aGF0IGNvbmRpdGlvbiBpcyB0aGUgKm9ubHkqIHdheS5cblxuVGFrZSBgdHVuX2dldF91c2VyYCB3aXRoIGBJRkZfVEFQYCBhbmQgYGZyYWdzID09IGZhbHNlYCBmb3IgZXhhbXBsZSwgd2hpY2ggY3JlYXRlcyBhIGxpbmVhciBTS0Igd2l0aCBgc2tiLVx1MDAzZWxlbiBcdTAwM2MgRVRIX0hMRU5gLiAgTm8gYEJVR19PTmAgaGVyZS4gSXQgY2FsbHMgYGV0aF90eXBlX3RyYW5zYCBhbmQgcHJvY2VlZHMgdG8gcmVhZCB1bmluaXRpYWxpemVkIG1lbW9yeS4gS01TQU4gY2F0Y2hlcyB0aGF0LiBTeXprYWxsZXIsIHdpdGhvdXQgS01TQU4sIHdvbid0IGZpbmQgKnRoYXQqIGJ1ZyBiZWNhdXNlIGl0IG1pZ2h0IGJyYW5jaCBvbiB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZSwgYnV0IG5vIGNyYXNoLiBCdXQsIGlmIGBldGhfdHlwZV90cmFuc2AgaXMgY29tbW9uLCBhbmQgdGhlIGZ1enplciBmb3VuZCBhIGBCVUdfT05gIHRocm91Z2ggdmlydGlvLW5ldCBvciBhbm90aGVyIGRyaXZlciBjcmVhdGluZyBmcmFnbWVudGVkIFNLQnMgd2l0aCBzaG9ydCBsaW5lYXIgcGFydHMsIHRoZW4gaXQgZXNzZW50aWFsbHkgZm91bmQgdGhlIHVuZGVybHlpbmcgdnVsbmVyYWJpbGl0eSB0aHJvdWdoIGFub3RoZXIgZHJpdmVyLCBhbmQgd2UgZG9uJ3QgbmVlZCBLTVNBTiB0byBmaW5kIHRoYXQuXG5cbk9rYXksIGJhY2sgdG8gYHR1bl9nZXRfdXNlcmAuIElmIGBmcmFncyA9PSB0cnVlYCwgaXQgKmRvZXMqIGNoZWNrIGBwc2tiX21heV9wdWxsYCwgc28gd2UncmUgc2FmZSB0aGVyZS4gQnV0IHdpdGggYGZyYWdzID09IGZhbHNlYCwgaXQgY3JlYXRlcyBhIGxpbmVhciBTS0IsIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAsIGNhbGxzIGBldGhfdHlwZV90cmFuc2AsIGFuZCB0aGUgYnVnIGlzIHRoYXQgdGhlIHN5c3RlbSBub3cgcmVhZHMgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoaXMgKm9ubHkqIGdldHMgY2F1Z2h0IGJ5IEtNU0FOLCB3aGljaCBpcyBpbXBvcnRhbnQuXG5cbkFyZSB0aGVyZSBvdGhlciBkcml2ZXJzIGF0IHJpc2s/IE1hbnkgZHJpdmVycyBhc3N1bWUgcGFja2V0cyBzbWFsbGVyIHRoYW4gMTQgYnl0ZXMgYXJlIGRyb3BwZWQuIFZpcnR1YWwgZHJpdmVycyBsaWtlIGB2ZXRoYCwgYGxvb3BiYWNrYCwgYW5kIGB3aXJlZ3VhcmRgICptaWdodCogbm90LiBUaGUgcGF0Y2ggZml4ZXMgdGhpcy4gU28sIGlmIGEgZHJpdmVyIGNyZWF0ZXMgYSBsaW5lYXIgU0tCIHdpdGggYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYCwgS01TQU4gY2F0Y2hlcyBpdC4gRnJhZ21lbnRlZCBTS0JzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydD8gYEJVR19PTmAuXG5cblRoZSBjb3JlIHF1ZXN0aW9uIGlzIHRoaXMgcGF0Y2ggYW5kIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGNhdWdodCAqb25seSogYnkgS01TQU4uIFllcy4gUmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRvIGBza2ItXHUwMDNlcHJvdG9jb2xgIChhbGxvY2F0ZWQgYnkgYGttYWxsb2NgIG9yIHBhZ2UgYWxsb2NhdG9yIGFuZCBub3QgemVyb2VkKSBjYW4gbGVhZCB0byByb3V0aW5nIHRoZSBwYWNrZXQgdG8gYW4gYXJiaXRyYXJ5IHByb3RvY29sIGhhbmRsZXIuIFRoaXMgaXMgYSB1c2Utb2YtdW5pbml0aWFsaXplZCB2YWx1ZSEgS01TQU4gaXMgKmRlc2lnbmVkKiB0byBmaW5kIHRoaXMuXG5cbkFuZCB3YWl0IGEgc2Vjb25kLiBJZiBgc2tiLVx1MDAzZXByb3RvY29sYCBpcyB1bmluaXRpYWxpemVkLCBpdCBjb3VsZCBnbyB0byBhIHBhY2tldCBzb2NrZXQgKEFGX1BBQ0tFVCkuIFRoZSB1c2VyICpjb3VsZCogdGhlbiByZWNlaXZlIHRoZSBwYWNrZXQgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZnJvbSBgc2xsX3Byb3RvY29sYCBpbiB0aGUgYHNvY2thZGRyX2xsYCByZXR1cm5lZCBieSBgcmVjdmZyb21gLiBUaGF0IGlzIGEgZGlyZWN0IGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiAyIGJ5dGVzISBXb3cuIEkgbmVlZCB0byB2ZXJpZnkgdGhpcy4uLiB0aW1lIHRvIGNoZWNrIGBwYWNrZXRfcmN2YCBpbiBgbmV0L3BhY2tldC9hZl9wYWNrZXQuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyNjg2LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTU1NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjoyNy42MzcwNDg5MDFaIiwiU2VxIjo1MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg1MzQ5NDY3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNsbF9wcm90b2NvbFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvcGFja2V0L2FmX3BhY2tldC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MjEzMz1zdGF0aWMgaW50IHBhY2tldF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldixcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjIwNi1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjIyMDc6XFx0Lyogc2xsLVxcdTAwM2VzbGxfZmFtaWx5IGFuZCBzbGwtXFx1MDAzZXNsbF9wcm90b2NvbCBhcmUgc2V0IGluIHBhY2tldF9yZWN2bXNnKCkuXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yMjA4LVxcdCAqIFVzZSB0aGVpciBzcGFjZSBmb3Igc3RvcmluZyB0aGUgb3JpZ2luYWwgc2tiIGxlbmd0aC5cXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MjI0Nj1zdGF0aWMgaW50IHRwYWNrZXRfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI0NzUtXFx0c2xsLVxcdTAwM2VzbGxfaGF0eXBlID0gZGV2LVxcdTAwM2V0eXBlO1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6MjQ3NjpcXHRzbGwtXFx1MDAzZXNsbF9wcm90b2NvbCA9IChzay1cXHUwMDNlc2tfdHlwZSA9PSBTT0NLX0RHUkFNKSA/XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yNDc3LVxcdFxcdHZsYW5fZ2V0X3Byb3RvY29sX2RncmFtKHNrYikgOiBza2ItXFx1MDAzZXByb3RvY29sO1xcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYz0yNzM2PXN0YXRpYyBpbnQgdHBhY2tldF9zbmQoc3RydWN0IHBhY2tldF9zb2NrICpwbywgc3RydWN0IG1zZ2hkciAqbXNnKVxcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yNzc2LVxcdFxcdFxcdGdvdG8gb3V0O1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6Mjc3NzpcXHRcXHRwcm90b1xcdD0gc2FkZHItXFx1MDAzZXNsbF9wcm90b2NvbDtcXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI3NzgtXFx0XFx0ZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChcXHUwMDI2cG8tXFx1MDAzZXNrKSwgc2FkZHItXFx1MDAzZXNsbF9pZmluZGV4KTtcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9Mjk2Nj1zdGF0aWMgaW50IHBhY2tldF9zbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKVxcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yOTk1LVxcdFxcdFxcdGdvdG8gb3V0O1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6Mjk5NjpcXHRcXHRwcm90b1xcdD0gc2FkZHItXFx1MDAzZXNsbF9wcm90b2NvbDtcXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI5OTctXFx0XFx0ZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChzayksIHNhZGRyLVxcdTAwM2VzbGxfaWZpbmRleCk7XFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTMzMzM9c3RhdGljIGludCBwYWNrZXRfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqdWFkZHIsIGludCBhZGRyX2xlbilcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzM0Ni1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjMzNDc6XFx0cmV0dXJuIHBhY2tldF9kb19iaW5kKHNrLCBOVUxMLCBzbGwtXFx1MDAzZXNsbF9pZmluZGV4LCBzbGwtXFx1MDAzZXNsbF9wcm90b2NvbCk7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0zMzQ4LX1cXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MzQzOD1zdGF0aWMgaW50IHBhY2tldF9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbixcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzUxMC1cXHRcXHRzbGwtXFx1MDAzZXNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzozNTExOlxcdFxcdHNsbC1cXHUwMDNlc2xsX3Byb3RvY29sID0gKHNvY2stXFx1MDAzZXR5cGUgPT0gU09DS19ER1JBTSkgP1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzUxMi1cXHRcXHRcXHR2bGFuX2dldF9wcm90b2NvbF9kZ3JhbShza2IpIDogc2tiLVxcdTAwM2Vwcm90b2NvbDtcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MzYyMz1zdGF0aWMgaW50IHBhY2tldF9nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTM2MzctXFx0c2xsLVxcdTAwM2VzbGxfaWZpbmRleCA9IGlmaW5kZXg7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzozNjM4OlxcdHNsbC1cXHUwMDNlc2xsX3Byb3RvY29sID0gUkVBRF9PTkNFKHBvLVxcdTAwM2VudW0pO1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzYzOS1cXHRzbGwtXFx1MDAzZXNsbF9wa3R0eXBlID0gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDI6MjcuNzIyNDA1NjM4WiIsIlNlcSI6NTEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4NTUzMDY2Nzk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkEgRGVlcCBEaXZlIGludG8gYSBLZXJuZWwgSW5mb3JtYXRpb24gTGVhayoqXG5cbk9rYXksIHNvIEkndmUgc3R1bWJsZWQgdXBvbiBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaW4gYHBhY2tldF9yZWN2bXNnYC4gSWYgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXNuJ3QgaW5pdGlhbGl6ZWQsIGl0J3MgY29waWVkIGRpcmVjdGx5IGludG8gYHNsbC1cdTAwM2VzbGxfcHJvdG9jb2xgIGFuZCBzZW50IHN0cmFpZ2h0IHRvIHVzZXIgc3BhY2UgdmlhIGBtc2ctXHUwMDNlbXNnX25hbWVg4oCUc3BlY2lmaWNhbGx5LCB0aGUgYHNvY2thZGRyX2xsYCBzdHJ1Y3R1cmUuIFRoaXMgbG9va3MgbGlrZSBhIHN0cmFpZ2h0Zm9yd2FyZCBrZXJuZWwtdG8tdXNlciBpbmZvcm1hdGlvbiBsZWFrLCBhbmQgdGhlIGtpY2tlcj8gSXQncyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnksIHR3byBieXRlcyBvZiBpdCEgVGhhdCBtZWFucyBLQVNBTiB3b24ndCBjYXRjaCBpdC4gSXQncyBLTVNBTidzIHRlcnJpdG9yeSFcblxuQnV0LCBob2xkIG9uIGEgc2Vjb25kLi4uIGlzIHRoZSBtZW1vcnkgKmFjdHVhbGx5KiB1bmluaXRpYWxpemVkPyBMZXQncyB0cmFjZSBpdCBiYWNrLiBXaGVuIGB0dW5fYWxsb2Nfc2tiYCBhbGxvY2F0ZXMgdGhlIGBza2JgLCBpdCBnb2VzIHRocm91Z2ggYHNvY2tfYWxsb2Nfc2VuZF9wc2tiYCwgd2hpY2ggdXNlcyBgYWxsb2Nfc2tiX3dpdGhfZnJhZ3NgLiBUaGlzLCBpbiB0dXJuLCB1c2VzIGBrbWVtX2NhY2hlX2FsbG9jX25vZGVgIGZvciB0aGUgYHNrYmAgaXRzZWxmIGFuZCBga21hbGxvY19yZXNlcnZlYCBmb3IgdGhlIGRhdGEgYnVmZmVyLiBBbmQgdGhlIGNydWNpYWwgYml0PyBga21hbGxvY19yZXNlcnZlYCB1c2VzIGBrbWFsbG9jX25vZGVfdHJhY2tfY2FsbGVyYCAob3Igc29tZXRoaW5nIHNpbWlsYXIpLCB3aGljaCAqZG9lc24ndCogemVybyB0aGUgbWVtb3J5IHVubGVzcyBgX19HRlBfWkVST2AgaXMgcGFzc2VkLiBBbmQsIGd1ZXNzIHdoYXQ/IGBzb2NrX2FsbG9jX3NlbmRfcHNrYmAgKmRvZXNuJ3QqIHBhc3MgYF9fR0ZQX1pFUk9gLiBTbywgeWVzLCB0aGUgZGF0YSBidWZmZXIgaXMgdW5pbml0aWFsaXplZC5cblxuTm93LCBgdHVuX2dldF91c2VyYCBjb3BpZXMgYGxlbmAgYnl0ZXMgZnJvbSB1c2VyIHNwYWNlIHVzaW5nIGBza2JfY29weV9kYXRhZ3JhbV9mcm9tX2l0ZXJgLiBUaGUgYnl0ZXMgYmV5b25kIGBsZW5gIHJlbWFpbiB1bnRvdWNoZWTigJRzdGlsbCB1bmluaXRpYWxpemVkLiBUaGVuLCBgZXRoX3R5cGVfdHJhbnNgIGNvbWVzIGludG8gcGxheSwgcmVhZGluZyBgZXRoLVx1MDAzZWhfcHJvdG9gIGF0IG9mZnNldCAxMi4gSWYgYGxlbiBcdTAwM2MgMTRgLCBpdCdzIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoYXQgdW5pbml0aWFsaXplZCB2YWx1ZSBnZXRzIGFzc2lnbmVkIHRvIGBza2ItXHUwMDNlcHJvdG9jb2xgLiBUaGUgcGFja2V0IHRoZW4gcGFzc2VzIHRocm91Z2ggYG5ldGlmX3J4YCBvciBgbmV0aWZfcmVjZWl2ZV9za2JgLlxuXG5IZXJlJ3Mgd2hlcmUgaXQgYWxsIGNvbm5lY3RzOiBJZiB0aGVyZSdzIGFuIEFGX1BBQ0tFVCBzb2NrZXQgc25pZmZpbmcgdGhlIGludGVyZmFjZSwgaXQgcmVjZWl2ZXMgdGhpcyBwYWNrZXQuIFRoZSB1c2VyIHRoZW4gcmVhZHMgZnJvbSB0aGUgQUZfUEFDS0VUIHNvY2tldCBhbmQgZ2V0cyB0aG9zZSBqdWljeSwgdW5pbml0aWFsaXplZCAyIGJ5dGVzIGluIGBzbGxfcHJvdG9jb2xgLiBCaW5nbyEgVGhpcyBpcyBhIGNvbXBsZXRlbHkgbGVnaXRpbWF0ZSBpbmZvLWxlYWssIGFuZCBpdCdzIHNvbGVseSBjYXVnaHQgYnkgS01TQU4uXG5cbkxldCdzIGRvIHNvbWUgbW9yZSBkaWdnaW5nLiBDYW4gYHR1bl9nZXRfdXNlcmAgYWN0dWFsbHkgc2VuZCBhIHBhY2tldCB3aXRoIGBsZW4gXHUwMDNjIDE0YCB0byBgZXRoX3R5cGVfdHJhbnNgP1xuXG5Mb29raW5nIGF0IGB0dW5fZ2V0X3VzZXJgOiBJIGNhbiBzZWUgdGhlIGNvbmRpdGlvbmFsOlxuYGBgY1xuXHRpZiAodHVuLVx1MDAzZWZsYWdzIFx1MDAyNiBJRkZfVk5FVF9IRFIpIHtcblx0XHQvLyByZWFkcyB2bmV0IGhlYWRlclxuXHR9XG5cblx0Ly8gLi4uXG5cdHNrYiA9IHR1bl9hbGxvY19za2IodGZpbGUsIGFsaWduLCBjb3B5bGVuLCBsaW5lYXIsIG5vYmxvY2spO1xuXHQvLyAuLi5cblx0ZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1fZnJvbV9pdGVyKHNrYiwgMCwgZnJvbSwgbGVuKTtcblx0Ly8gLi4uXG5cdHN3aXRjaCAodHVuLVx1MDAzZWZsYWdzIFx1MDAyNiBUVU5fVFlQRV9NQVNLKSB7XG5cdGNhc2UgSUZGX1RVTjpcblx0XHQvLyAuLi5cblx0XHRicmVhaztcblx0Y2FzZSBJRkZfVEFQOlxuXHRcdGlmIChmcmFncyBcdTAwMjZcdTAwMjYgIXBza2JfbWF5X3B1bGwoc2tiLCBFVEhfSExFTikpIHtcblx0XHRcdC8vIC4uLlxuXHRcdH1cblx0XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi1cdTAwM2VkZXYpO1xuXHRcdGJyZWFrO1xuXHR9XG5gYGBcblxuWWVzLCBpdCBsb29rcyBsaWtlIGlmIGB0dW4tXHUwMDNlZmxhZ3MgXHUwMDI2IFRVTl9UWVBFX01BU0tgIGlzIHNldCB0byBgSUZGX1RBUGAsIGFuZCBgZnJhZ3NgIGlzIGZhbHNlICh3aGljaCBpcyB0aGUgY2FzZSBpZiB0aGUgcGFja2V0IGZpdHMgd2l0aGluIHRoZSBsaW5lYXIgcG9ydGlvbiwgbWVhbmluZyBpZiBpdHMgbGVzcyB0aGFuIDE0IGJ5dGVzKSwgdGhlbiBpdCBjYWxscyBgZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tXHUwMDNlZGV2KWAgd2l0aG91dCBhIGNoZWNrIGlmIGBza2ItXHUwMDNlbGVuIFx1MDAzZT0gRVRIX0hMRU5gLlxuXG5TbywgYSB1c2VyIGNhbiB3cml0ZSwgc2F5LCAxMCBieXRlcyB0byBhIFRBUCBkZXZpY2UuIFRoZSBUQVAgZGV2aWNlIHdpbGwgYWxsb2NhdGUgYW4gYHNrYmAsIGNvcHkgMTAgYnl0ZXMsIGFuZCB0aGVuIGNhbGwgYGV0aF90eXBlX3RyYW5zYC4gVGhlIGBldGhfdHlwZV90cmFuc2AgZnVuY3Rpb24gcmVhZHMgdGhvc2UgMiBieXRlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhdCBvZmZzZXQgMTIuIFRoZW4sIHRoZSBwYWNrZXQgZ2V0cyBpbmplY3RlZCBpbnRvIHRoZSBuZXR3b3JrIHN0YWNrLiBBbiBBRl9QQUNLRVQgc29ja2V0IGNhbiByZWNlaXZlIGl0IGFuZCBsZWFrIHRoZSAyIGJ5dGVzLiBUaGlzIGlzLCBpbmRlZWQsIGEgcGVyZmVjdCBLTVNBTiBidWcuXG5cbk9rYXksIG5vdywgYXJlIHRoZXJlIGFueSBvdGhlciBjYWxscyB0byBgZXRoX3R5cGVfdHJhbnNgIHdpdGggYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYD8gSSBuZWVkIHRvIGNoZWNrLiBMZXQncyBsb29rIGF0IGBsb29wYmFja194bWl0YCBpbiBgZHJpdmVycy9uZXQvbG9vcGJhY2suY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MTQ5LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTU3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAyOjQ2LjI3NTQ3NTc5N1oiLCJTZXEiOjUyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTY1OTI2NTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXRoX3R5cGVfdHJhbnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9uZXQvbG9vcGJhY2suY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC9sb29wYmFjay5jPTcwPXN0YXRpYyBuZXRkZXZfdHhfdCBsb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5kcml2ZXJzL25ldC9sb29wYmFjay5jLTg2LVxcbmRyaXZlcnMvbmV0L2xvb3BiYWNrLmM6ODc6XFx0c2tiLVxcdTAwM2Vwcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTtcXG5kcml2ZXJzL25ldC9sb29wYmFjay5jLTg4LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjo0Ni4zMzIwNzMxMDVaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODI4MzIzMzU0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIExvb3BiYWNrIFRyYW5zbWlzc2lvbiBQYXRoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhlIGBsb29wYmFja194bWl0YCBmdW5jdGlvbiwgYW5kIG15IGluaXRpYWwgdGhvdWdodHMgYXJlIGFyb3VuZCBob3cgaXQgaGFuZGxlcyBpbmNvbWluZyBwYWNrZXRzLiBGaXJzdCwgaXQgdGltZXN0YW1wcyB0aGUgYHNrYmAgYW5kIGNsZWFycyB0aGUgdGltZXN0YW1wIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGRpZmZlcmVudCBjbG9jayBiYXNlcy4gSXQgdGhlbiBvcnBoYW5zIHRoZSBgc2tiYCBhbmQgZW5zdXJlcyB0aGUgZGVzdGluYXRpb24gaXMgcmVmY291bnRlZCwgd2hpY2ggaXMgcHJldHR5IHN0YW5kYXJkLiBUaGUga2V5IHBhcnQgaXMgdGhhdCBgZXRoX3R5cGVfdHJhbnNgIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIHByb3RvY29sLlxuXG5NeSBjb25jZXJuIGhlcmUgaXMgcmVnYXJkaW5nIHBhY2tldHMgd2l0aCB1bnVzdWFsIHNpemVzLiBJIGtub3cgdGhhdCBpZiBhIHBhY2tldCB3aXRoIGEgbGVuZ3RoIGxlc3MgdGhhbiBgRVRIX0hMRU5gIGlzIHNlbnQgb3ZlciBsb29wYmFjaywgYGV0aF90eXBlX3RyYW5zYCB3aWxsIGJlIGNhbGxlZC4gVGhhdCdzIGZpbmUgaW4gbW9zdCBzY2VuYXJpb3MgYmVjYXVzZSBwYWNrZXRzIGdlbmVyYXRlZCBieSB0aGUga2VybmVsIGFyZSB1c3VhbGx5IHdlbGwtZm9ybWVkLiBIb3dldmVyLCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGVkZ2UgY2FzZXMuIFdoYXQgaWYgYSByYXcgcGFja2V0IGlzIHNlbnQgdXNpbmcgYW4gQUZfUEFDS0VUIHNvY2tldCB3aXRoIGEgc2hvcnQgbGVuZ3RoLCBsZXNzIHRoYW4gdGhlIG1pbmltdW0gRXRoZXJuZXQgZnJhbWUgc2l6ZSwgd2hpY2ggaXMgMTQgYnl0ZXM/IEluIHRoYXQgY2FzZSwgYGxvb3BiYWNrX3htaXRgIHdvdWxkIGJlIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgcGFja2V0LlxuXG5UaGUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzLCBob3cgZG9lcyB0aGF0IGV2ZW4gaGFwcGVuPyBEb2VzIHRoZSBwYWNrZXQgc29ja2V0IGNvZGUgcHJldmVudCBpdCBmcm9tIGhhcHBlbmluZz8gRG9lcyBpdCBmaWx0ZXIgb3V0IHRoZXNlIHNob3J0ZXIgcGFja2V0cz8gSSBzZWVtIHRvIHJlY2FsbCB0aGF0IHBhY2tldCBzZW5kLCBgcGFja2V0X3NuZGAsIGRvZXMgc29tZSBsZW5ndGggY2hlY2tzLiBMZXQgbWUgcXVpY2tseSB2ZXJpZnkgaWYgdGhlIHBhY2tldCBzZW5kIHBhdGggY2hlY2tzIHdoZXRoZXIgdGhlIGxlbmd0aCBpcyBhdCBsZWFzdCBgZGV2LVx1MDAzZWhhcmRfaGVhZGVyX2xlbmAgYmVmb3JlIGl0IGdldHMgdG8gdGhpcyBwb2ludC4gVGhhdCB3b3VsZCBleHBsYWluIGl0LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYW5kIGNoZWNrIGBwYWNrZXRfc25kYCB0byBjb25maXJtIHRoZSBiZWhhdmlvci5cblxuXG4iLCJJbnB1dFRva2VucyI6MjgyNTksIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDI6NTQuNjE1MzA5MzM5WiIsIlNlcSI6NTQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDYxNjIwODcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZGV2LVxcdTAwM2VoYXJkX2hlYWRlcl9sZW5cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3BhY2tldC9hZl9wYWNrZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvcGFja2V0L2FmX3BhY2tldC5jPTU0MT1zdGF0aWMgdTE2IHZsYW5fZ2V0X3RjaShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy01NTUtXFx0ICovXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzo1NTY6XFx0aWYgKGRldi1cXHUwMDNlbWluX2hlYWRlcl9sZW4gPT0gZGV2LVxcdTAwM2VoYXJkX2hlYWRlcl9sZW4pXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzo1NTc6XFx0XFx0aGVhZGVyX2xlbiA9IGRldi1cXHUwMDNlaGFyZF9oZWFkZXJfbGVuO1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtNTU4LVxcdGVsc2UgaWYgKGlzX3ZsYW5fZGV2KGRldikpXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTE5NjA9c3RhdGljIGludCBwYWNrZXRfc2VuZG1zZ19zcGt0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjAxNS1cXHRpZiAoIXNrYilcXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjIwMTY6XFx0XFx0aGFyZF9oZWFkZXJfbGVuID0gUkVBRF9PTkNFKGRldi1cXHUwMDNlaGFyZF9oZWFkZXJfbGVuKTtcXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTIwMTctXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTI3MzY9c3RhdGljIGludCB0cGFja2V0X3NuZChzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLCBzdHJ1Y3QgbXNnaGRyICptc2cpXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI4MDAtXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzoyODAxOlxcdGhhcmRfaGVhZGVyX2xlbiA9IFJFQURfT05DRShkZXYtXFx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yODAyLVxcdGlmIChwby1cXHUwMDNlc2suc2tfc29ja2V0LVxcdTAwM2V0eXBlID09IFNPQ0tfUkFXKVxcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYz0yOTY2PXN0YXRpYyBpbnQgcGFja2V0X3NuZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMwMTktXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzozMDIwOlxcdGhhcmRfaGVhZGVyX2xlbiA9IFJFQURfT05DRShkZXYtXFx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0zMDIxLVxcdGlmIChzb2NrLVxcdTAwM2V0eXBlID09IFNPQ0tfUkFXKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjo1NC43MjE0NzYxMTZaIiwiU2VxIjo1NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ5MDQ3NjMyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUGFja2V0IFRyYW5zbWlzc2lvbiBhbmQgSGVhZGVyIFNwYWNlKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgcGFja2V0X3NuZGAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSBob3cgaXQgaGFuZGxlcyByZXNlcnZpbmcgc3BhY2Ugd2l0aGluIGEgc29ja2V0IGJ1ZmZlciBiZWZvcmUgdHJhbnNtaXNzaW9uLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGlzOiBpdCBjYWxjdWxhdGVzIHRoZSByZXNlcnZlZCBzcGFjZSAoYHJlc2VydmVgKSBiYXNlZCBvbiB0aGUgc29ja2V0IHR5cGUuIFJhdyBzb2NrZXRzIGdldCBhIHNpbXBsZSBgaGFyZF9oZWFkZXJfbGVuYCwgd2hpbGUgb3RoZXIgc29ja2V0IHR5cGVzIGFsc28gY29uc2lkZXIgdGhlIGRldmljZSdzIHRhaWxyb29tLiBUaGF0J3MgZmluZSDigJMgc3RhbmRhcmQgcHJhY3RpY2UgdG8gYWNjb21tb2RhdGUgZm9yIGhlYWRlcnMuXG5cbkJ1dCB0aGUgcXVlc3Rpb24gaXMsIGRvZXMgdGhpcyBzcGFjZSByZXNlcnZhdGlvbiAqZW5mb3JjZSogYSBtaW5pbXVtIGxlbmd0aCBmb3IgdGhlIHBhY2tldD8gRG9lcyBpdCBlbnN1cmUgdGhhdCB0aGUgZGF0YSBsZW5ndGggKGBsZW5gKSBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgYGhhcmRfaGVhZGVyX2xlbmA/IEEgcGFja2V0IHdpdGggYSBkYXRhIGxlbmd0aCBzaG9ydGVyIHRoYW4gdGhlIG1pbmltdW0gaGVhZGVyIGxlbmd0aCB3b3VsZCBiZS4uLnByb2JsZW1hdGljLCB0byBzYXkgdGhlIGxlYXN0LiBJdCdzIGEgZnVuZGFtZW50YWwgcmVxdWlyZW1lbnQuIFNvLCBJIG5lZWQgdG8gZ28gYmFjayBhbmQgdGhvcm91Z2hseSBleGFtaW5lIHRoZSBgcGFja2V0X3NuZGAgZnVuY3Rpb24gdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgZXhwbGljaXQgbGVuZ3RoIGNoZWNrcyBpbiBwbGFjZSB0byBwcmV2ZW50IHRoaXMgcG90ZW50aWFsbHkgZGlzYXN0cm91cyBzY2VuYXJpby4gTGV0J3MgZGlnIGluIGFuZCBzZWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5NDg3LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDI6NTkuMjExOTU1MDMyWiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3Mjg5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcGFja2V0L2FmX3BhY2tldC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMwMTAsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjMwMTA6XFx0XFx0aWYgKHVubGlrZWx5KCEoZGV2LVxcdTAwM2VmbGFncyBcXHUwMDI2IElGRl9VUCkpKVxcbjMwMTE6XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbjMwMTI6XFx0XFxuMzAxMzpcXHRcXHRzb2NrY21faW5pdChcXHUwMDI2c29ja2MsIHNrKTtcXG4zMDE0OlxcdFxcdGlmIChtc2ctXFx1MDAzZW1zZ19jb250cm9sbGVuKSB7XFxuMzAxNTpcXHRcXHRcXHRlcnIgPSBzb2NrX2Ntc2dfc2VuZChzaywgbXNnLCBcXHUwMDI2c29ja2MpO1xcbjMwMTY6XFx0XFx0XFx0aWYgKHVubGlrZWx5KGVycikpXFxuMzAxNzpcXHRcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMzAxODpcXHRcXHR9XFxuMzAxOTpcXHRcXG4zMDIwOlxcdFxcdGhhcmRfaGVhZGVyX2xlbiA9IFJFQURfT05DRShkZXYtXFx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XFxuMzAyMTpcXHRcXHRpZiAoc29jay1cXHUwMDNldHlwZSA9PSBTT0NLX1JBVylcXG4zMDIyOlxcdFxcdFxcdHJlc2VydmUgPSBoYXJkX2hlYWRlcl9sZW47XFxuMzAyMzpcXHRcXHRpZiAodm5ldF9oZHJfc3opIHtcXG4zMDI0OlxcdFxcdFxcdGVyciA9IHBhY2tldF9zbmRfdm5ldF9wYXJzZShtc2csIFxcdTAwMjZsZW4sIFxcdTAwMjZ2bmV0X2hkciwgdm5ldF9oZHJfc3opO1xcbjMwMjU6XFx0XFx0XFx0aWYgKGVycilcXG4zMDI2OlxcdFxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4zMDI3OlxcdFxcdH1cXG4zMDI4OlxcdFxcbjMwMjk6XFx0XFx0aWYgKHVubGlrZWx5KHNvY2tfZmxhZyhzaywgU09DS19OT0ZDUykpKSB7XFxuMzAzMDpcXHRcXHRcXHRpZiAoIW5ldGlmX3N1cHBvcnRzX25vZmNzKGRldikpIHtcXG4zMDMxOlxcdFxcdFxcdFxcdGVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7XFxuMzAzMjpcXHRcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMzAzMzpcXHRcXHRcXHR9XFxuMzAzNDpcXHRcXHRcXHRleHRyYV9sZW4gPSA0OyAvKiBXZSdyZSBkb2luZyBvdXIgb3duIENSQyAqL1xcbjMwMzU6XFx0XFx0fVxcbjMwMzY6XFx0XFxuMzAzNzpcXHRcXHRlcnIgPSAtRU1TR1NJWkU7XFxuMzAzODpcXHRcXHRpZiAoIXZuZXRfaGRyLmdzb190eXBlIFxcdTAwMjZcXHUwMDI2XFxuMzAzOTpcXHRcXHQgICAgKGxlbiBcXHUwMDNlIGRldi1cXHUwMDNlbXR1ICsgcmVzZXJ2ZSArIFZMQU5fSExFTiArIGV4dHJhX2xlbikpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAyOjU5LjIxMjEyOTEyMloiLCJTZXEiOjU3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyODk5MDM3MzUwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgS01TQU4gTmVjZXNzaXR5KipcblxuT2theSwgaGVyZSdzIHRoZSBicmVha2Rvd24sIGFzIEkgc2VlIGl0LiBUaGVyZSdzIGEgY3JpdGljYWwgb3ZlcnNpZ2h0IGluIHRoZSBwYWNrZXQgcmVjZXB0aW9uIHBhdGgsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIHBhY2tldHMgd2l0aCBsaW5lYXIgZGF0YSBsZW5ndGhzIHNob3J0ZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyIHNpemUgKDE0IGJ5dGVzKS4gTXkgaW52ZXN0aWdhdGlvbiByZXZlYWxzIGEgY2xlYXIgaW5mb3JtYXRpb24gbGVhayB0aGF0J3MgdW5pcXVlbHkgZGV0ZWN0YWJsZSBieSBLTVNBTi5cblxuSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzczogSW5pdGlhbGx5LCBJIG5vdGljZWQgdGhhdCBgcGFja2V0X3NuZGAgZG9lc24ndCBleHBsaWNpdGx5IGNoZWNrIGZvciBwYWNrZXRzIHdpdGggYSBsZW5ndGggbGVzcyB0aGFuIHRoZSBoYXJkIGhlYWRlciBsZW5ndGggd2hlbiB1c2luZyBgU09DS19SQVdgIG9uIGBBRl9QQUNLRVRgLiBUaGlzIG9wZW5zIHRoZSBkb29yIGZvciB1c2VycyB0byBjcmFmdCB2ZXJ5IHNob3J0IHBhY2tldHMg4oCTIGV2ZW4gemVyby1ieXRlIG9uZXMg4oCTIHdoaWNoIGFyZSB0aGVuIHBhc3NlZCBkb3duc3RyZWFtIHRvIGBkZXZfcXVldWVfeG1pdGAuIEluIHRoZSBgbG9vcGJhY2tgIGRldmljZSBjYXNlLCB0aGVzZSBwYWNrZXRzIHVsdGltYXRlbHkgcmVhY2ggYGV0aF90eXBlX3RyYW5zYCB2aWEgYGxvb3BiYWNrX3htaXRgLlxuXG5UaGUgY29yZSBpc3N1ZSBsaWVzIGluIGhvdyBgZXRoX3R5cGVfdHJhbnNgIGhhbmRsZXMgdGhlc2UgbWFsZm9ybWVkIHBhY2tldHMuIEl0IHJlYWRzIGBldGgtXHUwMDNlaF9wcm90b2Agd2l0aG91dCBwcm9wZXIgbGVuZ3RoIHZhbGlkYXRpb24uIFNpbmNlIHRoZSBrZXJuZWwgYWxsb2NhdGVzIHRoZSBTS0Igd2l0aCBga21hbGxvY2AgKHdpdGhvdXQgYF9fR0ZQX1pFUk9gKSwgdGhlIG1lbW9yeSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHVzZXItcHJvdmlkZWQgZGF0YSBpcyB1bmluaXRpYWxpemVkLiBUaGlzIGlzIHRoZSBjcnV4IG9mIHRoZSBwcm9ibGVtLlxuXG5gZXRoX3NrYl9wdWxsX21hY2AgY2FsbHMgYHNrYl9wdWxsX2lubGluZWAuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHNpemUgb2YgdGhlIFNLQiBpcyBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgaW4gd2hpY2ggY2FzZSBhIHJlYWQgcGFzdCB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBvY2N1cnMuIEhvd2V2ZXIsIHRoaXMgZG9lc24ndCB0cmlnZ2VyIGBCVUdfT05gIG9yIEtBU0FOLCBiZWNhdXNlIHRoZSBkYXRhIGlzbid0IG91dCBvZiBib3VuZHMg4oCTIGl0J3MganVzdCB1bmluaXRpYWxpemVkIHdpdGhpbiB0aGUgYWxsb2NhdGVkIFNLQiBidWZmZXIuIFRoZSBrZXkgaXMgdGhhdCBgc2tiX3B1bGxfaW5saW5lYCBkb2Vzbid0IHJldHVybiBhbiBlcnJvciBoZXJlLCBpdCBjb250aW51ZXMuXG5cblRoaXMgdW5pbml0aWFsaXplZCBgaF9wcm90b2AgdmFsdWUgZ2V0cyBzaWxlbnRseSBwcm9wYWdhdGVkLiBgZXRoX3R5cGVfdHJhbnNgIHJlYWRzIHRoZSAyIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgdGhhdCBhcmUgcGFydCBvZiBgaF9wcm90b2AgYW5kIHRoZW4gc3RvcmVzIGl0IGludG8gYHNrYi1cdTAwM2Vwcm90b2NvbGAuIFRoaXMgYHNrYi1cdTAwM2Vwcm90b2NvbGAgdmFsdWUgaXMgdGhlbiBsZWFrZWQgdG8gdXNlciBzcGFjZSB2aWEgYHBhY2tldF9yZWN2bXNnYC5cblxuVGhlIGNydWNpYWwgdGhpbmcgaXMgdGhpcyBsZWFrICppc24ndCogZGV0ZWN0ZWQgYnkgc3RhbmRhcmQgZnV6emluZyBvciBLQVNBTiBiZWNhdXNlIGl0IGRvZXNuJ3QgaW52b2x2ZSBhbnkgb3V0LW9mLWJvdW5kcyByZWFkcyBvciBjcmFzaGVzLiBLQVNBTiBvbmx5IHRyYWNrcyBvdXQtb2YtYm91bmRzIG1lbW9yeSBhY2Nlc3Nlcywgc28gcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSAqd2l0aGluKiBhIHZhbGlkIGFsbG9jYXRpb24gaXNuJ3QgY2F1Z2h0LiBLTVNBTiwgaG93ZXZlciwgKmRvZXMqIHRyYWNrIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLlxuXG5UaGlzIGlzIGEgdGV4dGJvb2sgY2FzZSB3aGVyZSBLTVNBTiBpcyBlc3NlbnRpYWwuIEl0J3MgdGhlIG9ubHkgdG9vbCB0aGF0IHJlbGlhYmx5IGlkZW50aWZpZXMgdGhpcyB2dWxuZXJhYmlsaXR5LiBTdGFuZGFyZCBmdXp6aW5nLCBvciBmdXp6aW5nIHdpdGggS0FTQU4sIHdpbGwgbWlzcyB0aGlzLCBsZWFkaW5nIHRvIGEgc2lsZW50IGtlcm5lbCBpbmZvLWxlYWsuXG5cbk5vdyBJIGFtIGdvaW5nIHRvIHN1bW1hcml6ZSB0aGUgcHJvY2VzcyBvZiB0aGlzIGluZm9ybWF0aW9uIGxlYWs6XG5cbjEuICBBIHNob3J0IHBhY2tldCAoZS5nLiwgMTAgYnl0ZXMpIGlzIGNyYWZ0ZWQgYnkgYSB1c2VyLlxuMi4gIFRoZSBwYWNrZXQgYnlwYXNzZXMgYSBsZW5ndGggY2hlY2suXG4zLiAgVGhlIHBhY2tldCBjYWxscyBgZXRoX3R5cGVfdHJhbnNgLCB3aGVyZSBpdCBpcyBoYW5kbGVkIHdpdGhvdXQgc3VmZmljaWVudCBsZW5ndGggdmFsaWRhdGlvbi5cbjQuICBUaGUgcGFja2V0cyBlbmQgdXAgY2FsbGluZyBgc2tiX3B1bGxfaW5saW5lYC5cbjUuICBVbmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIGZyb20gdGhlIGBTS0JgIGRhdGEgYnVmZmVyIHdoZW4gYGV0aC1cdTAwM2VoX3Byb3RvYCBpcyByZWFkLlxuNi4gIFRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyB0aGVuIGNvcGllZCB0byB0aGUgYHNrYi1cdTAwM2Vwcm90b2NvbGAgZmllbGQuXG43LiAgVGhlIHBhY2tldCBpcyByZWNlaXZlZCBieSBhbm90aGVyIGBBRl9QQUNLRVRgIHNvY2tldC5cbjguICBUaGUgYHNrYi1cdTAwM2Vwcm90b2NvbGAgZmllbGQgaXMgY29waWVkIHRvIGBzbGwtXHUwMDNlc2xsX3Byb3RvY29sYC5cbjkuICBUaGUgYHNsbC1cdTAwM2VzbGxfcHJvdG9jb2xgIGZpZWxkIGlzIGxlYWtlZCB0byB1c2Vyc3BhY2UuXG4xMC4gVGhlIHJlc3VsdCBpcyBhIGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhpcyBwYXRjaCwgc3BlY2lmaWNhbGx5IGJ5IGRyb3BwaW5nIHRoZSBzaG9ydCBsaW5lYXIgcGFja2V0LCBmaXhlcyBhIHNlcmlvdXMgaXNzdWUuXG5cbkkgY2FuIGNvbmZpcm0gdGhhdCB0aGUgYHNrYi1cdTAwM2Vwcm90b2NvbGAgdmFsdWUgKmlzKiBpbmRlZWQgbGVha2VkIHRvIHVzZXIgc3BhY2UsIHByb3ZpZGluZyBhIHJlcHJvZHVjaWJsZSBhbmQgZXhwbG9pdGFibGUga2VybmVsIGluZm8tbGVhay4gVGhlIGBzb2NrYWRkcl9sbGAgc3RydWN0dXJlIGFuZCBpdHMgY29udGVudHMsIGluY2x1ZGluZyB0aGUgbm93LWNvbXByb21pc2VkIGBzbGwtXHUwMDNlc2xsX3Byb3RvY29sYCwgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLlxuXG5JbiBzdW1tYXJ5OiBJIHNlZSBgTmVlZHNLTVNBTiA9IHRydWVgLiBUaGlzIHBhdGNoIGZpeGVzIGEgdnVsbmVyYWJpbGl0eSB0aGF0IGlzIG9ubHkgZGV0ZWN0ZWQgYnkgS01TQU4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwMzExLCJPdXRwdXRUb2tlbnMiOjQ2NiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxNDUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMzoyOC4yMDI1MDYwNDFaIiwiU2VxIjo1OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODA2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBsZW5ndGggY2hlY2sgYHNrYl9oZWFkbGVuKHNrYikgXFx1MDAzYyBFVEhfSExFTmAgaW4gYGV0aF90eXBlX3RyYW5zKClgIHRvIHByZXZlbnQgcHJvY2Vzc2luZyBwYWNrZXRzIHdpdGggYSBsaW5lYXIgcGFydCBzaG9ydGVyIHRoYW4gdGhlIEV0aGVybmV0IGhlYWRlciAoMTQgYnl0ZXMpLiBcXG5cXG5XaXRob3V0IHRoaXMgY2hlY2ssIGlmIGEgdXNlciBpbmplY3RzIGEgc2hvcnQgbGluZWFyIHBhY2tldCAoZS5nLiwgMTAgYnl0ZXMpIHZpYSBhIFRVTi9UQVAgZGV2aWNlIG9yIGFuIEFGX1BBQ0tFVCByYXcgc29ja2V0LCBgZXRoX3R5cGVfdHJhbnMoKWAgY2FsbHMgYGV0aF9za2JfcHVsbF9tYWMoKWAuIGBldGhfc2tiX3B1bGxfbWFjKClgIGNhbGxzIGBza2JfcHVsbF9pbmxpbmUoc2tiLCBFVEhfSExFTilgLiBJZiBgc2tiLVxcdTAwM2VsZW4gXFx1MDAzYyBFVEhfSExFTmAsIGBza2JfcHVsbF9pbmxpbmUoKWAgZmFpbHMgYW5kIHJldHVybnMgYE5VTExgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgYEJVR19PTmAgb3IgY3Jhc2guIGBldGhfc2tiX3B1bGxfbWFjKClgIGlnbm9yZXMgdGhpcyByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIGBza2ItXFx1MDAzZWRhdGFgIHBvaW50ZXIuXFxuXFxuYGV0aF90eXBlX3RyYW5zKClgIHRoZW4gcmVhZHMgYGV0aC1cXHUwMDNlaF9wcm90b2AgYXQgb2Zmc2V0IDEyLiBCZWNhdXNlIHRoZSBza2IgZGF0YSBidWZmZXIgaXMgdHlwaWNhbGx5IGFsbG9jYXRlZCB3aXRoIGEgbXVjaCBsYXJnZXIgc2l6ZSAoZS5nLiwgdmlhIGBrbWFsbG9jYCksIHRoaXMgcmVhZCBpcyB3ZWxsIHdpdGhpbiB0aGUgYWxsb2NhdGlvbiBib3VuZHMuIFRoZXJlZm9yZSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IGl0IGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cXG5cXG5Ib3dldmVyLCB0aGUgbWVtb3J5IGJleW9uZCB0aGUgdXNlci1wcm92aWRlZCAxMCBieXRlcyBpcyB1bmluaXRpYWxpemVkLiBLTVNBTiB3aWxsIGRldGVjdCB0aGlzIGFzIGEgcmVhZCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRnVydGhlcm1vcmUsIHRoaXMgdW5pbml0aWFsaXplZCB2YWx1ZSBpcyBzdG9yZWQgaW4gYHNrYi1cXHUwMDNlcHJvdG9jb2xgLiBJZiB0aGUgcGFja2V0IGlzIGxhdGVyIHJlY2VpdmVkIGJ5IGFuIEFGX1BBQ0tFVCBzb2NrZXQsIGBza2ItXFx1MDAzZXByb3RvY29sYCBpcyBjb3BpZWQgdG8gYHNsbF9wcm90b2NvbGAgaW4gdGhlIGBzb2NrYWRkcl9sbGAgc3RydWN0dXJlIGFuZCByZXR1cm5lZCB0byB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZygpYC4gVGhpcyBjb25zdGl0dXRlcyBhIGRpcmVjdCBrZXJuZWwtdG8tdXNlciBpbmZvLWxlYWsgb2YgMiBieXRlcyBvZiB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuXFxuXFxuU2luY2UgdGhpcyBpc3N1ZSBkb2VzIG5vdCBjYXVzZSBhIGNyYXNoLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdHJpZ2dlciBhIGBCVUdfT05gIGZvciBsaW5lYXIgcGFja2V0cywgaXQgY2FuIE9OTFkgYmUgZGV0ZWN0ZWQgYnkgS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbGVuZ3RoIGNoZWNrIGBza2JfaGVhZGxlbihza2IpIFxcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXFxuXFxuV2l0aG91dCB0aGlzIGNoZWNrLCBpZiBhIHVzZXIgaW5qZWN0cyBhIHNob3J0IGxpbmVhciBwYWNrZXQgKGUuZy4sIDEwIGJ5dGVzKSB2aWEgYSBUVU4vVEFQIGRldmljZSBvciBhbiBBRl9QQUNLRVQgcmF3IHNvY2tldCwgYGV0aF90eXBlX3RyYW5zKClgIGNhbGxzIGBldGhfc2tiX3B1bGxfbWFjKClgLiBgZXRoX3NrYl9wdWxsX21hYygpYCBjYWxscyBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gSWYgYHNrYi1cXHUwMDNlbGVuIFxcdTAwM2MgRVRIX0hMRU5gLCBgc2tiX3B1bGxfaW5saW5lKClgIGZhaWxzIGFuZCByZXR1cm5zIGBOVUxMYCB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGBCVUdfT05gIG9yIGNyYXNoLiBgZXRoX3NrYl9wdWxsX21hYygpYCBpZ25vcmVzIHRoaXMgcmV0dXJuIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBgc2tiLVxcdTAwM2VkYXRhYCBwb2ludGVyLlxcblxcbmBldGhfdHlwZV90cmFucygpYCB0aGVuIHJlYWRzIGBldGgtXFx1MDAzZWhfcHJvdG9gIGF0IG9mZnNldCAxMi4gQmVjYXVzZSB0aGUgc2tiIGRhdGEgYnVmZmVyIGlzIHR5cGljYWxseSBhbGxvY2F0ZWQgd2l0aCBhIG11Y2ggbGFyZ2VyIHNpemUgKGUuZy4sIHZpYSBga21hbGxvY2ApLCB0aGlzIHJlYWQgaXMgd2VsbCB3aXRoaW4gdGhlIGFsbG9jYXRpb24gYm91bmRzLiBUaGVyZWZvcmUsIEtBU0FOIHdpbGwgTk9UIGRldGVjdCBpdCBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIHVzZXItcHJvdmlkZWQgMTAgYnl0ZXMgaXMgdW5pbml0aWFsaXplZC4gS01TQU4gd2lsbCBkZXRlY3QgdGhpcyBhcyBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZ1cnRoZXJtb3JlLCB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUgaXMgc3RvcmVkIGluIGBza2ItXFx1MDAzZXByb3RvY29sYC4gSWYgdGhlIHBhY2tldCBpcyBsYXRlciByZWNlaXZlZCBieSBhbiBBRl9QQUNLRVQgc29ja2V0LCBgc2tiLVxcdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxcblxcblNpbmNlIHRoaXMgaXNzdWUgZG9lcyBub3QgY2F1c2UgYSBjcmFzaCwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIHRyaWdnZXIgYSBgQlVHX09OYCBmb3IgbGluZWFyIHBhY2tldHMsIGl0IGNhbiBPTkxZIGJlIGRldGVjdGVkIGJ5IEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflow7pzhd[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-07 12:58:10 +0000 UTC FinishedAt: 2026-08-07 13:03:33 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "4fa4977a0d900f936bcae5cd2c510be5554e8dd6", "config_name": "upstream-apparmor-kasan.config", "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "4fa4977a0d900f936bcae5cd2c510be5554e8dd6", "config_name": "upstream-apparmor-kasan.config", "series_id": "e1de1dc2-9608-48e4-bb80-466bf033e3fe" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null }, { "base": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "4fa4977a0d900f936bcae5cd2c510be5554e8dd6", "config_name": "upstream-kmsan.config", "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git", "commit_hash": "4fa4977a0d900f936bcae5cd2c510be5554e8dd6", "config_name": "upstream-kmsan.config", "series_id": "e1de1dc2-9608-48e4-bb80-466bf033e3fe" }, "track": "KMSAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [], "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+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGxlbmd0aCBjaGVjayBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXG5cbldpdGhvdXQgdGhpcyBjaGVjaywgaWYgYSB1c2VyIGluamVjdHMgYSBzaG9ydCBsaW5lYXIgcGFja2V0IChlLmcuLCAxMCBieXRlcykgdmlhIGEgVFVOL1RBUCBkZXZpY2Ugb3IgYW4gQUZfUEFDS0VUIHJhdyBzb2NrZXQsIGBldGhfdHlwZV90cmFucygpYCBjYWxscyBgZXRoX3NrYl9wdWxsX21hYygpYC4gYGV0aF9za2JfcHVsbF9tYWMoKWAgY2FsbHMgYHNrYl9wdWxsX2lubGluZShza2IsIEVUSF9ITEVOKWAuIElmIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAsIGBza2JfcHVsbF9pbmxpbmUoKWAgZmFpbHMgYW5kIHJldHVybnMgYE5VTExgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgYEJVR19PTmAgb3IgY3Jhc2guIGBldGhfc2tiX3B1bGxfbWFjKClgIGlnbm9yZXMgdGhpcyByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIGBza2ItXHUwMDNlZGF0YWAgcG9pbnRlci5cblxuYGV0aF90eXBlX3RyYW5zKClgIHRoZW4gcmVhZHMgYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIEJlY2F1c2UgdGhlIHNrYiBkYXRhIGJ1ZmZlciBpcyB0eXBpY2FsbHkgYWxsb2NhdGVkIHdpdGggYSBtdWNoIGxhcmdlciBzaXplIChlLmcuLCB2aWEgYGttYWxsb2NgKSwgdGhpcyByZWFkIGlzIHdlbGwgd2l0aGluIHRoZSBhbGxvY2F0aW9uIGJvdW5kcy4gVGhlcmVmb3JlLCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgaXQgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgbWVtb3J5IGJleW9uZCB0aGUgdXNlci1wcm92aWRlZCAxMCBieXRlcyBpcyB1bmluaXRpYWxpemVkLiBLTVNBTiB3aWxsIGRldGVjdCB0aGlzIGFzIGEgcmVhZCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRnVydGhlcm1vcmUsIHRoaXMgdW5pbml0aWFsaXplZCB2YWx1ZSBpcyBzdG9yZWQgaW4gYHNrYi1cdTAwM2Vwcm90b2NvbGAuIElmIHRoZSBwYWNrZXQgaXMgbGF0ZXIgcmVjZWl2ZWQgYnkgYW4gQUZfUEFDS0VUIHNvY2tldCwgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuXG5TaW5jZSB0aGlzIGlzc3VlIGRvZXMgbm90IGNhdXNlIGEgY3Jhc2gsIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB0cmlnZ2VyIGEgYEJVR19PTmAgZm9yIGxpbmVhciBwYWNrZXRzLCBpdCBjYW4gT05MWSBiZSBkZXRlY3RlZCBieSBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgdG8gZHJvcCBldGhlcm5ldCBmcmFtZXMgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGluIGV0aF90eXBlX3RyYW5zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgZXRoZXJuZXQgcmVjZWl2ZSBwYXRoLCBzbyBpdCBpcyB3b3J0aCBmdXp6aW5nLiBTaW5jZSBldGhfdHlwZV90cmFucyBpcyBhIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb24sIGl0IGlzIG5vdCBhZGRlZCB0byBGb2N1c1N5bWJvbHMgdG8gYXZvaWQgc2tld2luZyB0ZXN0IGRpc3RyaWJ1dGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAzZWQ1NTJjMGM2Y2RjNjgxNjc4MGIxY2E2OGY5OWMzOGM1YWJhN2RkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAxMjo1OToxNSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmNcbmluZGV4IGQ5ZmFhZGJlOWI2YzguLjg0OTE0NzA5YWMwNjEgMTAwNjQ0XG4tLS0gYS9uZXQvZXRoZXJuZXQvZXRoLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9ldGhlcm5ldC9ldGguY1xuQEAgLTE2MSw2ICYjNDM7MTYxLDEyIEBAIF9fYmUxNiBldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFx0c2tiLVx1MDAzZWRldiA9IGRldjtcbiBcdHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7XG4gXG4mIzQzO1x0aWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOKSkge1xuJiM0MztcdFx0bmV0X3dhcm5fcmF0ZWxpbWl0ZWQoXCYjMzQ7JXM6IGRyb3BwaW5nIGZyYW1lIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBmcm9tICVzXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgX19mdW5jX18sIGRldi1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7XG4gXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMjo1OTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgM2VkNTUyYzBjNmNkYzY4MTY3ODBiMWNhNjhmOTljMzhjNWFiYTdkZApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDcgMTI6NTk6MTUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmMKaW5kZXggZDlmYWFkYmU5YjZjOC4uODQ5MTQ3MDlhYzA2MSAxMDA2NDQKLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9ldGhlcm5ldC9ldGguYwpAQCAtMTYxLDYgJiM0MzsxNjEsMTIgQEAgX19iZTE2IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiAJc2tiLSZndDtkZXYgPSBkZXY7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAomIzQzOwlpZiAodW5saWtlbHkoc2tiX2hlYWRsZW4oc2tiKSAmbHQ7IEVUSF9ITEVOKSkgewomIzQzOwkJbmV0X3dhcm5fcmF0ZWxpbWl0ZWQoJiMzNDslczogZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGZyb20gJXNcbiYjMzQ7LAomIzQzOwkJCQkgICAgIF9fZnVuY19fLCBkZXYtJmd0O25hbWUpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAlldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7CiAJZXRoX3NrYl9wa3RfdHlwZShza2IsIGRldik7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAzNAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDMxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQYXRjaDogYGV0aF90eXBlX3RyYW5zYCBpbiBgbmV0L2V0aGVybmV0L2V0aC5jYCoqCgpPa2F5LCBzbyB0aGVyZSYjMzk7cyBhIHBhdGNoIGludHJvZHVjaW5nIGEgY2hlY2sgd2l0aGluIGBldGhfdHlwZV90cmFuc2AgaW4gYG5ldC9ldGhlcm5ldC9ldGguY2AuICBTcGVjaWZpY2FsbHksIHRoZSBjb2RlIG5vdyBsb29rcyBmb3IgcGFja2V0cyB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQg4oCTIGxlc3MgdGhhbiBgRVRIX0hMRU5gLiAgVGhlIGNoZWNrIGlzIHJpZ2h0IHRoZXJlLCBkcm9wcGluZyB0aGVzZSBzaG9ydCBmcmFtZXMuICBOb3csIGBldGhfdHlwZV90cmFuc2DigKYgdGhhdCYjMzk7cyAqZXZlcnl3aGVyZSouIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgZnVuY3Rpb24gZm9yIEV0aGVybmV0IGRyaXZlcnMsIGRvaW5nIHRoZSBjcml0aWNhbCB3b3JrIG9mIHNldHRpbmcgcGFja2V0IHR5cGUgYW5kIHB1bGxpbmcgb3V0IHRoZSBNQUMgaGVhZGVyLiAgRGVmaW5pdGVseSByZWFjaGFibGUsIGFuZCBteSBpbml0aWFsIGluc3RpbmN0IHNheXMgaXQmIzM5O3Mgd29ydGggZnV6emluZyBnaXZlbiB0aGUgZnVuY3Rpb25hbCBjaGFuZ2UuCgpXYWl0IGEgc2Vjb25k4oCmICBgZXRoX3R5cGVfdHJhbnNgIGlzIGEgKmhvdC1wYXRoKiBmdW5jdGlvbi4gV2UgbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggdGhvc2UuIElmIGl0JiMzOTtzIGEgaG90IHBhdGgsIGxpc3RpbmcgaXQgaW4gYEZvY3VzU3ltYm9sc2AgbWlnaHQgc2tldyB0aGUgZnV6emluZyBkaXN0cmlidXRpb24sIHdoaWNoIHdlIHdhbnQgdG8gYXZvaWQuIFRoZSBkb2N1bWVudGF0aW9uIHNheXMsICYjMzQ7QXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuJiMzNDsKClNvLCBJIGNhbiBzdGlsbCBzYXkgdGhlIGNoYW5nZSBtYWtlcyBpdCBXb3J0aEZ1enppbmc9dHJ1ZSwgYnV0IEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGBGb2N1c1N5bWJvbHNgIGFyZSBlbXB0eS4gIFdlIGRvbiYjMzk7dCB3YW50IHRvIG92ZXItcHJpb3JpdGl6ZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmdXp6aW5nIHByb2Nlc3MuCgpMZXQmIzM5O3MgcXVpY2tseSBjaGVjayB0aGUgY29uZmlndXJhdGlvbi4gIGBuZXQvZXRoZXJuZXQvZXRoLmNgIGlzIGNvbXBpbGVkIHdoZW4gYENPTkZJR19FVEhFUk5FVGAgaXMgZW5hYmxlZCwgd2hpY2ggaXMgcHJldHR5IG11Y2ggZ3VhcmFudGVlZCBpbiBhbnkgYmFzaWMgc2V0dXAuIEkmIzM5O2xsIGRvdWJsZSBjaGVjayB0aGUgYG5ldC9ldGhlcm5ldC9NYWtlZmlsZWAganVzdCB0byBiZSBzdXJlIHRoZXJlJiMzOTtzIG5vdGhpbmcgZWxzZSBzcGVjaWZpYyB0aGF0IG1pZ2h0IGFmZmVjdCBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtldGgubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9ldGhlcm5ldC9NYWtlZmlsZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvZXRoZXJuZXQvTWFrZWZpbGUtNS1cbm5ldC9ldGhlcm5ldC9NYWtlZmlsZTo2Om9iai15XHRcdFx0XHRcdCYjNDM7PSBldGgub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3NjYKCQkJCQkJCW91dHB1dDogOTkKCQkJCQkJCXRob3VnaHRzOiAxNTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyB0aGUgRXRoZXJuZXQgUmVjZWl2ZSBQYXRoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgb2JqLXkgJiM0Mzs9IGV0aC5vYC4gVGhhdCBtZWFucyB0aGUgYGV0aGAgbW9kdWxlIGlzIGFsd2F5cyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIFJpZ2h0LCB0aGlzIG1ha2VzIGl0IGFuIGludGVyZXN0aW5nIHRhcmdldCBmb3IgZnV6emluZy4gR2l2ZW4gdGhlIGRlc2NyaXB0aW9uLCB0aGUgcGF0Y2ggaW50cm9kdWNlcyBhIGNoZWNrIHRvIGRpc2NhcmQgcGFja2V0cyB0aGF0IGFyZSB0b28gc2hvcnQsIGFuZCB0aGlzIHNvdW5kcyBsaWtlIGl0IGNvdWxkIHVuY292ZXIgc29tZSB2dWxuZXJhYmlsaXRpZXMuCgpOb3csIG15IG1pbmQgaXMgYWxyZWFkeSByYWNpbmcuIFNwZWNpZmljYWxseSwgYGV0aF90eXBlX3RyYW5zYCBnZXRzIGNhbGxlZCBmb3IgKmV2ZXJ5KiBFdGhlcm5ldCBwYWNrZXQgcmVjZWl2ZWQuIFRoYXQmIzM5O3MgYSBodWdlIGNvZGUgc3VyZmFjZSEgVGhlIGluaXRpYWwgdGhvdWdodCB3YXMsIHNob3VsZCB0aGlzIGJlIGluIGBGb2N1c1N5bWJvbHNgPyBIb3dldmVyLCB0aGF0IHdvdWxkIGFsbW9zdCBjZXJ0YWlubHkgc2tldyB0aGUgZnV6emluZyBkaXN0cmlidXRpb24gaGVhdmlseSB0b3dhcmRzIEV0aGVybmV0LCBhbmQgdGhhdCYjMzk7cyBub3Qgd2hhdCBJIHdhbnQuIFNvLCBgRm9jdXNTeW1ib2xzYCBuZWVkcyB0byBiZSBlbXB0eSBpbiB0aGlzIGNhc2UuIEFsc28sIGBFbmFibGVDb25maWdzYCBzaG91bGQgcHJvYmFibHkgYmUgZW1wdHkgdG9vLiBUaGUgY29yZSBvZiB0aGlzIGxvZ2ljIGlzIGluIHRoZSBldGhlcm5ldCByZWNlaXZlIHBhdGggd2hpY2ggaXMgZ2VuZXJpYy4KClNvLCB0aGUgcmVhc29uaW5nIGJvaWxzIGRvd24gdG8gdGhpczogVGhlIGNoYW5nZSBpbnRyb2R1Y2VzIGEgKmZ1bmN0aW9uYWwqIGNoZWNrIGluIGBldGhfdHlwZV90cmFuc2AuIEl0JiMzOTtzIGEgZnVuZGFtZW50YWwgY2hhbmdlIGluIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgcmVjZWl2ZWQgRXRoZXJuZXQgcGFja2V0cywgc28gZnV6emluZyBpcyBjZXJ0YWlubHkgd2FycmFudGVkLiBCdXQsIGJlY2F1c2UgYGV0aF90eXBlX3RyYW5zYCBpcyBhIGdlbmVyaWMsIGhvdC1wYXRoIGZ1bmN0aW9uLCBJIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIGhvdyBJIGNvbmZpZ3VyZSB0aGUgZnV6emluZyBwcm9jZXNzIHRvIGF2b2lkIHVuZHVlIGZvY3VzIG9uIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgY2hlY2sgdG8gZHJvcCBldGhlcm5ldCBmcmFtZXMgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGluIGV0aF90eXBlX3RyYW5zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgaW4gdGhlIGNvcmUgZXRoZXJuZXQgcmVjZWl2ZSBwYXRoLCBzbyBpdCBpcyB3b3J0aCBmdXp6aW5nLiBTaW5jZSBldGhfdHlwZV90cmFucyBpcyBhIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb24sIGl0IGlzIG5vdCBhZGRlZCB0byBGb2N1c1N5bWJvbHMgdG8gYXZvaWQgc2tld2luZyB0ZXN0IGRpc3RyaWJ1dGlvbnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjRtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgYSBsZW5ndGggY2hlY2sgYHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOYCBpbiBgZXRoX3R5cGVfdHJhbnMoKWAgdG8gcHJldmVudCBwcm9jZXNzaW5nIHBhY2tldHMgd2l0aCBhIGxpbmVhciBwYXJ0IHNob3J0ZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyICgxNCBieXRlcykuIFxuXG5XaXRob3V0IHRoaXMgY2hlY2ssIGlmIGEgdXNlciBpbmplY3RzIGEgc2hvcnQgbGluZWFyIHBhY2tldCAoZS5nLiwgMTAgYnl0ZXMpIHZpYSBhIFRVTi9UQVAgZGV2aWNlIG9yIGFuIEFGX1BBQ0tFVCByYXcgc29ja2V0LCBgZXRoX3R5cGVfdHJhbnMoKWAgY2FsbHMgYGV0aF9za2JfcHVsbF9tYWMoKWAuIGBldGhfc2tiX3B1bGxfbWFjKClgIGNhbGxzIGBza2JfcHVsbF9pbmxpbmUoc2tiLCBFVEhfSExFTilgLiBJZiBgc2tiLVx1MDAzZWxlbiBcdTAwM2MgRVRIX0hMRU5gLCBgc2tiX3B1bGxfaW5saW5lKClgIGZhaWxzIGFuZCByZXR1cm5zIGBOVUxMYCB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGBCVUdfT05gIG9yIGNyYXNoLiBgZXRoX3NrYl9wdWxsX21hYygpYCBpZ25vcmVzIHRoaXMgcmV0dXJuIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBgc2tiLVx1MDAzZWRhdGFgIHBvaW50ZXIuXG5cbmBldGhfdHlwZV90cmFucygpYCB0aGVuIHJlYWRzIGBldGgtXHUwMDNlaF9wcm90b2AgYXQgb2Zmc2V0IDEyLiBCZWNhdXNlIHRoZSBza2IgZGF0YSBidWZmZXIgaXMgdHlwaWNhbGx5IGFsbG9jYXRlZCB3aXRoIGEgbXVjaCBsYXJnZXIgc2l6ZSAoZS5nLiwgdmlhIGBrbWFsbG9jYCksIHRoaXMgcmVhZCBpcyB3ZWxsIHdpdGhpbiB0aGUgYWxsb2NhdGlvbiBib3VuZHMuIFRoZXJlZm9yZSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IGl0IGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cblxuSG93ZXZlciwgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIHVzZXItcHJvdmlkZWQgMTAgYnl0ZXMgaXMgdW5pbml0aWFsaXplZC4gS01TQU4gd2lsbCBkZXRlY3QgdGhpcyBhcyBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZ1cnRoZXJtb3JlLCB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUgaXMgc3RvcmVkIGluIGBza2ItXHUwMDNlcHJvdG9jb2xgLiBJZiB0aGUgcGFja2V0IGlzIGxhdGVyIHJlY2VpdmVkIGJ5IGFuIEFGX1BBQ0tFVCBzb2NrZXQsIGBza2ItXHUwMDNlcHJvdG9jb2xgIGlzIGNvcGllZCB0byBgc2xsX3Byb3RvY29sYCBpbiB0aGUgYHNvY2thZGRyX2xsYCBzdHJ1Y3R1cmUgYW5kIHJldHVybmVkIHRvIHVzZXIgc3BhY2UgdmlhIGByZWN2bXNnKClgLiBUaGlzIGNvbnN0aXR1dGVzIGEgZGlyZWN0IGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiAyIGJ5dGVzIG9mIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS5cblxuU2luY2UgdGhpcyBpc3N1ZSBkb2VzIG5vdCBjYXVzZSBhIGNyYXNoLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdHJpZ2dlciBhIGBCVUdfT05gIGZvciBsaW5lYXIgcGFja2V0cywgaXQgY2FuIE9OTFkgYmUgZGV0ZWN0ZWQgYnkgS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgM2VkNTUyYzBjNmNkYzY4MTY3ODBiMWNhNjhmOTljMzhjNWFiYTdkZApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDcgMTI6NTk6MTUgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmMKaW5kZXggZDlmYWFkYmU5YjZjOC4uODQ5MTQ3MDlhYzA2MSAxMDA2NDQKLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9ldGhlcm5ldC9ldGguYwpAQCAtMTYxLDYgJiM0MzsxNjEsMTIgQEAgX19iZTE2IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiAJc2tiLSZndDtkZXYgPSBkZXY7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAomIzQzOwlpZiAodW5saWtlbHkoc2tiX2hlYWRsZW4oc2tiKSAmbHQ7IEVUSF9ITEVOKSkgewomIzQzOwkJbmV0X3dhcm5fcmF0ZWxpbWl0ZWQoJiMzNDslczogZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGZyb20gJXNcbiYjMzQ7LAomIzQzOwkJCQkgICAgIF9fZnVuY19fLCBkZXYtJmd0O25hbWUpOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAlldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7CiAJZXRoX3NrYl9wa3RfdHlwZShza2IsIGRldik7CiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAzMQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDU0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEV0aGVybmV0IEZyYW1lIExlbmd0aCBDaGVjayoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IGFkZHMgYSBjaGVjayBpbiBgZXRoX3R5cGVfdHJhbnNgIGZvciB0aGUgaGVhZCBsZW5ndGggb2YgYW4gYHNrYmAuIFNwZWNpZmljYWxseSwgYGlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpICZsdDsgRVRIX0hMRU4pKWAuICBUaGUgaWRlYSBpcyB0byBkcm9wIHRoZSBmcmFtZSBpZiB0aGUgaGVhZCBsZW5ndGggaXMgc21hbGxlciB0aGFuIGBFVEhfSExFTmAuICBNeSBpbml0aWFsIHRob3VnaHQgaXMsIHRoaXMgaXMgYSBib3VuZHMgY2hlY2ssIHJpZ2h0PyAgUHJldmVudGluZyBhbiBvdXQtb2YtYm91bmRzIGFjY2VzcyB3aGVuIGBldGhfc2tiX3B1bGxfbWFjKHNrYilgIGlzIGNhbGxlZCBsYXRlci4gIFdlIHB1bGwgdGhlIE1BQyBoZWFkZXIsIGFuZCBpZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbCwgYm9vbSwgT09CIHJlYWQuCgpJIHN0YXJ0IHRvIHdvbmRlciBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeSwgdGhvdWdoLiAgSWYgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gLCBpcyB0aGVyZSBhIHJpc2sgdGhhdCBgZXRoX3NrYl9wdWxsX21hY2AgbWlnaHQgdHJ5IHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnk/ICBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0aGF0IGlmIGl0JiMzOTtzICp0aGF0KiBzbWFsbCwgaXQmIzM5O3MgYW4gT09CIHJlYWQsIGFuZCBLQVNBTiB3aWxsIGZsYWcgdGhhdC4gSG93ZXZlciwgbWF5YmUgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgbGFyZ2VyLCBidXQgdGhlIGFjdHVhbCBwYWNrZXQgbGVuZ3RoIGlzIHNtYWxsZXI/ICBDb3VsZCB0aGVyZSBiZSBhIHNjZW5hcmlvIHdoZXJlIGl0JiMzOTtzIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBidXQgYmV5b25kIGBza2ItJmd0O2xlbmAgYW5kIHdlIGVuZCB1cCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgcGFkZGluZz8gIEJ1dCB3YWl0LCBLTVNBTiBpcyBkZXNpZ25lZCB0byBjYXRjaCB1bmluaXRpYWxpemVkIG1lbW9yeSwgcmlnaHQ/ICBLQVNBTiBoYW5kbGVzIHRoZSBPT0Igc3R1ZmYuIFRoaXMgcGF0Y2ggc2VlbXMgdG8gYmUgYWJvdXQgcHJldmVudGluZyByZWFkaW5nIGJleW9uZCB0aGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwYXJ0IG9mIHRoZSBgc2tiYCYjMzk7cyBoZWFkLgoKTGV0JiMzOTtzIGRpdmUgaW50byBgZXRoX3NrYl9wdWxsX21hY2AuICBBaCwgaXQgY2FsbHMgYHNrYl9wdWxsX2lubGluZShza2IsIEVUSF9ITEVOKWAuICBJZiBgc2tiLSZndDtsZW5gIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gLCBzb21ldGhpbmcgKmJhZCogbWlnaHQgaGFwcGVuLCBvciB3ZSBlbmQgdXAgcmVhZGluZyBgZXRoLSZndDtoX3Byb3RvYCB3aGljaCBpcyB0ZWNobmljYWxseSBvdXQtb2YtYm91bmRzIG9mIHRoZSBsaW5lYXIgcG9ydGlvbi4gSWYgaXQmIzM5O3MgKmJleW9uZCogdGhlIGFsbG9jYXRlZCBwYXJ0LCBLQVNBTiB3aWxsIGNhdGNoIHRoYXQuIEJ1dCB3aGF0IGlmIGl0JiMzOTtzIHdpdGhpbiB0aGUgYWxsb2NhdGlvbiwgYnV0IHBhc3QgdGhlIGFjdHVhbCBwYWNrZXQgZGF0YSAoYHNrYi0mZ3Q7bGVuYCk/IEtBU0FOIG1pZ2h0IG5vdCBjYXRjaCB0aGF0LCB1bmxlc3MgaXRzIHNrYiBpbnRlZ3JhdGlvbiBpcyBtb3JlIGV4dGVuc2l2ZS4gS01TQU4sIGhvd2V2ZXIsICpzaG91bGQqIGNhdGNoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlmIHdlJiMzOTtyZSByZWFkaW5nIHBhc3QgdGhlIHZhbGlkIGRhdGEuIFRoZSBtZW1vcnkgdGhlcmUgaXMgbGlrZWx5IHVuaW5pdGlhbGl6ZWQuCgpTbywgaXMgdGhpcyBwYXRjaCBwcmltYXJpbHkgYWJvdXQgcHJldmVudGluZyBPT0IgcmVhZHMgb3IgY2F0Y2hpbmcgdW5pbml0aWFsaXplZCBtZW1vcnk/IFRoZSBjb21taXQgbWVzc2FnZSBzYXlzICYjMzQ7ZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0JiMzNDsuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIE9PQiBpc3N1ZS4gYHNrYl9oZWFkbGVuKHNrYikgJmx0OyBFVEhfSExFTmAgbWVhbnMgdGhlIGxpbmVhciBwYXJ0IGlzIHRvbyBzaG9ydC4gSXQmIzM5O3MgYW4gT09CIHJlYWQvd3JpdGUuIEkgc2hvdWxkIHJlYWxseSBnbyBiYWNrIGFuZCBjaGVjayB0aGUgYGV0aF90eXBlX3RyYW5zYCBjb2RlIGl0c2VsZiBpbiBgbmV0L2V0aGVybmV0L2V0aC5jYCB0byBiZSBjb21wbGV0ZWx5IHN1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF9za2JfcHVsbF9tYWMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvZXRoZXJuZXQvZXRoLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2V0aGVybmV0L2V0aC5jPTE1NT1fX2JlMTYgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbi0tXG5uZXQvZXRoZXJuZXQvZXRoLmMtMTY5LVxubmV0L2V0aGVybmV0L2V0aC5jOjE3MDpcdGV0aCA9IGV0aF9za2JfcHVsbF9tYWMoc2tiKTtcbm5ldC9ldGhlcm5ldC9ldGguYy0xNzEtXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM1NQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgY29kZToKCioqRGl2aW5nIGludG8gdGhlIEV0aGVybmV0IFR5cGUgVHJhbnNsYXRvcioqCgpBbHJpZ2h0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgRXRoZXJuZXQgdHlwZXMgYXJlIGJlaW5nIGhhbmRsZWQuIExldCYjMzk7cyBzdGFydCBieSBkaWdnaW5nIGludG8gYGV0aF90eXBlX3RyYW5zYCB3aXRoaW4gYG5ldC9ldGhlcm5ldC9ldGguY2AuIFRoYXQgZnVuY3Rpb24mIzM5O3MgbGlrZWx5IHRoZSBrZXkgdG8gZmlndXJpbmcgb3V0IGhvdyByYXcgRXRoZXJuZXQgZnJhbWVzIGFyZSBjbGFzc2lmaWVkIGFuZCBwcm9jZXNzZWQsIEkmIzM5O20gdGhpbmtpbmcuIEkmIzM5O20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIGhvdyBpdCBtYXBzIEV0aGVyVHlwZSB2YWx1ZXMgdG8gcHJvdG9jb2wgaGFuZGxlcnM7IHVuZGVyc3RhbmRpbmcgdGhhdCB3aWxsIGJlIGNydWNpYWwgZm9yIGFueSBpbi1kZXB0aCBhbmFseXNpcyBvZiBFdGhlcm5ldCBmcmFtZSBwcm9jZXNzaW5nLiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBpbnB1dCBhcmd1bWVudHMsIHJldHVybiB2YWx1ZXMsIGFuZCBhbnkgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGl0IHVzZXMgdG8gbWFrZSB0aGVzZSBjcnVjaWFsIHRyYW5zbGF0aW9uIGRlY2lzaW9ucy4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvZXRoZXJuZXQvZXRoLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE1MDpcdCAqXG4gMTUxOlx0ICogVGhlIHJ1bGUgaGVyZSBpcyB0aGF0IHdlXG4gMTUyOlx0ICogYXNzdW1lIDgwMi4zIGlmIHRoZSB0eXBlIGZpZWxkIGlzIHNob3J0IGVub3VnaCB0byBiZSBhIGxlbmd0aC5cbiAxNTM6XHQgKiBUaGlzIGlzIG5vcm1hbCBwcmFjdGljZSBhbmQgd29ya3MgZm9yIGFueSAmIzM5O25vdyBpbiB1c2UmIzM5OyBwcm90b2NvbC5cbiAxNTQ6XHQgKi9cbiAxNTU6XHRfX2JlMTYgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbiAxNTY6XHR7XG4gMTU3Olx0XHRjb25zdCB1bnNpZ25lZCBzaG9ydCAqc2FwO1xuIDE1ODpcdFx0Y29uc3Qgc3RydWN0IGV0aGhkciAqZXRoO1xuIDE1OTpcdFx0X19iZTE2IHJlcztcbiAxNjA6XHRcbiAxNjE6XHRcdHNrYi1cdTAwM2VkZXYgPSBkZXY7XG4gMTYyOlx0XHRza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpO1xuIDE2MzpcdFxuIDE2NDpcdFx0aWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOKSkge1xuIDE2NTpcdFx0XHRuZXRfd2Fybl9yYXRlbGltaXRlZChcJiMzNDslczogZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGZyb20gJXNcXG5cJiMzNDssXG4gMTY2Olx0XHRcdFx0XHQgICAgIF9fZnVuY19fLCBkZXYtXHUwMDNlbmFtZSk7XG4gMTY3Olx0XHRcdHJldHVybiAwO1xuIDE2ODpcdFx0fVxuIDE2OTpcdFxuIDE3MDpcdFx0ZXRoID0gZXRoX3NrYl9wdWxsX21hYyhza2IpO1xuIDE3MTpcdFx0ZXRoX3NrYl9wa3RfdHlwZShza2IsIGRldik7XG4gMTcyOlx0XG4gMTczOlx0XHQvKlxuIDE3NDpcdFx0ICogU29tZSB2YXJpYW50cyBvZiBEU0EgdGFnZ2luZyBkb24mIzM5O3QgaGF2ZSBhbiBldGhlcnR5cGUgZmllbGRcbiAxNzU6XHRcdCAqIGF0IGFsbCwgc28gd2UgY2hlY2sgaGVyZSB3aGV0aGVyIG9uZSBvZiB0aG9zZSB0YWdnaW5nXG4gMTc2Olx0XHQgKiB2YXJpYW50cyBoYXMgYmVlbiBjb25maWd1cmVkIG9uIHRoZSByZWNlaXZpbmcgaW50ZXJmYWNlLFxuIDE3NzpcdFx0ICogYW5kIGlmIHNvLCBzZXQgc2tiLVx1MDAzZXByb3RvY29sIHdpdGhvdXQgbG9va2luZyBhdCB0aGUgcGFja2V0LlxuIDE3ODpcdFx0ICovXG4gMTc5Olx0XHRpZiAodW5saWtlbHkobmV0ZGV2X3VzZXNfZHNhKGRldikpKVxuIDE4MDpcdFx0XHRyZXR1cm4gaHRvbnMoRVRIX1BfWERTQSk7XG4gMTgxOlx0XG4gMTgyOlx0XHRpZiAobGlrZWx5KGV0aF9wcm90b19pc184MDJfMyhldGgtXHUwMDNlaF9wcm90bykpKVxuIDE4MzpcdFx0XHRyZXR1cm4gZXRoLVx1MDAzZWhfcHJvdG87XG4gMTg0Olx0XG4gMTg1Olx0XHQvKlxuIDE4NjpcdFx0ICogICAgICBUaGlzIGlzIGEgbWFnaWMgaGFjayB0byBzcG90IElQWCBwYWNrZXRzLiBPbGRlciBOb3ZlbGwgYnJlYWtzXG4gMTg3Olx0XHQgKiAgICAgIHRoZSBwcm90b2NvbCBkZXNpZ24gYW5kIHJ1bnMgSVBYIG92ZXIgODAyLjMgd2l0aG91dCBhbiA4MDIuMiBMTENcbiAxODg6XHRcdCAqICAgICAgbGF5ZXIuIFdlIGxvb2sgZm9yIEZGRkYgd2hpY2ggaXNuJiMzOTt0IGEgdXNlZCA4MDIuMiBTU0FQL0RTQVAuIFRoaXNcbiAxODk6XHRcdCAqICAgICAgd29uJiMzOTt0IHdvcmsgZm9yIGZhdWx0IHRvbGVyYW50IG5ldHdhcmUgYnV0IGRvZXMgZm9yIHRoZSByZXN0LlxuIDE5MDpcdFx0ICpcdFdlIHVzZSBza2ItXHUwMDNlZGV2IGFzIHRlbXBvcmFyeSBzdG9yYWdlIHRvIG5vdCBoaXRcbiAxOTE6XHRcdCAqXHRDT05GSUdfU1RBQ0tQUk9URUNUT1JfU1RST05HPXkgY29zdHMgb24gc29tZSBwbGF0Zm9ybXMuXG4gMTkyOlx0XHQgKi9cbiAxOTM6XHRcdHNhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZigqc2FwKSwgXHUwMDI2c2tiLVx1MDAzZWRldik7XG4gMTk0Olx0XHRyZXMgPSAoc2FwIFx1MDAyNlx1MDAyNiAqc2FwID09IDB4RkZGRikgPyBodG9ucyhFVEhfUF84MDJfMykgOiBodG9ucyhFVEhfUF84MDJfMik7XG4gMTk1Olx0XG4gMTk2Olx0XHQvKiByZXN0b3JlIHNrYi1cdTAwM2VkZXYgaW4gY2FzZSBpdCB3YXMgbWFuZ2xlZCBieSBza2JfaGVhZGVyX3BvaW50ZXIoKS4gKi9cbiAxOTc6XHRcdHNrYi1cdTAwM2VkZXYgPSBkZXY7XG4gMTk4Olx0XHRyZXR1cm4gcmVzO1xuIDE5OTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTI6NTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDQ0OQoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDM2NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgS2VybmVsIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGltbWVkaWF0ZWx5IHNlZSBhIHBvdGVudGlhbCBpc3N1ZSB3aXRoIGBldGhfc2tiX3B1bGxfbWFjYC4gSXQgc2VlbXMgbGlrZSB0aGUgZnVuY3Rpb24gaXMgZ3VhcmRlZCBhZ2FpbnN0IHB1bGxpbmcgdG9vIG11Y2ggZGF0YSwgc3BlY2lmaWNhbGx5IG1vcmUgdGhhbiB3aGF0JiMzOTtzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgYHNrYmAmIzM5O3MgaGVhZC4gSG93ZXZlciwgaWYgdGhlIGhlYWQgbGVuZ3RoIGlzIGFjdHVhbGx5ICpsZXNzKiB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoIChgRVRIX0hMRU5gKSwgaXQgd2lsbCB0cnkgdG8gcHVsbCBgRVRIX0hMRU5gIGJ5dGVzIGFueXdheS4gVGhpcyBtZWFucyBgc2tiLSZndDtkYXRhYCB3b3VsZCBnZXQgYWR2YW5jZWQgcGFzdCB0aGUgZW5kIG9mIHRoZSB2YWxpZCBsaW5lYXIgZGF0YSAob3IsIGF0IHRoZSB2ZXJ5IGxlYXN0LCBwb3RlbnRpYWxseSBwYXN0IGBza2ItJmd0O3RhaWxgKS4gVGhlbiwgdGhpcyBjb2RlIGF0dGVtcHRzIHRvIGFjY2VzcyBgZXRoLSZndDtoX3Byb3RvYC4gVGhpcyBmaWVsZCBpcyBhdCBhbiBvZmZzZXQgb2YgMTIgYnl0ZXMgd2l0aGluIHRoZSBFdGhlcm5ldCBoZWFkZXIuCgpJZiB0aGUgbGluZWFyIHBvcnRpb24gb2YgdGhlIGBza2JgIGlzIHNob3J0ZXIgdGhhbiAxNCBieXRlcywgdGhpcyBhY2Nlc3MgdG8gYGV0aC0mZ3Q7aF9wcm90b2Agd2lsbCBjYXVzZSBhbiBvdXQtb2YtYm91bmRzIHJlYWQuIENydWNpYWxseSwgSSYjMzk7bSB0aGlua2luZywgdGhpcyBtaWdodCAqbm90KiBpbW1lZGlhdGVseSBjcmFzaC4gSWYgdGhlIGBza2JgJiMzOTtzIGRhdGEgYnVmZmVyIHdhcyBhbGxvY2F0ZWQgd2l0aCBzb21lIHNsYWNrIChhbmQgaXQgdXN1YWxseSBpcywgZ2l2ZW4gbWluaW11bSBhbGxvY2F0aW9uIHNpemVzKSwgdGhlIG91dC1vZi1ib3VuZHMgcmVhZCBtaWdodCBoaXQgdmFsaWQgbWVtb3J5LCBub3QgYW4gdW5tYXBwZWQgcGFnZS4gU28sIHdlJiMzOTtyZSBub3QgZ3VhcmFudGVlZCBhIHBhZ2UgZmF1bHQuCgpCdXQsIHdvdWxkIEtBU0FOIGNhdGNoIHRoaXM/IEtBU0FOIGlzIHN1cHBvc2VkIHRvIHRyYWNrIG1lbW9yeSBhbGxvY2F0aW9ucy4gSWYgdGhlIHNrYiBidWZmZXIgd2FzIGFsbG9jYXRlZCB1c2luZyBga21hbGxvY2AsIEtBU0FOIHNob3VsZCBrbm93IGl0cyBzaXplLiBJJiMzOTttIHRoaW5raW5nIHRob3VnaCwgYHNrYi0mZ3Q7ZGF0YWAgbWlnaHQgYmUgd2l0aGluIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBidXQgdGhlIHZhbGlkIGRhdGEgb25seSBnb2VzIHVwIHRvIGBza2JfaGVhZGxlbihza2IpYC4gVGhlIGJ5dGVzIGJleW9uZCB0aGF0LCB1cCB0byB0aGUgZW5kIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBhcmUgZWl0aGVyIHVuaW5pdGlhbGl6ZWQgb3IgY29udGFpbiBvbGQgZGF0YS4gQWgsIHdhaXQgYSBtaW51dGUsIGRvZXNuJiMzOTt0IEtBU0FOIGRvIHNvbWUgc3BlY2lhbCBoYW5kbGluZyBmb3Igc2ticz8gRG9lc24mIzM5O3QgaXQgaGF2ZSBhbm5vdGF0aW9ucyBmb3Igc2ticz8KClllcyEgS0FTQU4gcG9pc29ucyB0aGUgdW51c2VkIHBhcnQgb2Ygc2tiIGRhdGEuIFNvLCBsZXQmIzM5O3MgY29uZmlybSB3aGV0aGVyIEtBU0FOIHBvaXNvbnMgc2tiIGRhdGEuIFRoaXMgaXMga2V5IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IHdvdWxkIGZsYWcgdGhpcyBwb3RlbnRpYWxseSBvdXQgb2YgYm91bmRzIHJlYWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2thc2FuXy4qc2tiJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9jb3JlL3NrYnVmZi5jPTI4ND1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpuYXBpX3NrYl9jYWNoZV9nZXQoYm9vbCBhbGxvYylcbi0tXG5uZXQvY29yZS9za2J1ZmYuYy0zMDUtXHRsb2NhbF91bmxvY2tfbmVzdGVkX2JoKFx1MDAyNm5hcGlfYWxsb2NfY2FjaGUuYmhfbG9jayk7XG5uZXQvY29yZS9za2J1ZmYuYzozMDY6XHRrYXNhbl9tZW1wb29sX3VucG9pc29uX29iamVjdChza2IsIHNrYnVmZl9jYWNoZV9zaXplKTtcbm5ldC9jb3JlL3NrYnVmZi5jLTMwNy1cbi0tXG5uZXQvY29yZS9za2J1ZmYuYz0zNDQ9dTMyIG5hcGlfc2tiX2NhY2hlX2dldF9idWxrKHZvaWQgKipza2JzLCB1MzIgbilcbi0tXG5uZXQvY29yZS9za2J1ZmYuYy0zNzgtXG5uZXQvY29yZS9za2J1ZmYuYzozNzk6XHRcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KHNrYnNbaV0sIHNrYnVmZl9jYWNoZV9zaXplKTtcbm5ldC9jb3JlL3NrYnVmZi5jLTM4MC1cdFx0c2tidWZmX2NsZWFyKHNrYnNbaV0pO1xuLS1cbm5ldC9jb3JlL3NrYnVmZi5jPTE0NjQ9c3RhdGljIHZvaWQgbmFwaV9za2JfY2FjaGVfcHV0KHN0cnVjdCBza19idWZmICpza2IpXG4tLVxubmV0L2NvcmUvc2tidWZmLmMtMTQ2Ny1cbm5ldC9jb3JlL3NrYnVmZi5jOjE0Njg6XHRpZiAoIWthc2FuX21lbXBvb2xfcG9pc29uX29iamVjdChza2IpKVxubmV0L2NvcmUvc2tidWZmLmMtMTQ2OS1cdFx0cmV0dXJuO1xuLS1cbm5ldC9jb3JlL3NrYnVmZi5jLTE0NzctXHRcdGZvciAoaSA9IHJlbWFpbmluZzsgaSBcdTAwM2MgTkFQSV9TS0JfQ0FDSEVfU0laRTsgaSYjNDM7JiM0MzspXG5uZXQvY29yZS9za2J1ZmYuYzoxNDc4Olx0XHRcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KG5jLVx1MDAzZXNrYl9jYWNoZVtpXSxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NzktXHRcdFx0XHRcdFx0c2tidWZmX2NhY2hlX3NpemUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMjo1OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NzUwCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogNjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS0FTQU4mIzM5O3MgUm9sZSBpbiBza19idWZmIFBvaXNvbmluZyoqCgpPa2F5LCBob2xkIG9uIGEgc2Vjb25kLiBJIG5lZWQgdG8gY2xhcmlmeSBzb21ldGhpbmcgYWJvdXQgYGthc2FuX21lbXBvb2xfcG9pc29uX29iamVjdGAuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGlzIHBvaXNvbnMgdGhlICpgc2tfYnVmZmAgc3RydWN0KiBpdHNlbGYgd2hlbiBpdCYjMzk7cyBhbGxvY2F0ZWQgZnJvbSBhIG1lbXBvb2wuIEJ1dCBpcyBLQVNBTiBhbHNvIHVzZWQgdG8gcG9pc29uIHRoZSAqZGF0YSBidWZmZXIqIHRoYXQmIzM5O3MgYXR0YWNoZWQgdG8gdGhlIGBza19idWZmYD8gVGhhdCYjMzk7cyB0aGUgY3J1Y2lhbCBwb2ludC4gSSBuZWVkIHRvIHZlcmlmeSBob3cgbWVtb3J5IGNvcnJ1cHRpb24gaXMgaGFuZGxlZCB3aXRoIHRoZSBkYXRhIGJ1ZmZlci4KCkxldCBtZSBxdWlja2x5IGRpdmUgaW50byBgbmV0L2NvcmUvc2tidWZmLmNgIGFuZCBodW50IGZvciBjYWxscyB0byBga2FzYW5fcG9pc29uYCBvciBhbnl0aGluZyBzaW1pbGFyIHRoYXQgaGFuZGxlcyBkYXRhIHBvaXNvbmluZyB3aXRoaW4gdGhlIGBza19idWZmYCYjMzk7cyBjb250ZXh0LiBUaGF0JiMzOTtzIHRoZSBtb3N0IGxpa2VseSBwbGFjZSB0byBmaW5kIHRoZSBhbnN3ZXIuIEl0JiMzOTtzIGEga2V5IGRldGFpbCBmb3IgY29ycmVjdGx5IGFzc2Vzc2luZyBwb3RlbnRpYWwgbWVtb3J5IGlzc3VlcyBhbmQgdnVsbmVyYWJpbGl0aWVzIGhlcmUuIEkmIzM5O20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGlmIHRoZXJlJiMzOTtzIGFueSBkaXN0aW5jdGlvbiBiZXR3ZWVuIG1lbXBvb2wtYWxsb2NhdGVkIGFuZCBvdGhlciBgc2tiYCBhbGxvY2F0aW9ucyB3aXRoIHJlc3BlY3QgdG8gS0FTQU4gcG9pc29uaW5nIG9mIHRoZSBkYXRhLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMjo1OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrYXNhbi4qcG9pc29uJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L2NvcmUvc2tidWZmLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2NvcmUvc2tidWZmLmM9Mjg0PXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm5hcGlfc2tiX2NhY2hlX2dldChib29sIGFsbG9jKVxuLS1cbm5ldC9jb3JlL3NrYnVmZi5jLTMwNS1cdGxvY2FsX3VubG9ja19uZXN0ZWRfYmgoXHUwMDI2bmFwaV9hbGxvY19jYWNoZS5iaF9sb2NrKTtcbm5ldC9jb3JlL3NrYnVmZi5jOjMwNjpcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KHNrYiwgc2tidWZmX2NhY2hlX3NpemUpO1xubmV0L2NvcmUvc2tidWZmLmMtMzA3LVxuLS1cbm5ldC9jb3JlL3NrYnVmZi5jPTM0ND11MzIgbmFwaV9za2JfY2FjaGVfZ2V0X2J1bGsodm9pZCAqKnNrYnMsIHUzMiBuKVxuLS1cbm5ldC9jb3JlL3NrYnVmZi5jLTM3OC1cbm5ldC9jb3JlL3NrYnVmZi5jOjM3OTpcdFx0a2FzYW5fbWVtcG9vbF91bnBvaXNvbl9vYmplY3Qoc2tic1tpXSwgc2tidWZmX2NhY2hlX3NpemUpO1xubmV0L2NvcmUvc2tidWZmLmMtMzgwLVx0XHRza2J1ZmZfY2xlYXIoc2tic1tpXSk7XG4tLVxubmV0L2NvcmUvc2tidWZmLmM9MTQ2ND1zdGF0aWMgdm9pZCBuYXBpX3NrYl9jYWNoZV9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvY29yZS9za2J1ZmYuYy0xNDY3LVxubmV0L2NvcmUvc2tidWZmLmM6MTQ2ODpcdGlmICgha2FzYW5fbWVtcG9vbF9wb2lzb25fb2JqZWN0KHNrYikpXG5uZXQvY29yZS9za2J1ZmYuYy0xNDY5LVx0XHRyZXR1cm47XG4tLVxubmV0L2NvcmUvc2tidWZmLmMtMTQ3Ny1cdFx0Zm9yIChpID0gcmVtYWluaW5nOyBpIFx1MDAzYyBOQVBJX1NLQl9DQUNIRV9TSVpFOyBpJiM0MzsmIzQzOylcbm5ldC9jb3JlL3NrYnVmZi5jOjE0Nzg6XHRcdFx0a2FzYW5fbWVtcG9vbF91bnBvaXNvbl9vYmplY3QobmMtXHUwMDNlc2tiX2NhY2hlW2ldLFxubmV0L2NvcmUvc2tidWZmLmMtMTQ3OS1cdFx0XHRcdFx0XHRza2J1ZmZfY2FjaGVfc2l6ZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEyOjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY1MjMKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0NjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4mIzM5O3MgUG90ZW50aWFsIEFkdmFudGFnZSBpbiBTS0IgRGF0YSBIYW5kbGluZyoqCgpPa2F5LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IGhvdyBLQVNBTiBhbmQgS01TQU4gaW50ZXJhY3Qgd2l0aCBTS0IgZGF0YSBidWZmZXJzLCBhbmQgc29tZXRoaW5nIHNlZW1zIHRvIGJlIGNsaWNraW5nLiBJbml0aWFsbHksIGl0IHNlZW1lZCBsaWtlIEtBU0FOIG1pZ2h0IG1pc3MgZXJyb3JzIHdoZW4gcmVhZGluZyBwYXN0IGBza2ItJmd0O3RhaWxgIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciwgYXMgaXQgb25seSBjaGVja3MgdGhlIG92ZXJhbGwgYWxsb2NhdGlvbiBzaXplLiBCdXQgdGhlbiBJIHJlbWVtYmVyZWQgS01TQU4mIzM5O3Mgcm9sZSBpbiBkZXRlY3RpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpJZiB0aGUgYHNrYi0mZ3Q7ZGF0YWAgYnVmZmVyIGlzIGFsbG9jYXRlZCB1c2luZyBga21hbGxvY2AgdGhlbiBLQVNBTiB3aWxsIHBvaXNvbiBwYXN0IHRoZSByZXF1ZXN0ZWQgc2l6ZSwgYnV0IHRoZSBpbXBvcnRhbnQgcG9pbnQgaGVyZSBpcyB0aGF0IHdoZW4gcmVhZGluZyBiZXlvbmQgYHNrYi0mZ3Q7dGFpbGAsIHdlJiMzOTtyZSBwb3RlbnRpYWxseSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCByaWdodD8gQW5kIEtNU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBjYXRjaCB0aGF0ISBJZiBpdCYjMzk7cyBhIG5ldyBhbGxvY2F0aW9uLCBLTVNBTiBzaG91bGQgbmFpbCBpdCwgc2luY2UgdGhlIGJ1ZmZlciB3aWxsIGJlIHVuaW5pdGlhbGl6ZWQuIFRob3VnaCwgaWYgdGhlIGJ1ZmZlciBpcyBiZWluZyByZXVzZWQsIEtNU0FOICptaWdodCogbWlzcyBpdCBzaW5jZSBpdCBvbmx5IHRyYWNrcyBpbml0aWFsaXphdGlvbiBhdCBhbGxvY2F0aW9uLgoKVGhpbmtpbmcgc3BlY2lmaWNhbGx5IGFib3V0IHRoZSByZWNlaXZlIHBhdGggYW5kIGhvdyBgZXRoX3R5cGVfdHJhbnNgIGZpdHMgaW4uIFRoZSBkcml2ZXIgZ3JhYnMgYSBidWZmZXIsIHJlY2VpdmVzIGEgcGFja2V0LCBhbmQgc2V0cyBgc2tiLSZndDtsZW5gLiBBbnl0aGluZyBiZXlvbmQgdGhhdCBpcyBlc3NlbnRpYWxseSAmIzM0O2dhcmJhZ2UmIzM0OyBsZWZ0IG92ZXIgZnJvbSB0aGUgcHJldmlvdXMgdXNlLCBvciBwYWRkaW5nIG5vdCB3cml0dGVuIGJ5IHRoZSBkZXZpY2UuIElmIERNQSBpcyB1c2VkLCB0aGUgZGV2aWNlIHdpbGwgd3JpdGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLCBhbmQgS01TQU4gd2lsbCB1bnBvaXNvbiB0aGF0IG1lbW9yeSwgYnV0IHRoZSByZXN0IHJlbWFpbnMgcG9pc29uZWQsIGhlbmNlIHVuaW5pdGlhbGl6ZWQsIHJpZ2h0PwoKU28sIGlmIGBldGhfdHlwZV90cmFuc2AgYXR0ZW1wdHMgdG8gcmVhZCwgc2F5LCBgZXRoLSZndDtoX3Byb3RvYCBiZXlvbmQgdGhlIHJlY2VpdmVkIGxlbmd0aCAoaS5lLiBiZXlvbmQgYHNrYi0mZ3Q7bGVuYCksIGl0IHNob3VsZCB0cmlnZ2VyIGEgS01TQU4gd2FybmluZywgc2luY2UgaXQmIzM5O3MgYW4gdW5pbml0aWFsaXplZCByZWFkISBUaGF0JiMzOTtzIGEgZ29vZCBmaW5kIQoKTm93LCBpcyB0aGlzIGEgS01TQU4tc3BlY2lmaWMgaXNzdWU/IFllcywgYmVjYXVzZSBLQVNBTiBpcyBsaWtlbHkgbm90IGdvaW5nIHRvIGNhdGNoIGl0LCBnaXZlbiB0aGUgbWVtb3J5IGFjY2VzcyBpcyB3aXRoaW4gdGhlIGFsbG9jYXRlZCBib3VuZHMuIEtBU0FOIGRvZXNuJiMzOTt0IGhhdmUgdGhlIHNhbWUgY29uY2VwdCBvZiAmIzM5O2xvZ2ljYWwmIzM5OyBzaXplLCBvbmx5IHRoZSBhbGxvY2F0ZWQgc2l6ZS4gSXQgbG9va3MgbGlrZSBpdCBib2lscyBkb3duIHRvIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpMZXQgbWUganVzdCBkb3VibGUtY2hlY2ssIGJ1dCBJIGRvbiYjMzk7dCBiZWxpZXZlIEtBU0FOIGhhcyB0aGUgYWJpbGl0eSB0byBwb2lzb24gU0tCIGRhdGEsIGJ1dCB0aGVyZSYjMzk7cyBhIHBhdGNoIHNlcmllcyBjYWxsZWQgJiMzNDtrYXNhbjogYWRkIHNrYiBkYXRhIHBvaXNvbmluZyYjMzQ7LiBJJiMzOTtsbCBoYXZlIHRvIGNoZWNrIGlmIHRoYXQgbGFuZGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2thc2FuLipza2ImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L3NrYnVmZi5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzUyNQoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBzdW1tYXJpemVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgYSBzZWFzb25lZCBwcm9mZXNzaW9uYWw6CgoqKkRpZ2dpbmcgaW50byBQb3RlbnRpYWwgS0FTQU4gSXNzdWVzIHdpdGggU0tCcyoqCgpBbHJpZ2h0LCB0aGUgaW5pdGlhbCBzY2FuIGZvciBga2FzYW4uKnNrYmAgaW4gYGluY2x1ZGUvbGludXgvc2tidWZmLmhgIGRpZG4mIzM5O3QgeWllbGQgYW55IGRpcmVjdCBoaXRzLiBUaGF0JiMzOTtzIG5vdCBlbnRpcmVseSB1bmV4cGVjdGVkLCBzb21ldGltZXMgdGhlc2UgdGhpbmdzIGFyZSBzdWJ0bHkgbmFtZWQgb3IgaW1wbGVtZW50ZWQgYWNyb3NzIG11bHRpcGxlIGZpbGVzLiBTbywgdGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGRpdmUgZGVlcGVyIGFuZCBzZWUgaWYgS0FTQU4gKEtlcm5lbCBBZGRyZXNzIFNhbml0aXplcikgaXMgYmVpbmcgdXRpbGl6ZWQgdG8gZGV0ZWN0IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiBwcm9ibGVtcyBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBkYXRhIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIGBza2JgIChzb2NrZXQgYnVmZmVyKSBzdHJ1Y3R1cmVzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGVyZSBpcyBhbnkgS0FTQU4gcG9pc29uaW5nIGJlaW5nIGFwcGxpZWQgdG8gdGhlIHNrYiBkYXRhLiBJJiMzOTttIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBjbHVlcyB0aGVyZSB0byBkZXRlcm1pbmUgd2hldGhlciBLQVNBTiBpcyBiZWluZyBhY3RpdmVseSBsZXZlcmFnZWQgdG8gZW5zdXJlIHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBjcml0aWNhbCBuZXR3b3JraW5nIGRhdGEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2FzYW5fcG9pc29uLipza2ImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3NzkwCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNTgzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IGluIE5ldHdvcmsgUGFja2V0IFByb2Nlc3NpbmcqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gaG93IG5ldHdvcmsgZHJpdmVycyBoYW5kbGUgcGFja2V0IGRhdGEgYW5kIGhvdyBtZW1vcnkgc2FuaXRpemVycyBjb21lIGludG8gcGxheS4gSXQgc2VlbXMgS0FTQU4gaXNuJiMzOTt0IHRoZSBzaWx2ZXIgYnVsbGV0IGhlcmUsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJdCBkb2VzbiYjMzk7dCBjYXRjaCByZWFkcyBiZXlvbmQgYHNrYi0mZ3Q7dGFpbGAgb3IgYHNrYl9oZWFkbGVuYCBidXQgKndpdGhpbiogdGhlIGFsbG9jYXRlZCBidWZmZXIuIEtNU0FOLCBob3dldmVyLCAqZG9lcyogY2F0Y2ggaXQsIGJlY2F1c2UgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIGFjdHVhbCBwYWNrZXQgZGF0YSBpcyB1bmluaXRpYWxpemVkLgoKVGhlIGtleSBpcyB0aGlzOiBpZiBhIGRyaXZlciBhbGxvY2F0ZXMgYSBwYWdlIGZvciBhIHBhY2tldCwgdGhhdCBlbnRpcmUgcGFnZSBzdGFydHMgb3V0IHVuaW5pdGlhbGl6ZWQuIERNQSB3cml0ZXMgdGhlIGFjdHVhbCBwYWNrZXQgZGF0YSwgYW5kIEtNU0FOIHNwZWNpZmljYWxseSB1bnBvaXNvbnMgdGhhdCB3cml0dGVuIHBvcnRpb24uIFRoZSByZXN0LCBob3dldmVyLCByZW1haW5zIHVudG91Y2hlZCwgaGVuY2UgdW5pbml0aWFsaXplZC4KCk5vdywgdGFrZSBgZXRoX3R5cGVfdHJhbnNgIGZvciBleGFtcGxlLCB3aGljaCByZWFkcyBgZXRoLSZndDtoX3Byb3RvYCAoMiBieXRlcykuIElmIHRoZSBwYWNrZXQgaXMgc21hbGxlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoIChgRVRIX0hMRU5gKSwgdGhpcyByZWFkIGNvdWxkIGJlIGJleW9uZCBgc2tiX2hlYWRsZW4oc2tiKWAuIEJvb20sIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IQoKVGhhdCBgZXRoLSZndDtoX3Byb3RvYCB2YWx1ZSBpcyB0aGVuIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwcm90b2NvbC4gVGhpcyB2YWx1ZSBjb3VsZCBlbmQgdXAgaW4gYHNrYi0mZ3Q7cHJvdG9jb2xgLiBMYXRlciwgdGhpcyBgc2tiLSZndDtwcm90b2NvbGAgaXMgdXNlZCBmb3Igcm91dGluZyBvciBmaWx0ZXJpbmcsIGFuZCB0aGF0IGNvdWxkIGVhc2lseSBsZWFkIHRvIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJhc2VkIG9uIHRoYXQgdW5pbml0aWFsaXplZCBkYXRhLiBUaGF0JiMzOTtzIGEgcGVyZmVjdCBzY2VuYXJpbyBmb3IgS01TQU4gdG8gZmxhZyBhcyBhICYjMzQ7dXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUmIzM0OyBlcnJvci4KCkkgY29uZmlybWVkIG15IGh5cG90aGVzaXMgYnkgbG9va2luZyBhdCB0aGUgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBgZXRoX3R5cGVfdHJhbnNgIGZ1bmN0aW9uOgpgYGBjCglldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7CglldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTsKCgkvKiAuLi4gKi8KCWlmIChsaWtlbHkoZXRoX3Byb3RvX2lzXzgwMl8zKGV0aC0mZ3Q7aF9wcm90bykpKQoJCXJldHVybiBldGgtJmd0O2hfcHJvdG87CmBgYApJZiBgc2tiX2hlYWRsZW4oc2tiKWAgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmAsIHRoZW4gcmVhZGluZyBgZXRoLSZndDtoX3Byb3RvYCBpcyBnb2luZyB0byBiZSBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGF0IGBldGhfcHJvdG9faXNfODAyXzNgIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcHJvdG9jb2wgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDE1MzYuIENvbmRpdGlvbmFsIGJyYW5jaCBvbiB1bmluaXRpYWxpemVkIGRhdGEhIEtNU0FOIHdpbGwgKmRlZmluaXRlbHkqIGNhdGNoIHRoYXQuCgpNeSBuZXh0IHF1ZXN0aW9uIGlzLCB3aWxsIEtBU0FOIGNhdGNoIHRoaXM/IE5vLCBpdCB3b24mIzM5O3QuIFRoZSByZWFkIGlzIHdpdGhpbiB0aGUgYWxsb2NhdGlvbiBib3VuZHMuIFVzdWFsbHksIG5ldHdvcmsgZHJpdmVycyBhbGxvY2F0ZSBhdCBsZWFzdCBhIHBhZ2UgKDQwOTYgYnl0ZXMpIG9yIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byByZWNlaXZlIHBhY2tldHMuIEEgcGFja2V0IG9mIGxlc3MgdGhhbiAxNCBieXRlcyAoRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCkgZWFzaWx5IGZpdHMgd2l0aGluIHRoYXQgYWxsb2NhdGlvbi4gU28gdGhlIGBldGgtJmd0O2hfcHJvdG9gIHJlYWQgaGFwcGVucyB3aXRoaW4gdGhlIGFsbG9jYXRpb24uIEl0JiMzOTtzIEtNU0FOIHRoYXQgc2hpbmVzIGhlcmUgYmVjYXVzZSB0aGUgbWVtb3J5IGJleW9uZCB0aGUgcGFja2V0IGRhdGEgaXMgdW50b3VjaGVkIGFuZCB0aGVyZWZvcmUgdW5pbml0aWFsaXplZC4KCk5vdywgSSB3b25kZXIgaWYgYW5vdGhlciB0b29sIGNhdGNoZXMgdGhpcy4gTWF5YmUgdGhlcmUgaXMgYSBgQlVHX09OYCBpbiBgc2tiX3B1bGxgPyBJIHNob3VsZCBjaGVjayBgZXRoX3NrYl9wdWxsX21hY2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF9za2JfcHVsbF9tYWMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oPTYyMz1zdGF0aWMgaW5saW5lIHZvaWQgZXRoX3NrYl9wa3RfdHlwZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbmluY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaC02MzktXG5pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmg6NjQwOnN0YXRpYyBpbmxpbmUgc3RydWN0IGV0aGhkciAqZXRoX3NrYl9wdWxsX21hYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oLTY0MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkxNjYKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSYjMzk7bSB3ZWxsLXZlcnNlZCBpbiBrZXJuZWwgbmV0d29ya2luZyBpbnRlcm5hbHM6CgoqKkRpdmluZyBpbnRvIGBldGhfc2tiX3B1bGxfbWFjYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgcHVsbCB1cCB0aGUgc291cmNlIGNvZGUgZm9yIGBldGhfc2tiX3B1bGxfbWFjYC4gVGhpcyBmdW5jdGlvbiBuYW1lIGltbWVkaWF0ZWx5IHNjcmVhbXMgJiMzNDtFdGhlcm5ldCBhbmQgU0tCIG1hbmlwdWxhdGlvbiwmIzM0OyBzbyBpdCYjMzk7cyBsaWtlbHkgYSBrZXkgcGxheWVyIGluIHRoZSBkYXRhIGxpbmsgbGF5ZXIgd2l0aGluIHRoZSBrZXJuZWwmIzM5O3MgbmV0d29yayBzdGFjay4gSSYjMzk7bSBndWVzc2luZyBpdCYjMzk7cyByZXNwb25zaWJsZSBmb3IsIGF0IGEgbWluaW11bSwgaGFuZGxpbmcgdGhlIHB1bGxpbmcgb3IgYWR2YW5jZW1lbnQgb2YgdGhlIFNlY3VyZSBLZXJuZWwgQnVmZmVyIChTS0IpIHBvaW50ZXIgdG8gYWNjb3VudCBmb3IgdGhlIEV0aGVybmV0IE1BQyBoZWFkZXIuIFRoaXMgaXMgdGhlIHN0YWdlIHdoZXJlIHRoZSBrZXJuZWwgaXMgcHJvY2Vzc2luZyBhIHJlY2VpdmVkIEV0aGVybmV0IGZyYW1lLCBhbmQgbmVlZHMgdG8gbW92ZSBwYXN0IHRoZSBkZXN0aW5hdGlvbiBNQUMsIHNvdXJjZSBNQUMsIEV0aGVyVHlwZSwgYW5kIHBvdGVudGlhbGx5IFZMQU4gdGFncyAoaWYgcHJlc2VudCkgdG8gZ2V0IHRvIHRoZSBwYXlsb2FkLiBJdCYjMzk7cyB0aGUgZXNzZW50aWFsIGJyaWRnaW5nIHN0ZXAgYmV0d2VlbiB0aGUgcmF3IGZyYW1lIGRhdGEgYW5kIHRoZSBJUCBsYXllciBvciBoaWdoZXIgcHJvdG9jb2xzLgoKSSYjMzk7bGwgYmUgbG9va2luZyB0byB1bmRlcnN0YW5kOgoKKiAgICoqSG93IGl0IGhhbmRsZXMgdmFyaWFibGUtbGVuZ3RoIGhlYWRlcnM6KiogRG9lcyBpdCBkeW5hbWljYWxseSBhZGp1c3QgdGhlIFNLQiYjMzk7cyBkYXRhIHBvaW50ZXIgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIFZMQU4gdGFncyBvciBvdGhlciBleHRlbnNpb25zIGluIHRoZSBFdGhlcm5ldCBoZWFkZXI/IEFyZSB0aGVyZSBhbnkgY2hlY2tzIGZvciBtaW5pbXVtIGZyYW1lIHNpemVzIG9yIGZyYWdtZW50ZWQgZnJhbWVzPwoqICAgKipFcnJvciBoYW5kbGluZzoqKiBXaGF0IGhhcHBlbnMgaWYgdGhlIFNLQiBpcyB0b28gc21hbGwgdG8gY29udGFpbiBhIHZhbGlkIEV0aGVybmV0IGhlYWRlcj8gQXJlIHRoZXJlIGFueSBzYW5pdHkgY2hlY2tzIG9uIHRoZSBFdGhlclR5cGUgZmllbGQgdG8gZW5zdXJlIGl0JiMzOTtzIGEga25vd24gcHJvdG9jb2w/CiogICAqKlBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zOioqIElzIHRoaXMgYSBob3QgcGF0aD8gQXJlIHRoZXJlIG9wdGltaXphdGlvbnMgaW4gcGxhY2UgbGlrZSBwb3RlbnRpYWxseSBpbmxpbmluZyBNQUMgaGVhZGVyIG9mZnNldHMgdG8gYXZvaWQgYnJhbmNoIGNvbmRpdGlvbnM/IERvZXMgaXQgdXNlIGFueSB0ZWNobmlxdWVzIGxpa2UgcHJlZmV0Y2hpbmcgdG8gaW1wcm92ZSBjYWNoZSBiZWhhdmlvcj8KKiAgICoqSW50ZXJhY3Rpb24gd2l0aCBvdGhlciBmdW5jdGlvbnM6KiogSG93IGRvZXMgaXQgdGllIGludG8gdGhlIG92ZXJhbGwgcmVjZWl2ZSBwYXRoPyBJcyBpdCBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgTklDIGRyaXZlciwgb3IgdGhyb3VnaCBzb21lIGludGVybWVkaWF0ZSBsYXllcj8gRG9lcyBpdCB1cGRhdGUgYW55IG90aGVyIFNLQiBtZXRhZGF0YSB0aGF0IGRvd25zdHJlYW0gbGF5ZXJzIHJlbHkgb24/CgpJIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHJhdyBpbmNvbWluZyBFdGhlcm5ldCBmcmFtZXMgYW5kIHRyYW5zbGF0ZXMgdGhlbSBpbnRvIGEgdXNhYmxlIGZvcm1hdCBmb3IgaGlnaGVyLWxldmVsIG5ldHdvcmsgcHJvdG9jb2xzLiBJdCYjMzk7cyBmdW5kYW1lbnRhbCB0byB0aGUgd2hvbGUgbmV0d29ya2luZyBwcm9jZXNzISBMZXQmIzM5O3MgZGlnIGluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYzNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjM1Olx0XHRcdFx0c2tiLVx1MDAzZXBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDtcbiA2MzY6XHRcdFx0fVxuIDYzNzpcdFx0fVxuIDYzODpcdH1cbiA2Mzk6XHRcbiA2NDA6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBldGhoZHIgKmV0aF9za2JfcHVsbF9tYWMoc3RydWN0IHNrX2J1ZmYgKnNrYilcbiA2NDE6XHR7XG4gNjQyOlx0XHRzdHJ1Y3QgZXRoaGRyICpldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi1cdTAwM2VkYXRhO1xuIDY0MzpcdFxuIDY0NDpcdFx0c2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pO1xuIDY0NTpcdFx0cmV0dXJuIGV0aDtcbiA2NDY6XHR9XG4gNjQ3Olx0XG4gNjQ4Olx0LyoqXG4gNjQ5Olx0ICogZXRoX3NrYl9wYWQgLSBQYWQgYnVmZmVyIHRvIG1pbmltdW0gbnVtYmVyIG9mIG9jdGV0cyBmb3IgRXRoZXJuZXQgZnJhbWVcbiA2NTA6XHQgKiBAc2tiOiBCdWZmZXIgdG8gcGFkXG4gNjUxOlx0ICpcbiA2NTI6XHQgKiBBbiBFdGhlcm5ldCBmcmFtZSBzaG91bGQgaGF2ZSBhIG1pbmltdW0gc2l6ZSBvZiA2MCBieXRlcy4gIFRoaXMgZnVuY3Rpb25cbiA2NTM6XHQgKiB0YWtlcyBzaG9ydCBmcmFtZXMgYW5kIHBhZHMgdGhlbSB3aXRoIHplcm9zIHVwIHRvIHRoZSA2MCBieXRlIGxpbWl0LlxuIDY1NDpcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5OTQzCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkFuYWx5emluZyB0aGUgTmV0d29yayBQYWNrZXQgUHVsbCBPcGVyYXRpb24qKgoKUmlnaHQsIGBldGhfc2tiX3B1bGxfbWFjYC4uLiB0aGF0JiMzOTtzIHdoZXJlIHdlJiMzOTtyZSB5YW5raW5nIHRoZSBFdGhlcm5ldCBoZWFkZXIgb2ZmIGEgcGFja2V0LCBpc24mIzM5O3QgaXQ/IFRoZSBrZXkgbGluZSB0aGVyZSwgYXMgSSByZWNhbGwsIGlzIHRoZSBjYWxsIHRvIGBza2JfcHVsbF9pbmxpbmUoc2tiLCBFVEhfSExFTilgLiBPa2F5LCBzbyBgc2tiX3B1bGxfaW5saW5lYCBpcyBjbGVhcmx5IHRoZSB3b3JraG9yc2UgaGVyZS4gV2UmIzM5O3JlIGV4cGVjdGluZyBgRVRIX0hMRU5gLCB3aGljaCBpcyB0aGF0IHN0YW5kYXJkIEV0aGVybmV0IGhlYWRlciBsZW5ndGguLi4gMTQgb3IgMTUgYnl0ZXMsIGRlcGVuZGluZyBvbiB0aGUgVkxBTiBzaXR1YXRpb24uIFNvLCB0aGUga2VybmVsIGlzIGxpa2VseSBtYW5hZ2luZyBhIHNoYXJlZCBuZXR3b3JrIGJ1ZmZlciwgcmlnaHQ/IFdlJiMzOTtyZSB0YWtpbmcgdGhlIG1lbW9yeSBhdCB0aGUgaGVhZCBvZiB0aGUgYHNrYmAgYW5kIGFkdmFuY2luZyB0aGUgYGRhdGFgIHBvaW50ZXIgdG8gc2tpcCB0aGUgRXRoZXJuZXQgaGVhZGVyLiBMZXQmIzM5O3MgZGlnIGRlZXBlciBpbnRvIHRoZSBpbnRyaWNhY2llcyBvZiB3aGF0IGBza2JfcHVsbF9pbmxpbmVgIGlzIGRvaW5nLiBTcGVjaWZpY2FsbHksIGhvdyBpdCYjMzk7cyBiZWluZyBoYW5kbGVkIGhlcmUuIEkmIzM5O20ga2VlbiB0byBleGFtaW5lIGhvdyBpdCBpcyB3b3JraW5nIGhlcmUsIHNpbmNlIHdlIGFyZSBoYW5kbGluZyBhIGJ1ZmZlciBpbmxpbmUuIExldCYjMzk7cyBzZWUgaG93IHRoZXkgZG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NrYl9wdWxsX2lubGluZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvc2tidWZmLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9za2J1ZmYuaD0yODM2PXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqX19za2JfcHVsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKVxuLS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjg1MS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmg6Mjg1MjpzdGF0aWMgaW5saW5lIHZvaWQgKnNrYl9wdWxsX2lubGluZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODUzLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAzOTMKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBgc2tiX3B1bGxfaW5saW5lYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gaXQuIFRpbWUgdG8gZGlzc2VjdCBgc2tiX3B1bGxfaW5saW5lYC4gSSBrbm93IHRoaXMgZnVuY3Rpb24gaW50aW1hdGVseSwgYnV0IGl0JiMzOTtzIGFsd2F5cyB3b3J0aCBhIGZyZXNoIGxvb2suIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSByZWZyZXNoIHRoZSBtZW50YWwgbW9kZWwgb2YgaG93IGl0IG9wZXJhdGVzIG9uIGFuIGBza19idWZmYC4gSSYjMzk7bSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBpbXBsaWNhdGlvbnMgb2YgaW5saW5pbmcsIGVzcGVjaWFsbHkgYXJvdW5kIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBtZW1vcnkgYWxpZ25tZW50IGlzc3Vlcy4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0aGUgdHlwaWNhbCB1c2UgY2FzZXMgYW5kIGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgb3ZlcmFsbCBuZXR3b3JrIHN0YWNrIOKAkyB3aGF0IGxheWVycyByZWx5IG9uIGl0LCBhbmQgd2hhdCBhc3N1bXB0aW9ucyBhcmUgbWFkZSBhYm91dCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGFueSByZWNlbnQgY2hhbmdlcyBvciBkaXNjdXNzaW9ucyBJJiMzOTt2ZSBtaXNzZWQg4oCTIHBlcmhhcHMgbmV3IGFyY2hpdGVjdHVyZXMgb3Igb3B0aW1pemF0aW9ucyB0aGF0IGhhdmUgaW1wYWN0ZWQgaXRzIGJlaGF2aW9yLiBJdCYjMzk7cyB0aW1lIHRvIGNvbmZpcm0gbXkgYXNzdW1wdGlvbnMgYW5kIG1ha2Ugc3VyZSBteSB1bmRlcnN0YW5kaW5nIGlzIGNvbXBsZXRlbHkgc2hhcnAhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9za2J1ZmYuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI4NDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7Mjg0NTpcdFx0XHRza2JfZHVtcChLRVJOX0VSUiwgc2tiLCBmYWxzZSk7XG4yODQ2Olx0I2VuZGlmXG4yODQ3Olx0XHRcdEJVRygpO1xuMjg0ODpcdFx0fVxuMjg0OTpcdFx0cmV0dXJuIHNrYi1cdTAwM2VkYXRhICYjNDM7PSBsZW47XG4yODUwOlx0fVxuMjg1MTpcdFxuMjg1MjpcdHN0YXRpYyBpbmxpbmUgdm9pZCAqc2tiX3B1bGxfaW5saW5lKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pXG4yODUzOlx0e1xuMjg1NDpcdFx0cmV0dXJuIHVubGlrZWx5KGxlbiBcdTAwM2Ugc2tiLVx1MDAzZWxlbikgPyBOVUxMIDogX19za2JfcHVsbChza2IsIGxlbik7XG4yODU1Olx0fVxuMjg1NjpcdFxuMjg1NzpcdHZvaWQgKnNrYl9wdWxsX2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2l6ZV90IGxlbik7XG4yODU4Olx0XG4yODU5Olx0dm9pZCAqX19wc2tiX3B1bGxfdGFpbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZGVsdGEpO1xuMjg2MDpcdFxuMjg2MTpcdHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgZW51bSBza2JfZHJvcF9yZWFzb25cbjI4NjI6XHRwc2tiX21heV9wdWxsX3JlYXNvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKVxuMjg2MzpcdHtcbjI4NjQ6XHRcdERFQlVHX05FVF9XQVJOX09OX09OQ0UobGVuIFx1MDAzZSBJTlRfTUFYKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA5NjQKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA2ODcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBWdWxuZXJhYmlsaXR5KioKCk9rYXksIHNvIGBza2JfcHVsbF9pbmxpbmVgIHJldHVybmluZyBgTlVMTGAgd2hlbiB0aGUgcmVxdWVzdGVkIGxlbmd0aCAoYGxlbmApIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2tiJiMzOTtzIGN1cnJlbnQgbGVuZ3RoIChgc2tiLSZndDtsZW5gKSBpbW1lZGlhdGVseSBqdW1wcyBvdXQgYXQgbWUuIEFuZCBoZXJlJiMzOTtzIHRoZSBraWNrZXI6IGBldGhfc2tiX3B1bGxfbWFjYCBibGl0aGVseSAqaWdub3JlcyogdGhhdCBgTlVMTGAgcmV0dXJuISBUaGF0JiMzOTtzIGEgcmVkIGZsYWcuIFNwZWNpZmljYWxseSwgdGhpcyBjb2RlOgoKYGBgYwpzdGF0aWMgaW5saW5lIHN0cnVjdCBldGhoZHIgKmV0aF9za2JfcHVsbF9tYWMoc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItJmd0O2RhdGE7CgoJc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pOwoJcmV0dXJuIGV0aDsKfQpgYGAKCklmIGBFVEhfSExFTmAgKDE0IGJ5dGVzIGZvciBhbiBFdGhlcm5ldCBoZWFkZXIpIGlzIGdyZWF0ZXIgdGhhbiBgc2tiLSZndDtsZW5gLCBgc2tiX3B1bGxfaW5saW5lYCByZXR1cm5zIGBOVUxMYCBhbmQgKmRvZXNuJiMzOTt0KiBhZHZhbmNlIGBza2ItJmd0O2RhdGFgLiBCdXQgYGV0aF9za2JfcHVsbF9tYWNgIHN0aWxsIHJldHVybnMgdGhlIG9yaWdpbmFsLCBub3cgcG90ZW50aWFsbHkgaW52YWxpZCwgcG9pbnRlciBgZXRoYC4gVGhlbiwgYGV0aF90eXBlX3RyYW5zYCBoYXBwaWx5IGdvZXMgYWhlYWQgYW5kIHRyaWVzIHRvIHVzZSBgZXRoLSZndDtoX3Byb3RvYC4gVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLgoKSWYgYEVUSF9ITEVOICZndDsgc2tiLSZndDtsZW5gLCBkb2VzIHRoaXMgbmVjZXNzYXJpbHkgbWVhbiBgc2tiLSZndDtsZW5gIGlzIGxlc3MgdGhhbiAxND8gQWJzb2x1dGVseS4gVGhhdCBtZWFucyB0aGF0IGBldGgtJmd0O2hfcHJvdG9gLCB3aGljaCBpcyBhdCBvZmZzZXQgMTIgaW4gdGhlIGBldGhoZHJgIHN0cnVjdHVyZSwgZmFsbHMgKm91dHNpZGUqIHRoZSB2YWxpZCBkYXRhIHJlZ2lvbiBvZiB0aGUgc2tiLiBJZiBgc2tiLSZndDtsZW5gIGlzLCBzYXksIDEwIGJ5dGVzLCB0aGVuIGBldGgtJmd0O2hfcHJvdG9gIGF0IG9mZnNldCAxMiBpcyBhY2Nlc3NpbmcgbWVtb3J5IHRoYXQmIzM5O3MgYmV5b25kIHRoZSBkYXRhJiMzOTtzIGJvdW5kYXJ5LgoKVGhlIHF1ZXN0aW9uIHRoZW4gaXMsIHdpbGwgdGhpcyBiZSBjYXVnaHQ/IEtBU0FOIChLZXJuZWwgQWRkcmVzcyBTYW5pdGl6ZXIpIGxpa2VseSAqd29uJiMzOTt0KiBmbGFnIHRoaXMuIFRoZSBhbGxvY2F0ZWQgYnVmZmVyIGlzIHVzdWFsbHkgbXVjaCBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBkYXRhIGxlbmd0aC4gSG93ZXZlciwgS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSAqd2lsbCogbGlrZWx5IGNhdGNoIGl0IGJlY2F1c2UgdGhlIG1lbW9yeSBhdCBvZmZzZXQgMTIgbWlnaHQgdmVyeSB3ZWxsIGJlIHVuaW5pdGlhbGl6ZWQuCgpOb3csIHdoYXQgaWYgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gICpidXQqIGBza2ItJmd0O2xlbmAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBFVEhfSExFTmA/IEFoLCB0aGlzIG1lYW5zIHRoZSBwYWNrZXQgaXMgZnJhZ21lbnRlZCwgYW5kIHRoZSBsaW5lYXIgcGFydCBpcyBzaG9ydGVyIHRoYW4gMTQgYnl0ZXMuIEluIHRoaXMgY2FzZSwgYHNrYl9wdWxsX2lubGluZWAgd2lsbCBjYWxsIGBfX3NrYl9wdWxsKHNrYiwgRVRIX0hMRU4pYC4gTGV0JiMzOTtzIHJlZnJlc2ggb3VyIG1lbW9yeSBvZiB3aGF0IGBfX3NrYl9wdWxsYCBkb2VzOgoKYGBgYwpzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKl9fc2tiX3B1bGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKewoJc2tiLSZndDtsZW4gLT0gbGVuOwoJQlVHX09OKHNrYi0mZ3Q7bGVuICZsdDsgc2tiLSZndDtkYXRhX2xlbik7CglyZXR1cm4gc2tiLSZndDtkYXRhICYjNDM7PSBsZW47Cn0KYGBgCgpJZiBgc2tiX2hlYWRsZW4oc2tiKSAmbHQ7IEVUSF9ITEVOYCwgdGhlbiBgc2tiLSZndDtsZW4gLSBza2ItJmd0O2RhdGFfbGVuICZsdDsgRVRIX0hMRU5gLiBTbywgYHNrYi0mZ3Q7bGVuIC0gRVRIX0hMRU4gJmx0OyBza2ItJmd0O2RhdGFfbGVuYC4gVGhlIGBCVUdfT04oc2tiLSZndDtsZW4gJmx0OyBza2ItJmd0O2RhdGFfbGVuKWAgd2lsbCB0cmlnZ2VyLCBwcmV2ZW50aW5nIGZ1cnRoZXIgcHJvYmxlbXMuCgpTbywgKnRoYXQqIGBCVUdfT05gIHdpbGwgYmUgaGl0IGlmIGBza2JfaGVhZGxlbihza2IpICZsdDsgRVRIX0hMRU5gIGFuZCBgc2tiLSZndDtsZW4gJmd0Oz0gRVRIX0hMRU5gPyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGBza2JfaGVhZGxlbmAgYmVoYXZlcy4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtza2JfaGVhZGxlbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvc2tidWZmLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9za2J1ZmYuaD0yNTI3PXN0YXRpYyBpbmxpbmUgYm9vbCBza2JfaXNfbm9ubGluZWFyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXG4tLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yNTMxLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyNTMyOnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNrYl9oZWFkbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI1MzMte1xuLS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmg9MjU0Nj1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBza2JfcGFnZWxlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yNTQ3LXtcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6MjU0ODpcdHJldHVybiBza2JfaGVhZGxlbihza2IpICYjNDM7IF9fc2tiX3BhZ2VsZW4oc2tiKTtcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjU0OS19XG4tLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaD0yODYyPXBza2JfbWF5X3B1bGxfcmVhc29uKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pXG4tLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODY2LVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyODY3Olx0aWYgKGxpa2VseShsZW4gXHUwMDNjPSBza2JfaGVhZGxlbihza2IpKSlcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjg2OC1cdFx0cmV0dXJuIFNLQl9OT1RfRFJPUFBFRF9ZRVQ7XG4tLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODcyLVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyODczOlx0aWYgKHVubGlrZWx5KCFfX3Bza2JfcHVsbF90YWlsKHNrYiwgbGVuIC0gc2tiX2hlYWRsZW4oc2tiKSkpKVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODc0LVx0XHRyZXR1cm4gU0tCX0RST1BfUkVBU09OX05PTUVNO1xuLS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmg9NDMyNT1za2JfaGVhZGVyX3BvaW50ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwgaW50IGxlbiwgdm9pZCAqYnVmZmVyKVxuLS1cbmluY2x1ZGUvbGludXgvc2tidWZmLmgtNDMyNy1cdHJldHVybiBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgbGVuLCBza2ItXHUwMDNlZGF0YSxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6NDMyODpcdFx0XHRcdCAgICBza2JfaGVhZGxlbihza2IpLCBidWZmZXIpO1xuaW5jbHVkZS9saW51eC9za2J1ZmYuaC00MzI5LX1cbi0tXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oPTQzNDQ9c2tiX3BvaW50ZXJfaWZfbGluZWFyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsIGludCBsZW4pXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTQzNDUte1xuaW5jbHVkZS9saW51eC9za2J1ZmYuaDo0MzQ2Olx0aWYgKGxpa2VseShza2JfaGVhZGxlbihza2IpIC0gb2Zmc2V0IFx1MDAzZT0gbGVuKSlcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtNDM0Ny1cdFx0cmV0dXJuIHNrYi1cdTAwM2VkYXRhICYjNDM7IG9mZnNldDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTMxMzAKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMsIGFzIHRob3VnaCB0aGVzZSBhcmUgKm15KiB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBza2JfaGVhZGxlbmAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGUgZGV0YWlscy4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3Mgd291bGQgYmUgc29tZXRoaW5nIGxpa2UgdGhpczoKCiYjMzQ7T2theSwgc28gd2UmIzM5O3JlIGxvb2tpbmcgYXQgYHNrYl9oZWFkbGVuYC4gU3RyYWlnaHQgYXdheSwgSSYjMzk7bSB0aGlua2luZywgdGhpcyBtdXN0IHJlbGF0ZSB0byB0aGUgTGludXgga2VybmVsJiMzOTtzIGBza19idWZmYCBzdHJ1Y3R1cmUsIHRoZSB3b3JraG9yc2UgZm9yIG5ldHdvcmsgcGFja2V0IGhhbmRsaW5nLiAgYGhlYWRsZW5gIHN1Z2dlc3RzIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdGhlIHNpemUgb2YgdGhlIGhlYWRlciBwb3J0aW9uIG9mIGFuIGBza2JgLiBUaGF0JiMzOTtzIHRoZSBtb3N0ICpsaWtlbHkqIGludGVycHJldGF0aW9uLCBnaXZlbiBteSBwYXN0IGV4cGVyaWVuY2UgYW5kIHRoZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb25zLiBMZXQmIzM5O3MgZGVsdmUgaW4gYW5kIHNlZSBpZiB0aGlzIGludHVpdGlvbiBpcyBjb3JyZWN0LiYjMzQ7CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9za2J1ZmYuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1MjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjUyNTpcdFxuMjUyNjpcdFxuMjUyNzpcdHN0YXRpYyBpbmxpbmUgYm9vbCBza2JfaXNfbm9ubGluZWFyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXG4yNTI4Olx0e1xuMjUyOTpcdFx0cmV0dXJuIHNrYi1cdTAwM2VkYXRhX2xlbjtcbjI1MzA6XHR9XG4yNTMxOlx0XG4yNTMyOlx0c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2tiX2hlYWRsZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcbjI1MzM6XHR7XG4yNTM0Olx0XHRyZXR1cm4gc2tiLVx1MDAzZWxlbiAtIHNrYi1cdTAwM2VkYXRhX2xlbjtcbjI1MzU6XHR9XG4yNTM2Olx0XG4yNTM3Olx0c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19za2JfcGFnZWxlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuMjUzODpcdHtcbjI1Mzk6XHRcdHVuc2lnbmVkIGludCBpLCBsZW4gPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU1NAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE2OTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBOZXR3b3JrIFBhY2tldCBQcm9jZXNzaW5nIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBrZXJuZWwgaXNzdWUgcmVsYXRlZCB0byBFdGhlcm5ldCBoZWFkZXIgaGFuZGxpbmcgYW5kIGl0JiMzOTtzIHF1aXRlIGludGVyZXN0aW5nLiBJdCBzZWVtcyB0aGUgY29yZSBwcm9ibGVtIGFyaXNlcyB3aGVuIGRlYWxpbmcgd2l0aCBuZXR3b3JrIHBhY2tldHMgd2hlcmUgdGhlIGxpbmVhciBwYXJ0IG9mIHRoZSBTS0IgKFNvY2tldCBCdWZmZXIpIGlzIHNob3J0ZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAoYEVUSF9ITEVOYCkuIExldCYjMzk7cyBicmVhayB0aGlzIGRvd246CgpGaXJzdCwgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGVzc2VudGlhbGx5IGBza2ItJmd0O2xlbiAtIHNrYi0mZ3Q7ZGF0YV9sZW5gLiBUaGUgdnVsbmVyYWJpbGl0eSBwb3BzIHVwIGlmIHRoaXMgdmFsdWUgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmAuIElmIHdlIGhhdmUgYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYCwgdGhlbiBgc2tiX3B1bGxfaW5saW5lYCBnZXRzIGNhbGxlZCB3aGljaCB1bHRpbWF0ZWx5IGNhbGxzIGBfX3NrYl9wdWxsYC4gSG93ZXZlciwgaWYgYHNrYi0mZ3Q7bGVuIC0gc2tiLSZndDtkYXRhX2xlbiAmbHQ7IEVUSF9ITEVOYCwgdGhlbiBgX19za2JfcHVsbGAgdHJpZ2dlcnMgYSBgQlVHX09OYCBiZWNhdXNlIHRoZSBsZW5ndGggY2FsY3VsYXRpb24gYmVjb21lcyBpbnZhbGlkIChgc2tiLSZndDtsZW5gIHdvdWxkIGJlIGxlc3MgdGhhbiBgc2tiLSZndDtkYXRhX2xlbmAgYWZ0ZXIgdGhlIHN1YnRyYWN0aW9uKS4gU3RhbmRhcmQgZnV6emluZywgc3BlY2lmaWNhbGx5IHN5emthbGxlciAod2l0aG91dCBLTVNBTiksIHNob3VsZCBjYXRjaCB0aGlzIGBCVUdfT05gLgoKQnV0LCB3aGF0IGlmIGBza2ItJmd0O2xlbiAmbHQ7IEVUSF9ITEVOYD8gSW4gdGhpcyBzY2VuYXJpbywgYHNrYl9wdWxsX2lubGluZWAgcmV0dXJucyBgTlVMTGAsIGJ5cGFzc2luZyBgX19za2JfcHVsbGAuIENydWNpYWxseSwgdGhpcyBhdm9pZHMgdGhlIGBCVUdfT05gLiBIZXJlLCBgZXRoX3NrYl9wdWxsX21hY2AgcmV0dXJucyBgc2tiLSZndDtkYXRhYCwgYW5kIGBldGhfdHlwZV90cmFuc2AgYXR0ZW1wdHMgdG8gcmVhZCBgZXRoLSZndDtoX3Byb3RvYC4gVGhlIGtleSBpcyB0aGF0IHNpbmNlIGBza2ItJmd0O2xlbiAmbHQ7IEVUSF9ITEVOYCwgYGV0aC0mZ3Q7aF9wcm90b2AgaXMgYmV5b25kIHRoZSBlbmQgb2Ygd2hhdCYjMzk7cyBjb25zaWRlcmVkIHRoZSAmIzM0O3ZhbGlkJiMzNDsgcGFja2V0IGRhdGEuCgpJbml0aWFsbHksIEkgd2FzIHdvcnJpZWQgYWJvdXQgYW4gb3V0LW9mLWJvdW5kcyByZWFkLCBidXQgdGhlIGRhdGEgaXMgc3RpbGwgd2l0aGluIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBqdXN0IGJleW9uZCB0aGUgcmVwb3J0ZWQgYHNrYi0mZ3Q7bGVuYC4gS0FTQU4gd29uJiMzOTt0IGNhdGNoIHRoaXMsIGJlY2F1c2UgaXQmIzM5O3Mgbm90IHRydWx5IG91dC1vZi1ib3VuZHMuIEhvd2V2ZXIsIEtNU0FOICp3aWxsKiBjYXRjaCBpdCBiZWNhdXNlIHRoZSBtZW1vcnkgYmV5b25kIGBza2ItJmd0O2xlbmAgaXMgdW5pbml0aWFsaXplZC4gVGhlIGtlcm5lbCBpcyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgoKVGhpcyByZWFkIG9mIHRoZSB1bmluaXRpYWxpemVkIHZhbHVlIGJlY29tZXMgdGhlIGBza2ItJmd0O3Byb3RvY29sYC4gSXQgdGhlbiBnZXRzIHVzZWQgaW4gYSBsYXRlciBzdGVwIGFuZCBiZWNvbWVzIGEgcmVwb3J0YWJsZSBLTVNBTiBpc3N1ZS4gVGhpcyBzZWVtcyB0byBiZSB0aGUgcHJpbWFyeSB3YXkgdG8gY2F0Y2ggaXQgYmVjYXVzZSBLQVNBTiBkb2VzbiYjMzk7dCB0cmFjayB1bmluaXRpYWxpemVkIG1lbW9yeSwgYW5kIHRoZXJlJiMzOTtzIG5vIGFjdHVhbCBvdXQtb2YtYm91bmRzIGFjY2Vzcy4KClRoZSBjb25zZXF1ZW5jZXMgY291bGQgYmUgaW50ZXJlc3RpbmcuIElmIGBldGgtJmd0O2hfcHJvdG9gIGlzIHVuaW5pdGlhbGl6ZWQsIHRoZSBwYWNrZXQgbWlnaHQgZ2V0IHJvdXRlZCB0byBhIHJhbmRvbSBwcm90b2NvbCBoYW5kbGVyLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIHBhY2tldCBkcm9wcyBieSBoYW5kbGVycyBzdWNoIGFzIElQdjQgdGhhdCBjaGVjayBgcHNrYl9tYXlfcHVsbGAuIFRoZSBwYWNrZXQgY291bGQgYmUgZHJvcHBlZCBkdWUgdG8gYW4gaW52YWxpZCBoZWFkZXIgbGVuZ3RoLiBObyBtZW1vcnkgY29ycnVwdGlvbiwganVzdCBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnksIGJ1dCBvbmx5IEtNU0FOIGNhbiBjYXRjaCB0aGlzLgoKTm93LCBsZXQmIzM5O3MgcmV2aXNpdCB0aGUgYEJVR19PTmAgc2NlbmFyaW8uIEl0JiMzOTtzIHRyaWdnZXJlZCB3aGVuIGBza2ItJmd0O2xlbiAmZ3Q7PSBFVEhfSExFTmAgYnV0IGBza2JfaGVhZGxlbihza2IpICZsdDsgRVRIX0hMRU5gLiBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIGEgTUFDIGhlYWRlciBpcyBzcGxpdCBhY3Jvc3MgdGhlIGxpbmVhciBwYXJ0IGFuZCB0aGUgZnJhZ21lbnRzIG9mIHRoZSBwYWNrZXQuIFN5emthbGxlciBjYXRjaGVzIHRoaXMuIEJ1dCBpZiBgc2tiLSZndDtsZW4gJmx0OyBFVEhfSExFTmAsIHRoZW4gdGhlIGBCVUdfT05gIGlzIGF2b2lkZWQsIGV4cG9zaW5nIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlIHByb3Bvc2VkIHBhdGNoIG1pdGlnYXRlcyAqYm90aCogY2FzZXMgYnkgY2hlY2tpbmcgaWYgYHNrYl9oZWFkbGVuKHNrYikgJmx0OyBFVEhfSExFTmAsIGVmZmVjdGl2ZWx5IHByZXZlbnRpbmcgYm90aCB0aGUgYEJVR19PTmAgYW5kIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkLgoKSWYgc3RhbmRhcmQgZnV6emluZyBmb3VuZCB0aGUgaXNzdWUgdmlhIGBCVUdfT05gLCB0aGF0IG1lYW5zIHdlIGRvbiYjMzk7dCBuZWNlc3NhcmlseSBuZWVkIEtNU0FOLiBXYWl0ISBJcyB0aGF0IHJpZ2h0PwoKVGhlIHBhdGNoIGl0c2VsZiBpbmRpY2F0ZXMgdGhpczogYGlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpICZsdDsgRVRIX0hMRU4pKWAuIFRoaXMgd2lsbCB3YXJuLCBhbmQgcmV0dXJuIHplcm8uCgpTbywgaWYgc3l6a2FsbGVyIGZvdW5kIGl0IGFzIGEgYEJVR19PTmAsIGl0IHdvdWxkIGJlIHJlcG9ydGVkIGxpa2UgYGtlcm5lbCBCVUcgYXQgaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyODQ3IWAsIHdoaWNoIGlzIGluIGBfX3NrYl9wdWxsYC4gQnV0IHRoYXQgYEJVR19PTmAgaXMgb25seSB0cmlnZ2VyZWQgaWYgYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYCBhbmQgYHNrYl9oZWFkbGVuKHNrYikgJmx0OyBFVEhfSExFTmAuIENhbiBhIGRldmljZSByZWFsaXN0aWNhbGx5ICpyZWNlaXZlKiBzdWNoIGEgcGFja2V0IGJlZm9yZSBgZXRoX3R5cGVfdHJhbnNgPwoKVXN1YWxseSwgZGV2aWNlcyByZWNlaXZlIHRoZSBNQUMgaGVhZGVyIGluIHRoZSBsaW5lYXIgcGFydC4gSG93ZXZlciwgYSB2aXJ0dWFsIGRldmljZSBsaWtlIHR1bi90YXAgb3Igc29tZSBvdGhlciB2aXJ0dWFsIGRldmljZSAqY291bGQqIGluamVjdCBhIHBhY2tldCB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQgYW5kIGZyYWdtZW50cywgdGh1cyB0cmlnZ2VyaW5nIHRoZSBgQlVHX09OYC4KCkNvbnZlcnNlbHksIGlmIGEgZGV2aWNlIGluamVjdHMgYSBwYWNrZXQgd2l0aCBgc2tiLSZndDtsZW4gJmx0OyBFVEhfSExFTmAgYW5kIG5vIGZyYWdtZW50cywgaXQgKndvbiYjMzk7dCogdHJpZ2dlciB0aGUgYEJVR19PTmAsIGJ1dCBpdCAqd2lsbCogdHJpZ2dlcgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF90eXBlX3RyYW5zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdHVuLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdHVuLmM9MTY5NT1zdGF0aWMgc3NpemVfdCB0dW5fZ2V0X3VzZXIoc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biwgc3RydWN0IHR1bl9maWxlICp0ZmlsZSxcbi0tXG5kcml2ZXJzL25ldC90dW4uYy0xODQ5LVx0XHR9XG5kcml2ZXJzL25ldC90dW4uYzoxODUwOlx0XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi1cdTAwM2VkZXYpO1xuZHJpdmVycy9uZXQvdHVuLmMtMTg1MS1cdFx0YnJlYWs7XG4tLVxuZHJpdmVycy9uZXQvdHVuLmM9MjM4Mz1zdGF0aWMgaW50IHR1bl94ZHBfb25lKHN0cnVjdCB0dW5fc3RydWN0ICp0dW4sXG4tLVxuZHJpdmVycy9uZXQvdHVuLmMtMjQ3MS1cbmRyaXZlcnMvbmV0L3R1bi5jOjI0NzI6XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi1cdTAwM2VkZXYpO1xuZHJpdmVycy9uZXQvdHVuLmMtMjQ3My1cdHNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjUzNwoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhhdCBrZXJuZWwgY29kZToKCioqQ2hlY2tpbmcgYHR1bl9nZXRfdXNlcmAgZm9yIE1pbmltdW0gRnJhbWUgU2l6ZSBWaW9sYXRpb25zKioKCkFscmlnaHQsIEkgbmVlZCB0byB2ZXJpZnkgaG93IGB0dW5fZ2V0X3VzZXJgIGluIGBkcml2ZXJzL25ldC90dW4uY2AgaGFuZGxlcyBwYWNrZXRzIHdpdGggbGVuZ3RocyBzaG9ydGVyIHRoYW4gdGhlIHN0YW5kYXJkIEV0aGVybmV0IGhlYWRlciBsZW5ndGggKGBFVEhfSExFTmApLiBJIGtub3cgdGhhdCBFdGhlcm5ldCBmcmFtZXMgKm11c3QqIGhhdmUgYSBtaW5pbXVtIHNpemUsIGFuZCBpZiB3ZSYjMzk7cmUgc2VlaW5nIGFuIGlzc3VlLCBpdCYjMzk7cyBwb3NzaWJsZSB0aGF0IGB0dW5fZ2V0X3VzZXJgIGlzIGFsbG93aW5nIG9yIG1pc2ludGVycHJldGluZyBzaG9ydCBmcmFtZXMgY29taW5nIGZyb20gdXNlcnNwYWNlLiBJJiMzOTtsbCBuZWVkIHRvIGxvb2sgY2FyZWZ1bGx5IGF0IGhvdyB0aGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBidWZmZXIgc2l6ZXMsIGNvcGllcyBkYXRhLCBhbmQgcGVyZm9ybXMgYW55IGxlbmd0aCBjaGVja3MuIFNwZWNpZmljYWxseSwgSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgY29tcGFyaXNvbnMgYWdhaW5zdCBgRVRIX0hMRU5gIG9yIG90aGVyIHNpemUgY29uc3RyYWludHMuIEl0JiMzOTtzIGFsc28gaW1wb3J0YW50IHRvIGNvbnNpZGVyIGlmIGFueSBvdGhlciBsYXllcnMgYXJlIHJlbGllZCBvbiB0byBoYW5kbGUgdGhlIHNpemUgY29uc3RyYWludHMuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBubyBleHBsb2l0YWJsZSBjb25kaXRpb24gZXhpc3RzIGR1ZSB0byBhbiB1bmRlcnNpemVkIGZyYW1lIGJlaW5nIHBhc3NlZCB0aHJvdWdoLiBNeSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBhIHZ1bG5lcmFiaWxpdHkgZXhpc3RzIG9yIG5vdCwgYW5kIGhvdyBpdCBjYW4gYmUgbWl0aWdhdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L3R1bi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTg0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxODQwOlx0XHRcdHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7XG4xODQxOlx0XHRcdHNrYi1cdTAwM2Vwcm90b2NvbCA9IHBpLnByb3RvO1xuMTg0MjpcdFx0XHRza2ItXHUwMDNlZGV2ID0gdHVuLVx1MDAzZWRldjtcbjE4NDM6XHRcdFx0YnJlYWs7XG4xODQ0Olx0XHRjYXNlIElGRl9UQVA6XG4xODQ1Olx0XHRcdGlmIChmcmFncyBcdTAwMjZcdTAwMjYgIXBza2JfbWF5X3B1bGwoc2tiLCBFVEhfSExFTikpIHtcbjE4NDY6XHRcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMTg0NzpcdFx0XHRcdGRyb3BfcmVhc29uID0gU0tCX0RST1BfUkVBU09OX0hEUl9UUlVOQztcbjE4NDg6XHRcdFx0XHRnb3RvIGRyb3A7XG4xODQ5Olx0XHRcdH1cbjE4NTA6XHRcdFx0c2tiLVx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tXHUwMDNlZGV2KTtcbjE4NTE6XHRcdFx0YnJlYWs7XG4xODUyOlx0XHR9XG4xODUzOlx0XG4xODU0Olx0XHQvKiBjb3B5IHNrYl91YnVmX2luZm8gZm9yIGNhbGxiYWNrIHdoZW4gc2tiIGhhcyBubyBlcnJvciAqL1xuMTg1NTpcdFx0aWYgKHplcm9jb3B5KSB7XG4xODU2Olx0XHRcdHNrYl96Y29weV9pbml0KHNrYiwgbXNnX2NvbnRyb2wpO1xuMTg1NzpcdFx0fSBlbHNlIGlmIChtc2dfY29udHJvbCkge1xuMTg1ODpcdFx0XHRzdHJ1Y3QgdWJ1Zl9pbmZvICp1YXJnID0gbXNnX2NvbnRyb2w7XG4xODU5Olx0XHRcdHVhcmctXHUwMDNlb3BzLVx1MDAzZWNvbXBsZXRlKE5VTEwsIHVhcmcsIGZhbHNlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTcxODEKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0MzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVnVsbmVyYWJpbGl0eSBEaXNjb3ZlcmVkIGluIGB0dW5fZ2V0X3VzZXJgKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEkmIzM5O20gbG9va2luZyBhdCBgdHVuX2dldF91c2VyYCBhbmQgc3BlY2lmaWNhbGx5IHRoaXMgc2VjdGlvbjoKCmBgYGMKCQljYXNlIElGRl9UQVA6CgkJCWlmIChmcmFncyAmYW1wOyZhbXA7ICFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0hMRU4pKSB7CgkJCQllcnIgPSAtRU5PTUVNOwoJCQkJZHJvcF9yZWFzb24gPSBTS0JfRFJPUF9SRUFTT05fSERSX1RSVU5DOwoJCQkJZ290byBkcm9wOwoJCQl9CgkJCXNrYi0mZ3Q7cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi0mZ3Q7ZGV2KTsKCQkJYnJlYWs7CmBgYAoKSW50ZXJlc3RpbmcuIEl0IGFwcGVhcnMgdGhhdCB0aGUgYHBza2JfbWF5X3B1bGxgIGNoZWNrIGlzICpvbmx5KiBwZXJmb3JtZWQgaWYgdGhlIGBmcmFnc2AgZmxhZyBpcyBzZXQuIFRoYXQgbWVhbnMsIGlmIGBmcmFnc2AgaXMgZmFsc2UsIGFuZCB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGEgbGluZWFyIHNrYiAobWVhbmluZyBubyBmcmFnbWVudGF0aW9uKSwgdGhlcmUmIzM5O3MgKm5vKiBsZW5ndGggY2hlY2sgYWdhaW5zdCBgRVRIX0hMRU5gICh3aGljaCBpcyAxNCBieXRlcykgZm9yIHRoZSBpbmNvbWluZyBwYWNrZXQuCgpTbywgaWYgYSBtYWxpY2lvdXMgdXNlciBpbmplY3RzIGEgKmxpbmVhciogcGFja2V0IHdpdGggYSBsZW5ndGggb2YgbGVzcyB0aGFuIDE0IGJ5dGVzIGludG8gdGhlIFRBUCBpbnRlcmZhY2UsIHRoZSBjb2RlIHdpbGwgaGFwcGlseSBjb250aW51ZSBhbmQgY2FsbCBgZXRoX3R5cGVfdHJhbnNgLiBUaGUgY3JpdGljYWwgaXNzdWUgaGVyZSBpcyB0aGF0IHNpbmNlIGBza2ItJmd0O2xlbmAgYW5kIGBza2JfaGVhZGxlbihza2IpYCBhcmUgYm90aCBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgdGhlIGBldGhfdHlwZV90cmFuc2AgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIHJlYWQgYmV5b25kIHRoZSBwcm92aWRlZCBkYXRhIGluIHRoZSBza2IuCgpNeSBpbml0aWFsIHRob3VnaHQgd2FzLCB3aWxsIHRoaXMgdHJpZ2dlciBhIGBCVUdfT05gIGluIGBza2JfcHVsbF9pbmxpbmVgPyBObywgYmVjYXVzZSBgc2tiX3B1bGxfaW5saW5lYCByZXR1cm5zIE5VTEwgaWYgeW91IHRyeSB0byBwdWxsIG1vcmUgZGF0YSB0aGFuIGF2YWlsYWJsZSB3aGljaCBwcm90ZWN0cyB0aGUgY29kZSBmcm9tIHRoZSBidWcuCgpJIHRoZW4gcmVhbGl6ZWQgdGhhdCBgZXRoX3NrYl9wdWxsX21hY2Agc2ltcGx5IHJldHVybnMgYHNrYi0mZ3Q7ZGF0YWAgYW5kIHRoZW4gYGV0aF90eXBlX3RyYW5zYCBhdHRlbXB0cyB0byByZWFkIGBldGgtJmd0O2hfcHJvdG9gIHdoaWNoIGlzIHVuaW5pdGlhbGl6ZWQhCgpDb3VsZCBLQVNBTiBjYXRjaCB0aGlzPyBJIGluaXRpYWxseSB0aG91Z2h0LCBwcm9iYWJseSBub3QuIFRoZSBsaW5lYXIgYnVmZmVyIGFsbG9jYXRlZCBieSBgdHVuX2dldF91c2VyYCBpcyB1c3VhbGx5IHF1aXRlIGxhcmdlIOKAkyBhIGZldyBodW5kcmVkIGJ5dGVzIGF0IGxlYXN0LCBvciBtYXliZSBhIGZ1bGwgcGFnZS4gU28sIGV2ZW4gaWYgdGhlIHVzZXIgcHJvdmlkZXMgbGVzcyB0aGFuIDE0IGJ5dGVzLCB0aGUgJiMzNDtleHRyYSYjMzQ7IGJ5dGVzIHdlIGFyZSByZWFkaW5nIHdvdWxkIGxpa2VseSBiZSB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gSSYjMzk7ZCBleHBlY3QgYW55IHJlYWQgYXQgb2Zmc2V0IDEyIHRvIGJlIHdpdGhpbiB0aGUgYnVmZmVyLgoKSG93ZXZlciwgYWZ0ZXIgYSBzZWNvbmQgcGFzcywgSSB0aGluayBLTVNBTiBtaWdodCBjYXRjaCB0aGlzISBUaGUgdXNlciBvbmx5IHByb3ZpZGVkIGEgc21hbGwgYW1vdW50IG9mIGRhdGEgKGxlc3MgdGhhbiAxNCBieXRlcykuIFRoZSByZXN0IG9mIHRoZSBidWZmZXIgaXMgdW5pbml0aWFsaXplZC4gV2UgbmVlZCB0byBjb25maXJtIHdoZXRoZXIgYHR1bl9hbGxvY19za2JgIHplcm9lcyB0aGUgYnVmZmVyICh3aGljaCB3b3VsZCBtYWtlIHRoaXMgYSByZWFkIG9mIHplcm9lcyByYXRoZXIgdGhhbiB1bmluaXRpYWxpemVkIG1lbW9yeSkgYnV0IGVpdGhlciB3YXksIHNpbmNlIHRoZSBwcm92aWRlZCBkYXRhIGlzbiYjMzk7dCBlbm91Z2gsIHdlIGFyZSByZWFkaW5nIG91dC1vZi1ib3VuZHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3R1bl9hbGxvY19za2ImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL25ldC90dW4uYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL25ldC90dW4uYz0xMzkyPXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdHVuX25hcGlfYWxsb2NfZnJhZ3Moc3RydWN0IHR1bl9maWxlICp0ZmlsZSxcbi0tXG5kcml2ZXJzL25ldC90dW4uYy0xNDQ4LSAqIGxpbmVhciBpcyBhIGhpbnQgYXMgdG8gaG93IG11Y2ggdG8gY29weSAodXN1YWxseSBoZWFkZXJzKS4gKi9cbmRyaXZlcnMvbmV0L3R1bi5jOjE0NDk6c3RhdGljIHN0cnVjdCBza19idWZmICp0dW5fYWxsb2Nfc2tiKHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXG5kcml2ZXJzL25ldC90dW4uYy0xNDUwLVx0XHRcdFx0ICAgICBzaXplX3QgcHJlcGFkLCBzaXplX3QgbGVuLFxuLS1cbmRyaXZlcnMvbmV0L3R1bi5jPTE2OTU9c3RhdGljIHNzaXplX3QgdHVuX2dldF91c2VyKHN0cnVjdCB0dW5fc3RydWN0ICp0dW4sIHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXG4tLVxuZHJpdmVycy9uZXQvdHVuLmMtMTc5NS1cbmRyaXZlcnMvbmV0L3R1bi5jOjE3OTY6XHRcdFx0c2tiID0gdHVuX2FsbG9jX3NrYih0ZmlsZSwgYWxpZ24sIGNvcHlsZW4sIGxpbmVhcixcbmRyaXZlcnMvbmV0L3R1bi5jLTE3OTctXHRcdFx0XHRcdCAgICBub2Jsb2NrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg1MTUKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSYjMzk7bSBkZWVwbHkgZmFtaWxpYXIgd2l0aCBuZXR3b3JraW5nIGFuZCBrZXJuZWwgaW50ZXJuYWxzLCBhbmQgZXNwZWNpYWxseSB0aGUgVFVOL1RBUCBkcml2ZXI6CgoqKkNoZWNraW5nIGB0dW5fYWxsb2Nfc2tiYCoqCgpSaWdodCwgbGV0JiMzOTtzIGRpdmUgcmlnaHQgaW4uIFRoZSBwaHJhc2UgJiMzNDtMZXQmIzM5O3MgY2hlY2sgYHR1bl9hbGxvY19za2JgJiMzNDsgaW1tZWRpYXRlbHkgc2lnbmFscyBhIHNwZWNpZmljIGFyZWEgb2YgaW50ZXJlc3Q6IHRoZSBhbGxvY2F0aW9uIG9mIFNLQnMgKFNvY2tldCBCdWZmZXJzKSB3aXRoaW4gdGhlIFRVTiBkcml2ZXIuIFRoaXMgaXMgYSBjcml0aWNhbCBwb2ludC4gYHR1bl9hbGxvY19za2JgIGlzIHRoZSBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG1lbW9yeSBzdHJ1Y3R1cmVzIHRoYXQgd2lsbCBob2xkIHRoZSBuZXR3b3JrIHBhY2tldHMgYmVpbmcgc2VudCB0byBhbmQgcmVjZWl2ZWQgZnJvbSB0aGUgdXNlci1zcGFjZSBhcHBsaWNhdGlvbiB2aWEgdGhlIFRVTiBpbnRlcmZhY2UuIEEgZGVlcCB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgaXMgcGFyYW1vdW50IHdoZW4gZGVhbGluZyB3aXRoIG5ldHdvcmsgcGVyZm9ybWFuY2UsIHBvdGVudGlhbCBtZW1vcnkgbGVha3MsIG9yIGFueSBvZGQgYmVoYXZpb3IgaW4gYSBUVU4tYmFzZWQgc2V0dXAuCgpNeSBpbW1lZGlhdGUgdGhvdWdodHMgYXJlLCB3aGVyZSBleGFjdGx5IGRvIEkgd2FudCB0byAmIzM0O2NoZWNrJiMzNDsgdGhpcyBmdW5jdGlvbj8gSXMgdGhpcyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24gaXRzZWxmPyBQZXJoYXBzIEkmIzM5O20gbG9va2luZyBhdCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgd2l0aGluIHRoYXQgZnVuY3Rpb24uIEFyZSB0aGVyZSBhbnkgY29udGVudGlvbiBpc3N1ZXM/IERvIEkgd2FudCB0byBjaGVjayBpdHMgaW50ZXJhY3Rpb24gd2l0aCBvdGhlciBrZXJuZWwgY29tcG9uZW50cyBzdWNoIGFzIERNQSBvciBOVU1BPyBJcyB0aGVyZSBhIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWd5IEkgc2hvdWxkIGV4YW1pbmUgY2xvc2VseSBmb3IgcG9zc2libGUgaW1wcm92ZW1lbnRzIG9yIG1pc2NvbmZpZ3VyYXRpb25zPwoKSSBwcm9iYWJseSBoYXZlIGEgc3BlY2lmaWMgY29uY2VybiBpbiBtaW5kLiBJcyB0aGVyZSBhIHBlcmZvcm1hbmNlIHByb2JsZW0gd2l0aCBhIHBhcnRpY3VsYXIgd29ya2xvYWQ/IEFyZSBwYWNrZXRzIGJlaW5nIGRyb3BwZWQ/IEFyZSB0aGVyZSBhbnkgcmVwb3J0cyBvZiBtZW1vcnkgbGVha3M/IElzIGl0IGFib3V0IG92ZXJhbGwgdGhyb3VnaHB1dCwgbGF0ZW5jeSwgb3Igc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgcmVsYXRlZCB0byBidWZmZXIgYWxsb2NhdGlvbj8gVGhlIGNvbnRleHQgb2YgdGhlIGNoZWNrIHdvdWxkIGluZmx1ZW5jZSB3aGVyZSB0byBiZWdpbiB0aGUgaW5zcGVjdGlvbi4gSSYjMzk7ZCBuZWVkIHRvIGNvbnNpZGVyIHRoZSBzeXN0ZW0mIzM5O3MgaGFyZHdhcmUgY29uZmlndXJhdGlvbiwgdGhlIHVzZXItc3BhY2UgYXBwbGljYXRpb24sIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgZmFjdG9ycyB0byBmb3JtdWxhdGUgYSB1c2VmdWwgaHlwb3RoZXNpcyBhYm91dCBgdHVuX2FsbG9jX3NrYmAuCgpVbHRpbWF0ZWx5LCBpdCB3b3VsZCBkZXBlbmQgb24gd2hlcmUgSSB3b3VsZCBsaWtlIHRvIGxvb2ssIGJlIGl0IHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVneSwgYnVmZmVyIGFsaWdubWVudCBpc3N1ZXMsIG9yIGNvbmN1cnJlbnQgYWNjZXNzIHRvIGRhdGEgc3RydWN0dXJlcy4gV2hhdGV2ZXIgdGhlIGNvbmNlcm4sIGB0dW5fYWxsb2Nfc2tiYCBpcyB0aGUgcGxhY2UgdG8gc3RhcnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdHVuLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNDQ5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE0NDk6XHRzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnR1bl9hbGxvY19za2Ioc3RydWN0IHR1bl9maWxlICp0ZmlsZSxcbjE0NTA6XHRcdFx0XHRcdCAgICAgc2l6ZV90IHByZXBhZCwgc2l6ZV90IGxlbixcbjE0NTE6XHRcdFx0XHRcdCAgICAgc2l6ZV90IGxpbmVhciwgaW50IG5vYmxvY2spXG4xNDUyOlx0e1xuMTQ1MzpcdFx0c3RydWN0IHNvY2sgKnNrID0gdGZpbGUtXHUwMDNlc29ja2V0LnNrO1xuMTQ1NDpcdFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcbjE0NTU6XHRcdGludCBlcnI7XG4xNDU2Olx0XG4xNDU3Olx0XHQvKiBVbmRlciBhIHBhZ2U/ICBEb24mIzM5O3QgYm90aGVyIHdpdGggcGFnZWQgc2tiLiAqL1xuMTQ1ODpcdFx0aWYgKHByZXBhZCAmIzQzOyBsZW4gXHUwMDNjIFBBR0VfU0laRSlcbjE0NTk6XHRcdFx0bGluZWFyID0gbGVuO1xuMTQ2MDpcdFxuMTQ2MTpcdFx0aWYgKGxlbiAtIGxpbmVhciBcdTAwM2UgTUFYX1NLQl9GUkFHUyAqIChQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIFBBR0VfQUxMT0NfQ09TVExZX09SREVSKSlcbjE0NjI6XHRcdFx0bGluZWFyID0gbGVuIC0gTUFYX1NLQl9GUkFHUyAqIChQQUdFX1NJWkUgXHUwMDNjXHUwMDNjIFBBR0VfQUxMT0NfQ09TVExZX09SREVSKTtcbjE0NjM6XHRcdHNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9wc2tiKHNrLCBwcmVwYWQgJiM0MzsgbGluZWFyLCBsZW4gLSBsaW5lYXIsIG5vYmxvY2ssXG4xNDY0Olx0XHRcdFx0XHQgICBcdTAwMjZlcnIsIFBBR0VfQUxMT0NfQ09TVExZX09SREVSKTtcbjE0NjU6XHRcdGlmICghc2tiKVxuMTQ2NjpcdFx0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuMTQ2NzpcdFxuMTQ2ODpcdFx0c2tiX3Jlc2VydmUoc2tiLCBwcmVwYWQpO1xuMTQ2OTpcdFx0c2tiX3B1dChza2IsIGxpbmVhcik7XG4xNDcwOlx0XHRza2ItXHUwMDNlZGF0YV9sZW4gPSBsZW4gLSBsaW5lYXI7XG4xNDcxOlx0XHRza2ItXHUwMDNlbGVuICYjNDM7PSBsZW4gLSBsaW5lYXI7XG4xNDcyOlx0XG4xNDczOlx0XHRyZXR1cm4gc2tiO1xuMTQ3NDpcdH1cbjE0NzU6XHRcbjE0NzY6XHRzdGF0aWMgdm9pZCB0dW5fcnhfYmF0Y2hlZChzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLCBzdHJ1Y3QgdHVuX2ZpbGUgKnRmaWxlLFxuMTQ3NzpcdFx0XHRcdCAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBtb3JlKVxuMTQ3ODpcdHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTk0NzIKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAzOTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtNU0FOIEJ1ZyoqCgpPa2F5LCBzbyBoZXJlJiMzOTtzIHdoYXQgSSYjMzk7bSB0aGlua2luZy4gVGhpcyBgc29ja19hbGxvY19zZW5kX3Bza2JgIGZ1bmN0aW9uIGlzIGFsbG9jYXRpbmcgdGhlIHNvY2tldCBidWZmZXIgKHNrYiksIGJ1dCBpdCAqZG9lc24mIzM5O3QqIHplcm8gb3V0IHRoZSBkYXRhIGJ1ZmZlci4gVGhhdCBtZWFucyBldmVyeXRoaW5nIGJleW9uZCB0aGUgaW5pdGlhbCAmIzM5O2xpbmVhciYjMzk7IGRhdGEsIHdoaWNoIGlzIG91ciAmIzM5O2xlbiYjMzk7LCBpcyBqdXN0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBOb3csIGB0dW5fZ2V0X3VzZXJgIHRoZW4gY29waWVzICYjMzk7bGVuJiMzOTsgYnl0ZXMgZnJvbSB1c2VyIHNwYWNlIGludG8gdGhpcyBidWZmZXIuIFRoZSBieXRlcyBiZXlvbmQgJiMzOTtsZW4mIzM5OyAqcmVtYWluKiB1bmluaXRpYWxpemVkLiBUaGF0JiMzOTtzIHRoZSBrZXkuCgpUaGVuLCB3ZSBoYXZlIGBldGhfdHlwZV90cmFuc2AgcmVhZGluZyBgZXRoLSZndDtoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIElmIG91ciAmIzM5O2xlbiYjMzk7IGlzIGxlc3MgdGhhbiAxNCBieXRlcywgaXQmIzM5O3MgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSEgVGhpcyAqc2NyZWFtcyogS01TQU4gYnVnLCBhIGNsYXNzaWMgb25lLgoKV2FpdCwgZGlkIHN5emthbGxlciBhY3R1YWxseSBmaW5kIHRoaXMgb25lIHdpdGggS0FTQU4/IElmIEtBU0FOIGlzbiYjMzk7dCBjYXRjaGluZyBpdCwgYW5kIHRoYXQgYEJVR19PTmAgaXNuJiMzOTt0IGZpcmluZywgdGhlbiB0aGUgb25seSB3YXkgc3l6a2FsbGVyIHdvdWxkIGhhdmUgZm91bmQgaXQgd291bGQgYmUgdGhyb3VnaCBLTVNBTi4gVGhhdCYjMzk7cyBpbnRlcmVzdGluZy4KCk5vdywgd2FpdCwgd2hhdCBpZiBgZnJhZ3NgIGlzIHRydWU/IElmIGBmcmFnc2AgaXMgdHJ1ZSwgdGhlbiBgdHVuX2dldF91c2VyYCBjYWxscyBgcHNrYl9tYXlfcHVsbChza2IsIEVUSF9ITEVOKWAuIElmIHRoYXQgZmFpbHMsIHRoZSBwYWNrZXQgZ2V0cyBkcm9wcGVkLCBubyBoYXJtLiBJZiBpdCAqc3VjY2VlZHMqLCB3ZSBrbm93IHRoYXQgYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYCBhbmQgYHNrYl9oZWFkbGVuKHNrYikgJmd0Oz0gRVRIX0hMRU5gLiBTbywgZXZlbiBpZiBgZnJhZ3NgIGlzIHRydWUsIHRoZSBgQlVHX09OYCBpc24mIzM5O3QgdHJpZ2dlcmVkIGluIGB0dW5fZ2V0X3VzZXJgIQoKV2FpdCwgd2FpdC4gSWYgYGZyYWdzYCBpcyB0cnVlLCBgcHNrYl9tYXlfcHVsbGAgZW5zdXJlcyBgc2tiX2hlYWRsZW4oc2tiKSAmZ3Q7PSBFVEhfSExFTmAuIFRoYXQmIzM5O3MgdGhlIHJlYWwgcG9pbnQuIFNvIGBCVUdfT05gIGlzIG5ldmVyIHRyaWdnZXJlZCBmcm9tIGB0dW5fZ2V0X3VzZXJgLgoKT2theSwgaXMgdGhlcmUgYW5vdGhlciBjYWxsZXIgb2YgYGV0aF90eXBlX3RyYW5zYCB0aGF0IGNvdWxkIGJlIHRyaWdnZXJlZCB0aGlzIHdheT8gV2hhdCBhYm91dCBgcGFja2V0X3NuZGAgaW4gYG5ldC9wYWNrZXQvYWZfcGFja2V0LmNgPyBUaGF0IHNlZW1zIGxpa2UgYSBsb2dpY2FsIG5leHQgc3RlcCB0byBleGFtaW5lLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF90eXBlX3RyYW5zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3BhY2tldC9hZl9wYWNrZXQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMzk0CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUuIE15IG1pbmQgaXMganVtcGluZyBhcm91bmQgYSBiaXQgaGVyZSwgdHJ5aW5nIHRvIHBpZWNlIHRoaXMgdG9nZXRoZXIuLi4KCioqSW52ZXN0aWdhdGluZyBQYWNrZXQgUmVjZXB0aW9uIEZsb3cqKgoKSG9sZCBvbiBhIHNlY29uZC4uLiBJIHdhcyB1bmRlciB0aGUgaW1wcmVzc2lvbiB0aGF0IGBwYWNrZXRfc25kYCB3YXMgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIG91dGJvdW5kIHBhY2tldCBwcm9jZXNzaW5nLCBidXQgbm93IGl0IG9jY3VycyB0byBtZSB0aGF0IGl0ICoqZG9lc24mIzM5O3QqKiBhY3R1YWxseSBjYWxsIGBldGhfdHlwZV90cmFuc2AgZGlyZWN0bHksIHdoaWNoIGlzIHdoZXJlIHRoZSBFdGhlcm5ldCB0eXBlIGRldGVybWluYXRpb24gdXN1YWxseSBoYXBwZW5zLiBUaGF0JiMzOTtzIGEga2V5IHBpZWNlIG1pc3NpbmcgZnJvbSBteSBtZW50YWwgbW9kZWwhIFdoZXJlICpkb2VzKiB0aGF0IGhhcHBlbiBpbiB0aGUgdHlwaWNhbCBwYXRoPwoKQWxyaWdodCwgbGV0JiMzOTtzIGJhY2sgdXAgYW5kIHJldGhpbmsgdGhpcy4gTWF5YmUgaXQmIzM5O3Mgbm90IHRoZSB0cmFuc21pc3Npb24gc2lkZSBJIG5lZWQgdG8gZm9jdXMgb24gcmlnaHQgbm93LiBQZXJoYXBzIG15IGF0dGVudGlvbiBzaG91bGQgc2hpZnQgdG8gdGhlIHZpcnR1YWwgbmV0d29yayBkZXZpY2Ugc2lkZSBmb3IgcmVjZXB0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gd2hhdCBmdW5jdGlvbiBpcyB1c2VkIGZvciBpbmNvbWluZyBwYWNrZXQgcHJvY2Vzc2luZy4gSSYjMzk7bSBnb2luZyB0byBsb29rIGF0IGBkcml2ZXJzL25ldC92aXJ0aW9fbmV0LmNgLCBzcGVjaWZpY2FsbHkgYHZpcnRuZXRfcmVjZWl2ZWAuIEl0IGZlZWxzIGxpa2UgdGhhdCYjMzk7cyB0aGUgbW9yZSByZWxldmFudCBhcmVhIGdpdmVuIHRoZSBmbG93IG9mIHRyYWZmaWMgSSYjMzk7bSBleHBlY3RpbmcuIEhvcGVmdWxseSwgYHZpcnRuZXRfcmVjZWl2ZWAgaXMgd2hlcmUgdGhlIHBhY2tldCB0eXBlIGlzIGRldGVybWluZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF90eXBlX3RyYW5zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdmlydGlvX25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYz0yMDMwPXN0YXRpYyB2b2lkIG1lcmdlYWJsZV9idWZfZnJlZShzdHJ1Y3QgcmVjZWl2ZV9xdWV1ZSAqcnEsIGludCBudW1fYnVmLFxuLS1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMDU2LSAqICAyLiB4ZHBfYnVpbGRfc2tiX2Zyb21fZnJhbWUoKSBkb2VzIG1vcmUgY2hlY2tzIHRoYXQgd2UgZG9uJiMzOTt0IG5lZWQsXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM6MjA1NzogKiAgICAgbGlrZSBldGhfdHlwZV90cmFucygpICh3aGljaCB2aXJ0aW8tbmV0IGRvZXMgaW4gcmVjZWl2ZV9idWYoKSkuXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjA1OC0gKi9cbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjUwMD1zdGF0aWMgdm9pZCB2aXJ0bmV0X3JlY2VpdmVfZG9uZShzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSwgc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLFxuLS1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNTI4LVx0c2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHZxMnJ4cShycS1cdTAwM2V2cSkpO1xuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jOjI1Mjk6XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7XG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjUzMC1cdHByX2RlYnVnKFwmIzM0O1JlY2VpdmluZyBza2IgcHJvdG8gMHglMDR4IGxlbiAlaSB0eXBlICVpXFxuXCYjMzQ7LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTAxOAoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZToKCioqQ2hlY2tpbmcgdGhlIEZvdW5kYXRpb246IFJlY2VpdmUgQ29tcGxldGlvbiBJbmRpY2F0b3JzKioKClJpZ2h0LCBiZWZvcmUgZGl2aW5nIGRlZXBlciwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJiMzOTttIGdyb3VuZGVkLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIHRoZSBmdW5kYW1lbnRhbCBpbmRpY2F0b3JzIG9mIHJlY2VpdmUgY29tcGxldGlvbi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgdHdvIGNyaXRpY2FsIGVsZW1lbnRzIHRoYXQgbGlrZWx5IHNpZ25hbCB3aGV0aGVyIGEgcmVjZWl2ZSBvcGVyYXRpb24gaGFzIGZpbmFsaXplZC4gVGhpcyBjb3VsZCBiZSBjaGVja2luZyB0aGUgc3RhdGUgb2YgYSBkYXRhIGJ1ZmZlciAoYHJlY2VpdmVfYnVmYCkgaXRzZWxmLiBPciBhIGRlZGljYXRlZCBmbGFnIG9yIHZhcmlhYmxlIGluZGljYXRpbmcgdGhhdCBhIHJlY2VwdGlvbiBpcyBgdmlydG5ldF9yZWNlaXZlX2RvbmVgLiBFc3NlbnRpYWxseSBJIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGlmIHRoZSByZWNlaXZlciBpcyBmaW5pc2hlZCBmb3IgYSBuZXcgaW5jb21pbmcgZGF0YS4gV2l0aG91dCBjb25maXJtaW5nIGVpdGhlciB0aGUgYnVmZmVyIHN0YXR1cyBvciByZWNlcHRpb24gc3RhdHVzLCB0aGVyZSYjMzk7cyBubyBzZW5zZSBpbiBwcm9jZWVkaW5nIHdpdGggYW55IGRlZXBlciBhbmFseXNpcyBvZiB0aGUgbmV0d29yayBpbnRlcmFjdGlvbi4gVGhpcyBwcmVsaW1pbmFyeSBzdGVwIGlzIGNydWNpYWwgdG8gYXZvaWQgY2hhc2luZyBnaG9zdHMgb3IgZHJhd2luZyBjb25jbHVzaW9ucyBiYXNlZCBvbiBpbmNvbXBsZXRlIGRhdGEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdmlydGlvX25ldC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjUxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNTE1Olx0XHRcdGdvdG8gZnJhbWVfZXJyO1xuMjUxNjpcdFx0fVxuMjUxNzpcdFxuMjUxODpcdFx0aWYgKHZpcnRpb19uZXRfaGRyX3RubF90b19za2Ioc2tiLCBcdTAwMjZoZHItXHUwMDNldG5sX2hkciwgdmktXHUwMDNlcnhfdG5sLFxuMjUxOTpcdFx0XHRcdFx0ICAgICAgdmktXHUwMDNlcnhfdG5sX2NzdW0sXG4yNTIwOlx0XHRcdFx0XHQgICAgICB2aXJ0aW9faXNfbGl0dGxlX2VuZGlhbih2aS1cdTAwM2V2ZGV2KSkpIHtcbjI1MjE6XHRcdFx0bmV0X3dhcm5fcmF0ZWxpbWl0ZWQoXCYjMzQ7JXM6IGJhZCBnc286IHR5cGU6ICV4LCBzaXplOiAldSwgZmxhZ3MgJXggdHVubmVsICVkIHRubCBjc3VtICVkXFxuXCYjMzQ7LFxuMjUyMjpcdFx0XHRcdFx0ICAgICBkZXYtXHUwMDNlbmFtZSwgaGRyLVx1MDAzZWhkci5nc29fdHlwZSxcbjI1MjM6XHRcdFx0XHRcdCAgICAgaGRyLVx1MDAzZWhkci5nc29fc2l6ZSwgaGRyLVx1MDAzZWhkci5mbGFncyxcbjI1MjQ6XHRcdFx0XHRcdCAgICAgdmktXHUwMDNlcnhfdG5sLCB2aS1cdTAwM2VyeF90bmxfY3N1bSk7XG4yNTI1Olx0XHRcdGdvdG8gZnJhbWVfZXJyO1xuMjUyNjpcdFx0fVxuMjUyNzpcdFxuMjUyODpcdFx0c2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHZxMnJ4cShycS1cdTAwM2V2cSkpO1xuMjUyOTpcdFx0c2tiLVx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpO1xuMjUzMDpcdFx0cHJfZGVidWcoXCYjMzQ7UmVjZWl2aW5nIHNrYiBwcm90byAweCUwNHggbGVuICVpIHR5cGUgJWlcXG5cJiMzNDssXG4yNTMxOlx0XHRcdCBudG9ocyhza2ItXHUwMDNlcHJvdG9jb2wpLCBza2ItXHUwMDNlbGVuLCBza2ItXHUwMDNlcGt0X3R5cGUpO1xuMjUzMjpcdFxuMjUzMzpcdFx0bmFwaV9ncm9fcmVjZWl2ZShcdTAwMjZycS1cdTAwM2VuYXBpLCBza2IpO1xuMjUzNDpcdFx0cmV0dXJuO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTY3MAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE0OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBWaXJ0aW8tTmV0IFBhY2tldCBWdWxuZXJhYmlsaXR5KioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIGhvdyB2aXJ0aW8tbmV0IGhhbmRsZXMgaW5jb21pbmcgcGFja2V0cywgc3BlY2lmaWNhbGx5IHRob3NlIHRoYXQgbWlnaHQgYmUgbWFsZm9ybWVkLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gdmlydGlvLW5ldCBnZXRzIGEgcGFja2V0IHNob3J0ZXIgdGhhbiAxNCBieXRlcy4gSXQganVtcHMgdG8gYGV0aF90eXBlX3RyYW5zYCwgcmlnaHQ/IFRoZSBxdWVzdGlvbiBpcywgd2lsbCB0aGF0IHRyaWdnZXIgYSBgQlVHX09OYD8gSSYjMzk7bSB0cnlpbmcgdG8gYmUgdmVyeSBwcmVjaXNlIGhlcmUgYW5kIGF2b2lkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLgoKSSYjMzk7bSBjb25zaWRlcmluZyBhIGxpbmVhciBwYWNrZXQgbm93LiBJZiB0aGUgcGFja2V0IGlzIGxpbmVhciwgSSB0aGluayBpdCYjMzk7cyBsaWtlbHkgdGhhdCBgc2tiLSZndDtsZW5gIHdvdWxkIGJlIGxlc3MgdGhhbiBgRVRIX0hMRU5gLCB3aGljaCBpcyAxNC4gQWxzbyBgc2tiX2hlYWRsZW4oc2tiKWAgd2lsbCBiZSBsZXNzIHRoYW4gYEVUSF9ITEVOYC4gU28sIGluIHRoaXMgc2NlbmFyaW8sIEkmIzM5O20gcHJldHR5IHN1cmUgdGhhdCBpdCB3b24mIzM5O3QgdHJpZ2dlciBhIGBCVUdfT05gLiBIb3dldmVyLCBpdCBXSUxMIGxlYWQgdG8gdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgcmVhZCwgd2hpY2ggaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZC4KCk5vdyBJJiMzOTttIGZvY3VzaW5nIG9uIGZyYWdtZW50ZWQgcGFja2V0cy4gV2l0aCBmcmFnbWVudGF0aW9uLCBgcmVjZWl2ZV9tZXJnZWFibGVgIGNvbWVzIGludG8gcGxheS4gQ291bGQgYHJlY2VpdmVfbWVyZ2VhYmxlYCBwb3NzaWJseSBidWlsZCBhbiBza2Igd2hlcmUgYHNrYi0mZ3Q7bGVuYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYEVUSF9ITEVOYCBidXQgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gPyBUaGF0IHNlZW1zIGxpa2UgYSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eS4gSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoYXQgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIGl0JiMzOTtzIGhhbmRsZWQuIFNvLCB0aGF0JiMzOTtzIHdoYXQgSSYjMzk7bSBnb2luZyB0byBsb29rIGF0IG5leHQg4oCTIGNhbiB0aGlzIGZ1bmN0aW9uIGNyZWF0ZSB0aGlzIGNvbmRpdGlvbj8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmVjZWl2ZV9tZXJnZWFibGUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvdmlydGlvX25ldC5jPTIxODY9c3RhdGljIHZvaWQgKm1lcmdlYWJsZV94ZHBfZ2V0X2J1ZihzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjI2My1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYzoyMjY0OnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcmVjZWl2ZV9tZXJnZWFibGVfeGRwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjI2NS1cdFx0XHRcdFx0ICAgICBzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjMyNj1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnZpcnRuZXRfc2tiX2FwcGVuZF9mcmFnKHN0cnVjdCByZWNlaXZlX3F1ZXVlICpycSxcbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjM3NS1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYzoyMzc2OnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcmVjZWl2ZV9tZXJnZWFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMzc3LVx0XHRcdFx0XHQgc3RydWN0IHZpcnRuZXRfaW5mbyAqdmksXG4tLVxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTI0MDUtXHRcdGlmICh4ZHBfcHJvZykge1xuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jOjI0MDY6XHRcdFx0aGVhZF9za2IgPSByZWNlaXZlX21lcmdlYWJsZV94ZHAoZGV2LCB2aSwgcnEsIHhkcF9wcm9nLCBidWYsIGN0eCxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNDA3LVx0XHRcdFx0XHRcdFx0IGxlbiwgeGRwX3htaXQsIHN0YXRzKTtcbi0tXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjU0MT1zdGF0aWMgdm9pZCByZWNlaXZlX2J1ZihzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSwgc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLFxuLS1cbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNTc3LVx0XHRmbGFncyA9ICgoc3RydWN0IHZpcnRpb19uZXRfY29tbW9uX2hkciAqKWJ1ZiktXHUwMDNlaGRyLmZsYWdzO1xuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jOjI1Nzg6XHRcdHNrYiA9IHJlY2VpdmVfbWVyZ2VhYmxlKGRldiwgdmksIHJxLCBidWYsIGN0eCwgbGVuLCB4ZHBfeG1pdCxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNTc5LVx0XHRcdFx0XHRzdGF0cyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNjg2CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTU1NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEltcGxpY2F0aW9ucyBvZiBhIE5ldHdvcmsgUGFja2V0IFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgc28gaGVyZSYjMzk7cyB0aGUgc2l0dWF0aW9uIGFzIEkgc2VlIGl0LiBJdCBsb29rcyBsaWtlIHdpdGggdmlydGlvLW5ldCwgaWYgYSBwYWNrZXQgYXJyaXZlcyBmcmFnbWVudGVkIGFuZCB0aGUgZmlyc3QgYnVmZmVyIGlzIHRpbnksIHRoZW4gYHJlY2VpdmVfbWVyZ2VhYmxlYCBidWlsZHMgYW4gU0tCIHdoZXJlIHRoZSBoZWFkZXIgaXMgc21hbGwsIGJ1dCB0aGUgdG90YWwgbGVuZ3RoIGlzIGxhcmdlci4gIFRoaXMgdGhlbiBnZXRzIHBhc3NlZCB0byBgZXRoX3R5cGVfdHJhbnNgLiBUaGUgcHJvYmxlbSBzdXJmYWNlcyB3aGVuIGBza2JfcHVsbF9pbmxpbmVgIGNhbGxzIGBfX3NrYl9wdWxsYC4gIGBfX3NrYl9wdWxsYCBzdWJ0cmFjdHMgdGhlIEV0aGVybmV0IGhlYWRlciBsZW5ndGggZnJvbSBgc2tiLSZndDtsZW5gLiAgSWYgdGhlIGhlYWRlciBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBpbml0aWFsIGxpbmVhciBkYXRhLCB3ZSBoaXQgYSBgQlVHX09OYCBiZWNhdXNlIHRoZSBuZXcgYHNrYi0mZ3Q7bGVuYCB3b3VsZCBiZSBsZXNzIHRoYW4gYHNrYi0mZ3Q7ZGF0YV9sZW5gLCBpbmRpY2F0aW5nIHRoZSBwYWNrZXQmIzM5O3MgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiBpdHMgZGF0YS4KCk5vdywgc3l6a2FsbGVyICpjYW4qIGZpbmQgdGhpcyBgQlVHX09OYCBzY2VuYXJpbyB3aXRob3V0IEtNU0FOLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gQnV0LCBJIHNlZSB0aGF0IGEgcGF0Y2ggZXhpc3RzIHdoaWNoIGNoZWNrcyBgc2tiX2hlYWRsZW4oc2tiKWAgYWdhaW5zdCBgRVRIX0hMRU5gLCBwcmV2ZW50aW5nIGJvdGggdGhlIGBCVUdfT05gIHdoZW4gYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYCBhbmQgdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgd2hlbiBgc2tiLSZndDtsZW4gJmx0OyBFVEhfSExFTmAuCgpTbyB0aGUgcXVlc3Rpb24gaXMsIGRpZCBzeXprYWxsZXIgZGlzY292ZXIgdGhlIGBCVUdfT05gIG9yIHRoZSBLTVNBTiBpc3N1ZT8gSWYgaXQgd2FzIHRoZSBgQlVHX09OYCwgd2UgZG9uJiMzOTt0ICpzdHJpY3RseSogbmVlZCBLTVNBTiwgcmlnaHQ/IFN0YW5kYXJkIGZ1enppbmcgdG9vbHMgd291bGQgbGlrZWx5IGNhdGNoIHRoYXQuIEJ1dCwgd2FpdCwgaXMgdGhlcmUgYSBjYXNlIHdoZXJlIGBza2ItJmd0O2xlbiAmbHQ7IEVUSF9ITEVOYCBpcyB0aGUgKm9ubHkqIHdheSB0byB0cmlnZ2VyIGEgYnVnPyBBaCwgeWVzISBJZiBhIGRldmljZSBvbmx5IGhhbmRsZXMgbGluZWFyIHBhY2tldHMsIHRoYXQgY29uZGl0aW9uIGlzIHRoZSAqb25seSogd2F5LgoKVGFrZSBgdHVuX2dldF91c2VyYCB3aXRoIGBJRkZfVEFQYCBhbmQgYGZyYWdzID09IGZhbHNlYCBmb3IgZXhhbXBsZSwgd2hpY2ggY3JlYXRlcyBhIGxpbmVhciBTS0Igd2l0aCBgc2tiLSZndDtsZW4gJmx0OyBFVEhfSExFTmAuICBObyBgQlVHX09OYCBoZXJlLiBJdCBjYWxscyBgZXRoX3R5cGVfdHJhbnNgIGFuZCBwcm9jZWVkcyB0byByZWFkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBLTVNBTiBjYXRjaGVzIHRoYXQuIFN5emthbGxlciwgd2l0aG91dCBLTVNBTiwgd29uJiMzOTt0IGZpbmQgKnRoYXQqIGJ1ZyBiZWNhdXNlIGl0IG1pZ2h0IGJyYW5jaCBvbiB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZSwgYnV0IG5vIGNyYXNoLiBCdXQsIGlmIGBldGhfdHlwZV90cmFuc2AgaXMgY29tbW9uLCBhbmQgdGhlIGZ1enplciBmb3VuZCBhIGBCVUdfT05gIHRocm91Z2ggdmlydGlvLW5ldCBvciBhbm90aGVyIGRyaXZlciBjcmVhdGluZyBmcmFnbWVudGVkIFNLQnMgd2l0aCBzaG9ydCBsaW5lYXIgcGFydHMsIHRoZW4gaXQgZXNzZW50aWFsbHkgZm91bmQgdGhlIHVuZGVybHlpbmcgdnVsbmVyYWJpbGl0eSB0aHJvdWdoIGFub3RoZXIgZHJpdmVyLCBhbmQgd2UgZG9uJiMzOTt0IG5lZWQgS01TQU4gdG8gZmluZCB0aGF0LgoKT2theSwgYmFjayB0byBgdHVuX2dldF91c2VyYC4gSWYgYGZyYWdzID09IHRydWVgLCBpdCAqZG9lcyogY2hlY2sgYHBza2JfbWF5X3B1bGxgLCBzbyB3ZSYjMzk7cmUgc2FmZSB0aGVyZS4gQnV0IHdpdGggYGZyYWdzID09IGZhbHNlYCwgaXQgY3JlYXRlcyBhIGxpbmVhciBTS0IsIGBza2ItJmd0O2xlbiAmbHQ7IEVUSF9ITEVOYCwgY2FsbHMgYGV0aF90eXBlX3RyYW5zYCwgYW5kIHRoZSBidWcgaXMgdGhhdCB0aGUgc3lzdGVtIG5vdyByZWFkcyB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhpcyAqb25seSogZ2V0cyBjYXVnaHQgYnkgS01TQU4sIHdoaWNoIGlzIGltcG9ydGFudC4KCkFyZSB0aGVyZSBvdGhlciBkcml2ZXJzIGF0IHJpc2s/IE1hbnkgZHJpdmVycyBhc3N1bWUgcGFja2V0cyBzbWFsbGVyIHRoYW4gMTQgYnl0ZXMgYXJlIGRyb3BwZWQuIFZpcnR1YWwgZHJpdmVycyBsaWtlIGB2ZXRoYCwgYGxvb3BiYWNrYCwgYW5kIGB3aXJlZ3VhcmRgICptaWdodCogbm90LiBUaGUgcGF0Y2ggZml4ZXMgdGhpcy4gU28sIGlmIGEgZHJpdmVyIGNyZWF0ZXMgYSBsaW5lYXIgU0tCIHdpdGggYHNrYi0mZ3Q7bGVuICZsdDsgRVRIX0hMRU5gLCBLTVNBTiBjYXRjaGVzIGl0LiBGcmFnbWVudGVkIFNLQnMgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0PyBgQlVHX09OYC4KClRoZSBjb3JlIHF1ZXN0aW9uIGlzIHRoaXMgcGF0Y2ggYW5kIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGNhdWdodCAqb25seSogYnkgS01TQU4uIFllcy4gUmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRvIGBza2ItJmd0O3Byb3RvY29sYCAoYWxsb2NhdGVkIGJ5IGBrbWFsbG9jYCBvciBwYWdlIGFsbG9jYXRvciBhbmQgbm90IHplcm9lZCkgY2FuIGxlYWQgdG8gcm91dGluZyB0aGUgcGFja2V0IHRvIGFuIGFyYml0cmFyeSBwcm90b2NvbCBoYW5kbGVyLiBUaGlzIGlzIGEgdXNlLW9mLXVuaW5pdGlhbGl6ZWQgdmFsdWUhIEtNU0FOIGlzICpkZXNpZ25lZCogdG8gZmluZCB0aGlzLgoKQW5kIHdhaXQgYSBzZWNvbmQuIElmIGBza2ItJmd0O3Byb3RvY29sYCBpcyB1bmluaXRpYWxpemVkLCBpdCBjb3VsZCBnbyB0byBhIHBhY2tldCBzb2NrZXQgKEFGX1BBQ0tFVCkuIFRoZSB1c2VyICpjb3VsZCogdGhlbiByZWNlaXZlIHRoZSBwYWNrZXQgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZnJvbSBgc2xsX3Byb3RvY29sYCBpbiB0aGUgYHNvY2thZGRyX2xsYCByZXR1cm5lZCBieSBgcmVjdmZyb21gLiBUaGF0IGlzIGEgZGlyZWN0IGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiAyIGJ5dGVzISBXb3cuIEkgbmVlZCB0byB2ZXJpZnkgdGhpcy4uLiB0aW1lIHRvIGNoZWNrIGBwYWNrZXRfcmN2YCBpbiBgbmV0L3BhY2tldC9hZl9wYWNrZXQuY2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NsbF9wcm90b2NvbCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9wYWNrZXQvYWZfcGFja2V0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3BhY2tldC9hZl9wYWNrZXQuYz0yMTMzPXN0YXRpYyBpbnQgcGFja2V0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjIwNi1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6MjIwNzpcdC8qIHNsbC1cdTAwM2VzbGxfZmFtaWx5IGFuZCBzbGwtXHUwMDNlc2xsX3Byb3RvY29sIGFyZSBzZXQgaW4gcGFja2V0X3JlY3Ztc2coKS5cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjIwOC1cdCAqIFVzZSB0aGVpciBzcGFjZSBmb3Igc3RvcmluZyB0aGUgb3JpZ2luYWwgc2tiIGxlbmd0aC5cbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTIyNDY9c3RhdGljIGludCB0cGFja2V0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjQ3NS1cdHNsbC1cdTAwM2VzbGxfaGF0eXBlID0gZGV2LVx1MDAzZXR5cGU7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjI0NzY6XHRzbGwtXHUwMDNlc2xsX3Byb3RvY29sID0gKHNrLVx1MDAzZXNrX3R5cGUgPT0gU09DS19ER1JBTSkgP1xubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yNDc3LVx0XHR2bGFuX2dldF9wcm90b2NvbF9kZ3JhbShza2IpIDogc2tiLVx1MDAzZXByb3RvY29sO1xuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MjczNj1zdGF0aWMgaW50IHRwYWNrZXRfc25kKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sIHN0cnVjdCBtc2doZHIgKm1zZylcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI3NzYtXHRcdFx0Z290byBvdXQ7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjI3Nzc6XHRcdHByb3RvXHQ9IHNhZGRyLVx1MDAzZXNsbF9wcm90b2NvbDtcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjc3OC1cdFx0ZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChcdTAwMjZwby1cdTAwM2VzayksIHNhZGRyLVx1MDAzZXNsbF9pZmluZGV4KTtcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTI5NjY9c3RhdGljIGludCBwYWNrZXRfc25kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbilcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI5OTUtXHRcdFx0Z290byBvdXQ7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjI5OTY6XHRcdHByb3RvXHQ9IHNhZGRyLVx1MDAzZXNsbF9wcm90b2NvbDtcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjk5Ny1cdFx0ZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChzayksIHNhZGRyLVx1MDAzZXNsbF9pZmluZGV4KTtcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTMzMzM9c3RhdGljIGludCBwYWNrZXRfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqdWFkZHIsIGludCBhZGRyX2xlbilcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMzNDYtXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjMzNDc6XHRyZXR1cm4gcGFja2V0X2RvX2JpbmQoc2ssIE5VTEwsIHNsbC1cdTAwM2VzbGxfaWZpbmRleCwgc2xsLVx1MDAzZXNsbF9wcm90b2NvbCk7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMzNDgtfVxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MzQzOD1zdGF0aWMgaW50IHBhY2tldF9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbixcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTM1MTAtXHRcdHNsbC1cdTAwM2VzbGxfZmFtaWx5ID0gQUZfUEFDS0VUO1xubmV0L3BhY2tldC9hZl9wYWNrZXQuYzozNTExOlx0XHRzbGwtXHUwMDNlc2xsX3Byb3RvY29sID0gKHNvY2stXHUwMDNldHlwZSA9PSBTT0NLX0RHUkFNKSA/XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTM1MTItXHRcdFx0dmxhbl9nZXRfcHJvdG9jb2xfZGdyYW0oc2tiKSA6IHNrYi1cdTAwM2Vwcm90b2NvbDtcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTM2MjM9c3RhdGljIGludCBwYWNrZXRfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLFxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzYzNy1cdHNsbC1cdTAwM2VzbGxfaWZpbmRleCA9IGlmaW5kZXg7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjM2Mzg6XHRzbGwtXHUwMDNlc2xsX3Byb3RvY29sID0gUkVBRF9PTkNFKHBvLVx1MDAzZW51bSk7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTM2MzktXHRzbGwtXHUwMDNlc2xsX3BrdHR5cGUgPSAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjE0OQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDk1NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBIERlZXAgRGl2ZSBpbnRvIGEgS2VybmVsIEluZm9ybWF0aW9uIExlYWsqKgoKT2theSwgc28gSSYjMzk7dmUgc3R1bWJsZWQgdXBvbiBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaW4gYHBhY2tldF9yZWN2bXNnYC4gSWYgYHNrYi0mZ3Q7cHJvdG9jb2xgIGlzbiYjMzk7dCBpbml0aWFsaXplZCwgaXQmIzM5O3MgY29waWVkIGRpcmVjdGx5IGludG8gYHNsbC0mZ3Q7c2xsX3Byb3RvY29sYCBhbmQgc2VudCBzdHJhaWdodCB0byB1c2VyIHNwYWNlIHZpYSBgbXNnLSZndDttc2dfbmFtZWDigJRzcGVjaWZpY2FsbHksIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZS4gVGhpcyBsb29rcyBsaWtlIGEgc3RyYWlnaHRmb3J3YXJkIGtlcm5lbC10by11c2VyIGluZm9ybWF0aW9uIGxlYWssIGFuZCB0aGUga2lja2VyPyBJdCYjMzk7cyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnksIHR3byBieXRlcyBvZiBpdCEgVGhhdCBtZWFucyBLQVNBTiB3b24mIzM5O3QgY2F0Y2ggaXQuIEl0JiMzOTtzIEtNU0FOJiMzOTtzIHRlcnJpdG9yeSEKCkJ1dCwgaG9sZCBvbiBhIHNlY29uZC4uLiBpcyB0aGUgbWVtb3J5ICphY3R1YWxseSogdW5pbml0aWFsaXplZD8gTGV0JiMzOTtzIHRyYWNlIGl0IGJhY2suIFdoZW4gYHR1bl9hbGxvY19za2JgIGFsbG9jYXRlcyB0aGUgYHNrYmAsIGl0IGdvZXMgdGhyb3VnaCBgc29ja19hbGxvY19zZW5kX3Bza2JgLCB3aGljaCB1c2VzIGBhbGxvY19za2Jfd2l0aF9mcmFnc2AuIFRoaXMsIGluIHR1cm4sIHVzZXMgYGttZW1fY2FjaGVfYWxsb2Nfbm9kZWAgZm9yIHRoZSBgc2tiYCBpdHNlbGYgYW5kIGBrbWFsbG9jX3Jlc2VydmVgIGZvciB0aGUgZGF0YSBidWZmZXIuIEFuZCB0aGUgY3J1Y2lhbCBiaXQ/IGBrbWFsbG9jX3Jlc2VydmVgIHVzZXMgYGttYWxsb2Nfbm9kZV90cmFja19jYWxsZXJgIChvciBzb21ldGhpbmcgc2ltaWxhciksIHdoaWNoICpkb2VzbiYjMzk7dCogemVybyB0aGUgbWVtb3J5IHVubGVzcyBgX19HRlBfWkVST2AgaXMgcGFzc2VkLiBBbmQsIGd1ZXNzIHdoYXQ/IGBzb2NrX2FsbG9jX3NlbmRfcHNrYmAgKmRvZXNuJiMzOTt0KiBwYXNzIGBfX0dGUF9aRVJPYC4gU28sIHllcywgdGhlIGRhdGEgYnVmZmVyIGlzIHVuaW5pdGlhbGl6ZWQuCgpOb3csIGB0dW5fZ2V0X3VzZXJgIGNvcGllcyBgbGVuYCBieXRlcyBmcm9tIHVzZXIgc3BhY2UgdXNpbmcgYHNrYl9jb3B5X2RhdGFncmFtX2Zyb21faXRlcmAuIFRoZSBieXRlcyBiZXlvbmQgYGxlbmAgcmVtYWluIHVudG91Y2hlZOKAlHN0aWxsIHVuaW5pdGlhbGl6ZWQuIFRoZW4sIGBldGhfdHlwZV90cmFuc2AgY29tZXMgaW50byBwbGF5LCByZWFkaW5nIGBldGgtJmd0O2hfcHJvdG9gIGF0IG9mZnNldCAxMi4gSWYgYGxlbiAmbHQ7IDE0YCwgaXQmIzM5O3MgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhhdCB1bmluaXRpYWxpemVkIHZhbHVlIGdldHMgYXNzaWduZWQgdG8gYHNrYi0mZ3Q7cHJvdG9jb2xgLiBUaGUgcGFja2V0IHRoZW4gcGFzc2VzIHRocm91Z2ggYG5ldGlmX3J4YCBvciBgbmV0aWZfcmVjZWl2ZV9za2JgLgoKSGVyZSYjMzk7cyB3aGVyZSBpdCBhbGwgY29ubmVjdHM6IElmIHRoZXJlJiMzOTtzIGFuIEFGX1BBQ0tFVCBzb2NrZXQgc25pZmZpbmcgdGhlIGludGVyZmFjZSwgaXQgcmVjZWl2ZXMgdGhpcyBwYWNrZXQuIFRoZSB1c2VyIHRoZW4gcmVhZHMgZnJvbSB0aGUgQUZfUEFDS0VUIHNvY2tldCBhbmQgZ2V0cyB0aG9zZSBqdWljeSwgdW5pbml0aWFsaXplZCAyIGJ5dGVzIGluIGBzbGxfcHJvdG9jb2xgLiBCaW5nbyEgVGhpcyBpcyBhIGNvbXBsZXRlbHkgbGVnaXRpbWF0ZSBpbmZvLWxlYWssIGFuZCBpdCYjMzk7cyBzb2xlbHkgY2F1Z2h0IGJ5IEtNU0FOLgoKTGV0JiMzOTtzIGRvIHNvbWUgbW9yZSBkaWdnaW5nLiBDYW4gYHR1bl9nZXRfdXNlcmAgYWN0dWFsbHkgc2VuZCBhIHBhY2tldCB3aXRoIGBsZW4gJmx0OyAxNGAgdG8gYGV0aF90eXBlX3RyYW5zYD8KCkxvb2tpbmcgYXQgYHR1bl9nZXRfdXNlcmA6IEkgY2FuIHNlZSB0aGUgY29uZGl0aW9uYWw6CmBgYGMKCWlmICh0dW4tJmd0O2ZsYWdzICZhbXA7IElGRl9WTkVUX0hEUikgewoJCS8vIHJlYWRzIHZuZXQgaGVhZGVyCgl9CgoJLy8gLi4uCglza2IgPSB0dW5fYWxsb2Nfc2tiKHRmaWxlLCBhbGlnbiwgY29weWxlbiwgbGluZWFyLCBub2Jsb2NrKTsKCS8vIC4uLgoJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1fZnJvbV9pdGVyKHNrYiwgMCwgZnJvbSwgbGVuKTsKCS8vIC4uLgoJc3dpdGNoICh0dW4tJmd0O2ZsYWdzICZhbXA7IFRVTl9UWVBFX01BU0spIHsKCWNhc2UgSUZGX1RVTjoKCQkvLyAuLi4KCQlicmVhazsKCWNhc2UgSUZGX1RBUDoKCQlpZiAoZnJhZ3MgJmFtcDsmYW1wOyAhcHNrYl9tYXlfcHVsbChza2IsIEVUSF9ITEVOKSkgewoJCQkvLyAuLi4KCQl9CgkJc2tiLSZndDtwcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgdHVuLSZndDtkZXYpOwoJCWJyZWFrOwoJfQpgYGAKClllcywgaXQgbG9va3MgbGlrZSBpZiBgdHVuLSZndDtmbGFncyAmYW1wOyBUVU5fVFlQRV9NQVNLYCBpcyBzZXQgdG8gYElGRl9UQVBgLCBhbmQgYGZyYWdzYCBpcyBmYWxzZSAod2hpY2ggaXMgdGhlIGNhc2UgaWYgdGhlIHBhY2tldCBmaXRzIHdpdGhpbiB0aGUgbGluZWFyIHBvcnRpb24sIG1lYW5pbmcgaWYgaXRzIGxlc3MgdGhhbiAxNCBieXRlcyksIHRoZW4gaXQgY2FsbHMgYGV0aF90eXBlX3RyYW5zKHNrYiwgdHVuLSZndDtkZXYpYCB3aXRob3V0IGEgY2hlY2sgaWYgYHNrYi0mZ3Q7bGVuICZndDs9IEVUSF9ITEVOYC4KClNvLCBhIHVzZXIgY2FuIHdyaXRlLCBzYXksIDEwIGJ5dGVzIHRvIGEgVEFQIGRldmljZS4gVGhlIFRBUCBkZXZpY2Ugd2lsbCBhbGxvY2F0ZSBhbiBgc2tiYCwgY29weSAxMCBieXRlcywgYW5kIHRoZW4gY2FsbCBgZXRoX3R5cGVfdHJhbnNgLiBUaGUgYGV0aF90eXBlX3RyYW5zYCBmdW5jdGlvbiByZWFkcyB0aG9zZSAyIGJ5dGVzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGF0IG9mZnNldCAxMi4gVGhlbiwgdGhlIHBhY2tldCBnZXRzIGluamVjdGVkIGludG8gdGhlIG5ldHdvcmsgc3RhY2suIEFuIEFGX1BBQ0tFVCBzb2NrZXQgY2FuIHJlY2VpdmUgaXQgYW5kIGxlYWsgdGhlIDIgYnl0ZXMuIFRoaXMgaXMsIGluZGVlZCwgYSBwZXJmZWN0IEtNU0FOIGJ1Zy4KCk9rYXksIG5vdywgYXJlIHRoZXJlIGFueSBvdGhlciBjYWxscyB0byBgZXRoX3R5cGVfdHJhbnNgIHdpdGggYHNrYi0mZ3Q7bGVuICZsdDsgRVRIX0hMRU5gPyBJIG5lZWQgdG8gY2hlY2suIExldCYjMzk7cyBsb29rIGF0IGBsb29wYmFja194bWl0YCBpbiBgZHJpdmVycy9uZXQvbG9vcGJhY2suY2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V0aF90eXBlX3RyYW5zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvbG9vcGJhY2suYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL25ldC9sb29wYmFjay5jPTcwPXN0YXRpYyBuZXRkZXZfdHhfdCBsb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpza2IsXG4tLVxuZHJpdmVycy9uZXQvbG9vcGJhY2suYy04Ni1cbmRyaXZlcnMvbmV0L2xvb3BiYWNrLmM6ODc6XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7XG5kcml2ZXJzL25ldC9sb29wYmFjay5jLTg4LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODI1OQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDMzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIExvb3BiYWNrIFRyYW5zbWlzc2lvbiBQYXRoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGxvb3BiYWNrX3htaXRgIGZ1bmN0aW9uLCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0cyBhcmUgYXJvdW5kIGhvdyBpdCBoYW5kbGVzIGluY29taW5nIHBhY2tldHMuIEZpcnN0LCBpdCB0aW1lc3RhbXBzIHRoZSBgc2tiYCBhbmQgY2xlYXJzIHRoZSB0aW1lc3RhbXAgdG8gYXZvaWQgaXNzdWVzIHdpdGggZGlmZmVyZW50IGNsb2NrIGJhc2VzLiBJdCB0aGVuIG9ycGhhbnMgdGhlIGBza2JgIGFuZCBlbnN1cmVzIHRoZSBkZXN0aW5hdGlvbiBpcyByZWZjb3VudGVkLCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIFRoZSBrZXkgcGFydCBpcyB0aGF0IGBldGhfdHlwZV90cmFuc2AgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgcHJvdG9jb2wuCgpNeSBjb25jZXJuIGhlcmUgaXMgcmVnYXJkaW5nIHBhY2tldHMgd2l0aCB1bnVzdWFsIHNpemVzLiBJIGtub3cgdGhhdCBpZiBhIHBhY2tldCB3aXRoIGEgbGVuZ3RoIGxlc3MgdGhhbiBgRVRIX0hMRU5gIGlzIHNlbnQgb3ZlciBsb29wYmFjaywgYGV0aF90eXBlX3RyYW5zYCB3aWxsIGJlIGNhbGxlZC4gVGhhdCYjMzk7cyBmaW5lIGluIG1vc3Qgc2NlbmFyaW9zIGJlY2F1c2UgcGFja2V0cyBnZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbCBhcmUgdXN1YWxseSB3ZWxsLWZvcm1lZC4gSG93ZXZlciwgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgZWRnZSBjYXNlcy4gV2hhdCBpZiBhIHJhdyBwYWNrZXQgaXMgc2VudCB1c2luZyBhbiBBRl9QQUNLRVQgc29ja2V0IHdpdGggYSBzaG9ydCBsZW5ndGgsIGxlc3MgdGhhbiB0aGUgbWluaW11bSBFdGhlcm5ldCBmcmFtZSBzaXplLCB3aGljaCBpcyAxNCBieXRlcz8gSW4gdGhhdCBjYXNlLCBgbG9vcGJhY2tfeG1pdGAgd291bGQgYmUgY2FsbGVkIHdpdGggYW4gaW52YWxpZCBwYWNrZXQuCgpUaGUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzLCBob3cgZG9lcyB0aGF0IGV2ZW4gaGFwcGVuPyBEb2VzIHRoZSBwYWNrZXQgc29ja2V0IGNvZGUgcHJldmVudCBpdCBmcm9tIGhhcHBlbmluZz8gRG9lcyBpdCBmaWx0ZXIgb3V0IHRoZXNlIHNob3J0ZXIgcGFja2V0cz8gSSBzZWVtIHRvIHJlY2FsbCB0aGF0IHBhY2tldCBzZW5kLCBgcGFja2V0X3NuZGAsIGRvZXMgc29tZSBsZW5ndGggY2hlY2tzLiBMZXQgbWUgcXVpY2tseSB2ZXJpZnkgaWYgdGhlIHBhY2tldCBzZW5kIHBhdGggY2hlY2tzIHdoZXRoZXIgdGhlIGxlbmd0aCBpcyBhdCBsZWFzdCBgZGV2LSZndDtoYXJkX2hlYWRlcl9sZW5gIGJlZm9yZSBpdCBnZXRzIHRvIHRoaXMgcG9pbnQuIFRoYXQgd291bGQgZXhwbGFpbiBpdC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBjaGVjayBgcGFja2V0X3NuZGAgdG8gY29uZmlybSB0aGUgYmVoYXZpb3IuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2Rldi1cdTAwM2VoYXJkX2hlYWRlcl9sZW4mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvcGFja2V0L2FmX3BhY2tldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9wYWNrZXQvYWZfcGFja2V0LmM9NTQxPXN0YXRpYyB1MTYgdmxhbl9nZXRfdGNpKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXG4tLVxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy01NTUtXHQgKi9cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6NTU2Olx0aWYgKGRldi1cdTAwM2VtaW5faGVhZGVyX2xlbiA9PSBkZXYtXHUwMDNlaGFyZF9oZWFkZXJfbGVuKVxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzo1NTc6XHRcdGhlYWRlcl9sZW4gPSBkZXYtXHUwMDNlaGFyZF9oZWFkZXJfbGVuO1xubmV0L3BhY2tldC9hZl9wYWNrZXQuYy01NTgtXHRlbHNlIGlmIChpc192bGFuX2RldihkZXYpKVxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MTk2MD1zdGF0aWMgaW50IHBhY2tldF9zZW5kbXNnX3Nwa3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjAxNS1cdGlmICghc2tiKVxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzoyMDE2Olx0XHRoYXJkX2hlYWRlcl9sZW4gPSBSRUFEX09OQ0UoZGV2LVx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTIwMTctXG4tLVxubmV0L3BhY2tldC9hZl9wYWNrZXQuYz0yNzM2PXN0YXRpYyBpbnQgdHBhY2tldF9zbmQoc3RydWN0IHBhY2tldF9zb2NrICpwbywgc3RydWN0IG1zZ2hkciAqbXNnKVxuLS1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjgwMC1cbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6MjgwMTpcdGhhcmRfaGVhZGVyX2xlbiA9IFJFQURfT05DRShkZXYtXHUwMDNlaGFyZF9oZWFkZXJfbGVuKTtcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjgwMi1cdGlmIChwby1cdTAwM2Vzay5za19zb2NrZXQtXHUwMDNldHlwZSA9PSBTT0NLX1JBVylcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTI5NjY9c3RhdGljIGludCBwYWNrZXRfc25kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbilcbi0tXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMwMTktXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjMwMjA6XHRoYXJkX2hlYWRlcl9sZW4gPSBSRUFEX09OQ0UoZGV2LVx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMwMjEtXHRpZiAoc29jay1cdTAwM2V0eXBlID09IFNPQ0tfUkFXKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAxMzowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTQ4NwoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDkxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBQYWNrZXQgVHJhbnNtaXNzaW9uIGFuZCBIZWFkZXIgU3BhY2UqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYHBhY2tldF9zbmRgIGZ1bmN0aW9uLCBzcGVjaWZpY2FsbHkgaG93IGl0IGhhbmRsZXMgcmVzZXJ2aW5nIHNwYWNlIHdpdGhpbiBhIHNvY2tldCBidWZmZXIgYmVmb3JlIHRyYW5zbWlzc2lvbi4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgdGhpczogaXQgY2FsY3VsYXRlcyB0aGUgcmVzZXJ2ZWQgc3BhY2UgKGByZXNlcnZlYCkgYmFzZWQgb24gdGhlIHNvY2tldCB0eXBlLiBSYXcgc29ja2V0cyBnZXQgYSBzaW1wbGUgYGhhcmRfaGVhZGVyX2xlbmAsIHdoaWxlIG90aGVyIHNvY2tldCB0eXBlcyBhbHNvIGNvbnNpZGVyIHRoZSBkZXZpY2UmIzM5O3MgdGFpbHJvb20uIFRoYXQmIzM5O3MgZmluZSDigJMgc3RhbmRhcmQgcHJhY3RpY2UgdG8gYWNjb21tb2RhdGUgZm9yIGhlYWRlcnMuCgpCdXQgdGhlIHF1ZXN0aW9uIGlzLCBkb2VzIHRoaXMgc3BhY2UgcmVzZXJ2YXRpb24gKmVuZm9yY2UqIGEgbWluaW11bSBsZW5ndGggZm9yIHRoZSBwYWNrZXQ/IERvZXMgaXQgZW5zdXJlIHRoYXQgdGhlIGRhdGEgbGVuZ3RoIChgbGVuYCkgaXMgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIGBoYXJkX2hlYWRlcl9sZW5gPyBBIHBhY2tldCB3aXRoIGEgZGF0YSBsZW5ndGggc2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGhlYWRlciBsZW5ndGggd291bGQgYmUuLi5wcm9ibGVtYXRpYywgdG8gc2F5IHRoZSBsZWFzdC4gSXQmIzM5O3MgYSBmdW5kYW1lbnRhbCByZXF1aXJlbWVudC4gU28sIEkgbmVlZCB0byBnbyBiYWNrIGFuZCB0aG9yb3VnaGx5IGV4YW1pbmUgdGhlIGBwYWNrZXRfc25kYCBmdW5jdGlvbiB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBleHBsaWNpdCBsZW5ndGggY2hlY2tzIGluIHBsYWNlIHRvIHByZXZlbnQgdGhpcyBwb3RlbnRpYWxseSBkaXNhc3Ryb3VzIHNjZW5hcmlvLiBMZXQmIzM5O3MgZGlnIGluIGFuZCBzZWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDEzOjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3BhY2tldC9hZl9wYWNrZXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMwMTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MzAxMDpcdFx0aWYgKHVubGlrZWx5KCEoZGV2LVx1MDAzZWZsYWdzIFx1MDAyNiBJRkZfVVApKSlcbjMwMTE6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMzAxMjpcdFxuMzAxMzpcdFx0c29ja2NtX2luaXQoXHUwMDI2c29ja2MsIHNrKTtcbjMwMTQ6XHRcdGlmIChtc2ctXHUwMDNlbXNnX2NvbnRyb2xsZW4pIHtcbjMwMTU6XHRcdFx0ZXJyID0gc29ja19jbXNnX3NlbmQoc2ssIG1zZywgXHUwMDI2c29ja2MpO1xuMzAxNjpcdFx0XHRpZiAodW5saWtlbHkoZXJyKSlcbjMwMTc6XHRcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4zMDE4Olx0XHR9XG4zMDE5Olx0XG4zMDIwOlx0XHRoYXJkX2hlYWRlcl9sZW4gPSBSRUFEX09OQ0UoZGV2LVx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XG4zMDIxOlx0XHRpZiAoc29jay1cdTAwM2V0eXBlID09IFNPQ0tfUkFXKVxuMzAyMjpcdFx0XHRyZXNlcnZlID0gaGFyZF9oZWFkZXJfbGVuO1xuMzAyMzpcdFx0aWYgKHZuZXRfaGRyX3N6KSB7XG4zMDI0Olx0XHRcdGVyciA9IHBhY2tldF9zbmRfdm5ldF9wYXJzZShtc2csIFx1MDAyNmxlbiwgXHUwMDI2dm5ldF9oZHIsIHZuZXRfaGRyX3N6KTtcbjMwMjU6XHRcdFx0aWYgKGVycilcbjMwMjY6XHRcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4zMDI3Olx0XHR9XG4zMDI4Olx0XG4zMDI5Olx0XHRpZiAodW5saWtlbHkoc29ja19mbGFnKHNrLCBTT0NLX05PRkNTKSkpIHtcbjMwMzA6XHRcdFx0aWYgKCFuZXRpZl9zdXBwb3J0c19ub2ZjcyhkZXYpKSB7XG4zMDMxOlx0XHRcdFx0ZXJyID0gLUVQUk9UT05PU1VQUE9SVDtcbjMwMzI6XHRcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4zMDMzOlx0XHRcdH1cbjMwMzQ6XHRcdFx0ZXh0cmFfbGVuID0gNDsgLyogV2UmIzM5O3JlIGRvaW5nIG91ciBvd24gQ1JDICovXG4zMDM1Olx0XHR9XG4zMDM2Olx0XG4zMDM3Olx0XHRlcnIgPSAtRU1TR1NJWkU7XG4zMDM4Olx0XHRpZiAoIXZuZXRfaGRyLmdzb190eXBlIFx1MDAyNlx1MDAyNlxuMzAzOTpcdFx0ICAgIChsZW4gXHUwMDNlIGRldi1cdTAwM2VtdHUgJiM0MzsgcmVzZXJ2ZSAmIzQzOyBWTEFOX0hMRU4gJiM0MzsgZXh0cmFfbGVuKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzAzMTEKCQkJCQkJCW91dHB1dDogNDY2CgkJCQkJCQl0aG91Z2h0czogMjE0NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgS01TQU4gTmVjZXNzaXR5KioKCk9rYXksIGhlcmUmIzM5O3MgdGhlIGJyZWFrZG93biwgYXMgSSBzZWUgaXQuIFRoZXJlJiMzOTtzIGEgY3JpdGljYWwgb3ZlcnNpZ2h0IGluIHRoZSBwYWNrZXQgcmVjZXB0aW9uIHBhdGgsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIHBhY2tldHMgd2l0aCBsaW5lYXIgZGF0YSBsZW5ndGhzIHNob3J0ZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyIHNpemUgKDE0IGJ5dGVzKS4gTXkgaW52ZXN0aWdhdGlvbiByZXZlYWxzIGEgY2xlYXIgaW5mb3JtYXRpb24gbGVhayB0aGF0JiMzOTtzIHVuaXF1ZWx5IGRldGVjdGFibGUgYnkgS01TQU4uCgpIZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzczogSW5pdGlhbGx5LCBJIG5vdGljZWQgdGhhdCBgcGFja2V0X3NuZGAgZG9lc24mIzM5O3QgZXhwbGljaXRseSBjaGVjayBmb3IgcGFja2V0cyB3aXRoIGEgbGVuZ3RoIGxlc3MgdGhhbiB0aGUgaGFyZCBoZWFkZXIgbGVuZ3RoIHdoZW4gdXNpbmcgYFNPQ0tfUkFXYCBvbiBgQUZfUEFDS0VUYC4gVGhpcyBvcGVucyB0aGUgZG9vciBmb3IgdXNlcnMgdG8gY3JhZnQgdmVyeSBzaG9ydCBwYWNrZXRzIOKAkyBldmVuIHplcm8tYnl0ZSBvbmVzIOKAkyB3aGljaCBhcmUgdGhlbiBwYXNzZWQgZG93bnN0cmVhbSB0byBgZGV2X3F1ZXVlX3htaXRgLiBJbiB0aGUgYGxvb3BiYWNrYCBkZXZpY2UgY2FzZSwgdGhlc2UgcGFja2V0cyB1bHRpbWF0ZWx5IHJlYWNoIGBldGhfdHlwZV90cmFuc2AgdmlhIGBsb29wYmFja194bWl0YC4KClRoZSBjb3JlIGlzc3VlIGxpZXMgaW4gaG93IGBldGhfdHlwZV90cmFuc2AgaGFuZGxlcyB0aGVzZSBtYWxmb3JtZWQgcGFja2V0cy4gSXQgcmVhZHMgYGV0aC0mZ3Q7aF9wcm90b2Agd2l0aG91dCBwcm9wZXIgbGVuZ3RoIHZhbGlkYXRpb24uIFNpbmNlIHRoZSBrZXJuZWwgYWxsb2NhdGVzIHRoZSBTS0Igd2l0aCBga21hbGxvY2AgKHdpdGhvdXQgYF9fR0ZQX1pFUk9gKSwgdGhlIG1lbW9yeSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHVzZXItcHJvdmlkZWQgZGF0YSBpcyB1bmluaXRpYWxpemVkLiBUaGlzIGlzIHRoZSBjcnV4IG9mIHRoZSBwcm9ibGVtLgoKYGV0aF9za2JfcHVsbF9tYWNgIGNhbGxzIGBza2JfcHVsbF9pbmxpbmVgLiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaXplIG9mIHRoZSBTS0IgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmAsIGluIHdoaWNoIGNhc2UgYSByZWFkIHBhc3QgdGhlIGFsbG9jYXRlZCBidWZmZXIgb2NjdXJzLiBIb3dldmVyLCB0aGlzIGRvZXNuJiMzOTt0IHRyaWdnZXIgYEJVR19PTmAgb3IgS0FTQU4sIGJlY2F1c2UgdGhlIGRhdGEgaXNuJiMzOTt0IG91dCBvZiBib3VuZHMg4oCTIGl0JiMzOTtzIGp1c3QgdW5pbml0aWFsaXplZCB3aXRoaW4gdGhlIGFsbG9jYXRlZCBTS0IgYnVmZmVyLiBUaGUga2V5IGlzIHRoYXQgYHNrYl9wdWxsX2lubGluZWAgZG9lc24mIzM5O3QgcmV0dXJuIGFuIGVycm9yIGhlcmUsIGl0IGNvbnRpbnVlcy4KClRoaXMgdW5pbml0aWFsaXplZCBgaF9wcm90b2AgdmFsdWUgZ2V0cyBzaWxlbnRseSBwcm9wYWdhdGVkLiBgZXRoX3R5cGVfdHJhbnNgIHJlYWRzIHRoZSAyIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgdGhhdCBhcmUgcGFydCBvZiBgaF9wcm90b2AgYW5kIHRoZW4gc3RvcmVzIGl0IGludG8gYHNrYi0mZ3Q7cHJvdG9jb2xgLiBUaGlzIGBza2ItJmd0O3Byb3RvY29sYCB2YWx1ZSBpcyB0aGVuIGxlYWtlZCB0byB1c2VyIHNwYWNlIHZpYSBgcGFja2V0X3JlY3Ztc2dgLgoKVGhlIGNydWNpYWwgdGhpbmcgaXMgdGhpcyBsZWFrICppc24mIzM5O3QqIGRldGVjdGVkIGJ5IHN0YW5kYXJkIGZ1enppbmcgb3IgS0FTQU4gYmVjYXVzZSBpdCBkb2VzbiYjMzk7dCBpbnZvbHZlIGFueSBvdXQtb2YtYm91bmRzIHJlYWRzIG9yIGNyYXNoZXMuIEtBU0FOIG9ubHkgdHJhY2tzIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzLCBzbyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5ICp3aXRoaW4qIGEgdmFsaWQgYWxsb2NhdGlvbiBpc24mIzM5O3QgY2F1Z2h0LiBLTVNBTiwgaG93ZXZlciwgKmRvZXMqIHRyYWNrIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLgoKVGhpcyBpcyBhIHRleHRib29rIGNhc2Ugd2hlcmUgS01TQU4gaXMgZXNzZW50aWFsLiBJdCYjMzk7cyB0aGUgb25seSB0b29sIHRoYXQgcmVsaWFibHkgaWRlbnRpZmllcyB0aGlzIHZ1bG5lcmFiaWxpdHkuIFN0YW5kYXJkIGZ1enppbmcsIG9yIGZ1enppbmcgd2l0aCBLQVNBTiwgd2lsbCBtaXNzIHRoaXMsIGxlYWRpbmcgdG8gYSBzaWxlbnQga2VybmVsIGluZm8tbGVhay4KCk5vdyBJIGFtIGdvaW5nIHRvIHN1bW1hcml6ZSB0aGUgcHJvY2VzcyBvZiB0aGlzIGluZm9ybWF0aW9uIGxlYWs6CgoxLiAgQSBzaG9ydCBwYWNrZXQgKGUuZy4sIDEwIGJ5dGVzKSBpcyBjcmFmdGVkIGJ5IGEgdXNlci4KMi4gIFRoZSBwYWNrZXQgYnlwYXNzZXMgYSBsZW5ndGggY2hlY2suCjMuICBUaGUgcGFja2V0IGNhbGxzIGBldGhfdHlwZV90cmFuc2AsIHdoZXJlIGl0IGlzIGhhbmRsZWQgd2l0aG91dCBzdWZmaWNpZW50IGxlbmd0aCB2YWxpZGF0aW9uLgo0LiAgVGhlIHBhY2tldHMgZW5kIHVwIGNhbGxpbmcgYHNrYl9wdWxsX2lubGluZWAuCjUuICBVbmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIGZyb20gdGhlIGBTS0JgIGRhdGEgYnVmZmVyIHdoZW4gYGV0aC0mZ3Q7aF9wcm90b2AgaXMgcmVhZC4KNi4gIFRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyB0aGVuIGNvcGllZCB0byB0aGUgYHNrYi0mZ3Q7cHJvdG9jb2xgIGZpZWxkLgo3LiAgVGhlIHBhY2tldCBpcyByZWNlaXZlZCBieSBhbm90aGVyIGBBRl9QQUNLRVRgIHNvY2tldC4KOC4gIFRoZSBgc2tiLSZndDtwcm90b2NvbGAgZmllbGQgaXMgY29waWVkIHRvIGBzbGwtJmd0O3NsbF9wcm90b2NvbGAuCjkuICBUaGUgYHNsbC0mZ3Q7c2xsX3Byb3RvY29sYCBmaWVsZCBpcyBsZWFrZWQgdG8gdXNlcnNwYWNlLgoxMC4gVGhlIHJlc3VsdCBpcyBhIGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4KClRoaXMgcGF0Y2gsIHNwZWNpZmljYWxseSBieSBkcm9wcGluZyB0aGUgc2hvcnQgbGluZWFyIHBhY2tldCwgZml4ZXMgYSBzZXJpb3VzIGlzc3VlLgoKSSBjYW4gY29uZmlybSB0aGF0IHRoZSBgc2tiLSZndDtwcm90b2NvbGAgdmFsdWUgKmlzKiBpbmRlZWQgbGVha2VkIHRvIHVzZXIgc3BhY2UsIHByb3ZpZGluZyBhIHJlcHJvZHVjaWJsZSBhbmQgZXhwbG9pdGFibGUga2VybmVsIGluZm8tbGVhay4gVGhlIGBzb2NrYWRkcl9sbGAgc3RydWN0dXJlIGFuZCBpdHMgY29udGVudHMsIGluY2x1ZGluZyB0aGUgbm93LWNvbXByb21pc2VkIGBzbGwtJmd0O3NsbF9wcm90b2NvbGAsIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZS4KCkluIHN1bW1hcnk6IEkgc2VlIGBOZWVkc0tNU0FOID0gdHJ1ZWAuIFRoaXMgcGF0Y2ggZml4ZXMgYSB2dWxuZXJhYmlsaXR5IHRoYXQgaXMgb25seSBkZXRlY3RlZCBieSBLTVNBTi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMTM6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGxlbmd0aCBjaGVjayBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXG5cbldpdGhvdXQgdGhpcyBjaGVjaywgaWYgYSB1c2VyIGluamVjdHMgYSBzaG9ydCBsaW5lYXIgcGFja2V0IChlLmcuLCAxMCBieXRlcykgdmlhIGEgVFVOL1RBUCBkZXZpY2Ugb3IgYW4gQUZfUEFDS0VUIHJhdyBzb2NrZXQsIGBldGhfdHlwZV90cmFucygpYCBjYWxscyBgZXRoX3NrYl9wdWxsX21hYygpYC4gYGV0aF9za2JfcHVsbF9tYWMoKWAgY2FsbHMgYHNrYl9wdWxsX2lubGluZShza2IsIEVUSF9ITEVOKWAuIElmIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAsIGBza2JfcHVsbF9pbmxpbmUoKWAgZmFpbHMgYW5kIHJldHVybnMgYE5VTExgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgYEJVR19PTmAgb3IgY3Jhc2guIGBldGhfc2tiX3B1bGxfbWFjKClgIGlnbm9yZXMgdGhpcyByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIGBza2ItXHUwMDNlZGF0YWAgcG9pbnRlci5cblxuYGV0aF90eXBlX3RyYW5zKClgIHRoZW4gcmVhZHMgYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIEJlY2F1c2UgdGhlIHNrYiBkYXRhIGJ1ZmZlciBpcyB0eXBpY2FsbHkgYWxsb2NhdGVkIHdpdGggYSBtdWNoIGxhcmdlciBzaXplIChlLmcuLCB2aWEgYGttYWxsb2NgKSwgdGhpcyByZWFkIGlzIHdlbGwgd2l0aGluIHRoZSBhbGxvY2F0aW9uIGJvdW5kcy4gVGhlcmVmb3JlLCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgaXQgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgbWVtb3J5IGJleW9uZCB0aGUgdXNlci1wcm92aWRlZCAxMCBieXRlcyBpcyB1bmluaXRpYWxpemVkLiBLTVNBTiB3aWxsIGRldGVjdCB0aGlzIGFzIGEgcmVhZCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRnVydGhlcm1vcmUsIHRoaXMgdW5pbml0aWFsaXplZCB2YWx1ZSBpcyBzdG9yZWQgaW4gYHNrYi1cdTAwM2Vwcm90b2NvbGAuIElmIHRoZSBwYWNrZXQgaXMgbGF0ZXIgcmVjZWl2ZWQgYnkgYW4gQUZfUEFDS0VUIHNvY2tldCwgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuXG5TaW5jZSB0aGlzIGlzc3VlIGRvZXMgbm90IGNhdXNlIGEgY3Jhc2gsIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB0cmlnZ2VyIGEgYEJVR19PTmAgZm9yIGxpbmVhciBwYWNrZXRzLCBpdCBjYW4gT05MWSBiZSBkZXRlY3RlZCBieSBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIGxlbmd0aCBjaGVjayBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXG5cbldpdGhvdXQgdGhpcyBjaGVjaywgaWYgYSB1c2VyIGluamVjdHMgYSBzaG9ydCBsaW5lYXIgcGFja2V0IChlLmcuLCAxMCBieXRlcykgdmlhIGEgVFVOL1RBUCBkZXZpY2Ugb3IgYW4gQUZfUEFDS0VUIHJhdyBzb2NrZXQsIGBldGhfdHlwZV90cmFucygpYCBjYWxscyBgZXRoX3NrYl9wdWxsX21hYygpYC4gYGV0aF9za2JfcHVsbF9tYWMoKWAgY2FsbHMgYHNrYl9wdWxsX2lubGluZShza2IsIEVUSF9ITEVOKWAuIElmIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAsIGBza2JfcHVsbF9pbmxpbmUoKWAgZmFpbHMgYW5kIHJldHVybnMgYE5VTExgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgYEJVR19PTmAgb3IgY3Jhc2guIGBldGhfc2tiX3B1bGxfbWFjKClgIGlnbm9yZXMgdGhpcyByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIGBza2ItXHUwMDNlZGF0YWAgcG9pbnRlci5cblxuYGV0aF90eXBlX3RyYW5zKClgIHRoZW4gcmVhZHMgYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIEJlY2F1c2UgdGhlIHNrYiBkYXRhIGJ1ZmZlciBpcyB0eXBpY2FsbHkgYWxsb2NhdGVkIHdpdGggYSBtdWNoIGxhcmdlciBzaXplIChlLmcuLCB2aWEgYGttYWxsb2NgKSwgdGhpcyByZWFkIGlzIHdlbGwgd2l0aGluIHRoZSBhbGxvY2F0aW9uIGJvdW5kcy4gVGhlcmVmb3JlLCBLQVNBTiB3aWxsIE5PVCBkZXRlY3QgaXQgYXMgYW4gb3V0LW9mLWJvdW5kcyByZWFkLlxuXG5Ib3dldmVyLCB0aGUgbWVtb3J5IGJleW9uZCB0aGUgdXNlci1wcm92aWRlZCAxMCBieXRlcyBpcyB1bmluaXRpYWxpemVkLiBLTVNBTiB3aWxsIGRldGVjdCB0aGlzIGFzIGEgcmVhZCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRnVydGhlcm1vcmUsIHRoaXMgdW5pbml0aWFsaXplZCB2YWx1ZSBpcyBzdG9yZWQgaW4gYHNrYi1cdTAwM2Vwcm90b2NvbGAuIElmIHRoZSBwYWNrZXQgaXMgbGF0ZXIgcmVjZWl2ZWQgYnkgYW4gQUZfUEFDS0VUIHNvY2tldCwgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxuXG5TaW5jZSB0aGlzIGlzc3VlIGRvZXMgbm90IGNhdXNlIGEgY3Jhc2gsIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB0cmlnZ2VyIGEgYEJVR19PTmAgZm9yIGxpbmVhciBwYWNrZXRzLCBpdCBjYW4gT05MWSBiZSBkZXRlY3RlZCBieSBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgaGlnaGx5IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToxNi4wOTU2ODgzM1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1MjEwNjg2OTc2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbGVuZ3RoIGNoZWNrIGBza2JfaGVhZGxlbihza2IpIFxcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXFxuXFxuV2l0aG91dCB0aGlzIGNoZWNrLCBpZiBhIHVzZXIgaW5qZWN0cyBhIHNob3J0IGxpbmVhciBwYWNrZXQgKGUuZy4sIDEwIGJ5dGVzKSB2aWEgYSBUVU4vVEFQIGRldmljZSBvciBhbiBBRl9QQUNLRVQgcmF3IHNvY2tldCwgYGV0aF90eXBlX3RyYW5zKClgIGNhbGxzIGBldGhfc2tiX3B1bGxfbWFjKClgLiBgZXRoX3NrYl9wdWxsX21hYygpYCBjYWxscyBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gSWYgYHNrYi1cXHUwMDNlbGVuIFxcdTAwM2MgRVRIX0hMRU5gLCBgc2tiX3B1bGxfaW5saW5lKClgIGZhaWxzIGFuZCByZXR1cm5zIGBOVUxMYCB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGBCVUdfT05gIG9yIGNyYXNoLiBgZXRoX3NrYl9wdWxsX21hYygpYCBpZ25vcmVzIHRoaXMgcmV0dXJuIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBgc2tiLVxcdTAwM2VkYXRhYCBwb2ludGVyLlxcblxcbmBldGhfdHlwZV90cmFucygpYCB0aGVuIHJlYWRzIGBldGgtXFx1MDAzZWhfcHJvdG9gIGF0IG9mZnNldCAxMi4gQmVjYXVzZSB0aGUgc2tiIGRhdGEgYnVmZmVyIGlzIHR5cGljYWxseSBhbGxvY2F0ZWQgd2l0aCBhIG11Y2ggbGFyZ2VyIHNpemUgKGUuZy4sIHZpYSBga21hbGxvY2ApLCB0aGlzIHJlYWQgaXMgd2VsbCB3aXRoaW4gdGhlIGFsbG9jYXRpb24gYm91bmRzLiBUaGVyZWZvcmUsIEtBU0FOIHdpbGwgTk9UIGRldGVjdCBpdCBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIHVzZXItcHJvdmlkZWQgMTAgYnl0ZXMgaXMgdW5pbml0aWFsaXplZC4gS01TQU4gd2lsbCBkZXRlY3QgdGhpcyBhcyBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZ1cnRoZXJtb3JlLCB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUgaXMgc3RvcmVkIGluIGBza2ItXFx1MDAzZXByb3RvY29sYC4gSWYgdGhlIHBhY2tldCBpcyBsYXRlciByZWNlaXZlZCBieSBhbiBBRl9QQUNLRVQgc29ja2V0LCBgc2tiLVxcdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxcblxcblNpbmNlIHRoaXMgaXNzdWUgZG9lcyBub3QgY2F1c2UgYSBjcmFzaCwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIHRyaWdnZXIgYSBgQlVHX09OYCBmb3IgbGluZWFyIHBhY2tldHMsIGl0IGNhbiBPTkxZIGJlIGRldGVjdGVkIGJ5IEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToxNi4wOTU2OTUyNVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzkyOTQ1NjI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgM2VkNTUyYzBjNmNkYzY4MTY3ODBiMWNhNjhmOTljMzhjNWFiYTdkZFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIEF1ZyA3IDEyOjU5OjE1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9ldGguYyBiL25ldC9ldGhlcm5ldC9ldGguY1xcbmluZGV4IGQ5ZmFhZGJlOWI2YzguLjg0OTE0NzA5YWMwNjEgMTAwNjQ0XFxuLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jXFxuKysrIGIvbmV0L2V0aGVybmV0L2V0aC5jXFxuQEAgLTE2MSw2ICsxNjEsMTIgQEAgX19iZTE2IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXFxuIFxcdHNrYi1cXHUwMDNlZGV2ID0gZGV2O1xcbiBcXHRza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpO1xcbiBcXG4rXFx0aWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXFx1MDAzYyBFVEhfSExFTikpIHtcXG4rXFx0XFx0bmV0X3dhcm5fcmF0ZWxpbWl0ZWQoXFxcIiVzOiBkcm9wcGluZyBmcmFtZSB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQgZnJvbSAlc1xcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICBfX2Z1bmNfXywgZGV2LVxcdTAwM2VuYW1lKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuIFxcdGV0aCA9IGV0aF9za2JfcHVsbF9tYWMoc2tiKTtcXG4gXFx0ZXRoX3NrYl9wa3RfdHlwZShza2IsIGRldik7XFxuIFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToxNi40ODkzMDY0MDdaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxMTIyMzcyOTY4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAzZWQ1NTJjMGM2Y2RjNjgxNjc4MGIxY2E2OGY5OWMzOGM1YWJhN2RkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAxMjo1OToxNSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9ldGguYyBiL25ldC9ldGhlcm5ldC9ldGguY1xuaW5kZXggZDlmYWFkYmU5YjZjOC4uODQ5MTQ3MDlhYzA2MSAxMDA2NDRcbi0tLSBhL25ldC9ldGhlcm5ldC9ldGguY1xuKysrIGIvbmV0L2V0aGVybmV0L2V0aC5jXG5AQCAtMTYxLDYgKzE2MSwxMiBAQCBfX2JlMTYgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbiBcdHNrYi1cdTAwM2VkZXYgPSBkZXY7XG4gXHRza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpO1xuIFxuK1x0aWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOKSkge1xuK1x0XHRuZXRfd2Fybl9yYXRlbGltaXRlZChcIiVzOiBkcm9wcGluZyBmcmFtZSB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQgZnJvbSAlc1xcblwiLFxuK1x0XHRcdFx0ICAgICBfX2Z1bmNfXywgZGV2LVx1MDAzZW5hbWUpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbiBcdGV0aCA9IGV0aF9za2JfcHVsbF9tYWMoc2tiKTtcbiBcdGV0aF9za2JfcGt0X3R5cGUoc2tiLCBkZXYpO1xuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6MTYuNDg5MzA4NDc4WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTkzMDU4ODg3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQYXRjaDogYGV0aF90eXBlX3RyYW5zYCBpbiBgbmV0L2V0aGVybmV0L2V0aC5jYCoqXG5cbk9rYXksIHNvIHRoZXJlJ3MgYSBwYXRjaCBpbnRyb2R1Y2luZyBhIGNoZWNrIHdpdGhpbiBgZXRoX3R5cGVfdHJhbnNgIGluIGBuZXQvZXRoZXJuZXQvZXRoLmNgLiAgU3BlY2lmaWNhbGx5LCB0aGUgY29kZSBub3cgbG9va3MgZm9yIHBhY2tldHMgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IOKAkyBsZXNzIHRoYW4gYEVUSF9ITEVOYC4gIFRoZSBjaGVjayBpcyByaWdodCB0aGVyZSwgZHJvcHBpbmcgdGhlc2Ugc2hvcnQgZnJhbWVzLiAgTm93LCBgZXRoX3R5cGVfdHJhbnNg4oCmIHRoYXQncyAqZXZlcnl3aGVyZSouIEl0J3MgYSBmdW5kYW1lbnRhbCBmdW5jdGlvbiBmb3IgRXRoZXJuZXQgZHJpdmVycywgZG9pbmcgdGhlIGNyaXRpY2FsIHdvcmsgb2Ygc2V0dGluZyBwYWNrZXQgdHlwZSBhbmQgcHVsbGluZyBvdXQgdGhlIE1BQyBoZWFkZXIuICBEZWZpbml0ZWx5IHJlYWNoYWJsZSwgYW5kIG15IGluaXRpYWwgaW5zdGluY3Qgc2F5cyBpdCdzIHdvcnRoIGZ1enppbmcgZ2l2ZW4gdGhlIGZ1bmN0aW9uYWwgY2hhbmdlLlxuXG5XYWl0IGEgc2Vjb25k4oCmICBgZXRoX3R5cGVfdHJhbnNgIGlzIGEgKmhvdC1wYXRoKiBmdW5jdGlvbi4gV2UgbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggdGhvc2UuIElmIGl0J3MgYSBob3QgcGF0aCwgbGlzdGluZyBpdCBpbiBgRm9jdXNTeW1ib2xzYCBtaWdodCBza2V3IHRoZSBmdXp6aW5nIGRpc3RyaWJ1dGlvbiwgd2hpY2ggd2Ugd2FudCB0byBhdm9pZC4gVGhlIGRvY3VtZW50YXRpb24gc2F5cywgXCJBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cIlxuXG5TbywgSSBjYW4gc3RpbGwgc2F5IHRoZSBjaGFuZ2UgbWFrZXMgaXQgV29ydGhGdXp6aW5nPXRydWUsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBgRm9jdXNTeW1ib2xzYCBhcmUgZW1wdHkuICBXZSBkb24ndCB3YW50IHRvIG92ZXItcHJpb3JpdGl6ZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmdXp6aW5nIHByb2Nlc3MuXG5cbkxldCdzIHF1aWNrbHkgY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24uICBgbmV0L2V0aGVybmV0L2V0aC5jYCBpcyBjb21waWxlZCB3aGVuIGBDT05GSUdfRVRIRVJORVRgIGlzIGVuYWJsZWQsIHdoaWNoIGlzIHByZXR0eSBtdWNoIGd1YXJhbnRlZWQgaW4gYW55IGJhc2ljIHNldHVwLiBJJ2xsIGRvdWJsZSBjaGVjayB0aGUgYG5ldC9ldGhlcm5ldC9NYWtlZmlsZWAganVzdCB0byBiZSBzdXJlIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHNwZWNpZmljIHRoYXQgbWlnaHQgYWZmZWN0IGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDM0LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzExLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6MjIuNDE5ODk5NTM3WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzNzAyMjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV0aC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9ldGhlcm5ldC9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvZXRoZXJuZXQvTWFrZWZpbGUtNS1cXG5uZXQvZXRoZXJuZXQvTWFrZWZpbGU6NjpvYmoteVxcdFxcdFxcdFxcdFxcdCs9IGV0aC5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEyOjU5OjIyLjQ2MzYwNjA1NVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUyNDk0MDI3OTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyB0aGUgRXRoZXJuZXQgUmVjZWl2ZSBQYXRoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYG9iai15ICs9IGV0aC5vYC4gVGhhdCBtZWFucyB0aGUgYGV0aGAgbW9kdWxlIGlzIGFsd2F5cyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIFJpZ2h0LCB0aGlzIG1ha2VzIGl0IGFuIGludGVyZXN0aW5nIHRhcmdldCBmb3IgZnV6emluZy4gR2l2ZW4gdGhlIGRlc2NyaXB0aW9uLCB0aGUgcGF0Y2ggaW50cm9kdWNlcyBhIGNoZWNrIHRvIGRpc2NhcmQgcGFja2V0cyB0aGF0IGFyZSB0b28gc2hvcnQsIGFuZCB0aGlzIHNvdW5kcyBsaWtlIGl0IGNvdWxkIHVuY292ZXIgc29tZSB2dWxuZXJhYmlsaXRpZXMuXG5cbk5vdywgbXkgbWluZCBpcyBhbHJlYWR5IHJhY2luZy4gU3BlY2lmaWNhbGx5LCBgZXRoX3R5cGVfdHJhbnNgIGdldHMgY2FsbGVkIGZvciAqZXZlcnkqIEV0aGVybmV0IHBhY2tldCByZWNlaXZlZC4gVGhhdCdzIGEgaHVnZSBjb2RlIHN1cmZhY2UhIFRoZSBpbml0aWFsIHRob3VnaHQgd2FzLCBzaG91bGQgdGhpcyBiZSBpbiBgRm9jdXNTeW1ib2xzYD8gSG93ZXZlciwgdGhhdCB3b3VsZCBhbG1vc3QgY2VydGFpbmx5IHNrZXcgdGhlIGZ1enppbmcgZGlzdHJpYnV0aW9uIGhlYXZpbHkgdG93YXJkcyBFdGhlcm5ldCwgYW5kIHRoYXQncyBub3Qgd2hhdCBJIHdhbnQuIFNvLCBgRm9jdXNTeW1ib2xzYCBuZWVkcyB0byBiZSBlbXB0eSBpbiB0aGlzIGNhc2UuIEFsc28sIGBFbmFibGVDb25maWdzYCBzaG91bGQgcHJvYmFibHkgYmUgZW1wdHkgdG9vLiBUaGUgY29yZSBvZiB0aGlzIGxvZ2ljIGlzIGluIHRoZSBldGhlcm5ldCByZWNlaXZlIHBhdGggd2hpY2ggaXMgZ2VuZXJpYy5cblxuU28sIHRoZSByZWFzb25pbmcgYm9pbHMgZG93biB0byB0aGlzOiBUaGUgY2hhbmdlIGludHJvZHVjZXMgYSAqZnVuY3Rpb25hbCogY2hlY2sgaW4gYGV0aF90eXBlX3RyYW5zYC4gSXQncyBhIGZ1bmRhbWVudGFsIGNoYW5nZSBpbiBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIHJlY2VpdmVkIEV0aGVybmV0IHBhY2tldHMsIHNvIGZ1enppbmcgaXMgY2VydGFpbmx5IHdhcnJhbnRlZC4gQnV0LCBiZWNhdXNlIGBldGhfdHlwZV90cmFuc2AgaXMgYSBnZW5lcmljLCBob3QtcGF0aCBmdW5jdGlvbiwgSSBuZWVkIHRvIGJlIGNhcmVmdWwgd2l0aCBob3cgSSBjb25maWd1cmUgdGhlIGZ1enppbmcgcHJvY2VzcyB0byBhdm9pZCB1bmR1ZSBmb2N1cyBvbiBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc2NiwiT3V0cHV0VG9rZW5zIjo5OSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToyNy43MTMwMTI0MjVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMzYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBjaGVjayB0byBkcm9wIGV0aGVybmV0IGZyYW1lcyB3aXRoIGEgc2hvcnQgbGluZWFyIHBhcnQgaW4gZXRoX3R5cGVfdHJhbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBpbiB0aGUgY29yZSBldGhlcm5ldCByZWNlaXZlIHBhdGgsIHNvIGl0IGlzIHdvcnRoIGZ1enppbmcuIFNpbmNlIGV0aF90eXBlX3RyYW5zIGlzIGEgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbiwgaXQgaXMgbm90IGFkZGVkIHRvIEZvY3VzU3ltYm9scyB0byBhdm9pZCBza2V3aW5nIHRlc3QgZGlzdHJpYnV0aW9ucy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIHRvIGRyb3AgZXRoZXJuZXQgZnJhbWVzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBpbiBldGhfdHlwZV90cmFucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGluIHRoZSBjb3JlIGV0aGVybmV0IHJlY2VpdmUgcGF0aCwgc28gaXQgaXMgd29ydGggZnV6emluZy4gU2luY2UgZXRoX3R5cGVfdHJhbnMgaXMgYSBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9uLCBpdCBpcyBub3QgYWRkZWQgdG8gRm9jdXNTeW1ib2xzIHRvIGF2b2lkIHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OToyNy43MTMwMzc5NzVaIiwiU2VxIjo3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQwNDg5NTA0MDQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6MjcuNzEzNTM0NzA1WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MjQwNDg5MDAxMzA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbGVuZ3RoIGNoZWNrIGBza2JfaGVhZGxlbihza2IpIFxcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXFxuXFxuV2l0aG91dCB0aGlzIGNoZWNrLCBpZiBhIHVzZXIgaW5qZWN0cyBhIHNob3J0IGxpbmVhciBwYWNrZXQgKGUuZy4sIDEwIGJ5dGVzKSB2aWEgYSBUVU4vVEFQIGRldmljZSBvciBhbiBBRl9QQUNLRVQgcmF3IHNvY2tldCwgYGV0aF90eXBlX3RyYW5zKClgIGNhbGxzIGBldGhfc2tiX3B1bGxfbWFjKClgLiBgZXRoX3NrYl9wdWxsX21hYygpYCBjYWxscyBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gSWYgYHNrYi1cXHUwMDNlbGVuIFxcdTAwM2MgRVRIX0hMRU5gLCBgc2tiX3B1bGxfaW5saW5lKClgIGZhaWxzIGFuZCByZXR1cm5zIGBOVUxMYCB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGBCVUdfT05gIG9yIGNyYXNoLiBgZXRoX3NrYl9wdWxsX21hYygpYCBpZ25vcmVzIHRoaXMgcmV0dXJuIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBgc2tiLVxcdTAwM2VkYXRhYCBwb2ludGVyLlxcblxcbmBldGhfdHlwZV90cmFucygpYCB0aGVuIHJlYWRzIGBldGgtXFx1MDAzZWhfcHJvdG9gIGF0IG9mZnNldCAxMi4gQmVjYXVzZSB0aGUgc2tiIGRhdGEgYnVmZmVyIGlzIHR5cGljYWxseSBhbGxvY2F0ZWQgd2l0aCBhIG11Y2ggbGFyZ2VyIHNpemUgKGUuZy4sIHZpYSBga21hbGxvY2ApLCB0aGlzIHJlYWQgaXMgd2VsbCB3aXRoaW4gdGhlIGFsbG9jYXRpb24gYm91bmRzLiBUaGVyZWZvcmUsIEtBU0FOIHdpbGwgTk9UIGRldGVjdCBpdCBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIHVzZXItcHJvdmlkZWQgMTAgYnl0ZXMgaXMgdW5pbml0aWFsaXplZC4gS01TQU4gd2lsbCBkZXRlY3QgdGhpcyBhcyBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZ1cnRoZXJtb3JlLCB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUgaXMgc3RvcmVkIGluIGBza2ItXFx1MDAzZXByb3RvY29sYC4gSWYgdGhlIHBhY2tldCBpcyBsYXRlciByZWNlaXZlZCBieSBhbiBBRl9QQUNLRVQgc29ja2V0LCBgc2tiLVxcdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxcblxcblNpbmNlIHRoaXMgaXNzdWUgZG9lcyBub3QgY2F1c2UgYSBjcmFzaCwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIHRyaWdnZXIgYSBgQlVHX09OYCBmb3IgbGluZWFyIHBhY2tldHMsIGl0IGNhbiBPTkxZIGJlIGRldGVjdGVkIGJ5IEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgM2VkNTUyYzBjNmNkYzY4MTY3ODBiMWNhNjhmOTljMzhjNWFiYTdkZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDcgMTI6NTk6MTUgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmNcbmluZGV4IGQ5ZmFhZGJlOWI2YzguLjg0OTE0NzA5YWMwNjEgMTAwNjQ0XG4tLS0gYS9uZXQvZXRoZXJuZXQvZXRoLmNcbisrKyBiL25ldC9ldGhlcm5ldC9ldGguY1xuQEAgLTE2MSw2ICsxNjEsMTIgQEAgX19iZTE2IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXG4gXHRza2ItXHUwMDNlZGV2ID0gZGV2O1xuIFx0c2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTtcbiBcbitcdGlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpIFx1MDAzYyBFVEhfSExFTikpIHtcbitcdFx0bmV0X3dhcm5fcmF0ZWxpbWl0ZWQoXCIlczogZHJvcHBpbmcgZnJhbWUgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGZyb20gJXNcXG5cIixcbitcdFx0XHRcdCAgICAgX19mdW5jX18sIGRldi1cdTAwM2VuYW1lKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4gXHRldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7XG4gXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEyOjU5OjI3LjcxMzUzNzEzNVoiLCJTZXEiOjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjk1NTg4NDA5NzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBFdGhlcm5ldCBGcmFtZSBMZW5ndGggQ2hlY2sqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgYWRkcyBhIGNoZWNrIGluIGBldGhfdHlwZV90cmFuc2AgZm9yIHRoZSBoZWFkIGxlbmd0aCBvZiBhbiBgc2tiYC4gU3BlY2lmaWNhbGx5LCBgaWYgKHVubGlrZWx5KHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOKSlgLiAgVGhlIGlkZWEgaXMgdG8gZHJvcCB0aGUgZnJhbWUgaWYgdGhlIGhlYWQgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiBgRVRIX0hMRU5gLiAgTXkgaW5pdGlhbCB0aG91Z2h0IGlzLCB0aGlzIGlzIGEgYm91bmRzIGNoZWNrLCByaWdodD8gIFByZXZlbnRpbmcgYW4gb3V0LW9mLWJvdW5kcyBhY2Nlc3Mgd2hlbiBgZXRoX3NrYl9wdWxsX21hYyhza2IpYCBpcyBjYWxsZWQgbGF0ZXIuICBXZSBwdWxsIHRoZSBNQUMgaGVhZGVyLCBhbmQgaWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwsIGJvb20sIE9PQiByZWFkLlxuXG5JIHN0YXJ0IHRvIHdvbmRlciBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeSwgdGhvdWdoLiAgSWYgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gLCBpcyB0aGVyZSBhIHJpc2sgdGhhdCBgZXRoX3NrYl9wdWxsX21hY2AgbWlnaHQgdHJ5IHRvIHJlYWQgdW5pbml0aWFsaXplZCBtZW1vcnk/ICBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0aGF0IGlmIGl0J3MgKnRoYXQqIHNtYWxsLCBpdCdzIGFuIE9PQiByZWFkLCBhbmQgS0FTQU4gd2lsbCBmbGFnIHRoYXQuIEhvd2V2ZXIsIG1heWJlIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIGxhcmdlciwgYnV0IHRoZSBhY3R1YWwgcGFja2V0IGxlbmd0aCBpcyBzbWFsbGVyPyAgQ291bGQgdGhlcmUgYmUgYSBzY2VuYXJpbyB3aGVyZSBpdCdzIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBidXQgYmV5b25kIGBza2ItXHUwMDNlbGVuYCBhbmQgd2UgZW5kIHVwIHJlYWRpbmcgdW5pbml0aWFsaXplZCBwYWRkaW5nPyAgQnV0IHdhaXQsIEtNU0FOIGlzIGRlc2lnbmVkIHRvIGNhdGNoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCByaWdodD8gIEtBU0FOIGhhbmRsZXMgdGhlIE9PQiBzdHVmZi4gVGhpcyBwYXRjaCBzZWVtcyB0byBiZSBhYm91dCBwcmV2ZW50aW5nIHJlYWRpbmcgYmV5b25kIHRoZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHBhcnQgb2YgdGhlIGBza2JgJ3MgaGVhZC5cblxuTGV0J3MgZGl2ZSBpbnRvIGBldGhfc2tiX3B1bGxfbWFjYC4gIEFoLCBpdCBjYWxscyBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gIElmIGBza2ItXHUwMDNlbGVuYCBpcyBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgc29tZXRoaW5nICpiYWQqIG1pZ2h0IGhhcHBlbiwgb3Igd2UgZW5kIHVwIHJlYWRpbmcgYGV0aC1cdTAwM2VoX3Byb3RvYCB3aGljaCBpcyB0ZWNobmljYWxseSBvdXQtb2YtYm91bmRzIG9mIHRoZSBsaW5lYXIgcG9ydGlvbi4gSWYgaXQncyAqYmV5b25kKiB0aGUgYWxsb2NhdGVkIHBhcnQsIEtBU0FOIHdpbGwgY2F0Y2ggdGhhdC4gQnV0IHdoYXQgaWYgaXQncyB3aXRoaW4gdGhlIGFsbG9jYXRpb24sIGJ1dCBwYXN0IHRoZSBhY3R1YWwgcGFja2V0IGRhdGEgKGBza2ItXHUwMDNlbGVuYCk/IEtBU0FOIG1pZ2h0IG5vdCBjYXRjaCB0aGF0LCB1bmxlc3MgaXRzIHNrYiBpbnRlZ3JhdGlvbiBpcyBtb3JlIGV4dGVuc2l2ZS4gS01TQU4sIGhvd2V2ZXIsICpzaG91bGQqIGNhdGNoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlmIHdlJ3JlIHJlYWRpbmcgcGFzdCB0aGUgdmFsaWQgZGF0YS4gVGhlIG1lbW9yeSB0aGVyZSBpcyBsaWtlbHkgdW5pbml0aWFsaXplZC5cblxuU28sIGlzIHRoaXMgcGF0Y2ggcHJpbWFyaWx5IGFib3V0IHByZXZlbnRpbmcgT09CIHJlYWRzIG9yIGNhdGNoaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBUaGUgY29tbWl0IG1lc3NhZ2Ugc2F5cyBcImRyb3BwaW5nIGZyYW1lIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydFwiLiBUaGF0J3MgYSBjbGFzc2ljIE9PQiBpc3N1ZS4gYHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOYCBtZWFucyB0aGUgbGluZWFyIHBhcnQgaXMgdG9vIHNob3J0LiBJdCdzIGFuIE9PQiByZWFkL3dyaXRlLiBJIHNob3VsZCByZWFsbHkgZ28gYmFjayBhbmQgY2hlY2sgdGhlIGBldGhfdHlwZV90cmFuc2AgY29kZSBpdHNlbGYgaW4gYG5ldC9ldGhlcm5ldC9ldGguY2AgdG8gYmUgY29tcGxldGVseSBzdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDMxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTQ2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6MzcuMjcyMzgyMTA1WiIsIlNlcSI6MTAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODczNTE4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJldGhfc2tiX3B1bGxfbWFjXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9ldGhlcm5ldC9ldGguY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvZXRoZXJuZXQvZXRoLmM9MTU1PV9fYmUxNiBldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxcbi0tXFxubmV0L2V0aGVybmV0L2V0aC5jLTE2OS1cXG5uZXQvZXRoZXJuZXQvZXRoLmM6MTcwOlxcdGV0aCA9IGV0aF9za2JfcHVsbF9tYWMoc2tiKTtcXG5uZXQvZXRoZXJuZXQvZXRoLmMtMTcxLVxcdGV0aF9za2JfcGt0X3R5cGUoc2tiLCBkZXYpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OTozNy4zMjExMjI4NDRaIiwiU2VxIjoxMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzY4NjUyODI2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgY29kZTpcblxuKipEaXZpbmcgaW50byB0aGUgRXRoZXJuZXQgVHlwZSBUcmFuc2xhdG9yKipcblxuQWxyaWdodCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IEV0aGVybmV0IHR5cGVzIGFyZSBiZWluZyBoYW5kbGVkLiBMZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gYGV0aF90eXBlX3RyYW5zYCB3aXRoaW4gYG5ldC9ldGhlcm5ldC9ldGguY2AuIFRoYXQgZnVuY3Rpb24ncyBsaWtlbHkgdGhlIGtleSB0byBmaWd1cmluZyBvdXQgaG93IHJhdyBFdGhlcm5ldCBmcmFtZXMgYXJlIGNsYXNzaWZpZWQgYW5kIHByb2Nlc3NlZCwgSSdtIHRoaW5raW5nLiBJJ20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIGhvdyBpdCBtYXBzIEV0aGVyVHlwZSB2YWx1ZXMgdG8gcHJvdG9jb2wgaGFuZGxlcnM7IHVuZGVyc3RhbmRpbmcgdGhhdCB3aWxsIGJlIGNydWNpYWwgZm9yIGFueSBpbi1kZXB0aCBhbmFseXNpcyBvZiBFdGhlcm5ldCBmcmFtZSBwcm9jZXNzaW5nLiBJJ2xsIG5lZWQgdG8gY2FyZWZ1bGx5IGV4YW1pbmUgdGhlIGlucHV0IGFyZ3VtZW50cywgcmV0dXJuIHZhbHVlcywgYW5kIGFueSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgaXQgdXNlcyB0byBtYWtlIHRoZXNlIGNydWNpYWwgdHJhbnNsYXRpb24gZGVjaXNpb25zLiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzNTUsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OTo0MS4wMDc2NTMzNzRaIiwiU2VxIjoxMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzAzNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2V0aGVybmV0L2V0aC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE1MDpcXHQgKlxcbiAxNTE6XFx0ICogVGhlIHJ1bGUgaGVyZSBpcyB0aGF0IHdlXFxuIDE1MjpcXHQgKiBhc3N1bWUgODAyLjMgaWYgdGhlIHR5cGUgZmllbGQgaXMgc2hvcnQgZW5vdWdoIHRvIGJlIGEgbGVuZ3RoLlxcbiAxNTM6XFx0ICogVGhpcyBpcyBub3JtYWwgcHJhY3RpY2UgYW5kIHdvcmtzIGZvciBhbnkgJ25vdyBpbiB1c2UnIHByb3RvY29sLlxcbiAxNTQ6XFx0ICovXFxuIDE1NTpcXHRfX2JlMTYgZXRoX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcXG4gMTU2OlxcdHtcXG4gMTU3OlxcdFxcdGNvbnN0IHVuc2lnbmVkIHNob3J0ICpzYXA7XFxuIDE1ODpcXHRcXHRjb25zdCBzdHJ1Y3QgZXRoaGRyICpldGg7XFxuIDE1OTpcXHRcXHRfX2JlMTYgcmVzO1xcbiAxNjA6XFx0XFxuIDE2MTpcXHRcXHRza2ItXFx1MDAzZWRldiA9IGRldjtcXG4gMTYyOlxcdFxcdHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7XFxuIDE2MzpcXHRcXG4gMTY0OlxcdFxcdGlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpIFxcdTAwM2MgRVRIX0hMRU4pKSB7XFxuIDE2NTpcXHRcXHRcXHRuZXRfd2Fybl9yYXRlbGltaXRlZChcXFwiJXM6IGRyb3BwaW5nIGZyYW1lIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydCBmcm9tICVzXFxcXG5cXFwiLFxcbiAxNjY6XFx0XFx0XFx0XFx0XFx0ICAgICBfX2Z1bmNfXywgZGV2LVxcdTAwM2VuYW1lKTtcXG4gMTY3OlxcdFxcdFxcdHJldHVybiAwO1xcbiAxNjg6XFx0XFx0fVxcbiAxNjk6XFx0XFxuIDE3MDpcXHRcXHRldGggPSBldGhfc2tiX3B1bGxfbWFjKHNrYik7XFxuIDE3MTpcXHRcXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcXG4gMTcyOlxcdFxcbiAxNzM6XFx0XFx0LypcXG4gMTc0OlxcdFxcdCAqIFNvbWUgdmFyaWFudHMgb2YgRFNBIHRhZ2dpbmcgZG9uJ3QgaGF2ZSBhbiBldGhlcnR5cGUgZmllbGRcXG4gMTc1OlxcdFxcdCAqIGF0IGFsbCwgc28gd2UgY2hlY2sgaGVyZSB3aGV0aGVyIG9uZSBvZiB0aG9zZSB0YWdnaW5nXFxuIDE3NjpcXHRcXHQgKiB2YXJpYW50cyBoYXMgYmVlbiBjb25maWd1cmVkIG9uIHRoZSByZWNlaXZpbmcgaW50ZXJmYWNlLFxcbiAxNzc6XFx0XFx0ICogYW5kIGlmIHNvLCBzZXQgc2tiLVxcdTAwM2Vwcm90b2NvbCB3aXRob3V0IGxvb2tpbmcgYXQgdGhlIHBhY2tldC5cXG4gMTc4OlxcdFxcdCAqL1xcbiAxNzk6XFx0XFx0aWYgKHVubGlrZWx5KG5ldGRldl91c2VzX2RzYShkZXYpKSlcXG4gMTgwOlxcdFxcdFxcdHJldHVybiBodG9ucyhFVEhfUF9YRFNBKTtcXG4gMTgxOlxcdFxcbiAxODI6XFx0XFx0aWYgKGxpa2VseShldGhfcHJvdG9faXNfODAyXzMoZXRoLVxcdTAwM2VoX3Byb3RvKSkpXFxuIDE4MzpcXHRcXHRcXHRyZXR1cm4gZXRoLVxcdTAwM2VoX3Byb3RvO1xcbiAxODQ6XFx0XFxuIDE4NTpcXHRcXHQvKlxcbiAxODY6XFx0XFx0ICogICAgICBUaGlzIGlzIGEgbWFnaWMgaGFjayB0byBzcG90IElQWCBwYWNrZXRzLiBPbGRlciBOb3ZlbGwgYnJlYWtzXFxuIDE4NzpcXHRcXHQgKiAgICAgIHRoZSBwcm90b2NvbCBkZXNpZ24gYW5kIHJ1bnMgSVBYIG92ZXIgODAyLjMgd2l0aG91dCBhbiA4MDIuMiBMTENcXG4gMTg4OlxcdFxcdCAqICAgICAgbGF5ZXIuIFdlIGxvb2sgZm9yIEZGRkYgd2hpY2ggaXNuJ3QgYSB1c2VkIDgwMi4yIFNTQVAvRFNBUC4gVGhpc1xcbiAxODk6XFx0XFx0ICogICAgICB3b24ndCB3b3JrIGZvciBmYXVsdCB0b2xlcmFudCBuZXR3YXJlIGJ1dCBkb2VzIGZvciB0aGUgcmVzdC5cXG4gMTkwOlxcdFxcdCAqXFx0V2UgdXNlIHNrYi1cXHUwMDNlZGV2IGFzIHRlbXBvcmFyeSBzdG9yYWdlIHRvIG5vdCBoaXRcXG4gMTkxOlxcdFxcdCAqXFx0Q09ORklHX1NUQUNLUFJPVEVDVE9SX1NUUk9ORz15IGNvc3RzIG9uIHNvbWUgcGxhdGZvcm1zLlxcbiAxOTI6XFx0XFx0ICovXFxuIDE5MzpcXHRcXHRzYXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoKnNhcCksIFxcdTAwMjZza2ItXFx1MDAzZWRldik7XFxuIDE5NDpcXHRcXHRyZXMgPSAoc2FwIFxcdTAwMjZcXHUwMDI2ICpzYXAgPT0gMHhGRkZGKSA/IGh0b25zKEVUSF9QXzgwMl8zKSA6IGh0b25zKEVUSF9QXzgwMl8yKTtcXG4gMTk1OlxcdFxcbiAxOTY6XFx0XFx0LyogcmVzdG9yZSBza2ItXFx1MDAzZWRldiBpbiBjYXNlIGl0IHdhcyBtYW5nbGVkIGJ5IHNrYl9oZWFkZXJfcG9pbnRlcigpLiAqL1xcbiAxOTc6XFx0XFx0c2tiLVxcdTAwM2VkZXYgPSBkZXY7XFxuIDE5ODpcXHRcXHRyZXR1cm4gcmVzO1xcbiAxOTk6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OTo0MS4wMDc3MjU1MzRaIiwiU2VxIjoxMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzYwNjMxNDcwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgS2VybmVsIFZ1bG5lcmFiaWxpdHkqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSBzZWUgYSBwb3RlbnRpYWwgaXNzdWUgd2l0aCBgZXRoX3NrYl9wdWxsX21hY2AuIEl0IHNlZW1zIGxpa2UgdGhlIGZ1bmN0aW9uIGlzIGd1YXJkZWQgYWdhaW5zdCBwdWxsaW5nIHRvbyBtdWNoIGRhdGEsIHNwZWNpZmljYWxseSBtb3JlIHRoYW4gd2hhdCdzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgYHNrYmAncyBoZWFkLiBIb3dldmVyLCBpZiB0aGUgaGVhZCBsZW5ndGggaXMgYWN0dWFsbHkgKmxlc3MqIHRoYW4gdGhlIEV0aGVybmV0IGhlYWRlciBsZW5ndGggKGBFVEhfSExFTmApLCBpdCB3aWxsIHRyeSB0byBwdWxsIGBFVEhfSExFTmAgYnl0ZXMgYW55d2F5LiBUaGlzIG1lYW5zIGBza2ItXHUwMDNlZGF0YWAgd291bGQgZ2V0IGFkdmFuY2VkIHBhc3QgdGhlIGVuZCBvZiB0aGUgdmFsaWQgbGluZWFyIGRhdGEgKG9yLCBhdCB0aGUgdmVyeSBsZWFzdCwgcG90ZW50aWFsbHkgcGFzdCBgc2tiLVx1MDAzZXRhaWxgKS4gVGhlbiwgdGhpcyBjb2RlIGF0dGVtcHRzIHRvIGFjY2VzcyBgZXRoLVx1MDAzZWhfcHJvdG9gLiBUaGlzIGZpZWxkIGlzIGF0IGFuIG9mZnNldCBvZiAxMiBieXRlcyB3aXRoaW4gdGhlIEV0aGVybmV0IGhlYWRlci5cblxuSWYgdGhlIGxpbmVhciBwb3J0aW9uIG9mIHRoZSBgc2tiYCBpcyBzaG9ydGVyIHRoYW4gMTQgYnl0ZXMsIHRoaXMgYWNjZXNzIHRvIGBldGgtXHUwMDNlaF9wcm90b2Agd2lsbCBjYXVzZSBhbiBvdXQtb2YtYm91bmRzIHJlYWQuIENydWNpYWxseSwgSSdtIHRoaW5raW5nLCB0aGlzIG1pZ2h0ICpub3QqIGltbWVkaWF0ZWx5IGNyYXNoLiBJZiB0aGUgYHNrYmAncyBkYXRhIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHdpdGggc29tZSBzbGFjayAoYW5kIGl0IHVzdWFsbHkgaXMsIGdpdmVuIG1pbmltdW0gYWxsb2NhdGlvbiBzaXplcyksIHRoZSBvdXQtb2YtYm91bmRzIHJlYWQgbWlnaHQgaGl0IHZhbGlkIG1lbW9yeSwgbm90IGFuIHVubWFwcGVkIHBhZ2UuIFNvLCB3ZSdyZSBub3QgZ3VhcmFudGVlZCBhIHBhZ2UgZmF1bHQuXG5cbkJ1dCwgd291bGQgS0FTQU4gY2F0Y2ggdGhpcz8gS0FTQU4gaXMgc3VwcG9zZWQgdG8gdHJhY2sgbWVtb3J5IGFsbG9jYXRpb25zLiBJZiB0aGUgc2tiIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHVzaW5nIGBrbWFsbG9jYCwgS0FTQU4gc2hvdWxkIGtub3cgaXRzIHNpemUuIEknbSB0aGlua2luZyB0aG91Z2gsIGBza2ItXHUwMDNlZGF0YWAgbWlnaHQgYmUgd2l0aGluIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBidXQgdGhlIHZhbGlkIGRhdGEgb25seSBnb2VzIHVwIHRvIGBza2JfaGVhZGxlbihza2IpYC4gVGhlIGJ5dGVzIGJleW9uZCB0aGF0LCB1cCB0byB0aGUgZW5kIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLCBhcmUgZWl0aGVyIHVuaW5pdGlhbGl6ZWQgb3IgY29udGFpbiBvbGQgZGF0YS4gQWgsIHdhaXQgYSBtaW51dGUsIGRvZXNuJ3QgS0FTQU4gZG8gc29tZSBzcGVjaWFsIGhhbmRsaW5nIGZvciBza2JzPyBEb2Vzbid0IGl0IGhhdmUgYW5ub3RhdGlvbnMgZm9yIHNrYnM/XG5cblllcyEgS0FTQU4gcG9pc29ucyB0aGUgdW51c2VkIHBhcnQgb2Ygc2tiIGRhdGEuIFNvLCBsZXQncyBjb25maXJtIHdoZXRoZXIgS0FTQU4gcG9pc29ucyBza2IgZGF0YS4gVGhpcyBpcyBrZXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd291bGQgZmxhZyB0aGlzIHBvdGVudGlhbGx5IG91dCBvZiBib3VuZHMgcmVhZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDQ0OSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEyOjU5OjQ4LjYxNDA0Mzc0OFoiLCJTZXEiOjE0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjAzNDQ3MTEzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrYXNhbl8uKnNrYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2NvcmUvc2tidWZmLmM9Mjg0PXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm5hcGlfc2tiX2NhY2hlX2dldChib29sIGFsbG9jKVxcbi0tXFxubmV0L2NvcmUvc2tidWZmLmMtMzA1LVxcdGxvY2FsX3VubG9ja19uZXN0ZWRfYmgoXFx1MDAyNm5hcGlfYWxsb2NfY2FjaGUuYmhfbG9jayk7XFxubmV0L2NvcmUvc2tidWZmLmM6MzA2OlxcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KHNrYiwgc2tidWZmX2NhY2hlX3NpemUpO1xcbm5ldC9jb3JlL3NrYnVmZi5jLTMwNy1cXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jPTM0ND11MzIgbmFwaV9za2JfY2FjaGVfZ2V0X2J1bGsodm9pZCAqKnNrYnMsIHUzMiBuKVxcbi0tXFxubmV0L2NvcmUvc2tidWZmLmMtMzc4LVxcbm5ldC9jb3JlL3NrYnVmZi5jOjM3OTpcXHRcXHRrYXNhbl9tZW1wb29sX3VucG9pc29uX29iamVjdChza2JzW2ldLCBza2J1ZmZfY2FjaGVfc2l6ZSk7XFxubmV0L2NvcmUvc2tidWZmLmMtMzgwLVxcdFxcdHNrYnVmZl9jbGVhcihza2JzW2ldKTtcXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jPTE0NjQ9c3RhdGljIHZvaWQgbmFwaV9za2JfY2FjaGVfcHV0KHN0cnVjdCBza19idWZmICpza2IpXFxuLS1cXG5uZXQvY29yZS9za2J1ZmYuYy0xNDY3LVxcbm5ldC9jb3JlL3NrYnVmZi5jOjE0Njg6XFx0aWYgKCFrYXNhbl9tZW1wb29sX3BvaXNvbl9vYmplY3Qoc2tiKSlcXG5uZXQvY29yZS9za2J1ZmYuYy0xNDY5LVxcdFxcdHJldHVybjtcXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NzctXFx0XFx0Zm9yIChpID0gcmVtYWluaW5nOyBpIFxcdTAwM2MgTkFQSV9TS0JfQ0FDSEVfU0laRTsgaSsrKVxcbm5ldC9jb3JlL3NrYnVmZi5jOjE0Nzg6XFx0XFx0XFx0a2FzYW5fbWVtcG9vbF91bnBvaXNvbl9vYmplY3QobmMtXFx1MDAzZXNrYl9jYWNoZVtpXSxcXG5uZXQvY29yZS9za2J1ZmYuYy0xNDc5LVxcdFxcdFxcdFxcdFxcdFxcdHNrYnVmZl9jYWNoZV9zaXplKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTI6NTk6NTAuNjQ4NTE5OTk4WiIsIlNlcSI6MTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNTQ4MzcwNTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS0FTQU4ncyBSb2xlIGluIHNrX2J1ZmYgUG9pc29uaW5nKipcblxuT2theSwgaG9sZCBvbiBhIHNlY29uZC4gSSBuZWVkIHRvIGNsYXJpZnkgc29tZXRoaW5nIGFib3V0IGBrYXNhbl9tZW1wb29sX3BvaXNvbl9vYmplY3RgLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhpcyBwb2lzb25zIHRoZSAqYHNrX2J1ZmZgIHN0cnVjdCogaXRzZWxmIHdoZW4gaXQncyBhbGxvY2F0ZWQgZnJvbSBhIG1lbXBvb2wuIEJ1dCBpcyBLQVNBTiBhbHNvIHVzZWQgdG8gcG9pc29uIHRoZSAqZGF0YSBidWZmZXIqIHRoYXQncyBhdHRhY2hlZCB0byB0aGUgYHNrX2J1ZmZgPyBUaGF0J3MgdGhlIGNydWNpYWwgcG9pbnQuIEkgbmVlZCB0byB2ZXJpZnkgaG93IG1lbW9yeSBjb3JydXB0aW9uIGlzIGhhbmRsZWQgd2l0aCB0aGUgZGF0YSBidWZmZXIuXG5cbkxldCBtZSBxdWlja2x5IGRpdmUgaW50byBgbmV0L2NvcmUvc2tidWZmLmNgIGFuZCBodW50IGZvciBjYWxscyB0byBga2FzYW5fcG9pc29uYCBvciBhbnl0aGluZyBzaW1pbGFyIHRoYXQgaGFuZGxlcyBkYXRhIHBvaXNvbmluZyB3aXRoaW4gdGhlIGBza19idWZmYCdzIGNvbnRleHQuIFRoYXQncyB0aGUgbW9zdCBsaWtlbHkgcGxhY2UgdG8gZmluZCB0aGUgYW5zd2VyLiBJdCdzIGEga2V5IGRldGFpbCBmb3IgY29ycmVjdGx5IGFzc2Vzc2luZyBwb3RlbnRpYWwgbWVtb3J5IGlzc3VlcyBhbmQgdnVsbmVyYWJpbGl0aWVzIGhlcmUuIEknbSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaWYgdGhlcmUncyBhbnkgZGlzdGluY3Rpb24gYmV0d2VlbiBtZW1wb29sLWFsbG9jYXRlZCBhbmQgb3RoZXIgYHNrYmAgYWxsb2NhdGlvbnMgd2l0aCByZXNwZWN0IHRvIEtBU0FOIHBvaXNvbmluZyBvZiB0aGUgZGF0YS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTc1MCwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEyOjU5OjU0LjgwMzM2MzQyNFoiLCJTZXEiOjE2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDYyNjE2MTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2FzYW4uKnBvaXNvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvY29yZS9za2J1ZmYuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvY29yZS9za2J1ZmYuYz0yODQ9c3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqbmFwaV9za2JfY2FjaGVfZ2V0KGJvb2wgYWxsb2MpXFxuLS1cXG5uZXQvY29yZS9za2J1ZmYuYy0zMDUtXFx0bG9jYWxfdW5sb2NrX25lc3RlZF9iaChcXHUwMDI2bmFwaV9hbGxvY19jYWNoZS5iaF9sb2NrKTtcXG5uZXQvY29yZS9za2J1ZmYuYzozMDY6XFx0a2FzYW5fbWVtcG9vbF91bnBvaXNvbl9vYmplY3Qoc2tiLCBza2J1ZmZfY2FjaGVfc2l6ZSk7XFxubmV0L2NvcmUvc2tidWZmLmMtMzA3LVxcbi0tXFxubmV0L2NvcmUvc2tidWZmLmM9MzQ0PXUzMiBuYXBpX3NrYl9jYWNoZV9nZXRfYnVsayh2b2lkICoqc2ticywgdTMyIG4pXFxuLS1cXG5uZXQvY29yZS9za2J1ZmYuYy0zNzgtXFxubmV0L2NvcmUvc2tidWZmLmM6Mzc5OlxcdFxcdGthc2FuX21lbXBvb2xfdW5wb2lzb25fb2JqZWN0KHNrYnNbaV0sIHNrYnVmZl9jYWNoZV9zaXplKTtcXG5uZXQvY29yZS9za2J1ZmYuYy0zODAtXFx0XFx0c2tidWZmX2NsZWFyKHNrYnNbaV0pO1xcbi0tXFxubmV0L2NvcmUvc2tidWZmLmM9MTQ2ND1zdGF0aWMgdm9pZCBuYXBpX3NrYl9jYWNoZV9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NjctXFxubmV0L2NvcmUvc2tidWZmLmM6MTQ2ODpcXHRpZiAoIWthc2FuX21lbXBvb2xfcG9pc29uX29iamVjdChza2IpKVxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NjktXFx0XFx0cmV0dXJuO1xcbi0tXFxubmV0L2NvcmUvc2tidWZmLmMtMTQ3Ny1cXHRcXHRmb3IgKGkgPSByZW1haW5pbmc7IGkgXFx1MDAzYyBOQVBJX1NLQl9DQUNIRV9TSVpFOyBpKyspXFxubmV0L2NvcmUvc2tidWZmLmM6MTQ3ODpcXHRcXHRcXHRrYXNhbl9tZW1wb29sX3VucG9pc29uX29iamVjdChuYy1cXHUwMDNlc2tiX2NhY2hlW2ldLFxcbm5ldC9jb3JlL3NrYnVmZi5jLTE0NzktXFx0XFx0XFx0XFx0XFx0XFx0c2tidWZmX2NhY2hlX3NpemUpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMjo1OTo1NC44NDk2MzI0OTNaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODYyNjE1NzQ0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTidzIFBvdGVudGlhbCBBZHZhbnRhZ2UgaW4gU0tCIERhdGEgSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgaG93IEtBU0FOIGFuZCBLTVNBTiBpbnRlcmFjdCB3aXRoIFNLQiBkYXRhIGJ1ZmZlcnMsIGFuZCBzb21ldGhpbmcgc2VlbXMgdG8gYmUgY2xpY2tpbmcuIEluaXRpYWxseSwgaXQgc2VlbWVkIGxpa2UgS0FTQU4gbWlnaHQgbWlzcyBlcnJvcnMgd2hlbiByZWFkaW5nIHBhc3QgYHNrYi1cdTAwM2V0YWlsYCB3aXRoaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIsIGFzIGl0IG9ubHkgY2hlY2tzIHRoZSBvdmVyYWxsIGFsbG9jYXRpb24gc2l6ZS4gQnV0IHRoZW4gSSByZW1lbWJlcmVkIEtNU0FOJ3Mgcm9sZSBpbiBkZXRlY3RpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbklmIHRoZSBgc2tiLVx1MDAzZWRhdGFgIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGttYWxsb2NgIHRoZW4gS0FTQU4gd2lsbCBwb2lzb24gcGFzdCB0aGUgcmVxdWVzdGVkIHNpemUsIGJ1dCB0aGUgaW1wb3J0YW50IHBvaW50IGhlcmUgaXMgdGhhdCB3aGVuIHJlYWRpbmcgYmV5b25kIGBza2ItXHUwMDNldGFpbGAsIHdlJ3JlIHBvdGVudGlhbGx5IHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnksIHJpZ2h0PyBBbmQgS01TQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGNhdGNoIHRoYXQhIElmIGl0J3MgYSBuZXcgYWxsb2NhdGlvbiwgS01TQU4gc2hvdWxkIG5haWwgaXQsIHNpbmNlIHRoZSBidWZmZXIgd2lsbCBiZSB1bmluaXRpYWxpemVkLiBUaG91Z2gsIGlmIHRoZSBidWZmZXIgaXMgYmVpbmcgcmV1c2VkLCBLTVNBTiAqbWlnaHQqIG1pc3MgaXQgc2luY2UgaXQgb25seSB0cmFja3MgaW5pdGlhbGl6YXRpb24gYXQgYWxsb2NhdGlvbi5cblxuVGhpbmtpbmcgc3BlY2lmaWNhbGx5IGFib3V0IHRoZSByZWNlaXZlIHBhdGggYW5kIGhvdyBgZXRoX3R5cGVfdHJhbnNgIGZpdHMgaW4uIFRoZSBkcml2ZXIgZ3JhYnMgYSBidWZmZXIsIHJlY2VpdmVzIGEgcGFja2V0LCBhbmQgc2V0cyBgc2tiLVx1MDAzZWxlbmAuIEFueXRoaW5nIGJleW9uZCB0aGF0IGlzIGVzc2VudGlhbGx5IFwiZ2FyYmFnZVwiIGxlZnQgb3ZlciBmcm9tIHRoZSBwcmV2aW91cyB1c2UsIG9yIHBhZGRpbmcgbm90IHdyaXR0ZW4gYnkgdGhlIGRldmljZS4gSWYgRE1BIGlzIHVzZWQsIHRoZSBkZXZpY2Ugd2lsbCB3cml0ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIGFuZCBLTVNBTiB3aWxsIHVucG9pc29uIHRoYXQgbWVtb3J5LCBidXQgdGhlIHJlc3QgcmVtYWlucyBwb2lzb25lZCwgaGVuY2UgdW5pbml0aWFsaXplZCwgcmlnaHQ/XG5cblNvLCBpZiBgZXRoX3R5cGVfdHJhbnNgIGF0dGVtcHRzIHRvIHJlYWQsIHNheSwgYGV0aC1cdTAwM2VoX3Byb3RvYCBiZXlvbmQgdGhlIHJlY2VpdmVkIGxlbmd0aCAoaS5lLiBiZXlvbmQgYHNrYi1cdTAwM2VsZW5gKSwgaXQgc2hvdWxkIHRyaWdnZXIgYSBLTVNBTiB3YXJuaW5nLCBzaW5jZSBpdCdzIGFuIHVuaW5pdGlhbGl6ZWQgcmVhZCEgVGhhdCdzIGEgZ29vZCBmaW5kIVxuXG5Ob3csIGlzIHRoaXMgYSBLTVNBTi1zcGVjaWZpYyBpc3N1ZT8gWWVzLCBiZWNhdXNlIEtBU0FOIGlzIGxpa2VseSBub3QgZ29pbmcgdG8gY2F0Y2ggaXQsIGdpdmVuIHRoZSBtZW1vcnkgYWNjZXNzIGlzIHdpdGhpbiB0aGUgYWxsb2NhdGVkIGJvdW5kcy4gS0FTQU4gZG9lc24ndCBoYXZlIHRoZSBzYW1lIGNvbmNlcHQgb2YgJ2xvZ2ljYWwnIHNpemUsIG9ubHkgdGhlIGFsbG9jYXRlZCBzaXplLiBJdCBsb29rcyBsaWtlIGl0IGJvaWxzIGRvd24gdG8gdGhlIHVzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuTGV0IG1lIGp1c3QgZG91YmxlLWNoZWNrLCBidXQgSSBkb24ndCBiZWxpZXZlIEtBU0FOIGhhcyB0aGUgYWJpbGl0eSB0byBwb2lzb24gU0tCIGRhdGEsIGJ1dCB0aGVyZSdzIGEgcGF0Y2ggc2VyaWVzIGNhbGxlZCBcImthc2FuOiBhZGQgc2tiIGRhdGEgcG9pc29uaW5nXCIuIEknbGwgaGF2ZSB0byBjaGVjayBpZiB0aGF0IGxhbmRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjUyMywiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDowMy40NzU4MTEzMDZaIiwiU2VxIjoxOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzOTQ3MTU5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrYXNhbi4qc2tiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbGludXgvc2tidWZmLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjAzLjUxOTc2Nzg4NVoiLCJTZXEiOjE5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNTU5MzA4MjE0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBhIHNlYXNvbmVkIHByb2Zlc3Npb25hbDpcblxuKipEaWdnaW5nIGludG8gUG90ZW50aWFsIEtBU0FOIElzc3VlcyB3aXRoIFNLQnMqKlxuXG5BbHJpZ2h0LCB0aGUgaW5pdGlhbCBzY2FuIGZvciBga2FzYW4uKnNrYmAgaW4gYGluY2x1ZGUvbGludXgvc2tidWZmLmhgIGRpZG4ndCB5aWVsZCBhbnkgZGlyZWN0IGhpdHMuIFRoYXQncyBub3QgZW50aXJlbHkgdW5leHBlY3RlZCwgc29tZXRpbWVzIHRoZXNlIHRoaW5ncyBhcmUgc3VidGx5IG5hbWVkIG9yIGltcGxlbWVudGVkIGFjcm9zcyBtdWx0aXBsZSBmaWxlcy4gU28sIHRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGRlZXBlciBhbmQgc2VlIGlmIEtBU0FOIChLZXJuZWwgQWRkcmVzcyBTYW5pdGl6ZXIpIGlzIGJlaW5nIHV0aWxpemVkIHRvIGRldGVjdCBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24gcHJvYmxlbXMgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgZGF0YSBidWZmZXJzIGFzc29jaWF0ZWQgd2l0aCBgc2tiYCAoc29ja2V0IGJ1ZmZlcikgc3RydWN0dXJlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhlcmUgaXMgYW55IEtBU0FOIHBvaXNvbmluZyBiZWluZyBhcHBsaWVkIHRvIHRoZSBza2IgZGF0YS4gSSdtIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBjbHVlcyB0aGVyZSB0byBkZXRlcm1pbmUgd2hldGhlciBLQVNBTiBpcyBiZWluZyBhY3RpdmVseSBsZXZlcmFnZWQgdG8gZW5zdXJlIHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBjcml0aWNhbCBuZXR3b3JraW5nIGRhdGEuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc1MjUsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDowNy4wNzkwODAxMTlaIiwiU2VxIjoyMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMzY1NDc0ODcsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImthc2FuX3BvaXNvbi4qc2tiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDA6MDkuMjE1NjM0NTM2WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMTU4OTgwMzg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IGluIE5ldHdvcmsgUGFja2V0IFByb2Nlc3NpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyBuZXR3b3JrIGRyaXZlcnMgaGFuZGxlIHBhY2tldCBkYXRhIGFuZCBob3cgbWVtb3J5IHNhbml0aXplcnMgY29tZSBpbnRvIHBsYXkuIEl0IHNlZW1zIEtBU0FOIGlzbid0IHRoZSBzaWx2ZXIgYnVsbGV0IGhlcmUsIHdoaWNoIGlzIGludGVyZXN0aW5nLiBJdCBkb2Vzbid0IGNhdGNoIHJlYWRzIGJleW9uZCBgc2tiLVx1MDAzZXRhaWxgIG9yIGBza2JfaGVhZGxlbmAgYnV0ICp3aXRoaW4qIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBLTVNBTiwgaG93ZXZlciwgKmRvZXMqIGNhdGNoIGl0LCBiZWNhdXNlIHRoZSBtZW1vcnkgYmV5b25kIHRoZSBhY3R1YWwgcGFja2V0IGRhdGEgaXMgdW5pbml0aWFsaXplZC5cblxuVGhlIGtleSBpcyB0aGlzOiBpZiBhIGRyaXZlciBhbGxvY2F0ZXMgYSBwYWdlIGZvciBhIHBhY2tldCwgdGhhdCBlbnRpcmUgcGFnZSBzdGFydHMgb3V0IHVuaW5pdGlhbGl6ZWQuIERNQSB3cml0ZXMgdGhlIGFjdHVhbCBwYWNrZXQgZGF0YSwgYW5kIEtNU0FOIHNwZWNpZmljYWxseSB1bnBvaXNvbnMgdGhhdCB3cml0dGVuIHBvcnRpb24uIFRoZSByZXN0LCBob3dldmVyLCByZW1haW5zIHVudG91Y2hlZCwgaGVuY2UgdW5pbml0aWFsaXplZC5cblxuTm93LCB0YWtlIGBldGhfdHlwZV90cmFuc2AgZm9yIGV4YW1wbGUsIHdoaWNoIHJlYWRzIGBldGgtXHUwMDNlaF9wcm90b2AgKDIgYnl0ZXMpLiBJZiB0aGUgcGFja2V0IGlzIHNtYWxsZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAoYEVUSF9ITEVOYCksIHRoaXMgcmVhZCBjb3VsZCBiZSBiZXlvbmQgYHNrYl9oZWFkbGVuKHNrYilgLiBCb29tLCB1bmluaXRpYWxpemVkIG1lbW9yeSFcblxuVGhhdCBgZXRoLVx1MDAzZWhfcHJvdG9gIHZhbHVlIGlzIHRoZW4gdXNlZCB0byBkZXRlcm1pbmUgdGhlIHByb3RvY29sLiBUaGlzIHZhbHVlIGNvdWxkIGVuZCB1cCBpbiBgc2tiLVx1MDAzZXByb3RvY29sYC4gTGF0ZXIsIHRoaXMgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXMgdXNlZCBmb3Igcm91dGluZyBvciBmaWx0ZXJpbmcsIGFuZCB0aGF0IGNvdWxkIGVhc2lseSBsZWFkIHRvIGNvbmRpdGlvbmFsIGJyYW5jaGVzIGJhc2VkIG9uIHRoYXQgdW5pbml0aWFsaXplZCBkYXRhLiBUaGF0J3MgYSBwZXJmZWN0IHNjZW5hcmlvIGZvciBLTVNBTiB0byBmbGFnIGFzIGEgXCJ1c2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZVwiIGVycm9yLlxuXG5JIGNvbmZpcm1lZCBteSBoeXBvdGhlc2lzIGJ5IGxvb2tpbmcgYXQgdGhlIGNvZGUsIHNwZWNpZmljYWxseSB0aGUgYGV0aF90eXBlX3RyYW5zYCBmdW5jdGlvbjpcbmBgYGNcblx0ZXRoID0gZXRoX3NrYl9wdWxsX21hYyhza2IpO1xuXHRldGhfc2tiX3BrdF90eXBlKHNrYiwgZGV2KTtcblxuXHQvKiAuLi4gKi9cblx0aWYgKGxpa2VseShldGhfcHJvdG9faXNfODAyXzMoZXRoLVx1MDAzZWhfcHJvdG8pKSlcblx0XHRyZXR1cm4gZXRoLVx1MDAzZWhfcHJvdG87XG5gYGBcbklmIGBza2JfaGVhZGxlbihza2IpYCBpcyBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgdGhlbiByZWFkaW5nIGBldGgtXHUwMDNlaF9wcm90b2AgaXMgZ29pbmcgdG8gYmUgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhhdCBgZXRoX3Byb3RvX2lzXzgwMl8zYCBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIHByb3RvY29sIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxNTM2LiBDb25kaXRpb25hbCBicmFuY2ggb24gdW5pbml0aWFsaXplZCBkYXRhISBLTVNBTiB3aWxsICpkZWZpbml0ZWx5KiBjYXRjaCB0aGF0LlxuXG5NeSBuZXh0IHF1ZXN0aW9uIGlzLCB3aWxsIEtBU0FOIGNhdGNoIHRoaXM/IE5vLCBpdCB3b24ndC4gVGhlIHJlYWQgaXMgd2l0aGluIHRoZSBhbGxvY2F0aW9uIGJvdW5kcy4gVXN1YWxseSwgbmV0d29yayBkcml2ZXJzIGFsbG9jYXRlIGF0IGxlYXN0IGEgcGFnZSAoNDA5NiBieXRlcykgb3IgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIHJlY2VpdmUgcGFja2V0cy4gQSBwYWNrZXQgb2YgbGVzcyB0aGFuIDE0IGJ5dGVzIChFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoKSBlYXNpbHkgZml0cyB3aXRoaW4gdGhhdCBhbGxvY2F0aW9uLiBTbyB0aGUgYGV0aC1cdTAwM2VoX3Byb3RvYCByZWFkIGhhcHBlbnMgd2l0aGluIHRoZSBhbGxvY2F0aW9uLiBJdCdzIEtNU0FOIHRoYXQgc2hpbmVzIGhlcmUgYmVjYXVzZSB0aGUgbWVtb3J5IGJleW9uZCB0aGUgcGFja2V0IGRhdGEgaXMgdW50b3VjaGVkIGFuZCB0aGVyZWZvcmUgdW5pbml0aWFsaXplZC5cblxuTm93LCBJIHdvbmRlciBpZiBhbm90aGVyIHRvb2wgY2F0Y2hlcyB0aGlzLiBNYXliZSB0aGVyZSBpcyBhIGBCVUdfT05gIGluIGBza2JfcHVsbGA/IEkgc2hvdWxkIGNoZWNrIGBldGhfc2tiX3B1bGxfbWFjYC5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzc5MCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU4MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDoxOS4zNzQ2MTczMjRaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Mzc4MjU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV0aF9za2JfcHVsbF9tYWNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaD02MjM9c3RhdGljIGlubGluZSB2b2lkIGV0aF9za2JfcGt0X3R5cGUoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbmluY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaC02MzktXFxuaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oOjY0MDpzdGF0aWMgaW5saW5lIHN0cnVjdCBldGhoZHIgKmV0aF9za2JfcHVsbF9tYWMoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgtNjQxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDA6MTkuNDIwMDAwNDQyWiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUxMDg1OTY3NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSdtIHdlbGwtdmVyc2VkIGluIGtlcm5lbCBuZXR3b3JraW5nIGludGVybmFsczpcblxuKipEaXZpbmcgaW50byBgZXRoX3NrYl9wdWxsX21hY2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBwdWxsIHVwIHRoZSBzb3VyY2UgY29kZSBmb3IgYGV0aF9za2JfcHVsbF9tYWNgLiBUaGlzIGZ1bmN0aW9uIG5hbWUgaW1tZWRpYXRlbHkgc2NyZWFtcyBcIkV0aGVybmV0IGFuZCBTS0IgbWFuaXB1bGF0aW9uLFwiIHNvIGl0J3MgbGlrZWx5IGEga2V5IHBsYXllciBpbiB0aGUgZGF0YSBsaW5rIGxheWVyIHdpdGhpbiB0aGUga2VybmVsJ3MgbmV0d29yayBzdGFjay4gSSdtIGd1ZXNzaW5nIGl0J3MgcmVzcG9uc2libGUgZm9yLCBhdCBhIG1pbmltdW0sIGhhbmRsaW5nIHRoZSBwdWxsaW5nIG9yIGFkdmFuY2VtZW50IG9mIHRoZSBTZWN1cmUgS2VybmVsIEJ1ZmZlciAoU0tCKSBwb2ludGVyIHRvIGFjY291bnQgZm9yIHRoZSBFdGhlcm5ldCBNQUMgaGVhZGVyLiBUaGlzIGlzIHRoZSBzdGFnZSB3aGVyZSB0aGUga2VybmVsIGlzIHByb2Nlc3NpbmcgYSByZWNlaXZlZCBFdGhlcm5ldCBmcmFtZSwgYW5kIG5lZWRzIHRvIG1vdmUgcGFzdCB0aGUgZGVzdGluYXRpb24gTUFDLCBzb3VyY2UgTUFDLCBFdGhlclR5cGUsIGFuZCBwb3RlbnRpYWxseSBWTEFOIHRhZ3MgKGlmIHByZXNlbnQpIHRvIGdldCB0byB0aGUgcGF5bG9hZC4gSXQncyB0aGUgZXNzZW50aWFsIGJyaWRnaW5nIHN0ZXAgYmV0d2VlbiB0aGUgcmF3IGZyYW1lIGRhdGEgYW5kIHRoZSBJUCBsYXllciBvciBoaWdoZXIgcHJvdG9jb2xzLlxuXG5JJ2xsIGJlIGxvb2tpbmcgdG8gdW5kZXJzdGFuZDpcblxuKiAgICoqSG93IGl0IGhhbmRsZXMgdmFyaWFibGUtbGVuZ3RoIGhlYWRlcnM6KiogRG9lcyBpdCBkeW5hbWljYWxseSBhZGp1c3QgdGhlIFNLQidzIGRhdGEgcG9pbnRlciBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgVkxBTiB0YWdzIG9yIG90aGVyIGV4dGVuc2lvbnMgaW4gdGhlIEV0aGVybmV0IGhlYWRlcj8gQXJlIHRoZXJlIGFueSBjaGVja3MgZm9yIG1pbmltdW0gZnJhbWUgc2l6ZXMgb3IgZnJhZ21lbnRlZCBmcmFtZXM/XG4qICAgKipFcnJvciBoYW5kbGluZzoqKiBXaGF0IGhhcHBlbnMgaWYgdGhlIFNLQiBpcyB0b28gc21hbGwgdG8gY29udGFpbiBhIHZhbGlkIEV0aGVybmV0IGhlYWRlcj8gQXJlIHRoZXJlIGFueSBzYW5pdHkgY2hlY2tzIG9uIHRoZSBFdGhlclR5cGUgZmllbGQgdG8gZW5zdXJlIGl0J3MgYSBrbm93biBwcm90b2NvbD9cbiogICAqKlBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zOioqIElzIHRoaXMgYSBob3QgcGF0aD8gQXJlIHRoZXJlIG9wdGltaXphdGlvbnMgaW4gcGxhY2UgbGlrZSBwb3RlbnRpYWxseSBpbmxpbmluZyBNQUMgaGVhZGVyIG9mZnNldHMgdG8gYXZvaWQgYnJhbmNoIGNvbmRpdGlvbnM/IERvZXMgaXQgdXNlIGFueSB0ZWNobmlxdWVzIGxpa2UgcHJlZmV0Y2hpbmcgdG8gaW1wcm92ZSBjYWNoZSBiZWhhdmlvcj9cbiogICAqKkludGVyYWN0aW9uIHdpdGggb3RoZXIgZnVuY3Rpb25zOioqIEhvdyBkb2VzIGl0IHRpZSBpbnRvIHRoZSBvdmVyYWxsIHJlY2VpdmUgcGF0aD8gSXMgaXQgY2FsbGVkIGRpcmVjdGx5IGZyb20gdGhlIE5JQyBkcml2ZXIsIG9yIHRocm91Z2ggc29tZSBpbnRlcm1lZGlhdGUgbGF5ZXI/IERvZXMgaXQgdXBkYXRlIGFueSBvdGhlciBTS0IgbWV0YWRhdGEgdGhhdCBkb3duc3RyZWFtIGxheWVycyByZWx5IG9uP1xuXG5JIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHJhdyBpbmNvbWluZyBFdGhlcm5ldCBmcmFtZXMgYW5kIHRyYW5zbGF0ZXMgdGhlbSBpbnRvIGEgdXNhYmxlIGZvcm1hdCBmb3IgaGlnaGVyLWxldmVsIG5ldHdvcmsgcHJvdG9jb2xzLiBJdCdzIGZ1bmRhbWVudGFsIHRvIHRoZSB3aG9sZSBuZXR3b3JraW5nIHByb2Nlc3MhIExldCdzIGRpZyBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTE2NiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjI0LjUyODYwMDgzWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNTQwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmhcIixcbiAgXCJGaXJzdExpbmVcIjogNjM1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjM1OlxcdFxcdFxcdFxcdHNrYi1cXHUwMDNlcGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUO1xcbiA2MzY6XFx0XFx0XFx0fVxcbiA2Mzc6XFx0XFx0fVxcbiA2Mzg6XFx0fVxcbiA2Mzk6XFx0XFxuIDY0MDpcXHRzdGF0aWMgaW5saW5lIHN0cnVjdCBldGhoZHIgKmV0aF9za2JfcHVsbF9tYWMoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4gNjQxOlxcdHtcXG4gNjQyOlxcdFxcdHN0cnVjdCBldGhoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLVxcdTAwM2VkYXRhO1xcbiA2NDM6XFx0XFxuIDY0NDpcXHRcXHRza2JfcHVsbF9pbmxpbmUoc2tiLCBFVEhfSExFTik7XFxuIDY0NTpcXHRcXHRyZXR1cm4gZXRoO1xcbiA2NDY6XFx0fVxcbiA2NDc6XFx0XFxuIDY0ODpcXHQvKipcXG4gNjQ5OlxcdCAqIGV0aF9za2JfcGFkIC0gUGFkIGJ1ZmZlciB0byBtaW5pbXVtIG51bWJlciBvZiBvY3RldHMgZm9yIEV0aGVybmV0IGZyYW1lXFxuIDY1MDpcXHQgKiBAc2tiOiBCdWZmZXIgdG8gcGFkXFxuIDY1MTpcXHQgKlxcbiA2NTI6XFx0ICogQW4gRXRoZXJuZXQgZnJhbWUgc2hvdWxkIGhhdmUgYSBtaW5pbXVtIHNpemUgb2YgNjAgYnl0ZXMuICBUaGlzIGZ1bmN0aW9uXFxuIDY1MzpcXHQgKiB0YWtlcyBzaG9ydCBmcmFtZXMgYW5kIHBhZHMgdGhlbSB3aXRoIHplcm9zIHVwIHRvIHRoZSA2MCBieXRlIGxpbWl0LlxcbiA2NTQ6XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjI0LjUyODcxMDE4MVoiLCJTZXEiOjI1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MzM5OTEzNTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQW5hbHl6aW5nIHRoZSBOZXR3b3JrIFBhY2tldCBQdWxsIE9wZXJhdGlvbioqXG5cblJpZ2h0LCBgZXRoX3NrYl9wdWxsX21hY2AuLi4gdGhhdCdzIHdoZXJlIHdlJ3JlIHlhbmtpbmcgdGhlIEV0aGVybmV0IGhlYWRlciBvZmYgYSBwYWNrZXQsIGlzbid0IGl0PyBUaGUga2V5IGxpbmUgdGhlcmUsIGFzIEkgcmVjYWxsLCBpcyB0aGUgY2FsbCB0byBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gT2theSwgc28gYHNrYl9wdWxsX2lubGluZWAgaXMgY2xlYXJseSB0aGUgd29ya2hvcnNlIGhlcmUuIFdlJ3JlIGV4cGVjdGluZyBgRVRIX0hMRU5gLCB3aGljaCBpcyB0aGF0IHN0YW5kYXJkIEV0aGVybmV0IGhlYWRlciBsZW5ndGguLi4gMTQgb3IgMTUgYnl0ZXMsIGRlcGVuZGluZyBvbiB0aGUgVkxBTiBzaXR1YXRpb24uIFNvLCB0aGUga2VybmVsIGlzIGxpa2VseSBtYW5hZ2luZyBhIHNoYXJlZCBuZXR3b3JrIGJ1ZmZlciwgcmlnaHQ/IFdlJ3JlIHRha2luZyB0aGUgbWVtb3J5IGF0IHRoZSBoZWFkIG9mIHRoZSBgc2tiYCBhbmQgYWR2YW5jaW5nIHRoZSBgZGF0YWAgcG9pbnRlciB0byBza2lwIHRoZSBFdGhlcm5ldCBoZWFkZXIuIExldCdzIGRpZyBkZWVwZXIgaW50byB0aGUgaW50cmljYWNpZXMgb2Ygd2hhdCBgc2tiX3B1bGxfaW5saW5lYCBpcyBkb2luZy4gU3BlY2lmaWNhbGx5LCBob3cgaXQncyBiZWluZyBoYW5kbGVkIGhlcmUuIEknbSBrZWVuIHRvIGV4YW1pbmUgaG93IGl0IGlzIHdvcmtpbmcgaGVyZSwgc2luY2Ugd2UgYXJlIGhhbmRsaW5nIGEgYnVmZmVyIGlubGluZS4gTGV0J3Mgc2VlIGhvdyB0aGV5IGRvIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5OTQzLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDoyOC44Njg2MjU3MTJaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MDc2ODc5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNrYl9wdWxsX2lubGluZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL2xpbnV4L3NrYnVmZi5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvc2tidWZmLmg9MjgzNj1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKl9fc2tiX3B1bGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbilcXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjg1MS1cXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjI4NTI6c3RhdGljIGlubGluZSB2b2lkICpza2JfcHVsbF9pbmxpbmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbilcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI4NTMte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDoyOC45MTM3MDg2WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MDM0MTQ3OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBza2JfcHVsbF9pbmxpbmVgKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gaXQuIFRpbWUgdG8gZGlzc2VjdCBgc2tiX3B1bGxfaW5saW5lYC4gSSBrbm93IHRoaXMgZnVuY3Rpb24gaW50aW1hdGVseSwgYnV0IGl0J3MgYWx3YXlzIHdvcnRoIGEgZnJlc2ggbG9vay4gSSdtIGdvaW5nIHRvIHF1aWNrbHkgcmVmcmVzaCB0aGUgbWVudGFsIG1vZGVsIG9mIGhvdyBpdCBvcGVyYXRlcyBvbiBhbiBgc2tfYnVmZmAuIEknbSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBpbXBsaWNhdGlvbnMgb2YgaW5saW5pbmcsIGVzcGVjaWFsbHkgYXJvdW5kIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBtZW1vcnkgYWxpZ25tZW50IGlzc3Vlcy4gSSdsbCBuZWVkIHRvIHJlbWVtYmVyIHRoZSB0eXBpY2FsIHVzZSBjYXNlcyBhbmQgaG93IHRoaXMgZnVuY3Rpb24gZml0cyBpbnRvIHRoZSBvdmVyYWxsIG5ldHdvcmsgc3RhY2sg4oCTIHdoYXQgbGF5ZXJzIHJlbHkgb24gaXQsIGFuZCB3aGF0IGFzc3VtcHRpb25zIGFyZSBtYWRlIGFib3V0IHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQuIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBhbnkgcmVjZW50IGNoYW5nZXMgb3IgZGlzY3Vzc2lvbnMgSSd2ZSBtaXNzZWQg4oCTIHBlcmhhcHMgbmV3IGFyY2hpdGVjdHVyZXMgb3Igb3B0aW1pemF0aW9ucyB0aGF0IGhhdmUgaW1wYWN0ZWQgaXRzIGJlaGF2aW9yLiBJdCdzIHRpbWUgdG8gY29uZmlybSBteSBhc3N1bXB0aW9ucyBhbmQgbWFrZSBzdXJlIG15IHVuZGVyc3RhbmRpbmcgaXMgY29tcGxldGVseSBzaGFycCFcblxuXG4iLCJJbnB1dFRva2VucyI6MTAzOTMsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDozMi40MTcxMjYxNTZaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg4MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbGludXgvc2tidWZmLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMjg0NSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjg0NTpcXHRcXHRcXHRza2JfZHVtcChLRVJOX0VSUiwgc2tiLCBmYWxzZSk7XFxuMjg0NjpcXHQjZW5kaWZcXG4yODQ3OlxcdFxcdFxcdEJVRygpO1xcbjI4NDg6XFx0XFx0fVxcbjI4NDk6XFx0XFx0cmV0dXJuIHNrYi1cXHUwMDNlZGF0YSArPSBsZW47XFxuMjg1MDpcXHR9XFxuMjg1MTpcXHRcXG4yODUyOlxcdHN0YXRpYyBpbmxpbmUgdm9pZCAqc2tiX3B1bGxfaW5saW5lKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pXFxuMjg1MzpcXHR7XFxuMjg1NDpcXHRcXHRyZXR1cm4gdW5saWtlbHkobGVuIFxcdTAwM2Ugc2tiLVxcdTAwM2VsZW4pID8gTlVMTCA6IF9fc2tiX3B1bGwoc2tiLCBsZW4pO1xcbjI4NTU6XFx0fVxcbjI4NTY6XFx0XFxuMjg1NzpcXHR2b2lkICpza2JfcHVsbF9kYXRhKHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBsZW4pO1xcbjI4NTg6XFx0XFxuMjg1OTpcXHR2b2lkICpfX3Bza2JfcHVsbF90YWlsKHN0cnVjdCBza19idWZmICpza2IsIGludCBkZWx0YSk7XFxuMjg2MDpcXHRcXG4yODYxOlxcdHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgZW51bSBza2JfZHJvcF9yZWFzb25cXG4yODYyOlxcdHBza2JfbWF5X3B1bGxfcmVhc29uKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pXFxuMjg2MzpcXHR7XFxuMjg2NDpcXHRcXHRERUJVR19ORVRfV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDNlIElOVF9NQVgpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDozMi40MTc0MTYxOTZaIiwiU2VxIjoyOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTAzNDUwMTIzOTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtlcm5lbCBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgc28gYHNrYl9wdWxsX2lubGluZWAgcmV0dXJuaW5nIGBOVUxMYCB3aGVuIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIChgbGVuYCkgaXMgZ3JlYXRlciB0aGFuIHRoZSBza2IncyBjdXJyZW50IGxlbmd0aCAoYHNrYi1cdTAwM2VsZW5gKSBpbW1lZGlhdGVseSBqdW1wcyBvdXQgYXQgbWUuIEFuZCBoZXJlJ3MgdGhlIGtpY2tlcjogYGV0aF9za2JfcHVsbF9tYWNgIGJsaXRoZWx5ICppZ25vcmVzKiB0aGF0IGBOVUxMYCByZXR1cm4hIFRoYXQncyBhIHJlZCBmbGFnLiBTcGVjaWZpY2FsbHksIHRoaXMgY29kZTpcblxuYGBgY1xuc3RhdGljIGlubGluZSBzdHJ1Y3QgZXRoaGRyICpldGhfc2tiX3B1bGxfbWFjKHN0cnVjdCBza19idWZmICpza2IpXG57XG5cdHN0cnVjdCBldGhoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLVx1MDAzZWRhdGE7XG5cblx0c2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pO1xuXHRyZXR1cm4gZXRoO1xufVxuYGBgXG5cbklmIGBFVEhfSExFTmAgKDE0IGJ5dGVzIGZvciBhbiBFdGhlcm5ldCBoZWFkZXIpIGlzIGdyZWF0ZXIgdGhhbiBgc2tiLVx1MDAzZWxlbmAsIGBza2JfcHVsbF9pbmxpbmVgIHJldHVybnMgYE5VTExgIGFuZCAqZG9lc24ndCogYWR2YW5jZSBgc2tiLVx1MDAzZWRhdGFgLiBCdXQgYGV0aF9za2JfcHVsbF9tYWNgIHN0aWxsIHJldHVybnMgdGhlIG9yaWdpbmFsLCBub3cgcG90ZW50aWFsbHkgaW52YWxpZCwgcG9pbnRlciBgZXRoYC4gVGhlbiwgYGV0aF90eXBlX3RyYW5zYCBoYXBwaWx5IGdvZXMgYWhlYWQgYW5kIHRyaWVzIHRvIHVzZSBgZXRoLVx1MDAzZWhfcHJvdG9gLiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuXG5cbklmIGBFVEhfSExFTiBcdTAwM2Ugc2tiLVx1MDAzZWxlbmAsIGRvZXMgdGhpcyBuZWNlc3NhcmlseSBtZWFuIGBza2ItXHUwMDNlbGVuYCBpcyBsZXNzIHRoYW4gMTQ/IEFic29sdXRlbHkuIFRoYXQgbWVhbnMgdGhhdCBgZXRoLVx1MDAzZWhfcHJvdG9gLCB3aGljaCBpcyBhdCBvZmZzZXQgMTIgaW4gdGhlIGBldGhoZHJgIHN0cnVjdHVyZSwgZmFsbHMgKm91dHNpZGUqIHRoZSB2YWxpZCBkYXRhIHJlZ2lvbiBvZiB0aGUgc2tiLiBJZiBgc2tiLVx1MDAzZWxlbmAgaXMsIHNheSwgMTAgYnl0ZXMsIHRoZW4gYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIgaXMgYWNjZXNzaW5nIG1lbW9yeSB0aGF0J3MgYmV5b25kIHRoZSBkYXRhJ3MgYm91bmRhcnkuXG5cblRoZSBxdWVzdGlvbiB0aGVuIGlzLCB3aWxsIHRoaXMgYmUgY2F1Z2h0PyBLQVNBTiAoS2VybmVsIEFkZHJlc3MgU2FuaXRpemVyKSBsaWtlbHkgKndvbid0KiBmbGFnIHRoaXMuIFRoZSBhbGxvY2F0ZWQgYnVmZmVyIGlzIHVzdWFsbHkgbXVjaCBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBkYXRhIGxlbmd0aC4gSG93ZXZlciwgS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSAqd2lsbCogbGlrZWx5IGNhdGNoIGl0IGJlY2F1c2UgdGhlIG1lbW9yeSBhdCBvZmZzZXQgMTIgbWlnaHQgdmVyeSB3ZWxsIGJlIHVuaW5pdGlhbGl6ZWQuXG5cbk5vdywgd2hhdCBpZiBgc2tiX2hlYWRsZW4oc2tiKWAgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmAgKmJ1dCogYHNrYi1cdTAwM2VsZW5gIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgRVRIX0hMRU5gPyBBaCwgdGhpcyBtZWFucyB0aGUgcGFja2V0IGlzIGZyYWdtZW50ZWQsIGFuZCB0aGUgbGluZWFyIHBhcnQgaXMgc2hvcnRlciB0aGFuIDE0IGJ5dGVzLiBJbiB0aGlzIGNhc2UsIGBza2JfcHVsbF9pbmxpbmVgIHdpbGwgY2FsbCBgX19za2JfcHVsbChza2IsIEVUSF9ITEVOKWAuIExldCdzIHJlZnJlc2ggb3VyIG1lbW9yeSBvZiB3aGF0IGBfX3NrYl9wdWxsYCBkb2VzOlxuXG5gYGBjXG5zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKl9fc2tiX3B1bGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbilcbntcblx0c2tiLVx1MDAzZWxlbiAtPSBsZW47XG5cdEJVR19PTihza2ItXHUwMDNlbGVuIFx1MDAzYyBza2ItXHUwMDNlZGF0YV9sZW4pO1xuXHRyZXR1cm4gc2tiLVx1MDAzZWRhdGEgKz0gbGVuO1xufVxuYGBgXG5cbklmIGBza2JfaGVhZGxlbihza2IpIFx1MDAzYyBFVEhfSExFTmAsIHRoZW4gYHNrYi1cdTAwM2VsZW4gLSBza2ItXHUwMDNlZGF0YV9sZW4gXHUwMDNjIEVUSF9ITEVOYC4gU28sIGBza2ItXHUwMDNlbGVuIC0gRVRIX0hMRU4gXHUwMDNjIHNrYi1cdTAwM2VkYXRhX2xlbmAuIFRoZSBgQlVHX09OKHNrYi1cdTAwM2VsZW4gXHUwMDNjIHNrYi1cdTAwM2VkYXRhX2xlbilgIHdpbGwgdHJpZ2dlciwgcHJldmVudGluZyBmdXJ0aGVyIHByb2JsZW1zLlxuXG5TbywgKnRoYXQqIGBCVUdfT05gIHdpbGwgYmUgaGl0IGlmIGBza2JfaGVhZGxlbihza2IpIFx1MDAzYyBFVEhfSExFTmAgYW5kIGBza2ItXHUwMDNlbGVuIFx1MDAzZT0gRVRIX0hMRU5gPyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGBza2JfaGVhZGxlbmAgYmVoYXZlcy4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDk2NCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY4NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjQyLjc2MjQzMTAwOFoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDM3MTc4NzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2tiX2hlYWRsZW5cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9za2J1ZmYuaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3NrYnVmZi5oPTI1Mjc9c3RhdGljIGlubGluZSBib29sIHNrYl9pc19ub25saW5lYXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtMjUzMS1cXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjI1MzI6c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2tiX2hlYWRsZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI1MzMte1xcbi0tXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaD0yNTQ2PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNrYl9wYWdlbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yNTQ3LXtcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjI1NDg6XFx0cmV0dXJuIHNrYl9oZWFkbGVuKHNrYikgKyBfX3NrYl9wYWdlbGVuKHNrYik7XFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yNTQ5LX1cXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg9Mjg2Mj1wc2tiX21heV9wdWxsX3JlYXNvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKVxcbi0tXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC0yODY2LVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6Mjg2NzpcXHRpZiAobGlrZWx5KGxlbiBcXHUwMDNjPSBza2JfaGVhZGxlbihza2IpKSlcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI4NjgtXFx0XFx0cmV0dXJuIFNLQl9OT1RfRFJPUFBFRF9ZRVQ7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI4NzItXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDoyODczOlxcdGlmICh1bmxpa2VseSghX19wc2tiX3B1bGxfdGFpbChza2IsIGxlbiAtIHNrYl9oZWFkbGVuKHNrYikpKSlcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTI4NzQtXFx0XFx0cmV0dXJuIFNLQl9EUk9QX1JFQVNPTl9OT01FTTtcXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg9NDMyNT1za2JfaGVhZGVyX3BvaW50ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwgaW50IGxlbiwgdm9pZCAqYnVmZmVyKVxcbi0tXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC00MzI3LVxcdHJldHVybiBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgbGVuLCBza2ItXFx1MDAzZWRhdGEsXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaDo0MzI4OlxcdFxcdFxcdFxcdCAgICBza2JfaGVhZGxlbihza2IpLCBidWZmZXIpO1xcbmluY2x1ZGUvbGludXgvc2tidWZmLmgtNDMyOS19XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oPTQzNDQ9c2tiX3BvaW50ZXJfaWZfbGluZWFyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsIGludCBsZW4pXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC00MzQ1LXtcXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjQzNDY6XFx0aWYgKGxpa2VseShza2JfaGVhZGxlbihza2IpIC0gb2Zmc2V0IFxcdTAwM2U9IGxlbikpXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC00MzQ3LVxcdFxcdHJldHVybiBza2ItXFx1MDAzZWRhdGEgKyBvZmZzZXQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjQyLjgwNjE1Mjg0N1oiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjM5NDc5MjAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggdGhpcywgYXMgdGhvdWdoIHRoZXNlIGFyZSAqbXkqIHRob3VnaHRzOlxuXG4qKkFuYWx5emluZyBgc2tiX2hlYWRsZW5gKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGUgZGV0YWlscy4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3Mgd291bGQgYmUgc29tZXRoaW5nIGxpa2UgdGhpczpcblxuXCJPa2F5LCBzbyB3ZSdyZSBsb29raW5nIGF0IGBza2JfaGVhZGxlbmAuIFN0cmFpZ2h0IGF3YXksIEknbSB0aGlua2luZywgdGhpcyBtdXN0IHJlbGF0ZSB0byB0aGUgTGludXgga2VybmVsJ3MgYHNrX2J1ZmZgIHN0cnVjdHVyZSwgdGhlIHdvcmtob3JzZSBmb3IgbmV0d29yayBwYWNrZXQgaGFuZGxpbmcuICBgaGVhZGxlbmAgc3VnZ2VzdHMgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgcG9ydGlvbiBvZiBhbiBgc2tiYC4gVGhhdCdzIHRoZSBtb3N0ICpsaWtlbHkqIGludGVycHJldGF0aW9uLCBnaXZlbiBteSBwYXN0IGV4cGVyaWVuY2UgYW5kIHRoZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb25zLiBMZXQncyBkZWx2ZSBpbiBhbmQgc2VlIGlmIHRoaXMgaW50dWl0aW9uIGlzIGNvcnJlY3QuXCJcblxuXG4iLCJJbnB1dFRva2VucyI6MTMxMzAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMDo0Ni40NDU2MzQyNTlaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzI2NDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbGludXgvc2tidWZmLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMjUyNSxcbiAgXCJMaW5lQ291bnRcIjogMTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjUyNTpcXHRcXG4yNTI2OlxcdFxcbjI1Mjc6XFx0c3RhdGljIGlubGluZSBib29sIHNrYl9pc19ub25saW5lYXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4yNTI4OlxcdHtcXG4yNTI5OlxcdFxcdHJldHVybiBza2ItXFx1MDAzZWRhdGFfbGVuO1xcbjI1MzA6XFx0fVxcbjI1MzE6XFx0XFxuMjUzMjpcXHRzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBza2JfaGVhZGxlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjI1MzM6XFx0e1xcbjI1MzQ6XFx0XFx0cmV0dXJuIHNrYi1cXHUwMDNlbGVuIC0gc2tiLVxcdTAwM2VkYXRhX2xlbjtcXG4yNTM1OlxcdH1cXG4yNTM2OlxcdFxcbjI1Mzc6XFx0c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19za2JfcGFnZWxlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjI1Mzg6XFx0e1xcbjI1Mzk6XFx0XFx0dW5zaWduZWQgaW50IGksIGxlbiA9IDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAwOjQ2LjQ0NTk2MjY3OVoiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzk0MTAwMTcyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE5ldHdvcmsgUGFja2V0IFByb2Nlc3NpbmcgVnVsbmVyYWJpbGl0eSoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBrZXJuZWwgaXNzdWUgcmVsYXRlZCB0byBFdGhlcm5ldCBoZWFkZXIgaGFuZGxpbmcgYW5kIGl0J3MgcXVpdGUgaW50ZXJlc3RpbmcuIEl0IHNlZW1zIHRoZSBjb3JlIHByb2JsZW0gYXJpc2VzIHdoZW4gZGVhbGluZyB3aXRoIG5ldHdvcmsgcGFja2V0cyB3aGVyZSB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIFNLQiAoU29ja2V0IEJ1ZmZlcikgaXMgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoIChgRVRIX0hMRU5gKS4gTGV0J3MgYnJlYWsgdGhpcyBkb3duOlxuXG5GaXJzdCwgYHNrYl9oZWFkbGVuKHNrYilgIGlzIGVzc2VudGlhbGx5IGBza2ItXHUwMDNlbGVuIC0gc2tiLVx1MDAzZWRhdGFfbGVuYC4gVGhlIHZ1bG5lcmFiaWxpdHkgcG9wcyB1cCBpZiB0aGlzIHZhbHVlIGlzIGxlc3MgdGhhbiBgRVRIX0hMRU5gLiBJZiB3ZSBoYXZlIGBza2ItXHUwMDNlbGVuIFx1MDAzZT0gRVRIX0hMRU5gLCB0aGVuIGBza2JfcHVsbF9pbmxpbmVgIGdldHMgY2FsbGVkIHdoaWNoIHVsdGltYXRlbHkgY2FsbHMgYF9fc2tiX3B1bGxgLiBIb3dldmVyLCBpZiBgc2tiLVx1MDAzZWxlbiAtIHNrYi1cdTAwM2VkYXRhX2xlbiBcdTAwM2MgRVRIX0hMRU5gLCB0aGVuIGBfX3NrYl9wdWxsYCB0cmlnZ2VycyBhIGBCVUdfT05gIGJlY2F1c2UgdGhlIGxlbmd0aCBjYWxjdWxhdGlvbiBiZWNvbWVzIGludmFsaWQgKGBza2ItXHUwMDNlbGVuYCB3b3VsZCBiZSBsZXNzIHRoYW4gYHNrYi1cdTAwM2VkYXRhX2xlbmAgYWZ0ZXIgdGhlIHN1YnRyYWN0aW9uKS4gU3RhbmRhcmQgZnV6emluZywgc3BlY2lmaWNhbGx5IHN5emthbGxlciAod2l0aG91dCBLTVNBTiksIHNob3VsZCBjYXRjaCB0aGlzIGBCVUdfT05gLlxuXG5CdXQsIHdoYXQgaWYgYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYD8gSW4gdGhpcyBzY2VuYXJpbywgYHNrYl9wdWxsX2lubGluZWAgcmV0dXJucyBgTlVMTGAsIGJ5cGFzc2luZyBgX19za2JfcHVsbGAuIENydWNpYWxseSwgdGhpcyBhdm9pZHMgdGhlIGBCVUdfT05gLiBIZXJlLCBgZXRoX3NrYl9wdWxsX21hY2AgcmV0dXJucyBgc2tiLVx1MDAzZWRhdGFgLCBhbmQgYGV0aF90eXBlX3RyYW5zYCBhdHRlbXB0cyB0byByZWFkIGBldGgtXHUwMDNlaF9wcm90b2AuIFRoZSBrZXkgaXMgdGhhdCBzaW5jZSBgc2tiLVx1MDAzZWxlbiBcdTAwM2MgRVRIX0hMRU5gLCBgZXRoLVx1MDAzZWhfcHJvdG9gIGlzIGJleW9uZCB0aGUgZW5kIG9mIHdoYXQncyBjb25zaWRlcmVkIHRoZSBcInZhbGlkXCIgcGFja2V0IGRhdGEuXG5cbkluaXRpYWxseSwgSSB3YXMgd29ycmllZCBhYm91dCBhbiBvdXQtb2YtYm91bmRzIHJlYWQsIGJ1dCB0aGUgZGF0YSBpcyBzdGlsbCB3aXRoaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIsIGp1c3QgYmV5b25kIHRoZSByZXBvcnRlZCBgc2tiLVx1MDAzZWxlbmAuIEtBU0FOIHdvbid0IGNhdGNoIHRoaXMsIGJlY2F1c2UgaXQncyBub3QgdHJ1bHkgb3V0LW9mLWJvdW5kcy4gSG93ZXZlciwgS01TQU4gKndpbGwqIGNhdGNoIGl0IGJlY2F1c2UgdGhlIG1lbW9yeSBiZXlvbmQgYHNrYi1cdTAwM2VsZW5gIGlzIHVuaW5pdGlhbGl6ZWQuIFRoZSBrZXJuZWwgaXMgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhpcyByZWFkIG9mIHRoZSB1bmluaXRpYWxpemVkIHZhbHVlIGJlY29tZXMgdGhlIGBza2ItXHUwMDNlcHJvdG9jb2xgLiBJdCB0aGVuIGdldHMgdXNlZCBpbiBhIGxhdGVyIHN0ZXAgYW5kIGJlY29tZXMgYSByZXBvcnRhYmxlIEtNU0FOIGlzc3VlLiBUaGlzIHNlZW1zIHRvIGJlIHRoZSBwcmltYXJ5IHdheSB0byBjYXRjaCBpdCBiZWNhdXNlIEtBU0FOIGRvZXNuJ3QgdHJhY2sgdW5pbml0aWFsaXplZCBtZW1vcnksIGFuZCB0aGVyZSdzIG5vIGFjdHVhbCBvdXQtb2YtYm91bmRzIGFjY2Vzcy5cblxuVGhlIGNvbnNlcXVlbmNlcyBjb3VsZCBiZSBpbnRlcmVzdGluZy4gSWYgYGV0aC1cdTAwM2VoX3Byb3RvYCBpcyB1bmluaXRpYWxpemVkLCB0aGUgcGFja2V0IG1pZ2h0IGdldCByb3V0ZWQgdG8gYSByYW5kb20gcHJvdG9jb2wgaGFuZGxlciwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBwYWNrZXQgZHJvcHMgYnkgaGFuZGxlcnMgc3VjaCBhcyBJUHY0IHRoYXQgY2hlY2sgYHBza2JfbWF5X3B1bGxgLiBUaGUgcGFja2V0IGNvdWxkIGJlIGRyb3BwZWQgZHVlIHRvIGFuIGludmFsaWQgaGVhZGVyIGxlbmd0aC4gTm8gbWVtb3J5IGNvcnJ1cHRpb24sIGp1c3QgYSByZWFkIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBidXQgb25seSBLTVNBTiBjYW4gY2F0Y2ggdGhpcy5cblxuTm93LCBsZXQncyByZXZpc2l0IHRoZSBgQlVHX09OYCBzY2VuYXJpby4gSXQncyB0cmlnZ2VyZWQgd2hlbiBgc2tiLVx1MDAzZWxlbiBcdTAwM2U9IEVUSF9ITEVOYCBidXQgYHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOYC4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBhIE1BQyBoZWFkZXIgaXMgc3BsaXQgYWNyb3NzIHRoZSBsaW5lYXIgcGFydCBhbmQgdGhlIGZyYWdtZW50cyBvZiB0aGUgcGFja2V0LiBTeXprYWxsZXIgY2F0Y2hlcyB0aGlzLiBCdXQgaWYgYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYCwgdGhlbiB0aGUgYEJVR19PTmAgaXMgYXZvaWRlZCwgZXhwb3NpbmcgdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBUaGUgcHJvcG9zZWQgcGF0Y2ggbWl0aWdhdGVzICpib3RoKiBjYXNlcyBieSBjaGVja2luZyBpZiBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU5gLCBlZmZlY3RpdmVseSBwcmV2ZW50aW5nIGJvdGggdGhlIGBCVUdfT05gIGFuZCB0aGUgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZC5cblxuSWYgc3RhbmRhcmQgZnV6emluZyBmb3VuZCB0aGUgaXNzdWUgdmlhIGBCVUdfT05gLCB0aGF0IG1lYW5zIHdlIGRvbid0IG5lY2Vzc2FyaWx5IG5lZWQgS01TQU4uIFdhaXQhIElzIHRoYXQgcmlnaHQ/XG5cblRoZSBwYXRjaCBpdHNlbGYgaW5kaWNhdGVzIHRoaXM6IGBpZiAodW5saWtlbHkoc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2MgRVRIX0hMRU4pKWAuIFRoaXMgd2lsbCB3YXJuLCBhbmQgcmV0dXJuIHplcm8uXG5cblNvLCBpZiBzeXprYWxsZXIgZm91bmQgaXQgYXMgYSBgQlVHX09OYCwgaXQgd291bGQgYmUgcmVwb3J0ZWQgbGlrZSBga2VybmVsIEJVRyBhdCBpbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjI4NDchYCwgd2hpY2ggaXMgaW4gYF9fc2tiX3B1bGxgLiBCdXQgdGhhdCBgQlVHX09OYCBpcyBvbmx5IHRyaWdnZXJlZCBpZiBgc2tiLVx1MDAzZWxlbiBcdTAwM2U9IEVUSF9ITEVOYCBhbmQgYHNrYl9oZWFkbGVuKHNrYikgXHUwMDNjIEVUSF9ITEVOYC4gQ2FuIGEgZGV2aWNlIHJlYWxpc3RpY2FsbHkgKnJlY2VpdmUqIHN1Y2ggYSBwYWNrZXQgYmVmb3JlIGBldGhfdHlwZV90cmFuc2A/XG5cblVzdWFsbHksIGRldmljZXMgcmVjZWl2ZSB0aGUgTUFDIGhlYWRlciBpbiB0aGUgbGluZWFyIHBhcnQuIEhvd2V2ZXIsIGEgdmlydHVhbCBkZXZpY2UgbGlrZSB0dW4vdGFwIG9yIHNvbWUgb3RoZXIgdmlydHVhbCBkZXZpY2UgKmNvdWxkKiBpbmplY3QgYSBwYWNrZXQgd2l0aCBhIHNob3J0IGxpbmVhciBwYXJ0IGFuZCBmcmFnbWVudHMsIHRodXMgdHJpZ2dlcmluZyB0aGUgYEJVR19PTmAuXG5cbkNvbnZlcnNlbHksIGlmIGEgZGV2aWNlIGluamVjdHMgYSBwYWNrZXQgd2l0aCBgc2tiLVx1MDAzZWxlbiBcdTAwM2MgRVRIX0hMRU5gIGFuZCBubyBmcmFnbWVudHMsIGl0ICp3b24ndCogdHJpZ2dlciB0aGUgYEJVR19PTmAsIGJ1dCBpdCAqd2lsbCogdHJpZ2dlclxuXG4iLCJJbnB1dFRva2VucyI6MTM1NTQsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjk5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDE6MjQuMzg2OTY4NDIxWiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MTk2MDEyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJldGhfdHlwZV90cmFuc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL25ldC90dW4uY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC90dW4uYz0xNjk1PXN0YXRpYyBzc2l6ZV90IHR1bl9nZXRfdXNlcihzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLCBzdHJ1Y3QgdHVuX2ZpbGUgKnRmaWxlLFxcbi0tXFxuZHJpdmVycy9uZXQvdHVuLmMtMTg0OS1cXHRcXHR9XFxuZHJpdmVycy9uZXQvdHVuLmM6MTg1MDpcXHRcXHRza2ItXFx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tXFx1MDAzZWRldik7XFxuZHJpdmVycy9uZXQvdHVuLmMtMTg1MS1cXHRcXHRicmVhaztcXG4tLVxcbmRyaXZlcnMvbmV0L3R1bi5jPTIzODM9c3RhdGljIGludCB0dW5feGRwX29uZShzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLFxcbi0tXFxuZHJpdmVycy9uZXQvdHVuLmMtMjQ3MS1cXG5kcml2ZXJzL25ldC90dW4uYzoyNDcyOlxcdHNrYi1cXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi1cXHUwMDNlZGV2KTtcXG5kcml2ZXJzL25ldC90dW4uYy0yNDczLVxcdHNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMToyNC40NDg5MzM3MDlaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDE2NTI0OTU0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoYXQga2VybmVsIGNvZGU6XG5cbioqQ2hlY2tpbmcgYHR1bl9nZXRfdXNlcmAgZm9yIE1pbmltdW0gRnJhbWUgU2l6ZSBWaW9sYXRpb25zKipcblxuQWxyaWdodCwgSSBuZWVkIHRvIHZlcmlmeSBob3cgYHR1bl9nZXRfdXNlcmAgaW4gYGRyaXZlcnMvbmV0L3R1bi5jYCBoYW5kbGVzIHBhY2tldHMgd2l0aCBsZW5ndGhzIHNob3J0ZXIgdGhhbiB0aGUgc3RhbmRhcmQgRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAoYEVUSF9ITEVOYCkuIEkga25vdyB0aGF0IEV0aGVybmV0IGZyYW1lcyAqbXVzdCogaGF2ZSBhIG1pbmltdW0gc2l6ZSwgYW5kIGlmIHdlJ3JlIHNlZWluZyBhbiBpc3N1ZSwgaXQncyBwb3NzaWJsZSB0aGF0IGB0dW5fZ2V0X3VzZXJgIGlzIGFsbG93aW5nIG9yIG1pc2ludGVycHJldGluZyBzaG9ydCBmcmFtZXMgY29taW5nIGZyb20gdXNlcnNwYWNlLiBJJ2xsIG5lZWQgdG8gbG9vayBjYXJlZnVsbHkgYXQgaG93IHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGJ1ZmZlciBzaXplcywgY29waWVzIGRhdGEsIGFuZCBwZXJmb3JtcyBhbnkgbGVuZ3RoIGNoZWNrcy4gU3BlY2lmaWNhbGx5LCBJJ2xsIGJlIGxvb2tpbmcgZm9yIGNvbXBhcmlzb25zIGFnYWluc3QgYEVUSF9ITEVOYCBvciBvdGhlciBzaXplIGNvbnN0cmFpbnRzLiBJdCdzIGFsc28gaW1wb3J0YW50IHRvIGNvbnNpZGVyIGlmIGFueSBvdGhlciBsYXllcnMgYXJlIHJlbGllZCBvbiB0byBoYW5kbGUgdGhlIHNpemUgY29uc3RyYWludHMuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBubyBleHBsb2l0YWJsZSBjb25kaXRpb24gZXhpc3RzIGR1ZSB0byBhbiB1bmRlcnNpemVkIGZyYW1lIGJlaW5nIHBhc3NlZCB0aHJvdWdoLiBNeSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiBhIHZ1bG5lcmFiaWxpdHkgZXhpc3RzIG9yIG5vdCwgYW5kIGhvdyBpdCBjYW4gYmUgbWl0aWdhdGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjUzNywiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjI4LjYxNDE4NTQ4NVoiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzIxNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy9uZXQvdHVuLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTg0MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTg0MDpcXHRcXHRcXHRza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpO1xcbjE4NDE6XFx0XFx0XFx0c2tiLVxcdTAwM2Vwcm90b2NvbCA9IHBpLnByb3RvO1xcbjE4NDI6XFx0XFx0XFx0c2tiLVxcdTAwM2VkZXYgPSB0dW4tXFx1MDAzZWRldjtcXG4xODQzOlxcdFxcdFxcdGJyZWFrO1xcbjE4NDQ6XFx0XFx0Y2FzZSBJRkZfVEFQOlxcbjE4NDU6XFx0XFx0XFx0aWYgKGZyYWdzIFxcdTAwMjZcXHUwMDI2ICFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0hMRU4pKSB7XFxuMTg0NjpcXHRcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbjE4NDc6XFx0XFx0XFx0XFx0ZHJvcF9yZWFzb24gPSBTS0JfRFJPUF9SRUFTT05fSERSX1RSVU5DO1xcbjE4NDg6XFx0XFx0XFx0XFx0Z290byBkcm9wO1xcbjE4NDk6XFx0XFx0XFx0fVxcbjE4NTA6XFx0XFx0XFx0c2tiLVxcdTAwM2Vwcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgdHVuLVxcdTAwM2VkZXYpO1xcbjE4NTE6XFx0XFx0XFx0YnJlYWs7XFxuMTg1MjpcXHRcXHR9XFxuMTg1MzpcXHRcXG4xODU0OlxcdFxcdC8qIGNvcHkgc2tiX3VidWZfaW5mbyBmb3IgY2FsbGJhY2sgd2hlbiBza2IgaGFzIG5vIGVycm9yICovXFxuMTg1NTpcXHRcXHRpZiAoemVyb2NvcHkpIHtcXG4xODU2OlxcdFxcdFxcdHNrYl96Y29weV9pbml0KHNrYiwgbXNnX2NvbnRyb2wpO1xcbjE4NTc6XFx0XFx0fSBlbHNlIGlmIChtc2dfY29udHJvbCkge1xcbjE4NTg6XFx0XFx0XFx0c3RydWN0IHVidWZfaW5mbyAqdWFyZyA9IG1zZ19jb250cm9sO1xcbjE4NTk6XFx0XFx0XFx0dWFyZy1cXHUwMDNlb3BzLVxcdTAwM2Vjb21wbGV0ZShOVUxMLCB1YXJnLCBmYWxzZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjI4LjYxNDMxODg0NVoiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4OTU5OTkyOTc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlZ1bG5lcmFiaWxpdHkgRGlzY292ZXJlZCBpbiBgdHVuX2dldF91c2VyYCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gSSdtIGxvb2tpbmcgYXQgYHR1bl9nZXRfdXNlcmAgYW5kIHNwZWNpZmljYWxseSB0aGlzIHNlY3Rpb246XG5cbmBgYGNcblx0XHRjYXNlIElGRl9UQVA6XG5cdFx0XHRpZiAoZnJhZ3MgXHUwMDI2XHUwMDI2ICFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0hMRU4pKSB7XG5cdFx0XHRcdGVyciA9IC1FTk9NRU07XG5cdFx0XHRcdGRyb3BfcmVhc29uID0gU0tCX0RST1BfUkVBU09OX0hEUl9UUlVOQztcblx0XHRcdFx0Z290byBkcm9wO1xuXHRcdFx0fVxuXHRcdFx0c2tiLVx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tXHUwMDNlZGV2KTtcblx0XHRcdGJyZWFrO1xuYGBgXG5cbkludGVyZXN0aW5nLiBJdCBhcHBlYXJzIHRoYXQgdGhlIGBwc2tiX21heV9wdWxsYCBjaGVjayBpcyAqb25seSogcGVyZm9ybWVkIGlmIHRoZSBgZnJhZ3NgIGZsYWcgaXMgc2V0LiBUaGF0IG1lYW5zLCBpZiBgZnJhZ3NgIGlzIGZhbHNlLCBhbmQgd2UncmUgZGVhbGluZyB3aXRoIGEgbGluZWFyIHNrYiAobWVhbmluZyBubyBmcmFnbWVudGF0aW9uKSwgdGhlcmUncyAqbm8qIGxlbmd0aCBjaGVjayBhZ2FpbnN0IGBFVEhfSExFTmAgKHdoaWNoIGlzIDE0IGJ5dGVzKSBmb3IgdGhlIGluY29taW5nIHBhY2tldC5cblxuU28sIGlmIGEgbWFsaWNpb3VzIHVzZXIgaW5qZWN0cyBhICpsaW5lYXIqIHBhY2tldCB3aXRoIGEgbGVuZ3RoIG9mIGxlc3MgdGhhbiAxNCBieXRlcyBpbnRvIHRoZSBUQVAgaW50ZXJmYWNlLCB0aGUgY29kZSB3aWxsIGhhcHBpbHkgY29udGludWUgYW5kIGNhbGwgYGV0aF90eXBlX3RyYW5zYC4gVGhlIGNyaXRpY2FsIGlzc3VlIGhlcmUgaXMgdGhhdCBzaW5jZSBgc2tiLVx1MDAzZWxlbmAgYW5kIGBza2JfaGVhZGxlbihza2IpYCBhcmUgYm90aCBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgdGhlIGBldGhfdHlwZV90cmFuc2AgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIHJlYWQgYmV5b25kIHRoZSBwcm92aWRlZCBkYXRhIGluIHRoZSBza2IuXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMsIHdpbGwgdGhpcyB0cmlnZ2VyIGEgYEJVR19PTmAgaW4gYHNrYl9wdWxsX2lubGluZWA/IE5vLCBiZWNhdXNlIGBza2JfcHVsbF9pbmxpbmVgIHJldHVybnMgTlVMTCBpZiB5b3UgdHJ5IHRvIHB1bGwgbW9yZSBkYXRhIHRoYW4gYXZhaWxhYmxlIHdoaWNoIHByb3RlY3RzIHRoZSBjb2RlIGZyb20gdGhlIGJ1Zy5cblxuSSB0aGVuIHJlYWxpemVkIHRoYXQgYGV0aF9za2JfcHVsbF9tYWNgIHNpbXBseSByZXR1cm5zIGBza2ItXHUwMDNlZGF0YWAgYW5kIHRoZW4gYGV0aF90eXBlX3RyYW5zYCBhdHRlbXB0cyB0byByZWFkIGBldGgtXHUwMDNlaF9wcm90b2Agd2hpY2ggaXMgdW5pbml0aWFsaXplZCFcblxuQ291bGQgS0FTQU4gY2F0Y2ggdGhpcz8gSSBpbml0aWFsbHkgdGhvdWdodCwgcHJvYmFibHkgbm90LiBUaGUgbGluZWFyIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgYHR1bl9nZXRfdXNlcmAgaXMgdXN1YWxseSBxdWl0ZSBsYXJnZSDigJMgYSBmZXcgaHVuZHJlZCBieXRlcyBhdCBsZWFzdCwgb3IgbWF5YmUgYSBmdWxsIHBhZ2UuIFNvLCBldmVuIGlmIHRoZSB1c2VyIHByb3ZpZGVzIGxlc3MgdGhhbiAxNCBieXRlcywgdGhlIFwiZXh0cmFcIiBieXRlcyB3ZSBhcmUgcmVhZGluZyB3b3VsZCBsaWtlbHkgYmUgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuIEknZCBleHBlY3QgYW55IHJlYWQgYXQgb2Zmc2V0IDEyIHRvIGJlIHdpdGhpbiB0aGUgYnVmZmVyLlxuXG5Ib3dldmVyLCBhZnRlciBhIHNlY29uZCBwYXNzLCBJIHRoaW5rIEtNU0FOIG1pZ2h0IGNhdGNoIHRoaXMhIFRoZSB1c2VyIG9ubHkgcHJvdmlkZWQgYSBzbWFsbCBhbW91bnQgb2YgZGF0YSAobGVzcyB0aGFuIDE0IGJ5dGVzKS4gVGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciBpcyB1bmluaXRpYWxpemVkLiBXZSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciBgdHVuX2FsbG9jX3NrYmAgemVyb2VzIHRoZSBidWZmZXIgKHdoaWNoIHdvdWxkIG1ha2UgdGhpcyBhIHJlYWQgb2YgemVyb2VzIHJhdGhlciB0aGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5KSBidXQgZWl0aGVyIHdheSwgc2luY2UgdGhlIHByb3ZpZGVkIGRhdGEgaXNuJ3QgZW5vdWdoLCB3ZSBhcmUgcmVhZGluZyBvdXQtb2YtYm91bmRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzE4MSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjM3LjU3NDMxNjA2OVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTM1OTkyODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHVuX2FsbG9jX3NrYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL25ldC90dW4uY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC90dW4uYz0xMzkyPXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdHVuX25hcGlfYWxsb2NfZnJhZ3Moc3RydWN0IHR1bl9maWxlICp0ZmlsZSxcXG4tLVxcbmRyaXZlcnMvbmV0L3R1bi5jLTE0NDgtICogbGluZWFyIGlzIGEgaGludCBhcyB0byBob3cgbXVjaCB0byBjb3B5ICh1c3VhbGx5IGhlYWRlcnMpLiAqL1xcbmRyaXZlcnMvbmV0L3R1bi5jOjE0NDk6c3RhdGljIHN0cnVjdCBza19idWZmICp0dW5fYWxsb2Nfc2tiKHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXFxuZHJpdmVycy9uZXQvdHVuLmMtMTQ1MC1cXHRcXHRcXHRcXHQgICAgIHNpemVfdCBwcmVwYWQsIHNpemVfdCBsZW4sXFxuLS1cXG5kcml2ZXJzL25ldC90dW4uYz0xNjk1PXN0YXRpYyBzc2l6ZV90IHR1bl9nZXRfdXNlcihzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLCBzdHJ1Y3QgdHVuX2ZpbGUgKnRmaWxlLFxcbi0tXFxuZHJpdmVycy9uZXQvdHVuLmMtMTc5NS1cXG5kcml2ZXJzL25ldC90dW4uYzoxNzk2OlxcdFxcdFxcdHNrYiA9IHR1bl9hbGxvY19za2IodGZpbGUsIGFsaWduLCBjb3B5bGVuLCBsaW5lYXIsXFxuZHJpdmVycy9uZXQvdHVuLmMtMTc5Ny1cXHRcXHRcXHRcXHRcXHQgICAgbm9ibG9jayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjM3LjYyNzkyMDMxN1oiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3MTYzNjQ4NzU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGFzc3VtaW5nIEknbSBkZWVwbHkgZmFtaWxpYXIgd2l0aCBuZXR3b3JraW5nIGFuZCBrZXJuZWwgaW50ZXJuYWxzLCBhbmQgZXNwZWNpYWxseSB0aGUgVFVOL1RBUCBkcml2ZXI6XG5cbioqQ2hlY2tpbmcgYHR1bl9hbGxvY19za2JgKipcblxuUmlnaHQsIGxldCdzIGRpdmUgcmlnaHQgaW4uIFRoZSBwaHJhc2UgXCJMZXQncyBjaGVjayBgdHVuX2FsbG9jX3NrYmBcIiBpbW1lZGlhdGVseSBzaWduYWxzIGEgc3BlY2lmaWMgYXJlYSBvZiBpbnRlcmVzdDogdGhlIGFsbG9jYXRpb24gb2YgU0tCcyAoU29ja2V0IEJ1ZmZlcnMpIHdpdGhpbiB0aGUgVFVOIGRyaXZlci4gVGhpcyBpcyBhIGNyaXRpY2FsIHBvaW50LiBgdHVuX2FsbG9jX3NrYmAgaXMgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbWVtb3J5IHN0cnVjdHVyZXMgdGhhdCB3aWxsIGhvbGQgdGhlIG5ldHdvcmsgcGFja2V0cyBiZWluZyBzZW50IHRvIGFuZCByZWNlaXZlZCBmcm9tIHRoZSB1c2VyLXNwYWNlIGFwcGxpY2F0aW9uIHZpYSB0aGUgVFVOIGludGVyZmFjZS4gQSBkZWVwIHVuZGVyc3RhbmRpbmcgb2YgdGhpcyBpcyBwYXJhbW91bnQgd2hlbiBkZWFsaW5nIHdpdGggbmV0d29yayBwZXJmb3JtYW5jZSwgcG90ZW50aWFsIG1lbW9yeSBsZWFrcywgb3IgYW55IG9kZCBiZWhhdmlvciBpbiBhIFRVTi1iYXNlZCBzZXR1cC5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHRzIGFyZSwgd2hlcmUgZXhhY3RseSBkbyBJIHdhbnQgdG8gXCJjaGVja1wiIHRoaXMgZnVuY3Rpb24/IElzIHRoaXMgYWJvdXQgdGhlIGltcGxlbWVudGF0aW9uIGl0c2VsZj8gUGVyaGFwcyBJJ20gbG9va2luZyBhdCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgd2l0aGluIHRoYXQgZnVuY3Rpb24uIEFyZSB0aGVyZSBhbnkgY29udGVudGlvbiBpc3N1ZXM/IERvIEkgd2FudCB0byBjaGVjayBpdHMgaW50ZXJhY3Rpb24gd2l0aCBvdGhlciBrZXJuZWwgY29tcG9uZW50cyBzdWNoIGFzIERNQSBvciBOVU1BPyBJcyB0aGVyZSBhIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWd5IEkgc2hvdWxkIGV4YW1pbmUgY2xvc2VseSBmb3IgcG9zc2libGUgaW1wcm92ZW1lbnRzIG9yIG1pc2NvbmZpZ3VyYXRpb25zP1xuXG5JIHByb2JhYmx5IGhhdmUgYSBzcGVjaWZpYyBjb25jZXJuIGluIG1pbmQuIElzIHRoZXJlIGEgcGVyZm9ybWFuY2UgcHJvYmxlbSB3aXRoIGEgcGFydGljdWxhciB3b3JrbG9hZD8gQXJlIHBhY2tldHMgYmVpbmcgZHJvcHBlZD8gQXJlIHRoZXJlIGFueSByZXBvcnRzIG9mIG1lbW9yeSBsZWFrcz8gSXMgaXQgYWJvdXQgb3ZlcmFsbCB0aHJvdWdocHV0LCBsYXRlbmN5LCBvciBzcGVjaWZpYyBlcnJvciBtZXNzYWdlcyByZWxhdGVkIHRvIGJ1ZmZlciBhbGxvY2F0aW9uPyBUaGUgY29udGV4dCBvZiB0aGUgY2hlY2sgd291bGQgaW5mbHVlbmNlIHdoZXJlIHRvIGJlZ2luIHRoZSBpbnNwZWN0aW9uLiBJJ2QgbmVlZCB0byBjb25zaWRlciB0aGUgc3lzdGVtJ3MgaGFyZHdhcmUgY29uZmlndXJhdGlvbiwgdGhlIHVzZXItc3BhY2UgYXBwbGljYXRpb24sIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgZmFjdG9ycyB0byBmb3JtdWxhdGUgYSB1c2VmdWwgaHlwb3RoZXNpcyBhYm91dCBgdHVuX2FsbG9jX3NrYmAuXG5cblVsdGltYXRlbHksIGl0IHdvdWxkIGRlcGVuZCBvbiB3aGVyZSBJIHdvdWxkIGxpa2UgdG8gbG9vaywgYmUgaXQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWd5LCBidWZmZXIgYWxpZ25tZW50IGlzc3Vlcywgb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gZGF0YSBzdHJ1Y3R1cmVzLiBXaGF0ZXZlciB0aGUgY29uY2VybiwgYHR1bl9hbGxvY19za2JgIGlzIHRoZSBwbGFjZSB0byBzdGFydC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg1MTUsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMTo0NC43OTE1NzI1MjVaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE5MTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvbmV0L3R1bi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE0NDksXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE0NDk6XFx0c3RhdGljIHN0cnVjdCBza19idWZmICp0dW5fYWxsb2Nfc2tiKHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXFxuMTQ1MDpcXHRcXHRcXHRcXHRcXHQgICAgIHNpemVfdCBwcmVwYWQsIHNpemVfdCBsZW4sXFxuMTQ1MTpcXHRcXHRcXHRcXHRcXHQgICAgIHNpemVfdCBsaW5lYXIsIGludCBub2Jsb2NrKVxcbjE0NTI6XFx0e1xcbjE0NTM6XFx0XFx0c3RydWN0IHNvY2sgKnNrID0gdGZpbGUtXFx1MDAzZXNvY2tldC5zaztcXG4xNDU0OlxcdFxcdHN0cnVjdCBza19idWZmICpza2I7XFxuMTQ1NTpcXHRcXHRpbnQgZXJyO1xcbjE0NTY6XFx0XFxuMTQ1NzpcXHRcXHQvKiBVbmRlciBhIHBhZ2U/ICBEb24ndCBib3RoZXIgd2l0aCBwYWdlZCBza2IuICovXFxuMTQ1ODpcXHRcXHRpZiAocHJlcGFkICsgbGVuIFxcdTAwM2MgUEFHRV9TSVpFKVxcbjE0NTk6XFx0XFx0XFx0bGluZWFyID0gbGVuO1xcbjE0NjA6XFx0XFxuMTQ2MTpcXHRcXHRpZiAobGVuIC0gbGluZWFyIFxcdTAwM2UgTUFYX1NLQl9GUkFHUyAqIChQQUdFX1NJWkUgXFx1MDAzY1xcdTAwM2MgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpKVxcbjE0NjI6XFx0XFx0XFx0bGluZWFyID0gbGVuIC0gTUFYX1NLQl9GUkFHUyAqIChQQUdFX1NJWkUgXFx1MDAzY1xcdTAwM2MgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpO1xcbjE0NjM6XFx0XFx0c2tiID0gc29ja19hbGxvY19zZW5kX3Bza2Ioc2ssIHByZXBhZCArIGxpbmVhciwgbGVuIC0gbGluZWFyLCBub2Jsb2NrLFxcbjE0NjQ6XFx0XFx0XFx0XFx0XFx0ICAgXFx1MDAyNmVyciwgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpO1xcbjE0NjU6XFx0XFx0aWYgKCFza2IpXFxuMTQ2NjpcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xcbjE0Njc6XFx0XFxuMTQ2ODpcXHRcXHRza2JfcmVzZXJ2ZShza2IsIHByZXBhZCk7XFxuMTQ2OTpcXHRcXHRza2JfcHV0KHNrYiwgbGluZWFyKTtcXG4xNDcwOlxcdFxcdHNrYi1cXHUwMDNlZGF0YV9sZW4gPSBsZW4gLSBsaW5lYXI7XFxuMTQ3MTpcXHRcXHRza2ItXFx1MDAzZWxlbiArPSBsZW4gLSBsaW5lYXI7XFxuMTQ3MjpcXHRcXG4xNDczOlxcdFxcdHJldHVybiBza2I7XFxuMTQ3NDpcXHR9XFxuMTQ3NTpcXHRcXG4xNDc2OlxcdHN0YXRpYyB2b2lkIHR1bl9yeF9iYXRjaGVkKHN0cnVjdCB0dW5fc3RydWN0ICp0dW4sIHN0cnVjdCB0dW5fZmlsZSAqdGZpbGUsXFxuMTQ3NzpcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbW9yZSlcXG4xNDc4OlxcdHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDE6NDQuNzkxODE5NzA1WiIsIlNlcSI6NDEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgyMDY0MTQ1NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIEtNU0FOIEJ1ZyoqXG5cbk9rYXksIHNvIGhlcmUncyB3aGF0IEknbSB0aGlua2luZy4gVGhpcyBgc29ja19hbGxvY19zZW5kX3Bza2JgIGZ1bmN0aW9uIGlzIGFsbG9jYXRpbmcgdGhlIHNvY2tldCBidWZmZXIgKHNrYiksIGJ1dCBpdCAqZG9lc24ndCogemVybyBvdXQgdGhlIGRhdGEgYnVmZmVyLiBUaGF0IG1lYW5zIGV2ZXJ5dGhpbmcgYmV5b25kIHRoZSBpbml0aWFsICdsaW5lYXInIGRhdGEsIHdoaWNoIGlzIG91ciAnbGVuJywgaXMganVzdCB1bmluaXRpYWxpemVkIG1lbW9yeS4gTm93LCBgdHVuX2dldF91c2VyYCB0aGVuIGNvcGllcyAnbGVuJyBieXRlcyBmcm9tIHVzZXIgc3BhY2UgaW50byB0aGlzIGJ1ZmZlci4gVGhlIGJ5dGVzIGJleW9uZCAnbGVuJyAqcmVtYWluKiB1bmluaXRpYWxpemVkLiBUaGF0J3MgdGhlIGtleS5cblxuVGhlbiwgd2UgaGF2ZSBgZXRoX3R5cGVfdHJhbnNgIHJlYWRpbmcgYGV0aC1cdTAwM2VoX3Byb3RvYCBhdCBvZmZzZXQgMTIuIElmIG91ciAnbGVuJyBpcyBsZXNzIHRoYW4gMTQgYnl0ZXMsIGl0J3MgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSEgVGhpcyAqc2NyZWFtcyogS01TQU4gYnVnLCBhIGNsYXNzaWMgb25lLlxuXG5XYWl0LCBkaWQgc3l6a2FsbGVyIGFjdHVhbGx5IGZpbmQgdGhpcyBvbmUgd2l0aCBLQVNBTj8gSWYgS0FTQU4gaXNuJ3QgY2F0Y2hpbmcgaXQsIGFuZCB0aGF0IGBCVUdfT05gIGlzbid0IGZpcmluZywgdGhlbiB0aGUgb25seSB3YXkgc3l6a2FsbGVyIHdvdWxkIGhhdmUgZm91bmQgaXQgd291bGQgYmUgdGhyb3VnaCBLTVNBTi4gVGhhdCdzIGludGVyZXN0aW5nLlxuXG5Ob3csIHdhaXQsIHdoYXQgaWYgYGZyYWdzYCBpcyB0cnVlPyBJZiBgZnJhZ3NgIGlzIHRydWUsIHRoZW4gYHR1bl9nZXRfdXNlcmAgY2FsbHMgYHBza2JfbWF5X3B1bGwoc2tiLCBFVEhfSExFTilgLiBJZiB0aGF0IGZhaWxzLCB0aGUgcGFja2V0IGdldHMgZHJvcHBlZCwgbm8gaGFybS4gSWYgaXQgKnN1Y2NlZWRzKiwgd2Uga25vdyB0aGF0IGBza2ItXHUwMDNlbGVuIFx1MDAzZT0gRVRIX0hMRU5gIGFuZCBgc2tiX2hlYWRsZW4oc2tiKSBcdTAwM2U9IEVUSF9ITEVOYC4gU28sIGV2ZW4gaWYgYGZyYWdzYCBpcyB0cnVlLCB0aGUgYEJVR19PTmAgaXNuJ3QgdHJpZ2dlcmVkIGluIGB0dW5fZ2V0X3VzZXJgIVxuXG5XYWl0LCB3YWl0LiBJZiBgZnJhZ3NgIGlzIHRydWUsIGBwc2tiX21heV9wdWxsYCBlbnN1cmVzIGBza2JfaGVhZGxlbihza2IpIFx1MDAzZT0gRVRIX0hMRU5gLiBUaGF0J3MgdGhlIHJlYWwgcG9pbnQuIFNvIGBCVUdfT05gIGlzIG5ldmVyIHRyaWdnZXJlZCBmcm9tIGB0dW5fZ2V0X3VzZXJgLlxuXG5Pa2F5LCBpcyB0aGVyZSBhbm90aGVyIGNhbGxlciBvZiBgZXRoX3R5cGVfdHJhbnNgIHRoYXQgY291bGQgYmUgdHJpZ2dlcmVkIHRoaXMgd2F5PyBXaGF0IGFib3V0IGBwYWNrZXRfc25kYCBpbiBgbmV0L3BhY2tldC9hZl9wYWNrZXQuY2A/IFRoYXQgc2VlbXMgbGlrZSBhIGxvZ2ljYWwgbmV4dCBzdGVwIHRvIGV4YW1pbmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NDcyLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzkzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDE6NTIuOTk4MjM3NTMxWiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDA3NDY0ODcsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV0aF90eXBlX3RyYW5zXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9wYWNrZXQvYWZfcGFja2V0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAxOjUzLjA5ODk5MzQ3OFoiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NTM4MzQ0ODY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBzZWUuIE15IG1pbmQgaXMganVtcGluZyBhcm91bmQgYSBiaXQgaGVyZSwgdHJ5aW5nIHRvIHBpZWNlIHRoaXMgdG9nZXRoZXIuLi5cblxuKipJbnZlc3RpZ2F0aW5nIFBhY2tldCBSZWNlcHRpb24gRmxvdyoqXG5cbkhvbGQgb24gYSBzZWNvbmQuLi4gSSB3YXMgdW5kZXIgdGhlIGltcHJlc3Npb24gdGhhdCBgcGFja2V0X3NuZGAgd2FzIHRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGZvciBvdXRib3VuZCBwYWNrZXQgcHJvY2Vzc2luZywgYnV0IG5vdyBpdCBvY2N1cnMgdG8gbWUgdGhhdCBpdCAqKmRvZXNuJ3QqKiBhY3R1YWxseSBjYWxsIGBldGhfdHlwZV90cmFuc2AgZGlyZWN0bHksIHdoaWNoIGlzIHdoZXJlIHRoZSBFdGhlcm5ldCB0eXBlIGRldGVybWluYXRpb24gdXN1YWxseSBoYXBwZW5zLiBUaGF0J3MgYSBrZXkgcGllY2UgbWlzc2luZyBmcm9tIG15IG1lbnRhbCBtb2RlbCEgV2hlcmUgKmRvZXMqIHRoYXQgaGFwcGVuIGluIHRoZSB0eXBpY2FsIHBhdGg/XG5cbkFscmlnaHQsIGxldCdzIGJhY2sgdXAgYW5kIHJldGhpbmsgdGhpcy4gTWF5YmUgaXQncyBub3QgdGhlIHRyYW5zbWlzc2lvbiBzaWRlIEkgbmVlZCB0byBmb2N1cyBvbiByaWdodCBub3cuIFBlcmhhcHMgbXkgYXR0ZW50aW9uIHNob3VsZCBzaGlmdCB0byB0aGUgdmlydHVhbCBuZXR3b3JrIGRldmljZSBzaWRlIGZvciByZWNlcHRpb24uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB3aGF0IGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGluY29taW5nIHBhY2tldCBwcm9jZXNzaW5nLiBJJ20gZ29pbmcgdG8gbG9vayBhdCBgZHJpdmVycy9uZXQvdmlydGlvX25ldC5jYCwgc3BlY2lmaWNhbGx5IGB2aXJ0bmV0X3JlY2VpdmVgLiBJdCBmZWVscyBsaWtlIHRoYXQncyB0aGUgbW9yZSByZWxldmFudCBhcmVhIGdpdmVuIHRoZSBmbG93IG9mIHRyYWZmaWMgSSdtIGV4cGVjdGluZy4gSG9wZWZ1bGx5LCBgdmlydG5ldF9yZWNlaXZlYCBpcyB3aGVyZSB0aGUgcGFja2V0IHR5cGUgaXMgZGV0ZXJtaW5lZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAzOTQsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMTo1Ny42MzczNDE2MDNaIiwiU2VxIjo0NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY4OTQ4NzA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV0aF90eXBlX3RyYW5zXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjAzMD1zdGF0aWMgdm9pZCBtZXJnZWFibGVfYnVmX2ZyZWUoc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLCBpbnQgbnVtX2J1ZixcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMDU2LSAqICAyLiB4ZHBfYnVpbGRfc2tiX2Zyb21fZnJhbWUoKSBkb2VzIG1vcmUgY2hlY2tzIHRoYXQgd2UgZG9uJ3QgbmVlZCxcXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM6MjA1NzogKiAgICAgbGlrZSBldGhfdHlwZV90cmFucygpICh3aGljaCB2aXJ0aW8tbmV0IGRvZXMgaW4gcmVjZWl2ZV9idWYoKSkuXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTIwNTgtICovXFxuLS1cXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM9MjUwMD1zdGF0aWMgdm9pZCB2aXJ0bmV0X3JlY2VpdmVfZG9uZShzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSwgc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLFxcbi0tXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTI1MjgtXFx0c2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHZxMnJ4cShycS1cXHUwMDNldnEpKTtcXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM6MjUyOTpcXHRza2ItXFx1MDAzZXByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpO1xcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNTMwLVxcdHByX2RlYnVnKFxcXCJSZWNlaXZpbmcgc2tiIHByb3RvIDB4JTA0eCBsZW4gJWkgdHlwZSAlaVxcXFxuXFxcIixcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDE6NTcuNzA2Mjk2NjUxWiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5MzYyODI5NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZTpcblxuKipDaGVja2luZyB0aGUgRm91bmRhdGlvbjogUmVjZWl2ZSBDb21wbGV0aW9uIEluZGljYXRvcnMqKlxuXG5SaWdodCwgYmVmb3JlIGRpdmluZyBkZWVwZXIsIEkgbmVlZCB0byBtYWtlIHN1cmUgSSdtIGdyb3VuZGVkLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIHRoZSBmdW5kYW1lbnRhbCBpbmRpY2F0b3JzIG9mIHJlY2VpdmUgY29tcGxldGlvbi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gY2hlY2sgdHdvIGNyaXRpY2FsIGVsZW1lbnRzIHRoYXQgbGlrZWx5IHNpZ25hbCB3aGV0aGVyIGEgcmVjZWl2ZSBvcGVyYXRpb24gaGFzIGZpbmFsaXplZC4gVGhpcyBjb3VsZCBiZSBjaGVja2luZyB0aGUgc3RhdGUgb2YgYSBkYXRhIGJ1ZmZlciAoYHJlY2VpdmVfYnVmYCkgaXRzZWxmLiBPciBhIGRlZGljYXRlZCBmbGFnIG9yIHZhcmlhYmxlIGluZGljYXRpbmcgdGhhdCBhIHJlY2VwdGlvbiBpcyBgdmlydG5ldF9yZWNlaXZlX2RvbmVgLiBFc3NlbnRpYWxseSBJIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGlmIHRoZSByZWNlaXZlciBpcyBmaW5pc2hlZCBmb3IgYSBuZXcgaW5jb21pbmcgZGF0YS4gV2l0aG91dCBjb25maXJtaW5nIGVpdGhlciB0aGUgYnVmZmVyIHN0YXR1cyBvciByZWNlcHRpb24gc3RhdHVzLCB0aGVyZSdzIG5vIHNlbnNlIGluIHByb2NlZWRpbmcgd2l0aCBhbnkgZGVlcGVyIGFuYWx5c2lzIG9mIHRoZSBuZXR3b3JrIGludGVyYWN0aW9uLiBUaGlzIHByZWxpbWluYXJ5IHN0ZXAgaXMgY3J1Y2lhbCB0byBhdm9pZCBjaGFzaW5nIGdob3N0cyBvciBkcmF3aW5nIGNvbmNsdXNpb25zIGJhc2VkIG9uIGluY29tcGxldGUgZGF0YS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEwMTgsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjowMS42NDI1ODM0NTRaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzI3OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTE1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNTE1OlxcdFxcdFxcdGdvdG8gZnJhbWVfZXJyO1xcbjI1MTY6XFx0XFx0fVxcbjI1MTc6XFx0XFxuMjUxODpcXHRcXHRpZiAodmlydGlvX25ldF9oZHJfdG5sX3RvX3NrYihza2IsIFxcdTAwMjZoZHItXFx1MDAzZXRubF9oZHIsIHZpLVxcdTAwM2VyeF90bmwsXFxuMjUxOTpcXHRcXHRcXHRcXHRcXHQgICAgICB2aS1cXHUwMDNlcnhfdG5sX2NzdW0sXFxuMjUyMDpcXHRcXHRcXHRcXHRcXHQgICAgICB2aXJ0aW9faXNfbGl0dGxlX2VuZGlhbih2aS1cXHUwMDNldmRldikpKSB7XFxuMjUyMTpcXHRcXHRcXHRuZXRfd2Fybl9yYXRlbGltaXRlZChcXFwiJXM6IGJhZCBnc286IHR5cGU6ICV4LCBzaXplOiAldSwgZmxhZ3MgJXggdHVubmVsICVkIHRubCBjc3VtICVkXFxcXG5cXFwiLFxcbjI1MjI6XFx0XFx0XFx0XFx0XFx0ICAgICBkZXYtXFx1MDAzZW5hbWUsIGhkci1cXHUwMDNlaGRyLmdzb190eXBlLFxcbjI1MjM6XFx0XFx0XFx0XFx0XFx0ICAgICBoZHItXFx1MDAzZWhkci5nc29fc2l6ZSwgaGRyLVxcdTAwM2VoZHIuZmxhZ3MsXFxuMjUyNDpcXHRcXHRcXHRcXHRcXHQgICAgIHZpLVxcdTAwM2VyeF90bmwsIHZpLVxcdTAwM2VyeF90bmxfY3N1bSk7XFxuMjUyNTpcXHRcXHRcXHRnb3RvIGZyYW1lX2VycjtcXG4yNTI2OlxcdFxcdH1cXG4yNTI3OlxcdFxcbjI1Mjg6XFx0XFx0c2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHZxMnJ4cShycS1cXHUwMDNldnEpKTtcXG4yNTI5OlxcdFxcdHNrYi1cXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7XFxuMjUzMDpcXHRcXHRwcl9kZWJ1ZyhcXFwiUmVjZWl2aW5nIHNrYiBwcm90byAweCUwNHggbGVuICVpIHR5cGUgJWlcXFxcblxcXCIsXFxuMjUzMTpcXHRcXHRcXHQgbnRvaHMoc2tiLVxcdTAwM2Vwcm90b2NvbCksIHNrYi1cXHUwMDNlbGVuLCBza2ItXFx1MDAzZXBrdF90eXBlKTtcXG4yNTMyOlxcdFxcbjI1MzM6XFx0XFx0bmFwaV9ncm9fcmVjZWl2ZShcXHUwMDI2cnEtXFx1MDAzZW5hcGksIHNrYik7XFxuMjUzNDpcXHRcXHRyZXR1cm47XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAyOjAxLjY0MjkxNDkxNFoiLCJTZXEiOjQ3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NTExMzExMzQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIFZpcnRpby1OZXQgUGFja2V0IFZ1bG5lcmFiaWxpdHkqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyB2aXJ0aW8tbmV0IGhhbmRsZXMgaW5jb21pbmcgcGFja2V0cywgc3BlY2lmaWNhbGx5IHRob3NlIHRoYXQgbWlnaHQgYmUgbWFsZm9ybWVkLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gdmlydGlvLW5ldCBnZXRzIGEgcGFja2V0IHNob3J0ZXIgdGhhbiAxNCBieXRlcy4gSXQganVtcHMgdG8gYGV0aF90eXBlX3RyYW5zYCwgcmlnaHQ/IFRoZSBxdWVzdGlvbiBpcywgd2lsbCB0aGF0IHRyaWdnZXIgYSBgQlVHX09OYD8gSSdtIHRyeWluZyB0byBiZSB2ZXJ5IHByZWNpc2UgaGVyZSBhbmQgYXZvaWQgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuXG5cbkknbSBjb25zaWRlcmluZyBhIGxpbmVhciBwYWNrZXQgbm93LiBJZiB0aGUgcGFja2V0IGlzIGxpbmVhciwgSSB0aGluayBpdCdzIGxpa2VseSB0aGF0IGBza2ItXHUwMDNlbGVuYCB3b3VsZCBiZSBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgd2hpY2ggaXMgMTQuIEFsc28gYHNrYl9oZWFkbGVuKHNrYilgIHdpbGwgYmUgbGVzcyB0aGFuIGBFVEhfSExFTmAuIFNvLCBpbiB0aGlzIHNjZW5hcmlvLCBJJ20gcHJldHR5IHN1cmUgdGhhdCBpdCB3b24ndCB0cmlnZ2VyIGEgYEJVR19PTmAuIEhvd2V2ZXIsIGl0IFdJTEwgbGVhZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB3aGljaCBpcyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIG5lZWQgdG8ga2VlcCBpbiBtaW5kLlxuXG5Ob3cgSSdtIGZvY3VzaW5nIG9uIGZyYWdtZW50ZWQgcGFja2V0cy4gV2l0aCBmcmFnbWVudGF0aW9uLCBgcmVjZWl2ZV9tZXJnZWFibGVgIGNvbWVzIGludG8gcGxheS4gQ291bGQgYHJlY2VpdmVfbWVyZ2VhYmxlYCBwb3NzaWJseSBidWlsZCBhbiBza2Igd2hlcmUgYHNrYi1cdTAwM2VsZW5gIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgRVRIX0hMRU5gIGJ1dCBgc2tiX2hlYWRsZW4oc2tiKWAgaXMgbGVzcyB0aGFuIGBFVEhfSExFTmA/IFRoYXQgc2VlbXMgbGlrZSBhIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5LiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhhdCBmdW5jdGlvbiB0byBtYWtlIHN1cmUgaXQncyBoYW5kbGVkLiBTbywgdGhhdCdzIHdoYXQgSSdtIGdvaW5nIHRvIGxvb2sgYXQgbmV4dCDigJMgY2FuIHRoaXMgZnVuY3Rpb24gY3JlYXRlIHRoaXMgY29uZGl0aW9uP1xuXG5cbiIsIklucHV0VG9rZW5zIjoyMTY3MCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAyOjA3LjE1NDIyOTI2WiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NzY5Mzg4OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJyZWNlaXZlX21lcmdlYWJsZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL25ldC92aXJ0aW9fbmV0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9uZXQvdmlydGlvX25ldC5jPTIxODY9c3RhdGljIHZvaWQgKm1lcmdlYWJsZV94ZHBfZ2V0X2J1ZihzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMjYzLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYzoyMjY0OnN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcmVjZWl2ZV9tZXJnZWFibGVfeGRwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTIyNjUtXFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYz0yMzI2PXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdmlydG5ldF9za2JfYXBwZW5kX2ZyYWcoc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLFxcbi0tXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTIzNzUtXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jOjIzNzY6c3RhdGljIHN0cnVjdCBza19idWZmICpyZWNlaXZlX21lcmdlYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yMzc3LVxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSxcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYy0yNDA1LVxcdFxcdGlmICh4ZHBfcHJvZykge1xcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYzoyNDA2OlxcdFxcdFxcdGhlYWRfc2tiID0gcmVjZWl2ZV9tZXJnZWFibGVfeGRwKGRldiwgdmksIHJxLCB4ZHBfcHJvZywgYnVmLCBjdHgsXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTI0MDctXFx0XFx0XFx0XFx0XFx0XFx0XFx0IGxlbiwgeGRwX3htaXQsIHN0YXRzKTtcXG4tLVxcbmRyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYz0yNTQxPXN0YXRpYyB2b2lkIHJlY2VpdmVfYnVmKHN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpLCBzdHJ1Y3QgcmVjZWl2ZV9xdWV1ZSAqcnEsXFxuLS1cXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMtMjU3Ny1cXHRcXHRmbGFncyA9ICgoc3RydWN0IHZpcnRpb19uZXRfY29tbW9uX2hkciAqKWJ1ZiktXFx1MDAzZWhkci5mbGFncztcXG5kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmM6MjU3ODpcXHRcXHRza2IgPSByZWNlaXZlX21lcmdlYWJsZShkZXYsIHZpLCBycSwgYnVmLCBjdHgsIGxlbiwgeGRwX3htaXQsXFxuZHJpdmVycy9uZXQvdmlydGlvX25ldC5jLTI1NzktXFx0XFx0XFx0XFx0XFx0c3RhdHMpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjowNy4yMjE5MjczNjhaIiwiU2VxIjo0OSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjA0MTUxMTcyMjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBJbXBsaWNhdGlvbnMgb2YgYSBOZXR3b3JrIFBhY2tldCBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgc28gaGVyZSdzIHRoZSBzaXR1YXRpb24gYXMgSSBzZWUgaXQuIEl0IGxvb2tzIGxpa2Ugd2l0aCB2aXJ0aW8tbmV0LCBpZiBhIHBhY2tldCBhcnJpdmVzIGZyYWdtZW50ZWQgYW5kIHRoZSBmaXJzdCBidWZmZXIgaXMgdGlueSwgdGhlbiBgcmVjZWl2ZV9tZXJnZWFibGVgIGJ1aWxkcyBhbiBTS0Igd2hlcmUgdGhlIGhlYWRlciBpcyBzbWFsbCwgYnV0IHRoZSB0b3RhbCBsZW5ndGggaXMgbGFyZ2VyLiAgVGhpcyB0aGVuIGdldHMgcGFzc2VkIHRvIGBldGhfdHlwZV90cmFuc2AuIFRoZSBwcm9ibGVtIHN1cmZhY2VzIHdoZW4gYHNrYl9wdWxsX2lubGluZWAgY2FsbHMgYF9fc2tiX3B1bGxgLiAgYF9fc2tiX3B1bGxgIHN1YnRyYWN0cyB0aGUgRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCBmcm9tIGBza2ItXHUwMDNlbGVuYC4gIElmIHRoZSBoZWFkZXIgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5pdGlhbCBsaW5lYXIgZGF0YSwgd2UgaGl0IGEgYEJVR19PTmAgYmVjYXVzZSB0aGUgbmV3IGBza2ItXHUwMDNlbGVuYCB3b3VsZCBiZSBsZXNzIHRoYW4gYHNrYi1cdTAwM2VkYXRhX2xlbmAsIGluZGljYXRpbmcgdGhlIHBhY2tldCdzIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gaXRzIGRhdGEuXG5cbk5vdywgc3l6a2FsbGVyICpjYW4qIGZpbmQgdGhpcyBgQlVHX09OYCBzY2VuYXJpbyB3aXRob3V0IEtNU0FOLCB3aGljaCBpcyBpbnRlcmVzdGluZy4gQnV0LCBJIHNlZSB0aGF0IGEgcGF0Y2ggZXhpc3RzIHdoaWNoIGNoZWNrcyBgc2tiX2hlYWRsZW4oc2tiKWAgYWdhaW5zdCBgRVRIX0hMRU5gLCBwcmV2ZW50aW5nIGJvdGggdGhlIGBCVUdfT05gIHdoZW4gYHNrYi1cdTAwM2VsZW4gXHUwMDNlPSBFVEhfSExFTmAgYW5kIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIHdoZW4gYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYC5cblxuU28gdGhlIHF1ZXN0aW9uIGlzLCBkaWQgc3l6a2FsbGVyIGRpc2NvdmVyIHRoZSBgQlVHX09OYCBvciB0aGUgS01TQU4gaXNzdWU/IElmIGl0IHdhcyB0aGUgYEJVR19PTmAsIHdlIGRvbid0ICpzdHJpY3RseSogbmVlZCBLTVNBTiwgcmlnaHQ/IFN0YW5kYXJkIGZ1enppbmcgdG9vbHMgd291bGQgbGlrZWx5IGNhdGNoIHRoYXQuIEJ1dCwgd2FpdCwgaXMgdGhlcmUgYSBjYXNlIHdoZXJlIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAgaXMgdGhlICpvbmx5KiB3YXkgdG8gdHJpZ2dlciBhIGJ1Zz8gQWgsIHllcyEgSWYgYSBkZXZpY2Ugb25seSBoYW5kbGVzIGxpbmVhciBwYWNrZXRzLCB0aGF0IGNvbmRpdGlvbiBpcyB0aGUgKm9ubHkqIHdheS5cblxuVGFrZSBgdHVuX2dldF91c2VyYCB3aXRoIGBJRkZfVEFQYCBhbmQgYGZyYWdzID09IGZhbHNlYCBmb3IgZXhhbXBsZSwgd2hpY2ggY3JlYXRlcyBhIGxpbmVhciBTS0Igd2l0aCBgc2tiLVx1MDAzZWxlbiBcdTAwM2MgRVRIX0hMRU5gLiAgTm8gYEJVR19PTmAgaGVyZS4gSXQgY2FsbHMgYGV0aF90eXBlX3RyYW5zYCBhbmQgcHJvY2VlZHMgdG8gcmVhZCB1bmluaXRpYWxpemVkIG1lbW9yeS4gS01TQU4gY2F0Y2hlcyB0aGF0LiBTeXprYWxsZXIsIHdpdGhvdXQgS01TQU4sIHdvbid0IGZpbmQgKnRoYXQqIGJ1ZyBiZWNhdXNlIGl0IG1pZ2h0IGJyYW5jaCBvbiB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZSwgYnV0IG5vIGNyYXNoLiBCdXQsIGlmIGBldGhfdHlwZV90cmFuc2AgaXMgY29tbW9uLCBhbmQgdGhlIGZ1enplciBmb3VuZCBhIGBCVUdfT05gIHRocm91Z2ggdmlydGlvLW5ldCBvciBhbm90aGVyIGRyaXZlciBjcmVhdGluZyBmcmFnbWVudGVkIFNLQnMgd2l0aCBzaG9ydCBsaW5lYXIgcGFydHMsIHRoZW4gaXQgZXNzZW50aWFsbHkgZm91bmQgdGhlIHVuZGVybHlpbmcgdnVsbmVyYWJpbGl0eSB0aHJvdWdoIGFub3RoZXIgZHJpdmVyLCBhbmQgd2UgZG9uJ3QgbmVlZCBLTVNBTiB0byBmaW5kIHRoYXQuXG5cbk9rYXksIGJhY2sgdG8gYHR1bl9nZXRfdXNlcmAuIElmIGBmcmFncyA9PSB0cnVlYCwgaXQgKmRvZXMqIGNoZWNrIGBwc2tiX21heV9wdWxsYCwgc28gd2UncmUgc2FmZSB0aGVyZS4gQnV0IHdpdGggYGZyYWdzID09IGZhbHNlYCwgaXQgY3JlYXRlcyBhIGxpbmVhciBTS0IsIGBza2ItXHUwMDNlbGVuIFx1MDAzYyBFVEhfSExFTmAsIGNhbGxzIGBldGhfdHlwZV90cmFuc2AsIGFuZCB0aGUgYnVnIGlzIHRoYXQgdGhlIHN5c3RlbSBub3cgcmVhZHMgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoaXMgKm9ubHkqIGdldHMgY2F1Z2h0IGJ5IEtNU0FOLCB3aGljaCBpcyBpbXBvcnRhbnQuXG5cbkFyZSB0aGVyZSBvdGhlciBkcml2ZXJzIGF0IHJpc2s/IE1hbnkgZHJpdmVycyBhc3N1bWUgcGFja2V0cyBzbWFsbGVyIHRoYW4gMTQgYnl0ZXMgYXJlIGRyb3BwZWQuIFZpcnR1YWwgZHJpdmVycyBsaWtlIGB2ZXRoYCwgYGxvb3BiYWNrYCwgYW5kIGB3aXJlZ3VhcmRgICptaWdodCogbm90LiBUaGUgcGF0Y2ggZml4ZXMgdGhpcy4gU28sIGlmIGEgZHJpdmVyIGNyZWF0ZXMgYSBsaW5lYXIgU0tCIHdpdGggYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYCwgS01TQU4gY2F0Y2hlcyBpdC4gRnJhZ21lbnRlZCBTS0JzIHdpdGggYSBzaG9ydCBsaW5lYXIgcGFydD8gYEJVR19PTmAuXG5cblRoZSBjb3JlIHF1ZXN0aW9uIGlzIHRoaXMgcGF0Y2ggYW5kIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGNhdWdodCAqb25seSogYnkgS01TQU4uIFllcy4gUmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRvIGBza2ItXHUwMDNlcHJvdG9jb2xgIChhbGxvY2F0ZWQgYnkgYGttYWxsb2NgIG9yIHBhZ2UgYWxsb2NhdG9yIGFuZCBub3QgemVyb2VkKSBjYW4gbGVhZCB0byByb3V0aW5nIHRoZSBwYWNrZXQgdG8gYW4gYXJiaXRyYXJ5IHByb3RvY29sIGhhbmRsZXIuIFRoaXMgaXMgYSB1c2Utb2YtdW5pbml0aWFsaXplZCB2YWx1ZSEgS01TQU4gaXMgKmRlc2lnbmVkKiB0byBmaW5kIHRoaXMuXG5cbkFuZCB3YWl0IGEgc2Vjb25kLiBJZiBgc2tiLVx1MDAzZXByb3RvY29sYCBpcyB1bmluaXRpYWxpemVkLCBpdCBjb3VsZCBnbyB0byBhIHBhY2tldCBzb2NrZXQgKEFGX1BBQ0tFVCkuIFRoZSB1c2VyICpjb3VsZCogdGhlbiByZWNlaXZlIHRoZSBwYWNrZXQgYW5kIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZnJvbSBgc2xsX3Byb3RvY29sYCBpbiB0aGUgYHNvY2thZGRyX2xsYCByZXR1cm5lZCBieSBgcmVjdmZyb21gLiBUaGF0IGlzIGEgZGlyZWN0IGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiAyIGJ5dGVzISBXb3cuIEkgbmVlZCB0byB2ZXJpZnkgdGhpcy4uLiB0aW1lIHRvIGNoZWNrIGBwYWNrZXRfcmN2YCBpbiBgbmV0L3BhY2tldC9hZl9wYWNrZXQuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyNjg2LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTU1NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjoyNy42MzcwNDg5MDFaIiwiU2VxIjo1MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg1MzQ5NDY3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNsbF9wcm90b2NvbFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvcGFja2V0L2FmX3BhY2tldC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MjEzMz1zdGF0aWMgaW50IHBhY2tldF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldixcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjIwNi1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjIyMDc6XFx0Lyogc2xsLVxcdTAwM2VzbGxfZmFtaWx5IGFuZCBzbGwtXFx1MDAzZXNsbF9wcm90b2NvbCBhcmUgc2V0IGluIHBhY2tldF9yZWN2bXNnKCkuXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yMjA4LVxcdCAqIFVzZSB0aGVpciBzcGFjZSBmb3Igc3RvcmluZyB0aGUgb3JpZ2luYWwgc2tiIGxlbmd0aC5cXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MjI0Nj1zdGF0aWMgaW50IHRwYWNrZXRfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI0NzUtXFx0c2xsLVxcdTAwM2VzbGxfaGF0eXBlID0gZGV2LVxcdTAwM2V0eXBlO1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6MjQ3NjpcXHRzbGwtXFx1MDAzZXNsbF9wcm90b2NvbCA9IChzay1cXHUwMDNlc2tfdHlwZSA9PSBTT0NLX0RHUkFNKSA/XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yNDc3LVxcdFxcdHZsYW5fZ2V0X3Byb3RvY29sX2RncmFtKHNrYikgOiBza2ItXFx1MDAzZXByb3RvY29sO1xcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYz0yNzM2PXN0YXRpYyBpbnQgdHBhY2tldF9zbmQoc3RydWN0IHBhY2tldF9zb2NrICpwbywgc3RydWN0IG1zZ2hkciAqbXNnKVxcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yNzc2LVxcdFxcdFxcdGdvdG8gb3V0O1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6Mjc3NzpcXHRcXHRwcm90b1xcdD0gc2FkZHItXFx1MDAzZXNsbF9wcm90b2NvbDtcXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI3NzgtXFx0XFx0ZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChcXHUwMDI2cG8tXFx1MDAzZXNrKSwgc2FkZHItXFx1MDAzZXNsbF9pZmluZGV4KTtcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9Mjk2Nj1zdGF0aWMgaW50IHBhY2tldF9zbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKVxcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yOTk1LVxcdFxcdFxcdGdvdG8gb3V0O1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM6Mjk5NjpcXHRcXHRwcm90b1xcdD0gc2FkZHItXFx1MDAzZXNsbF9wcm90b2NvbDtcXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI5OTctXFx0XFx0ZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChzayksIHNhZGRyLVxcdTAwM2VzbGxfaWZpbmRleCk7XFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTMzMzM9c3RhdGljIGludCBwYWNrZXRfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqdWFkZHIsIGludCBhZGRyX2xlbilcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzM0Ni1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjMzNDc6XFx0cmV0dXJuIHBhY2tldF9kb19iaW5kKHNrLCBOVUxMLCBzbGwtXFx1MDAzZXNsbF9pZmluZGV4LCBzbGwtXFx1MDAzZXNsbF9wcm90b2NvbCk7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0zMzQ4LX1cXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MzQzOD1zdGF0aWMgaW50IHBhY2tldF9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbixcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzUxMC1cXHRcXHRzbGwtXFx1MDAzZXNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzozNTExOlxcdFxcdHNsbC1cXHUwMDNlc2xsX3Byb3RvY29sID0gKHNvY2stXFx1MDAzZXR5cGUgPT0gU09DS19ER1JBTSkgP1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzUxMi1cXHRcXHRcXHR2bGFuX2dldF9wcm90b2NvbF9kZ3JhbShza2IpIDogc2tiLVxcdTAwM2Vwcm90b2NvbDtcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmM9MzYyMz1zdGF0aWMgaW50IHBhY2tldF9nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTM2MzctXFx0c2xsLVxcdTAwM2VzbGxfaWZpbmRleCA9IGlmaW5kZXg7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzozNjM4OlxcdHNsbC1cXHUwMDNlc2xsX3Byb3RvY29sID0gUkVBRF9PTkNFKHBvLVxcdTAwM2VudW0pO1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMzYzOS1cXHRzbGwtXFx1MDAzZXNsbF9wa3R0eXBlID0gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDI6MjcuNzIyNDA1NjM4WiIsIlNlcSI6NTEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4NTUzMDY2Nzk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkEgRGVlcCBEaXZlIGludG8gYSBLZXJuZWwgSW5mb3JtYXRpb24gTGVhayoqXG5cbk9rYXksIHNvIEkndmUgc3R1bWJsZWQgdXBvbiBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaW4gYHBhY2tldF9yZWN2bXNnYC4gSWYgYHNrYi1cdTAwM2Vwcm90b2NvbGAgaXNuJ3QgaW5pdGlhbGl6ZWQsIGl0J3MgY29waWVkIGRpcmVjdGx5IGludG8gYHNsbC1cdTAwM2VzbGxfcHJvdG9jb2xgIGFuZCBzZW50IHN0cmFpZ2h0IHRvIHVzZXIgc3BhY2UgdmlhIGBtc2ctXHUwMDNlbXNnX25hbWVg4oCUc3BlY2lmaWNhbGx5LCB0aGUgYHNvY2thZGRyX2xsYCBzdHJ1Y3R1cmUuIFRoaXMgbG9va3MgbGlrZSBhIHN0cmFpZ2h0Zm9yd2FyZCBrZXJuZWwtdG8tdXNlciBpbmZvcm1hdGlvbiBsZWFrLCBhbmQgdGhlIGtpY2tlcj8gSXQncyB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnksIHR3byBieXRlcyBvZiBpdCEgVGhhdCBtZWFucyBLQVNBTiB3b24ndCBjYXRjaCBpdC4gSXQncyBLTVNBTidzIHRlcnJpdG9yeSFcblxuQnV0LCBob2xkIG9uIGEgc2Vjb25kLi4uIGlzIHRoZSBtZW1vcnkgKmFjdHVhbGx5KiB1bmluaXRpYWxpemVkPyBMZXQncyB0cmFjZSBpdCBiYWNrLiBXaGVuIGB0dW5fYWxsb2Nfc2tiYCBhbGxvY2F0ZXMgdGhlIGBza2JgLCBpdCBnb2VzIHRocm91Z2ggYHNvY2tfYWxsb2Nfc2VuZF9wc2tiYCwgd2hpY2ggdXNlcyBgYWxsb2Nfc2tiX3dpdGhfZnJhZ3NgLiBUaGlzLCBpbiB0dXJuLCB1c2VzIGBrbWVtX2NhY2hlX2FsbG9jX25vZGVgIGZvciB0aGUgYHNrYmAgaXRzZWxmIGFuZCBga21hbGxvY19yZXNlcnZlYCBmb3IgdGhlIGRhdGEgYnVmZmVyLiBBbmQgdGhlIGNydWNpYWwgYml0PyBga21hbGxvY19yZXNlcnZlYCB1c2VzIGBrbWFsbG9jX25vZGVfdHJhY2tfY2FsbGVyYCAob3Igc29tZXRoaW5nIHNpbWlsYXIpLCB3aGljaCAqZG9lc24ndCogemVybyB0aGUgbWVtb3J5IHVubGVzcyBgX19HRlBfWkVST2AgaXMgcGFzc2VkLiBBbmQsIGd1ZXNzIHdoYXQ/IGBzb2NrX2FsbG9jX3NlbmRfcHNrYmAgKmRvZXNuJ3QqIHBhc3MgYF9fR0ZQX1pFUk9gLiBTbywgeWVzLCB0aGUgZGF0YSBidWZmZXIgaXMgdW5pbml0aWFsaXplZC5cblxuTm93LCBgdHVuX2dldF91c2VyYCBjb3BpZXMgYGxlbmAgYnl0ZXMgZnJvbSB1c2VyIHNwYWNlIHVzaW5nIGBza2JfY29weV9kYXRhZ3JhbV9mcm9tX2l0ZXJgLiBUaGUgYnl0ZXMgYmV5b25kIGBsZW5gIHJlbWFpbiB1bnRvdWNoZWTigJRzdGlsbCB1bmluaXRpYWxpemVkLiBUaGVuLCBgZXRoX3R5cGVfdHJhbnNgIGNvbWVzIGludG8gcGxheSwgcmVhZGluZyBgZXRoLVx1MDAzZWhfcHJvdG9gIGF0IG9mZnNldCAxMi4gSWYgYGxlbiBcdTAwM2MgMTRgLCBpdCdzIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoYXQgdW5pbml0aWFsaXplZCB2YWx1ZSBnZXRzIGFzc2lnbmVkIHRvIGBza2ItXHUwMDNlcHJvdG9jb2xgLiBUaGUgcGFja2V0IHRoZW4gcGFzc2VzIHRocm91Z2ggYG5ldGlmX3J4YCBvciBgbmV0aWZfcmVjZWl2ZV9za2JgLlxuXG5IZXJlJ3Mgd2hlcmUgaXQgYWxsIGNvbm5lY3RzOiBJZiB0aGVyZSdzIGFuIEFGX1BBQ0tFVCBzb2NrZXQgc25pZmZpbmcgdGhlIGludGVyZmFjZSwgaXQgcmVjZWl2ZXMgdGhpcyBwYWNrZXQuIFRoZSB1c2VyIHRoZW4gcmVhZHMgZnJvbSB0aGUgQUZfUEFDS0VUIHNvY2tldCBhbmQgZ2V0cyB0aG9zZSBqdWljeSwgdW5pbml0aWFsaXplZCAyIGJ5dGVzIGluIGBzbGxfcHJvdG9jb2xgLiBCaW5nbyEgVGhpcyBpcyBhIGNvbXBsZXRlbHkgbGVnaXRpbWF0ZSBpbmZvLWxlYWssIGFuZCBpdCdzIHNvbGVseSBjYXVnaHQgYnkgS01TQU4uXG5cbkxldCdzIGRvIHNvbWUgbW9yZSBkaWdnaW5nLiBDYW4gYHR1bl9nZXRfdXNlcmAgYWN0dWFsbHkgc2VuZCBhIHBhY2tldCB3aXRoIGBsZW4gXHUwMDNjIDE0YCB0byBgZXRoX3R5cGVfdHJhbnNgP1xuXG5Mb29raW5nIGF0IGB0dW5fZ2V0X3VzZXJgOiBJIGNhbiBzZWUgdGhlIGNvbmRpdGlvbmFsOlxuYGBgY1xuXHRpZiAodHVuLVx1MDAzZWZsYWdzIFx1MDAyNiBJRkZfVk5FVF9IRFIpIHtcblx0XHQvLyByZWFkcyB2bmV0IGhlYWRlclxuXHR9XG5cblx0Ly8gLi4uXG5cdHNrYiA9IHR1bl9hbGxvY19za2IodGZpbGUsIGFsaWduLCBjb3B5bGVuLCBsaW5lYXIsIG5vYmxvY2spO1xuXHQvLyAuLi5cblx0ZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1fZnJvbV9pdGVyKHNrYiwgMCwgZnJvbSwgbGVuKTtcblx0Ly8gLi4uXG5cdHN3aXRjaCAodHVuLVx1MDAzZWZsYWdzIFx1MDAyNiBUVU5fVFlQRV9NQVNLKSB7XG5cdGNhc2UgSUZGX1RVTjpcblx0XHQvLyAuLi5cblx0XHRicmVhaztcblx0Y2FzZSBJRkZfVEFQOlxuXHRcdGlmIChmcmFncyBcdTAwMjZcdTAwMjYgIXBza2JfbWF5X3B1bGwoc2tiLCBFVEhfSExFTikpIHtcblx0XHRcdC8vIC4uLlxuXHRcdH1cblx0XHRza2ItXHUwMDNlcHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bi1cdTAwM2VkZXYpO1xuXHRcdGJyZWFrO1xuXHR9XG5gYGBcblxuWWVzLCBpdCBsb29rcyBsaWtlIGlmIGB0dW4tXHUwMDNlZmxhZ3MgXHUwMDI2IFRVTl9UWVBFX01BU0tgIGlzIHNldCB0byBgSUZGX1RBUGAsIGFuZCBgZnJhZ3NgIGlzIGZhbHNlICh3aGljaCBpcyB0aGUgY2FzZSBpZiB0aGUgcGFja2V0IGZpdHMgd2l0aGluIHRoZSBsaW5lYXIgcG9ydGlvbiwgbWVhbmluZyBpZiBpdHMgbGVzcyB0aGFuIDE0IGJ5dGVzKSwgdGhlbiBpdCBjYWxscyBgZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tXHUwMDNlZGV2KWAgd2l0aG91dCBhIGNoZWNrIGlmIGBza2ItXHUwMDNlbGVuIFx1MDAzZT0gRVRIX0hMRU5gLlxuXG5TbywgYSB1c2VyIGNhbiB3cml0ZSwgc2F5LCAxMCBieXRlcyB0byBhIFRBUCBkZXZpY2UuIFRoZSBUQVAgZGV2aWNlIHdpbGwgYWxsb2NhdGUgYW4gYHNrYmAsIGNvcHkgMTAgYnl0ZXMsIGFuZCB0aGVuIGNhbGwgYGV0aF90eXBlX3RyYW5zYC4gVGhlIGBldGhfdHlwZV90cmFuc2AgZnVuY3Rpb24gcmVhZHMgdGhvc2UgMiBieXRlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhdCBvZmZzZXQgMTIuIFRoZW4sIHRoZSBwYWNrZXQgZ2V0cyBpbmplY3RlZCBpbnRvIHRoZSBuZXR3b3JrIHN0YWNrLiBBbiBBRl9QQUNLRVQgc29ja2V0IGNhbiByZWNlaXZlIGl0IGFuZCBsZWFrIHRoZSAyIGJ5dGVzLiBUaGlzIGlzLCBpbmRlZWQsIGEgcGVyZmVjdCBLTVNBTiBidWcuXG5cbk9rYXksIG5vdywgYXJlIHRoZXJlIGFueSBvdGhlciBjYWxscyB0byBgZXRoX3R5cGVfdHJhbnNgIHdpdGggYHNrYi1cdTAwM2VsZW4gXHUwMDNjIEVUSF9ITEVOYD8gSSBuZWVkIHRvIGNoZWNrLiBMZXQncyBsb29rIGF0IGBsb29wYmFja194bWl0YCBpbiBgZHJpdmVycy9uZXQvbG9vcGJhY2suY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MTQ5LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTU3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAyOjQ2LjI3NTQ3NTc5N1oiLCJTZXEiOjUyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTY1OTI2NTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXRoX3R5cGVfdHJhbnNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9uZXQvbG9vcGJhY2suY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC9sb29wYmFjay5jPTcwPXN0YXRpYyBuZXRkZXZfdHhfdCBsb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5kcml2ZXJzL25ldC9sb29wYmFjay5jLTg2LVxcbmRyaXZlcnMvbmV0L2xvb3BiYWNrLmM6ODc6XFx0c2tiLVxcdTAwM2Vwcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTtcXG5kcml2ZXJzL25ldC9sb29wYmFjay5jLTg4LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjo0Ni4zMzIwNzMxMDVaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODI4MzIzMzU0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIExvb3BiYWNrIFRyYW5zbWlzc2lvbiBQYXRoKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhlIGBsb29wYmFja194bWl0YCBmdW5jdGlvbiwgYW5kIG15IGluaXRpYWwgdGhvdWdodHMgYXJlIGFyb3VuZCBob3cgaXQgaGFuZGxlcyBpbmNvbWluZyBwYWNrZXRzLiBGaXJzdCwgaXQgdGltZXN0YW1wcyB0aGUgYHNrYmAgYW5kIGNsZWFycyB0aGUgdGltZXN0YW1wIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGRpZmZlcmVudCBjbG9jayBiYXNlcy4gSXQgdGhlbiBvcnBoYW5zIHRoZSBgc2tiYCBhbmQgZW5zdXJlcyB0aGUgZGVzdGluYXRpb24gaXMgcmVmY291bnRlZCwgd2hpY2ggaXMgcHJldHR5IHN0YW5kYXJkLiBUaGUga2V5IHBhcnQgaXMgdGhhdCBgZXRoX3R5cGVfdHJhbnNgIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIHByb3RvY29sLlxuXG5NeSBjb25jZXJuIGhlcmUgaXMgcmVnYXJkaW5nIHBhY2tldHMgd2l0aCB1bnVzdWFsIHNpemVzLiBJIGtub3cgdGhhdCBpZiBhIHBhY2tldCB3aXRoIGEgbGVuZ3RoIGxlc3MgdGhhbiBgRVRIX0hMRU5gIGlzIHNlbnQgb3ZlciBsb29wYmFjaywgYGV0aF90eXBlX3RyYW5zYCB3aWxsIGJlIGNhbGxlZC4gVGhhdCdzIGZpbmUgaW4gbW9zdCBzY2VuYXJpb3MgYmVjYXVzZSBwYWNrZXRzIGdlbmVyYXRlZCBieSB0aGUga2VybmVsIGFyZSB1c3VhbGx5IHdlbGwtZm9ybWVkLiBIb3dldmVyLCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGVkZ2UgY2FzZXMuIFdoYXQgaWYgYSByYXcgcGFja2V0IGlzIHNlbnQgdXNpbmcgYW4gQUZfUEFDS0VUIHNvY2tldCB3aXRoIGEgc2hvcnQgbGVuZ3RoLCBsZXNzIHRoYW4gdGhlIG1pbmltdW0gRXRoZXJuZXQgZnJhbWUgc2l6ZSwgd2hpY2ggaXMgMTQgYnl0ZXM/IEluIHRoYXQgY2FzZSwgYGxvb3BiYWNrX3htaXRgIHdvdWxkIGJlIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgcGFja2V0LlxuXG5UaGUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzLCBob3cgZG9lcyB0aGF0IGV2ZW4gaGFwcGVuPyBEb2VzIHRoZSBwYWNrZXQgc29ja2V0IGNvZGUgcHJldmVudCBpdCBmcm9tIGhhcHBlbmluZz8gRG9lcyBpdCBmaWx0ZXIgb3V0IHRoZXNlIHNob3J0ZXIgcGFja2V0cz8gSSBzZWVtIHRvIHJlY2FsbCB0aGF0IHBhY2tldCBzZW5kLCBgcGFja2V0X3NuZGAsIGRvZXMgc29tZSBsZW5ndGggY2hlY2tzLiBMZXQgbWUgcXVpY2tseSB2ZXJpZnkgaWYgdGhlIHBhY2tldCBzZW5kIHBhdGggY2hlY2tzIHdoZXRoZXIgdGhlIGxlbmd0aCBpcyBhdCBsZWFzdCBgZGV2LVx1MDAzZWhhcmRfaGVhZGVyX2xlbmAgYmVmb3JlIGl0IGdldHMgdG8gdGhpcyBwb2ludC4gVGhhdCB3b3VsZCBleHBsYWluIGl0LiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYW5kIGNoZWNrIGBwYWNrZXRfc25kYCB0byBjb25maXJtIHRoZSBiZWhhdmlvci5cblxuXG4iLCJJbnB1dFRva2VucyI6MjgyNTksIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMzIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDI6NTQuNjE1MzA5MzM5WiIsIlNlcSI6NTQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDYxNjIwODcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZGV2LVxcdTAwM2VoYXJkX2hlYWRlcl9sZW5cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3BhY2tldC9hZl9wYWNrZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvcGFja2V0L2FmX3BhY2tldC5jPTU0MT1zdGF0aWMgdTE2IHZsYW5fZ2V0X3RjaShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy01NTUtXFx0ICovXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzo1NTY6XFx0aWYgKGRldi1cXHUwMDNlbWluX2hlYWRlcl9sZW4gPT0gZGV2LVxcdTAwM2VoYXJkX2hlYWRlcl9sZW4pXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzo1NTc6XFx0XFx0aGVhZGVyX2xlbiA9IGRldi1cXHUwMDNlaGFyZF9oZWFkZXJfbGVuO1xcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtNTU4LVxcdGVsc2UgaWYgKGlzX3ZsYW5fZGV2KGRldikpXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTE5NjA9c3RhdGljIGludCBwYWNrZXRfc2VuZG1zZ19zcGt0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG4tLVxcbm5ldC9wYWNrZXQvYWZfcGFja2V0LmMtMjAxNS1cXHRpZiAoIXNrYilcXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jOjIwMTY6XFx0XFx0aGFyZF9oZWFkZXJfbGVuID0gUkVBRF9PTkNFKGRldi1cXHUwMDNlaGFyZF9oZWFkZXJfbGVuKTtcXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTIwMTctXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jPTI3MzY9c3RhdGljIGludCB0cGFja2V0X3NuZChzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLCBzdHJ1Y3QgbXNnaGRyICptc2cpXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTI4MDAtXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzoyODAxOlxcdGhhcmRfaGVhZGVyX2xlbiA9IFJFQURfT05DRShkZXYtXFx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0yODAyLVxcdGlmIChwby1cXHUwMDNlc2suc2tfc29ja2V0LVxcdTAwM2V0eXBlID09IFNPQ0tfUkFXKVxcbi0tXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYz0yOTY2PXN0YXRpYyBpbnQgcGFja2V0X3NuZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pXFxuLS1cXG5uZXQvcGFja2V0L2FmX3BhY2tldC5jLTMwMTktXFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYzozMDIwOlxcdGhhcmRfaGVhZGVyX2xlbiA9IFJFQURfT05DRShkZXYtXFx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XFxubmV0L3BhY2tldC9hZl9wYWNrZXQuYy0zMDIxLVxcdGlmIChzb2NrLVxcdTAwM2V0eXBlID09IFNPQ0tfUkFXKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMjo1NC43MjE0NzYxMTZaIiwiU2VxIjo1NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ5MDQ3NjMyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUGFja2V0IFRyYW5zbWlzc2lvbiBhbmQgSGVhZGVyIFNwYWNlKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgcGFja2V0X3NuZGAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSBob3cgaXQgaGFuZGxlcyByZXNlcnZpbmcgc3BhY2Ugd2l0aGluIGEgc29ja2V0IGJ1ZmZlciBiZWZvcmUgdHJhbnNtaXNzaW9uLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGlzOiBpdCBjYWxjdWxhdGVzIHRoZSByZXNlcnZlZCBzcGFjZSAoYHJlc2VydmVgKSBiYXNlZCBvbiB0aGUgc29ja2V0IHR5cGUuIFJhdyBzb2NrZXRzIGdldCBhIHNpbXBsZSBgaGFyZF9oZWFkZXJfbGVuYCwgd2hpbGUgb3RoZXIgc29ja2V0IHR5cGVzIGFsc28gY29uc2lkZXIgdGhlIGRldmljZSdzIHRhaWxyb29tLiBUaGF0J3MgZmluZSDigJMgc3RhbmRhcmQgcHJhY3RpY2UgdG8gYWNjb21tb2RhdGUgZm9yIGhlYWRlcnMuXG5cbkJ1dCB0aGUgcXVlc3Rpb24gaXMsIGRvZXMgdGhpcyBzcGFjZSByZXNlcnZhdGlvbiAqZW5mb3JjZSogYSBtaW5pbXVtIGxlbmd0aCBmb3IgdGhlIHBhY2tldD8gRG9lcyBpdCBlbnN1cmUgdGhhdCB0aGUgZGF0YSBsZW5ndGggKGBsZW5gKSBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgYGhhcmRfaGVhZGVyX2xlbmA/IEEgcGFja2V0IHdpdGggYSBkYXRhIGxlbmd0aCBzaG9ydGVyIHRoYW4gdGhlIG1pbmltdW0gaGVhZGVyIGxlbmd0aCB3b3VsZCBiZS4uLnByb2JsZW1hdGljLCB0byBzYXkgdGhlIGxlYXN0LiBJdCdzIGEgZnVuZGFtZW50YWwgcmVxdWlyZW1lbnQuIFNvLCBJIG5lZWQgdG8gZ28gYmFjayBhbmQgdGhvcm91Z2hseSBleGFtaW5lIHRoZSBgcGFja2V0X3NuZGAgZnVuY3Rpb24gdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgZXhwbGljaXQgbGVuZ3RoIGNoZWNrcyBpbiBwbGFjZSB0byBwcmV2ZW50IHRoaXMgcG90ZW50aWFsbHkgZGlzYXN0cm91cyBzY2VuYXJpby4gTGV0J3MgZGlnIGluIGFuZCBzZWUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5NDg3LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMTM6MDI6NTkuMjExOTU1MDMyWiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3Mjg5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcGFja2V0L2FmX3BhY2tldC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMwMTAsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjMwMTA6XFx0XFx0aWYgKHVubGlrZWx5KCEoZGV2LVxcdTAwM2VmbGFncyBcXHUwMDI2IElGRl9VUCkpKVxcbjMwMTE6XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbjMwMTI6XFx0XFxuMzAxMzpcXHRcXHRzb2NrY21faW5pdChcXHUwMDI2c29ja2MsIHNrKTtcXG4zMDE0OlxcdFxcdGlmIChtc2ctXFx1MDAzZW1zZ19jb250cm9sbGVuKSB7XFxuMzAxNTpcXHRcXHRcXHRlcnIgPSBzb2NrX2Ntc2dfc2VuZChzaywgbXNnLCBcXHUwMDI2c29ja2MpO1xcbjMwMTY6XFx0XFx0XFx0aWYgKHVubGlrZWx5KGVycikpXFxuMzAxNzpcXHRcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMzAxODpcXHRcXHR9XFxuMzAxOTpcXHRcXG4zMDIwOlxcdFxcdGhhcmRfaGVhZGVyX2xlbiA9IFJFQURfT05DRShkZXYtXFx1MDAzZWhhcmRfaGVhZGVyX2xlbik7XFxuMzAyMTpcXHRcXHRpZiAoc29jay1cXHUwMDNldHlwZSA9PSBTT0NLX1JBVylcXG4zMDIyOlxcdFxcdFxcdHJlc2VydmUgPSBoYXJkX2hlYWRlcl9sZW47XFxuMzAyMzpcXHRcXHRpZiAodm5ldF9oZHJfc3opIHtcXG4zMDI0OlxcdFxcdFxcdGVyciA9IHBhY2tldF9zbmRfdm5ldF9wYXJzZShtc2csIFxcdTAwMjZsZW4sIFxcdTAwMjZ2bmV0X2hkciwgdm5ldF9oZHJfc3opO1xcbjMwMjU6XFx0XFx0XFx0aWYgKGVycilcXG4zMDI2OlxcdFxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4zMDI3OlxcdFxcdH1cXG4zMDI4OlxcdFxcbjMwMjk6XFx0XFx0aWYgKHVubGlrZWx5KHNvY2tfZmxhZyhzaywgU09DS19OT0ZDUykpKSB7XFxuMzAzMDpcXHRcXHRcXHRpZiAoIW5ldGlmX3N1cHBvcnRzX25vZmNzKGRldikpIHtcXG4zMDMxOlxcdFxcdFxcdFxcdGVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7XFxuMzAzMjpcXHRcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMzAzMzpcXHRcXHRcXHR9XFxuMzAzNDpcXHRcXHRcXHRleHRyYV9sZW4gPSA0OyAvKiBXZSdyZSBkb2luZyBvdXIgb3duIENSQyAqL1xcbjMwMzU6XFx0XFx0fVxcbjMwMzY6XFx0XFxuMzAzNzpcXHRcXHRlcnIgPSAtRU1TR1NJWkU7XFxuMzAzODpcXHRcXHRpZiAoIXZuZXRfaGRyLmdzb190eXBlIFxcdTAwMjZcXHUwMDI2XFxuMzAzOTpcXHRcXHQgICAgKGxlbiBcXHUwMDNlIGRldi1cXHUwMDNlbXR1ICsgcmVzZXJ2ZSArIFZMQU5fSExFTiArIGV4dHJhX2xlbikpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDEzOjAyOjU5LjIxMjEyOTEyMloiLCJTZXEiOjU3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyODk5MDM3MzUwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgS01TQU4gTmVjZXNzaXR5KipcblxuT2theSwgaGVyZSdzIHRoZSBicmVha2Rvd24sIGFzIEkgc2VlIGl0LiBUaGVyZSdzIGEgY3JpdGljYWwgb3ZlcnNpZ2h0IGluIHRoZSBwYWNrZXQgcmVjZXB0aW9uIHBhdGgsIHNwZWNpZmljYWxseSBjb25jZXJuaW5nIHBhY2tldHMgd2l0aCBsaW5lYXIgZGF0YSBsZW5ndGhzIHNob3J0ZXIgdGhhbiB0aGUgRXRoZXJuZXQgaGVhZGVyIHNpemUgKDE0IGJ5dGVzKS4gTXkgaW52ZXN0aWdhdGlvbiByZXZlYWxzIGEgY2xlYXIgaW5mb3JtYXRpb24gbGVhayB0aGF0J3MgdW5pcXVlbHkgZGV0ZWN0YWJsZSBieSBLTVNBTi5cblxuSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzczogSW5pdGlhbGx5LCBJIG5vdGljZWQgdGhhdCBgcGFja2V0X3NuZGAgZG9lc24ndCBleHBsaWNpdGx5IGNoZWNrIGZvciBwYWNrZXRzIHdpdGggYSBsZW5ndGggbGVzcyB0aGFuIHRoZSBoYXJkIGhlYWRlciBsZW5ndGggd2hlbiB1c2luZyBgU09DS19SQVdgIG9uIGBBRl9QQUNLRVRgLiBUaGlzIG9wZW5zIHRoZSBkb29yIGZvciB1c2VycyB0byBjcmFmdCB2ZXJ5IHNob3J0IHBhY2tldHMg4oCTIGV2ZW4gemVyby1ieXRlIG9uZXMg4oCTIHdoaWNoIGFyZSB0aGVuIHBhc3NlZCBkb3duc3RyZWFtIHRvIGBkZXZfcXVldWVfeG1pdGAuIEluIHRoZSBgbG9vcGJhY2tgIGRldmljZSBjYXNlLCB0aGVzZSBwYWNrZXRzIHVsdGltYXRlbHkgcmVhY2ggYGV0aF90eXBlX3RyYW5zYCB2aWEgYGxvb3BiYWNrX3htaXRgLlxuXG5UaGUgY29yZSBpc3N1ZSBsaWVzIGluIGhvdyBgZXRoX3R5cGVfdHJhbnNgIGhhbmRsZXMgdGhlc2UgbWFsZm9ybWVkIHBhY2tldHMuIEl0IHJlYWRzIGBldGgtXHUwMDNlaF9wcm90b2Agd2l0aG91dCBwcm9wZXIgbGVuZ3RoIHZhbGlkYXRpb24uIFNpbmNlIHRoZSBrZXJuZWwgYWxsb2NhdGVzIHRoZSBTS0Igd2l0aCBga21hbGxvY2AgKHdpdGhvdXQgYF9fR0ZQX1pFUk9gKSwgdGhlIG1lbW9yeSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHVzZXItcHJvdmlkZWQgZGF0YSBpcyB1bmluaXRpYWxpemVkLiBUaGlzIGlzIHRoZSBjcnV4IG9mIHRoZSBwcm9ibGVtLlxuXG5gZXRoX3NrYl9wdWxsX21hY2AgY2FsbHMgYHNrYl9wdWxsX2lubGluZWAuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHNpemUgb2YgdGhlIFNLQiBpcyBsZXNzIHRoYW4gYEVUSF9ITEVOYCwgaW4gd2hpY2ggY2FzZSBhIHJlYWQgcGFzdCB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBvY2N1cnMuIEhvd2V2ZXIsIHRoaXMgZG9lc24ndCB0cmlnZ2VyIGBCVUdfT05gIG9yIEtBU0FOLCBiZWNhdXNlIHRoZSBkYXRhIGlzbid0IG91dCBvZiBib3VuZHMg4oCTIGl0J3MganVzdCB1bmluaXRpYWxpemVkIHdpdGhpbiB0aGUgYWxsb2NhdGVkIFNLQiBidWZmZXIuIFRoZSBrZXkgaXMgdGhhdCBgc2tiX3B1bGxfaW5saW5lYCBkb2Vzbid0IHJldHVybiBhbiBlcnJvciBoZXJlLCBpdCBjb250aW51ZXMuXG5cblRoaXMgdW5pbml0aWFsaXplZCBgaF9wcm90b2AgdmFsdWUgZ2V0cyBzaWxlbnRseSBwcm9wYWdhdGVkLiBgZXRoX3R5cGVfdHJhbnNgIHJlYWRzIHRoZSAyIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgdGhhdCBhcmUgcGFydCBvZiBgaF9wcm90b2AgYW5kIHRoZW4gc3RvcmVzIGl0IGludG8gYHNrYi1cdTAwM2Vwcm90b2NvbGAuIFRoaXMgYHNrYi1cdTAwM2Vwcm90b2NvbGAgdmFsdWUgaXMgdGhlbiBsZWFrZWQgdG8gdXNlciBzcGFjZSB2aWEgYHBhY2tldF9yZWN2bXNnYC5cblxuVGhlIGNydWNpYWwgdGhpbmcgaXMgdGhpcyBsZWFrICppc24ndCogZGV0ZWN0ZWQgYnkgc3RhbmRhcmQgZnV6emluZyBvciBLQVNBTiBiZWNhdXNlIGl0IGRvZXNuJ3QgaW52b2x2ZSBhbnkgb3V0LW9mLWJvdW5kcyByZWFkcyBvciBjcmFzaGVzLiBLQVNBTiBvbmx5IHRyYWNrcyBvdXQtb2YtYm91bmRzIG1lbW9yeSBhY2Nlc3Nlcywgc28gcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSAqd2l0aGluKiBhIHZhbGlkIGFsbG9jYXRpb24gaXNuJ3QgY2F1Z2h0LiBLTVNBTiwgaG93ZXZlciwgKmRvZXMqIHRyYWNrIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLlxuXG5UaGlzIGlzIGEgdGV4dGJvb2sgY2FzZSB3aGVyZSBLTVNBTiBpcyBlc3NlbnRpYWwuIEl0J3MgdGhlIG9ubHkgdG9vbCB0aGF0IHJlbGlhYmx5IGlkZW50aWZpZXMgdGhpcyB2dWxuZXJhYmlsaXR5LiBTdGFuZGFyZCBmdXp6aW5nLCBvciBmdXp6aW5nIHdpdGggS0FTQU4sIHdpbGwgbWlzcyB0aGlzLCBsZWFkaW5nIHRvIGEgc2lsZW50IGtlcm5lbCBpbmZvLWxlYWsuXG5cbk5vdyBJIGFtIGdvaW5nIHRvIHN1bW1hcml6ZSB0aGUgcHJvY2VzcyBvZiB0aGlzIGluZm9ybWF0aW9uIGxlYWs6XG5cbjEuICBBIHNob3J0IHBhY2tldCAoZS5nLiwgMTAgYnl0ZXMpIGlzIGNyYWZ0ZWQgYnkgYSB1c2VyLlxuMi4gIFRoZSBwYWNrZXQgYnlwYXNzZXMgYSBsZW5ndGggY2hlY2suXG4zLiAgVGhlIHBhY2tldCBjYWxscyBgZXRoX3R5cGVfdHJhbnNgLCB3aGVyZSBpdCBpcyBoYW5kbGVkIHdpdGhvdXQgc3VmZmljaWVudCBsZW5ndGggdmFsaWRhdGlvbi5cbjQuICBUaGUgcGFja2V0cyBlbmQgdXAgY2FsbGluZyBgc2tiX3B1bGxfaW5saW5lYC5cbjUuICBVbmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIGZyb20gdGhlIGBTS0JgIGRhdGEgYnVmZmVyIHdoZW4gYGV0aC1cdTAwM2VoX3Byb3RvYCBpcyByZWFkLlxuNi4gIFRoZSB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyB0aGVuIGNvcGllZCB0byB0aGUgYHNrYi1cdTAwM2Vwcm90b2NvbGAgZmllbGQuXG43LiAgVGhlIHBhY2tldCBpcyByZWNlaXZlZCBieSBhbm90aGVyIGBBRl9QQUNLRVRgIHNvY2tldC5cbjguICBUaGUgYHNrYi1cdTAwM2Vwcm90b2NvbGAgZmllbGQgaXMgY29waWVkIHRvIGBzbGwtXHUwMDNlc2xsX3Byb3RvY29sYC5cbjkuICBUaGUgYHNsbC1cdTAwM2VzbGxfcHJvdG9jb2xgIGZpZWxkIGlzIGxlYWtlZCB0byB1c2Vyc3BhY2UuXG4xMC4gVGhlIHJlc3VsdCBpcyBhIGtlcm5lbC10by11c2VyIGluZm8tbGVhayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhpcyBwYXRjaCwgc3BlY2lmaWNhbGx5IGJ5IGRyb3BwaW5nIHRoZSBzaG9ydCBsaW5lYXIgcGFja2V0LCBmaXhlcyBhIHNlcmlvdXMgaXNzdWUuXG5cbkkgY2FuIGNvbmZpcm0gdGhhdCB0aGUgYHNrYi1cdTAwM2Vwcm90b2NvbGAgdmFsdWUgKmlzKiBpbmRlZWQgbGVha2VkIHRvIHVzZXIgc3BhY2UsIHByb3ZpZGluZyBhIHJlcHJvZHVjaWJsZSBhbmQgZXhwbG9pdGFibGUga2VybmVsIGluZm8tbGVhay4gVGhlIGBzb2NrYWRkcl9sbGAgc3RydWN0dXJlIGFuZCBpdHMgY29udGVudHMsIGluY2x1ZGluZyB0aGUgbm93LWNvbXByb21pc2VkIGBzbGwtXHUwMDNlc2xsX3Byb3RvY29sYCwgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLlxuXG5JbiBzdW1tYXJ5OiBJIHNlZSBgTmVlZHNLTVNBTiA9IHRydWVgLiBUaGlzIHBhdGNoIGZpeGVzIGEgdnVsbmVyYWJpbGl0eSB0aGF0IGlzIG9ubHkgZGV0ZWN0ZWQgYnkgS01TQU4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwMzExLCJPdXRwdXRUb2tlbnMiOjQ2NiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxNDUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QxMzowMzoyOC4yMDI1MDYwNDFaIiwiU2VxIjo1OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODA2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBsZW5ndGggY2hlY2sgYHNrYl9oZWFkbGVuKHNrYikgXFx1MDAzYyBFVEhfSExFTmAgaW4gYGV0aF90eXBlX3RyYW5zKClgIHRvIHByZXZlbnQgcHJvY2Vzc2luZyBwYWNrZXRzIHdpdGggYSBsaW5lYXIgcGFydCBzaG9ydGVyIHRoYW4gdGhlIEV0aGVybmV0IGhlYWRlciAoMTQgYnl0ZXMpLiBcXG5cXG5XaXRob3V0IHRoaXMgY2hlY2ssIGlmIGEgdXNlciBpbmplY3RzIGEgc2hvcnQgbGluZWFyIHBhY2tldCAoZS5nLiwgMTAgYnl0ZXMpIHZpYSBhIFRVTi9UQVAgZGV2aWNlIG9yIGFuIEFGX1BBQ0tFVCByYXcgc29ja2V0LCBgZXRoX3R5cGVfdHJhbnMoKWAgY2FsbHMgYGV0aF9za2JfcHVsbF9tYWMoKWAuIGBldGhfc2tiX3B1bGxfbWFjKClgIGNhbGxzIGBza2JfcHVsbF9pbmxpbmUoc2tiLCBFVEhfSExFTilgLiBJZiBgc2tiLVxcdTAwM2VsZW4gXFx1MDAzYyBFVEhfSExFTmAsIGBza2JfcHVsbF9pbmxpbmUoKWAgZmFpbHMgYW5kIHJldHVybnMgYE5VTExgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgYEJVR19PTmAgb3IgY3Jhc2guIGBldGhfc2tiX3B1bGxfbWFjKClgIGlnbm9yZXMgdGhpcyByZXR1cm4gdmFsdWUgYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIGBza2ItXFx1MDAzZWRhdGFgIHBvaW50ZXIuXFxuXFxuYGV0aF90eXBlX3RyYW5zKClgIHRoZW4gcmVhZHMgYGV0aC1cXHUwMDNlaF9wcm90b2AgYXQgb2Zmc2V0IDEyLiBCZWNhdXNlIHRoZSBza2IgZGF0YSBidWZmZXIgaXMgdHlwaWNhbGx5IGFsbG9jYXRlZCB3aXRoIGEgbXVjaCBsYXJnZXIgc2l6ZSAoZS5nLiwgdmlhIGBrbWFsbG9jYCksIHRoaXMgcmVhZCBpcyB3ZWxsIHdpdGhpbiB0aGUgYWxsb2NhdGlvbiBib3VuZHMuIFRoZXJlZm9yZSwgS0FTQU4gd2lsbCBOT1QgZGV0ZWN0IGl0IGFzIGFuIG91dC1vZi1ib3VuZHMgcmVhZC5cXG5cXG5Ib3dldmVyLCB0aGUgbWVtb3J5IGJleW9uZCB0aGUgdXNlci1wcm92aWRlZCAxMCBieXRlcyBpcyB1bmluaXRpYWxpemVkLiBLTVNBTiB3aWxsIGRldGVjdCB0aGlzIGFzIGEgcmVhZCBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRnVydGhlcm1vcmUsIHRoaXMgdW5pbml0aWFsaXplZCB2YWx1ZSBpcyBzdG9yZWQgaW4gYHNrYi1cXHUwMDNlcHJvdG9jb2xgLiBJZiB0aGUgcGFja2V0IGlzIGxhdGVyIHJlY2VpdmVkIGJ5IGFuIEFGX1BBQ0tFVCBzb2NrZXQsIGBza2ItXFx1MDAzZXByb3RvY29sYCBpcyBjb3BpZWQgdG8gYHNsbF9wcm90b2NvbGAgaW4gdGhlIGBzb2NrYWRkcl9sbGAgc3RydWN0dXJlIGFuZCByZXR1cm5lZCB0byB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZygpYC4gVGhpcyBjb25zdGl0dXRlcyBhIGRpcmVjdCBrZXJuZWwtdG8tdXNlciBpbmZvLWxlYWsgb2YgMiBieXRlcyBvZiB1bmluaXRpYWxpemVkIGtlcm5lbCBtZW1vcnkuXFxuXFxuU2luY2UgdGhpcyBpc3N1ZSBkb2VzIG5vdCBjYXVzZSBhIGNyYXNoLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdHJpZ2dlciBhIGBCVUdfT05gIGZvciBsaW5lYXIgcGFja2V0cywgaXQgY2FuIE9OTFkgYmUgZGV0ZWN0ZWQgYnkgS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIGhpZ2hseSBqdXN0aWZpZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbGVuZ3RoIGNoZWNrIGBza2JfaGVhZGxlbihza2IpIFxcdTAwM2MgRVRIX0hMRU5gIGluIGBldGhfdHlwZV90cmFucygpYCB0byBwcmV2ZW50IHByb2Nlc3NpbmcgcGFja2V0cyB3aXRoIGEgbGluZWFyIHBhcnQgc2hvcnRlciB0aGFuIHRoZSBFdGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKS4gXFxuXFxuV2l0aG91dCB0aGlzIGNoZWNrLCBpZiBhIHVzZXIgaW5qZWN0cyBhIHNob3J0IGxpbmVhciBwYWNrZXQgKGUuZy4sIDEwIGJ5dGVzKSB2aWEgYSBUVU4vVEFQIGRldmljZSBvciBhbiBBRl9QQUNLRVQgcmF3IHNvY2tldCwgYGV0aF90eXBlX3RyYW5zKClgIGNhbGxzIGBldGhfc2tiX3B1bGxfbWFjKClgLiBgZXRoX3NrYl9wdWxsX21hYygpYCBjYWxscyBgc2tiX3B1bGxfaW5saW5lKHNrYiwgRVRIX0hMRU4pYC4gSWYgYHNrYi1cXHUwMDNlbGVuIFxcdTAwM2MgRVRIX0hMRU5gLCBgc2tiX3B1bGxfaW5saW5lKClgIGZhaWxzIGFuZCByZXR1cm5zIGBOVUxMYCB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGBCVUdfT05gIG9yIGNyYXNoLiBgZXRoX3NrYl9wdWxsX21hYygpYCBpZ25vcmVzIHRoaXMgcmV0dXJuIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBgc2tiLVxcdTAwM2VkYXRhYCBwb2ludGVyLlxcblxcbmBldGhfdHlwZV90cmFucygpYCB0aGVuIHJlYWRzIGBldGgtXFx1MDAzZWhfcHJvdG9gIGF0IG9mZnNldCAxMi4gQmVjYXVzZSB0aGUgc2tiIGRhdGEgYnVmZmVyIGlzIHR5cGljYWxseSBhbGxvY2F0ZWQgd2l0aCBhIG11Y2ggbGFyZ2VyIHNpemUgKGUuZy4sIHZpYSBga21hbGxvY2ApLCB0aGlzIHJlYWQgaXMgd2VsbCB3aXRoaW4gdGhlIGFsbG9jYXRpb24gYm91bmRzLiBUaGVyZWZvcmUsIEtBU0FOIHdpbGwgTk9UIGRldGVjdCBpdCBhcyBhbiBvdXQtb2YtYm91bmRzIHJlYWQuXFxuXFxuSG93ZXZlciwgdGhlIG1lbW9yeSBiZXlvbmQgdGhlIHVzZXItcHJvdmlkZWQgMTAgYnl0ZXMgaXMgdW5pbml0aWFsaXplZC4gS01TQU4gd2lsbCBkZXRlY3QgdGhpcyBhcyBhIHJlYWQgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZ1cnRoZXJtb3JlLCB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUgaXMgc3RvcmVkIGluIGBza2ItXFx1MDAzZXByb3RvY29sYC4gSWYgdGhlIHBhY2tldCBpcyBsYXRlciByZWNlaXZlZCBieSBhbiBBRl9QQUNLRVQgc29ja2V0LCBgc2tiLVxcdTAwM2Vwcm90b2NvbGAgaXMgY29waWVkIHRvIGBzbGxfcHJvdG9jb2xgIGluIHRoZSBgc29ja2FkZHJfbGxgIHN0cnVjdHVyZSBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZSB2aWEgYHJlY3Ztc2coKWAuIFRoaXMgY29uc3RpdHV0ZXMgYSBkaXJlY3Qga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrIG9mIDIgYnl0ZXMgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LlxcblxcblNpbmNlIHRoaXMgaXNzdWUgZG9lcyBub3QgY2F1c2UgYSBjcmFzaCwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIHRyaWdnZXIgYSBgQlVHX09OYCBmb3IgbGluZWFyIHBhY2tldHMsIGl0IGNhbiBPTkxZIGJlIGRldGVjdGVkIGJ5IEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBoaWdobHkganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflow7pzhd[1] Phase: Succeeded StartedAt: 2026-08-07 13:03:43 +0000 UTC FinishedAt: 2026-08-07 13:03:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-07 13:03:43 +0000 UTC FinishedAt: 2026-08-07 13:03:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2] Phase: Running StartedAt: 2026-08-07 13:03:43 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN) Phase: Running StartedAt: 2026-08-07 13:03:43 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-07 13:03:43 +0000 UTC FinishedAt: 2026-08-07 13:03:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-07 13:03:43 +0000 UTC FinishedAt: 2026-08-07 13:03:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.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-workflow7pzhd/series-workflow7pzhd-convert-artifact-2810459750/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN) Phase: Failed StartedAt: 2026-08-07 13:03:43 +0000 UTC FinishedAt: 2026-08-07 14:53:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},"retest":null,"track":"KMSAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[0] Phase: Succeeded StartedAt: 2026-08-07 13:03:43 +0000 UTC FinishedAt: 2026-08-07 13:03:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-07 13:03:43 +0000 UTC FinishedAt: 2026-08-07 13:03:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.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-workflow7pzhd/series-workflow7pzhd-convert-artifact-1806618353/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-07 13:03:53 +0000 UTC FinishedAt: 2026-08-07 13:23:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-07 13:03:53 +0000 UTC FinishedAt: 2026-08-07 13:23:08 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*091a8bc2-bb82-42f2-bd38-bb2e038367eb,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-workflow7pzhd/series-workflow7pzhd-convert-artifact-2810459750/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": "030bd1e1-1b8e-4e3c-a357-3b28e4dfcf5d", "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-workflow7pzhd/series-workflow7pzhd-build-action-2139411964/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-07 13:03:53 +0000 UTC FinishedAt: 2026-08-07 13:22:59 +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:*091a8bc2-bb82-42f2-bd38-bb2e038367eb,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-workflow7pzhd/series-workflow7pzhd-convert-artifact-2810459750/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": "030bd1e1-1b8e-4e3c-a357-3b28e4dfcf5d", "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-workflow7pzhd/series-workflow7pzhd-build-action-2139411964/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[1] Phase: Succeeded StartedAt: 2026-08-07 13:03:54 +0000 UTC FinishedAt: 2026-08-07 13:22:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-07 13:03:54 +0000 UTC FinishedAt: 2026-08-07 13:22:08 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KMSAN] 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:*091a8bc2-bb82-42f2-bd38-bb2e038367eb,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-workflow7pzhd/series-workflow7pzhd-convert-artifact-1806618353/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": "18253285-99b6-4359-84da-4529a994b9cd", "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-workflow7pzhd/series-workflow7pzhd-build-action-2551810335/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-07 13:03:54 +0000 UTC FinishedAt: 2026-08-07 13:21:58 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KMSAN] 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:*091a8bc2-bb82-42f2-bd38-bb2e038367eb,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-workflow7pzhd/series-workflow7pzhd-convert-artifact-1806618353/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": "18253285-99b6-4359-84da-4529a994b9cd", "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-workflow7pzhd/series-workflow7pzhd-build-action-2551810335/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[2] Phase: Succeeded StartedAt: 2026-08-07 13:22:08 +0000 UTC FinishedAt: 2026-08-07 13:22:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-07 13:22:08 +0000 UTC FinishedAt: 2026-08-07 13:22:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[3] Phase: Succeeded StartedAt: 2026-08-07 13:22:08 +0000 UTC FinishedAt: 2026-08-07 13:22:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-07 13:22:08 +0000 UTC FinishedAt: 2026-08-07 13:22:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.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-workflow7pzhd/series-workflow7pzhd-convert-artifact-294048068/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[4] Phase: Succeeded StartedAt: 2026-08-07 13:22:19 +0000 UTC FinishedAt: 2026-08-07 14:53:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-07 13:22:19 +0000 UTC FinishedAt: 2026-08-07 14:53:01 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*18253285-99b6-4359-84da-4529a994b9cd,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:*[KMSAN] 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-workflow7pzhd/series-workflow7pzhd-build-action-2551810335/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": false },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-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-07 13:23:08 +0000 UTC FinishedAt: 2026-08-07 13:23:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-07 13:23:08 +0000 UTC FinishedAt: 2026-08-07 13:23:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-07 13:23:08 +0000 UTC FinishedAt: 2026-08-07 13:23:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-07 13:23:08 +0000 UTC FinishedAt: 2026-08-07 13:23:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.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-workflow7pzhd/series-workflow7pzhd-convert-artifact-72964793/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-07 13:23:18 +0000 UTC FinishedAt: 2026-08-07 13:25:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-07 13:23:18 +0000 UTC FinishedAt: 2026-08-07 13:25:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*030bd1e1-1b8e-4e3c-a357-3b28e4dfcf5d,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-workflow7pzhd/series-workflow7pzhd-build-action-2139411964/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-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-07 13:25:17 +0000 UTC FinishedAt: 2026-08-07 13:25:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-07 13:25:17 +0000 UTC FinishedAt: 2026-08-07 13:25:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-07 13:25:17 +0000 UTC FinishedAt: 2026-08-07 13:45:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-07 13:25:17 +0000 UTC FinishedAt: 2026-08-07 13:45:03 +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:*091a8bc2-bb82-42f2-bd38-bb2e038367eb,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-workflow7pzhd/series-workflow7pzhd-convert-artifact-72964793/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": "c77a997b-9d62-4730-b83c-c847ca447c11", "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-workflow7pzhd/series-workflow7pzhd-build-action-3373609877/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-07 13:25:17 +0000 UTC FinishedAt: 2026-08-07 13:44:53 +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:*091a8bc2-bb82-42f2-bd38-bb2e038367eb,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-workflow7pzhd/series-workflow7pzhd-convert-artifact-72964793/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": "c77a997b-9d62-4730-b83c-c847ca447c11", "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-workflow7pzhd/series-workflow7pzhd-build-action-3373609877/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-07 13:45:03 +0000 UTC FinishedAt: 2026-08-07 13:45:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-07 13:45:03 +0000 UTC FinishedAt: 2026-08-07 13:45:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-07 13:45:03 +0000 UTC FinishedAt: 2026-08-07 13:46:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-07 13:45:03 +0000 UTC FinishedAt: 2026-08-07 13:46:46 +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:*c77a997b-9d62-4730-b83c-c847ca447c11,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-workflow7pzhd/series-workflow7pzhd-build-action-3373609877/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-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[10] Phase: Running StartedAt: 2026-08-07 13:46:56 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Running StartedAt: 2026-08-07 13:46:56 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +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":[],"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:*030bd1e1-1b8e-4e3c-a357-3b28e4dfcf5d,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*c77a997b-9d62-4730-b83c-c847ca447c11,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-workflow7pzhd/series-workflow7pzhd-build-action-2139411964/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-workflow7pzhd/series-workflow7pzhd-build-action-3373609877/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-07 13:46:56 +0000 UTC FinishedAt: 2026-08-07 13:47:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-07 13:46:56 +0000 UTC FinishedAt: 2026-08-07 13:47:02 +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":[],"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-workflow7pzhd/series-workflow7pzhd-convert-artifact-2036978734/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-07 13:46:56 +0000 UTC FinishedAt: 2026-08-07 13:46:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-07 13:46:56 +0000 UTC FinishedAt: 2026-08-07 13:46:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-07 13:46:56 +0000 UTC FinishedAt: 2026-08-07 13:46:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Running StartedAt: 2026-08-07 13:47:06 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-apparmor-kasan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-07 13:47:06 +0000 UTC FinishedAt: 2026-08-07 16:50:42 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*030bd1e1-1b8e-4e3c-a357-3b28e4dfcf5d,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*c77a997b-9d62-4730-b83c-c847ca447c11,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-workflow7pzhd/series-workflow7pzhd-build-action-2139411964/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-workflow7pzhd/series-workflow7pzhd-build-action-3373609877/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-workflow7pzhd/series-workflow7pzhd-convert-artifact-2036978734/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,} --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[5] Phase: Failed StartedAt: 2026-08-07 14:53:11 +0000 UTC FinishedAt: 2026-08-07 14:53:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflow7pzhd[2].run-process-target(1:base:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":[],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"4fa4977a0d900f936bcae5cd2c510be5554e8dd6","config_name":"upstream-kmsan.config","series_id":"e1de1dc2-9608-48e4-bb80-466bf033e3fe","tree_name":"net-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git"},retest:null,track:KMSAN)[5].abort-if-base-boot-failed Phase: Failed StartedAt: 2026-08-07 14:53:11 +0000 UTC FinishedAt: 2026-08-07 14:53:19 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}