Name: series-workflowmdrx9 Phase: Succeeded StartedAt: 2026-08-21 12:25:06 +0000 UTC FinishedAt: 2026-08-21 16:46:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[0] Phase: Succeeded StartedAt: 2026-08-21 12:25:06 +0000 UTC FinishedAt: 2026-08-21 12:57:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[0].run-triage Phase: Succeeded StartedAt: 2026-08-21 12:25:06 +0000 UTC FinishedAt: 2026-08-21 12:57:09 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "55ab7e14222e5f0b0fd9f7711ca391d2924b35e3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FUNCTION_TRACER", "FUNCTION_GRAPH_TRACER" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "55ab7e14222e5f0b0fd9f7711ca391d2924b35e3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FUNCTION_TRACER", "FUNCTION_GRAPH_TRACER" ], "series_id": "3596507b-cc8d-4da1-aa5b-42ea601545d2" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVTkNUSU9OX1RSQUNFUiYjMzQ7LAogICAgJiMzNDtGVU5DVElPTl9HUkFQSF9UUkFDRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb3ZlcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgZWFybGllciBpbiBgY29weV9wcm9jZXNzKClgIHRvIHByZXZlbnQgYSB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIGJ1Zy4gV2hlbiBhIG5ldyB0YXNrIGlzIGNyZWF0ZWQsIGBkdXBfdGFza19zdHJ1Y3QoKWAgY29waWVzIHRoZSBwYXJlbnQmIzM5O3MgYHRhc2tfc3RydWN0YCB0byB0aGUgY2hpbGQsIGluY2x1ZGluZyB0aGUgYHJldF9zdGFja2AgcG9pbnRlciB1c2VkIGJ5IGZ0cmFjZS4gSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBgY29weV9wcm9jZXNzKClgIChlLmcuLCBpbiBgY29weV9leGVjX3N0YXRlKClgKSBiZWZvcmUgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKWAgaXMgY2FsbGVkLCB0aGUgZXJyb3IgaGFuZGxpbmcgcGF0aCAoYGJhZF9mb3JrX2ZyZWVgKSB3aWxsIGNhbGwgYGZyZWVfdGFzaygpYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYC4gU2luY2UgdGhlIGNoaWxkJiMzOTtzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYCB3aWxsIGVycm9uZW91c2x5IGZyZWUgdGhlIHBhcmVudCYjMzk7cyBgcmV0X3N0YWNrYC4gVGhlIHBhcmVudCB0YXNrIHdpbGwgdGhlbiBjb250aW51ZSB0byB1c2UgdGhlIGZyZWVkIGByZXRfc3RhY2tgLCByZXN1bHRpbmcgaW4gYSB1c2UtYWZ0ZXItZnJlZSwgYW5kIGl0IHdpbGwgYmUgZG91YmxlLWZyZWVkIHdoZW4gdGhlIHBhcmVudCBldmVudHVhbGx5IGV4aXRzLlxuXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBvZiBjb3B5X3Byb2Nlc3MoKSBieSBtb3ZpbmcgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpIGVhcmxpZXIuIFRoZSBidWcgaXMgdHJpZ2dlcmVkIHdoZW4gY29weV9wcm9jZXNzKCkgZmFpbHMgKGUuZy4sIGluIGNvcHlfZXhlY19zdGF0ZSgpKSBhbmQgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBGdXp6aW5nIHRoaXMgcmVxdWlyZXMgZW5hYmxpbmcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSIGFuZCBGVU5DVElPTl9UUkFDRVIgdG8gZW5zdXJlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIGVycm9yIHBhdGhzIGFyZSBwcm9wZXJseSB0ZXN0ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBlMmYzZTI0MTNjZDBkMDU0YzM1MDJjZjdjMWIxNGJhY2QyYTk0ZWZlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMjEgMTI6NTQ6MTggMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmNcbmluZGV4IDFlNjg0MDRiZDc3M2UuLmNlYzgyYTY0YTA3Y2QgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvZm9yay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZm9yay5jXG5AQCAtMjEzOSw2ICYjNDM7MjEzOSw3IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXG4gXHRwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpO1xuIFx0aWYgKCFwKVxuIFx0XHRnb3RvIGZvcmtfb3V0O1xuJiM0MztcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG4gXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xuIFx0aWYgKHJldHZhbClcbiBcdFx0Z290byBiYWRfZm9ya19mcmVlO1xuQEAgLTIxNjUsOCAmIzQzOzIxNjYsNiBAQCBfX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxuIFx0ICovXG4gXHRwLVx1MDAzZWNsZWFyX2NoaWxkX3RpZCA9IChjbG9uZV9mbGFncyBcdTAwMjYgQ0xPTkVfQ0hJTERfQ0xFQVJUSUQpID8gYXJncy1cdTAwM2VjaGlsZF90aWQgOiBOVUxMO1xuIFxuLVx0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcbi1cbiBcdHJ0X211dGV4X2luaXRfdGFzayhwKTtcbiBcdHJhd19zcGluX2xvY2tfaW5pdChcdTAwMjZwLVx1MDAzZWJsb2NrZWRfbG9jayk7XG4gXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVTkNUSU9OX1RSQUNFUiYjMzQ7LAogICAgJiMzNDtGVU5DVElPTl9HUkFQSF9UUkFDRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSB1c2UtYWZ0ZXItZnJlZSBidWcgaW4gdGhlIGVycm9yIHBhdGggb2YgY29weV9wcm9jZXNzKCkgYnkgbW92aW5nIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKSBlYXJsaWVyLiBUaGUgYnVnIGlzIHRyaWdnZXJlZCB3aGVuIGNvcHlfcHJvY2VzcygpIGZhaWxzIChlLmcuLCBpbiBjb3B5X2V4ZWNfc3RhdGUoKSkgYW5kIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZC4gRnV6emluZyB0aGlzIHJlcXVpcmVzIGVuYWJsaW5nIEZVTkNUSU9OX0dSQVBIX1RSQUNFUiBhbmQgRlVOQ1RJT05fVFJBQ0VSIHRvIGVuc3VyZSB0aGUgbmV3IGluaXRpYWxpemF0aW9uIG9yZGVyIGFuZCBlcnJvciBwYXRocyBhcmUgcHJvcGVybHkgdGVzdGVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTJmM2UyNDEzY2QwZDA1NGMzNTAyY2Y3YzFiMTRiYWNkMmE5NGVmZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDIxIDEyOjU0OjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggMWU2ODQwNGJkNzczZS4uY2VjODJhNjRhMDdjZCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZm9yay5jCkBAIC0yMTM5LDYgJiM0MzsyMTM5LDcgQEAgX19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcygKIAlwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpOwogCWlmICghcCkKIAkJZ290byBmb3JrX291dDsKJiM0MzsJZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTsKIAlyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gYmFkX2ZvcmtfZnJlZTsKQEAgLTIxNjUsOCAmIzQzOzIxNjYsNiBAQCBfX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKAogCSAqLwogCXAtJmd0O2NsZWFyX2NoaWxkX3RpZCA9IChjbG9uZV9mbGFncyAmYW1wOyBDTE9ORV9DSElMRF9DTEVBUlRJRCkgPyBhcmdzLSZndDtjaGlsZF90aWQgOiBOVUxMOwogCi0JZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTsKLQogCXJ0X211dGV4X2luaXRfdGFzayhwKTsKIAlyYXdfc3Bpbl9sb2NrX2luaXQoJmFtcDtwLSZndDtibG9ja2VkX2xvY2spOwogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNzIKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgRm9yayBPcHRpbWl6YXRpb24gaW4gS2VybmVsL2ZvcmsuYyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHNlZW1zIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCB5b3Uga25vdyBob3cgaXQgZ29lcyDigJMgZXZlbiBzbWFsbCBjaGFuZ2VzIGNhbiBiZSBzaWduaWZpY2FudC4gSXQmIzM5O3MgaW4gYGtlcm5lbC9mb3JrLmNgLCBhbmQgdGhlIGtleSBoZXJlIGlzIHRoZSByZWxvY2F0aW9uIG9mIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO2AuIFRoZXkmIzM5O3ZlIG1vdmVkIGl0ICppbnNpZGUqIGBjb3B5X3Byb2Nlc3MoKWAsIHdoaWNoIGlzIGEgbGl0dGxlIHVudXN1YWwuIEl0IHdhcyBvcmlnaW5hbGx5IHBvc2l0aW9uZWQgKmFmdGVyKiB0aGUgYXNzaWdubWVudCB0byBgcC0mZ3Q7Y2xlYXJfY2hpbGRfdGlkYCwgYW5kIG5vdyBpdCYjMzk7cyBoYXBwZW5pbmcgcmlnaHQgYWZ0ZXIgdGhlIGBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7YCBjYWxsLgoKTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhpcyBpcyBsaWtlbHkgYSBzdWJ0bGUgYnVnIGZpeC4gUGVyaGFwcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agd2FzIGJlaW5nIGNhbGxlZCB0b28gbGF0ZSBpbiB0aGUgcHJvY2Vzcywgb3IgbWF5YmUgdGhlcmUgd2FzIGEgbWlzc2VkIGV4ZWN1dGlvbiBwYXRoIHRoYXQgd2FzIGluYWR2ZXJ0ZW50bHkgYnlwYXNzaW5nIGl0LiBUaGUgZmFjdCB0aGF0IHRoZSBjaGFuZ2UgaXMgc28gdGlnaHRseSBmb2N1c2VkIHN1Z2dlc3RzIHRoZXkmIzM5O3JlIHRyeWluZyB0byBhZGRyZXNzIGEgc3BlY2lmaWMsIGNvbnRhaW5lZCBpc3N1ZS4gSXQmIzM5O3MgYWxzbyBwb3NzaWJsZSB0aGF0IHRoZXJlIHdhcyBzb21lIGVycm9yIGhhbmRsaW5nIGxvZ2ljIHRoYXQgY291bGQgc2tpcCB0aGUgY2FsbCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuCgpCZWZvcmUgSSBqdW1wIHRvIGFueSBkZWZpbml0aXZlIGNvbmNsdXNpb25zLCBJIG5lZWQgdG8gZGlnIGludG8gYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGl0c2VsZi4gVGhhdCYjMzk7cyB0aGUgcmVhbCBrZXkgdG8gdW5kZXJzdGFuZGluZyAqd2h5KiB0aGlzIHNoaWZ0IHdhcyBuZWVkZWQgYW5kIHdoYXQgcG90ZW50aWFsIGltcGFjdCBpdCBoYXMgb24gdGhlIHN5c3RlbSYjMzk7cyBiZWhhdmlvci4gVGltZSB0byBkZWx2ZSBpbnRvIHRoZSBmdW5jdGlvbiYjMzk7cyBpbXBsZW1lbnRhdGlvbiBhbmQgdW5kZXJzdGFuZCBpdHMgaW50ZXJhY3Rpb25zIHdpdGhpbiB0aGUgYnJvYWRlciB0cmFjaW5nIGZyYW1ld29yay4gVGhpcyBtaW5vciBjaGFuZ2UgaGFzIHBpcXVlZCBteSBpbnRlcmVzdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmdHJhY2VfZ3JhcGhfaW5pdF90YXNrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2ZvcmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jPTIwMTg9X19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2Vzcyhcbi0tXG5rZXJuZWwvZm9yay5jLTIxNDEtXHRcdGdvdG8gZm9ya19vdXQ7XG5rZXJuZWwvZm9yay5jOjIxNDI6XHRmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO1xua2VybmVsL2ZvcmsuYy0yMTQzLVx0cmV0dmFsID0gY29weV9leGVjX3N0YXRlKGNsb25lX2ZsYWdzLCBwKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjQxCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHNvbWV0aGluZyByZWxhdGVkIHRvIGZ0cmFjZSYjMzk7cyBncmFwaCB0cmFjaW5nIGluaXRpYWxpemF0aW9uLiBUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGRlZmluaXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgLiBJIG5lZWQgYSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgZ3JhcGggdHJhY2VyIGlzIHNldCB1cCBmb3IgYSBuZXdseSBjcmVhdGVkIHRhc2suIEkgc3VzcGVjdCBpdCYjMzk7bGwgaW52b2x2ZSBzZXR0aW5nIHVwIHBlci10YXNrIGRhdGEgc3RydWN0dXJlcywgY29uZmlndXJpbmcgdGhlIHRyYWNlIGJ1ZmZlciwgYW5kIGxpa2VseSBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIGdsb2JhbCBncmFwaCB0cmFjZXIgc3RhdGUuIEkmIzM5O2xsIHByb2JhYmx5IGZpbmQgc29tZSBpbnRlcmVzdGluZyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgc2NoZWR1bGVyIGhlcmUgdG9vLCBwb3NzaWJseSBob29rcyBpbnRvIHRhc2sgY3JlYXRpb24gb3IgY29udGV4dCBzd2l0Y2hlcy4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZnRyYWNlX2dyYXBoX2luaXRfdGFzayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2Z0cmFjZS5oPTEzNDI9ZXh0ZXJuIHRyYWNlX2Z1bmNfZ3JhcGhfZW50X3QgZnRyYWNlX2dyYXBoX2VudHJ5O1xuaW5jbHVkZS9saW51eC9mdHJhY2UuaC0xMzQzLVxuaW5jbHVkZS9saW51eC9mdHJhY2UuaDoxMzQ0OmV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM0NS1leHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCk7XG4tLVxuaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzU2PXN0YXRpYyBpbmxpbmUgdm9pZCB1bnBhdXNlX2dyYXBoX3RyYWNpbmcodm9pZClcbi0tXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNjMtXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNjQ6c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM2NS1zdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgfVxuLS1cbmtlcm5lbC9mb3JrLmM9MjAxOD1fX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxuLS1cbmtlcm5lbC9mb3JrLmMtMjE0MS1cdFx0Z290byBmb3JrX291dDtcbmtlcm5lbC9mb3JrLmM6MjE0MjpcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG5rZXJuZWwvZm9yay5jLTIxNDMtXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xuLS1cbmtlcm5lbC90cmFjZS9mZ3JhcGguYz0xMTMxPXZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSlcbi0tXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE1OS0vKiBBbGxvY2F0ZSBhIHJldHVybiBzdGFjayBmb3IgbmV3bHkgY3JlYXRlZCB0YXNrICovXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM6MTE2MDp2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNjEte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyOTUKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Ag4oCTIGEgcHJldHR5IHNwZWNpZmljIGZ1bmN0aW9uIG5hbWUuIEJhc2VkIG9uIGNvbnRleHQsIGl0JiMzOTtzIGxpa2VseSBpbnZvbHZlZCB3aXRoIGluaXRpYWxpemluZyBzb21ldGhpbmcgcmVsYXRlZCB0byBmdW5jdGlvbiB0cmFjaW5nLCBzcGVjaWZpY2FsbHkgdGhlIGdyYXBoIHRyYWNlci4gTXkgZ3V0IGZlZWxpbmcgaXMgaXQmIzM5O3MgaGFuZGxpbmcgdGhlIHNldHVwIGZvciBhIG5ldyB0YXNrIG9yIHByb2Nlc3MuIE5vdywgd2hlcmUgaXMgdGhpcyBmdW5jdGlvbiBkZWZpbmVkPyBBaCwgaXQmIzM5O3MgaW4gYGtlcm5lbC90cmFjZS9mZ3JhcGguY2AuIFRpbWUgdG8gZGlnIGludG8gdGhhdCBmaWxlIGFuZCBzZWUgZXhhY3RseSBob3cgaXQgd29ya3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBpbml0aWFsaXphdGlvbiBlbnRhaWxzLCB3aGF0IGRhdGEgc3RydWN0dXJlcyBpdCBtYW5pcHVsYXRlcywgYW5kIHdoYXQgaW1wbGljYXRpb25zIGl0IGhhcyBmb3IgdGhlIG92ZXJhbGwgdHJhY2luZyBtZWNoYW5pc20uIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC90cmFjZS9mZ3JhcGguYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDExNTksCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTE1OTpcdC8qIEFsbG9jYXRlIGEgcmV0dXJuIHN0YWNrIGZvciBuZXdseSBjcmVhdGVkIHRhc2sgKi9cbjExNjA6XHR2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxuMTE2MTpcdHtcbjExNjI6XHRcdC8qIE1ha2Ugc3VyZSB3ZSBkbyBub3QgdXNlIHRoZSBwYXJlbnQgcmV0X3N0YWNrICovXG4xMTYzOlx0XHR0LVx1MDAzZXJldF9zdGFjayA9IE5VTEw7XG4xMTY0Olx0XHR0LVx1MDAzZWN1cnJfcmV0X3N0YWNrID0gMDtcbjExNjU6XHRcdHQtXHUwMDNlY3Vycl9yZXRfZGVwdGggPSAtMTtcbjExNjY6XHRcbjExNjc6XHRcdGlmIChmdHJhY2VfZ3JhcGhfYWN0aXZlKSB7XG4xMTY4Olx0XHRcdHVuc2lnbmVkIGxvbmcgKnJldF9zdGFjaztcbjExNjk6XHRcbjExNzA6XHRcdFx0aWYgKFdBUk5fT05fT05DRSghZmdyYXBoX3N0YWNrX2NhY2hlcCkpXG4xMTcxOlx0XHRcdFx0cmV0dXJuO1xuMTE3MjpcdFxuMTE3MzpcdFx0XHRyZXRfc3RhY2sgPSBrbWVtX2NhY2hlX2FsbG9jKGZncmFwaF9zdGFja19jYWNoZXAsIEdGUF9LRVJORUwpO1xuMTE3NDpcdFx0XHRpZiAoIXJldF9zdGFjaylcbjExNzU6XHRcdFx0XHRyZXR1cm47XG4xMTc2Olx0XHRcdGdyYXBoX2luaXRfdGFzayh0LCByZXRfc3RhY2spO1xuMTE3NzpcdFx0fVxuMTE3ODpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzODM0CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBQYXRjaCoqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIG1vdmluZyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgdG8gYSBzbGlnaHRseSBlYXJsaWVyIHBvaW50LCBzcGVjaWZpY2FsbHkgcmlnaHQgYWZ0ZXIgYHAgPSBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7YC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhpcyBpcyBhIGRlZmVuc2l2ZSBtb3ZlLiBJdCYjMzk7cyBhbG1vc3QgY2VydGFpbmx5IHRvIGVuc3VyZSB0aGF0IGB0LSZndDtyZXRfc3RhY2sgPSBOVUxMO2AgaXMgc2V0ICpiZWZvcmUqIGFueSBwb3RlbnRpYWwgZXJyb3IgY29uZGl0aW9ucyB0aGF0IG1pZ2h0IGNhdXNlIHRoZSBzeXN0ZW0gdG8gY2FsbCBgZnJlZV90YXNrKHApYCBvciBhIHNpbWlsYXIgZnVuY3Rpb24uIElmIHRoYXQgd2FzbiYjMzk7dCBkb25lLCB0aGVyZSYjMzk7cyB0aGUgcG9zc2liaWxpdHkgdGhhdCB3ZSYjMzk7ZCB0cnkgdG8gZnJlZSB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgIGJ5IGFjY2lkZW50IGR1cmluZyBhbiBlcnJvciBwYXRoLCBiZWNhdXNlIGBkdXBfdGFza19zdHJ1Y3RgIGNvcGllcyB0aGF0LgoKSG9sZCBvbiwgKnJpZ2h0KiwgYGR1cF90YXNrX3N0cnVjdGAgZG9lcyBhIGZ1bGwgY29weSBvZiB0aGUgZW50aXJlIGB0YXNrX3N0cnVjdGAuIFRoYXQgbWVhbnMgaWYgdGhlIHBhcmVudCB0YXNrIGhhcyBgcmV0X3N0YWNrYCBhbGxvY2F0ZWQsIHRoZSBjaGlsZCB0YXNrIHdpbGwgaW5pdGlhbGx5IHBvaW50IHRvICp0aGUgc2FtZSBtZW1vcnkgbG9jYXRpb24qLiBTbywgaWYgYW4gZXJyb3IgaGFwcGVucyAqYmVmb3JlKiBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgcnVucywgZm9yIGluc3RhbmNlLCBpbiBgY29weV9leGVjX3N0YXRlYCwgdGhlIGNoaWxkIHRhc2sgY291bGQgZ2V0IGZyZWVkLiBBbmQgaWYgaXQgZG9lcywgaXRzIGByZXRfc3RhY2tgIHBvaW50ZXIgKHdoaWNoIGlzIGFjdHVhbGx5IHRoZSBwYXJlbnQmIzM5O3MhKSBjb3VsZCBiZSBmcmVlZCBvciBjb3JydXB0ZWQsIHdoaWNoIHdvdWxkIGJlIGRpc2FzdHJvdXMuCgpXYWl0IGEgc2Vjb25kLi4uIGlzbiYjMzk7dCBgZnJlZV90YXNrYCBzdXBwb3NlZCB0byBjYWxsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHQpYD8gSWYgdGhhdCYjMzk7cyB0aGUgY2FzZSwgdGhlbiB0aGlzIGNoYW5nZSBtaWdodCBub3QgZXZlbiBiZSBuZWNlc3NhcnkuIExldCBtZSBxdWlja2x5IGNoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AgYW5kIHNlZSBpZiBpdCBkZWFscyB3aXRoIHRoaXMgc2NlbmFyaW8uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2Z0cmFjZV9ncmFwaF9leGl0X3Rhc2smIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzQ0PWV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcbmluY2x1ZGUvbGludXgvZnRyYWNlLmg6MTM0NTpleHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCk7XG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNDYtZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSk7XG4tLVxuaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzY0PXN0YXRpYyBpbmxpbmUgdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkgeyB9XG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNjU6c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM2Ni1zdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSkgeyB9XG4tLVxua2VybmVsL2ZvcmsuYz01MzM9dm9pZCBmcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxua2VybmVsL2ZvcmsuYy01NTUtXHRydF9tdXRleF9kZWJ1Z190YXNrX2ZyZWUodHNrKTtcbmtlcm5lbC9mb3JrLmM6NTU2Olx0ZnRyYWNlX2dyYXBoX2V4aXRfdGFzayh0c2spO1xua2VybmVsL2ZvcmsuYy01NTctXHRhcmNoX3JlbGVhc2VfdGFza19zdHJ1Y3QodHNrKTtcbi0tXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM9MTE2MD12b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxuLS1cbmtlcm5lbC90cmFjZS9mZ3JhcGguYy0xMTc5LVxua2VybmVsL3RyYWNlL2ZncmFwaC5jOjExODA6dm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcbmtlcm5lbC90cmFjZS9mZ3JhcGguYy0xMTgxLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDg2MwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSYjMzk7cmUgbXkgb3duOgoKKipBbmFseXppbmcgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgKioKCkFscmlnaHQsIGxldCYjMzk7cyB0YWtlIGEgbG9vayBhdCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AuIE15IGluaXRpYWwgdGhvdWdodCBpcywgd2hhdCBzcGVjaWZpY2FsbHkgZG9lcyB0aGlzIGZ1bmN0aW9uIHJlcHJlc2VudCB3aXRoaW4gdGhlIGZ0cmFjZSBmcmFtZXdvcms/IEl0JiMzOTtzIGNsZWFybHkgdGllZCB0byB0YXNrIGV4aXQgZXZlbnRzLCBiYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24uIE15IGltbWVkaWF0ZSBxdWVzdGlvbnMgYXJlOiBob3cgZG9lcyBpdCBmaXQgaW50byB0aGUgYnJvYWRlciB0cmFjaW5nIHBpY3R1cmU/IElzIHRoaXMgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIGNsZWFudXAsIGJvb2trZWVwaW5nLCBkYXRhIGFnZ3JlZ2F0aW9uLCBvciBwZXJoYXBzIHNvbWUga2luZCBvZiBub3RpZmljYXRpb24gcmVsYXRlZCB0byB0aGUgdGVybWluYXRpb24gb2YgYSB0cmFjZWQgdGFzaz8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIEkgbmVlZCB0byBjb25zaWRlcj8gS25vd2luZyB0aGUgc3BlY2lmaWNzIG9mIHRoZSBrZXJuZWwmIzM5O3MgdHJhY2luZyBkZXNpZ24sIEkmIzM5O20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgd2hlcmUgdGhpcyBmdW5jdGlvbiBzaXRzIGluIHRoZSBleGVjdXRpb24gcGF0aCB3aGVuIGEgcHJvY2VzcyBleGl0cyB3aGlsZSBiZWluZyB0cmFjZWQuIEkgd29uZGVyIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgdGhpczsgaXMgaXQgb25seSBkdXJpbmcgYSAmIzM0O25vcm1hbCYjMzQ7IGV4aXQgb3IgYWxzbyBmb3IgYWJub3JtYWwgdGVybWluYXRpb25zIGxpa2Ugc2lnbmFscz8gVGhlIGludGVycGxheSB3aXRoIG90aGVyIGZ0cmFjZSBncmFwaCBmdW5jdGlvbnMgaXMga2V5IGhlcmUuIEkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gY2hlY2sgZm9yIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgbG9ja2luZyBtZWNoYW5pc21zIHRoYXQgcHJvdGVjdCBzaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzLiBUaGlzIG9uZSBpcyBnb2luZyB0byBiZSBpbXBvcnRhbnQgaW4gdGVybXMgb2YgaG93IHRoZSB0cmFjZWQgdGFzayBleGl0cy4gVGhpcyBmdW5jdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvdmlkZSBpbnNpZ2h0IGludG8gdHJhY2UgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvdHJhY2UvZmdyYXBoLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExODA6XHR2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxuMTE4MTpcdHtcbjExODI6XHRcdHVuc2lnbmVkIGxvbmcgKnJldF9zdGFjayA9IHQtXHUwMDNlcmV0X3N0YWNrO1xuMTE4MzpcdFxuMTE4NDpcdFx0dC1cdTAwM2VyZXRfc3RhY2sgPSBOVUxMO1xuMTE4NTpcdFx0LyogTlVMTCBtdXN0IGJlY29tZSB2aXNpYmxlIHRvIElSUXMgYmVmb3JlIHdlIGZyZWUgaXQ6ICovXG4xMTg2Olx0XHRiYXJyaWVyKCk7XG4xMTg3Olx0XG4xMTg4Olx0XHRpZiAocmV0X3N0YWNrKSB7XG4xMTg5Olx0XHRcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxuMTE5MDpcdFx0XHRcdHJldHVybjtcbjExOTE6XHRcdFx0a21lbV9jYWNoZV9mcmVlKGZncmFwaF9zdGFja19jYWNoZXAsIHJldF9zdGFjayk7XG4xMTkyOlx0XHR9XG4xMTkzOlx0fVxuMTE5NDpcdFxuMTE5NTpcdCNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0VcbjExOTY6XHRzdGF0aWMgaW50IGZncmFwaF9waWRfZnVuYyhzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudCAqdHJhY2UsXG4xMTk3Olx0XHRcdFx0ICAgc3RydWN0IGZncmFwaF9vcHMgKmdvcHMsXG4xMTk4Olx0XHRcdFx0ICAgc3RydWN0IGZ0cmFjZV9yZWdzICpmcmVncylcbjExOTk6XHR7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU0ODQKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiA1ODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgS2VybmVsIEJ1ZyBGaXg6IFdvcnRoIEZ1enppbmc/KioKCk9rYXksIHNvIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCAqZG9lcyogZnJlZSBgdC0mZ3Q7cmV0X3N0YWNrYC4gVGhhdCYjMzk7cyB0aGUgc3RhcnRpbmcgcG9pbnQuIEFuZCBpZiBgY29weV9wcm9jZXNzYCBmYWlscyAqYmVmb3JlKiBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgZ2V0cyBjYWxsZWQsIGBmcmVlX3Rhc2socClgIGtpY2tzIGluLiBTaW5jZSBgcGAgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgdGFzaywgaXRzIGByZXRfc3RhY2tgIHdpbGwgcG9pbnQgdG8gdGhlIHNhbWUgbWVtb3J5IGFzIHRoZSBwYXJlbnQgdGFzay4gTm93LCBoZXJlJiMzOTtzIHRoZSBraWNrZXI6IGBmcmVlX3Rhc2socClgIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHApYCwgYW5kICp0aGF0KiBmcmVlcyB0aGUgKnBhcmVudCYjMzk7cyogYHJldF9zdGFja2AhIENsYXNzaWMgdXNlLWFmdGVyLWZyZWUuCgpUaGUgZml4IG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCB0byBoYXBwZW4gaW1tZWRpYXRlbHkgYWZ0ZXIgYGR1cF90YXNrX3N0cnVjdGAgdG8gYXZvaWQgdGhpcy4gU2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgZml4aW5nIGEgY29uZGl0aW9uIHdoZXJlIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZCAqYW5kKiBgY29weV9wcm9jZXNzYCBmYWlscyBlYXJseS4KClNvLCBpcyB0aGlzIHdvcnRoIGZ1enppbmc/IFRoYXQmIzM5O3MgdGhlIHF1ZXN0aW9uLiBUaGUgY29kZSBjaGFuZ2UgaXRzZWxmIGlzIG1pbmltYWw7IGp1c3QgbW92aW5nIGEgZnVuY3Rpb24gY2FsbCBhcm91bmQuIEl0ICpmaXhlcyogYSBidWcuIERvZXMgaXQgaW50cm9kdWNlIG5ldyBsb2dpYyB0aGF0IG1pZ2h0IGJlIHZ1bG5lcmFibGU/IEkgZG9uJiMzOTt0IHRoaW5rIHNvLiBJdCYjMzk7cyBqdXN0IGluaXRpYWxpemF0aW9uIG1vdmVkIGVhcmxpZXIuCgpIbW0sIGJ1dCBpZiBpdCYjMzk7cyBhIGJ1ZyBmaXgsIGRvIHRoZSBpbnN0cnVjdGlvbnMgYXBwbHk/IFRoZXkgc2F5ICYjMzQ7UmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWlucy4uLiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLiBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLi4uIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMuLi4gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoLi4uIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLi4uIERyaXZlciAucmVtb3ZlLi4uJiMzNDsgRG9lc24mIzM5O3QgZXhwbGljaXRseSBzYXkgdG8gcmV0dXJuIGZhbHNlIGZvciBzaW1wbGUgYnVnIGZpeGVzLCBidXQgdGhlIHByb21wdCBlbXBoYXNpemVzIGZ1bmN0aW9uYWwgY2hhbmdlcy4KClRoaXMgKmRvZXMqIG1vZGlmeSBgY29weV9wcm9jZXNzYCBpbiBga2VybmVsL2ZvcmsuY2AuIFRoYXQmIzM5O3MgY29yZSBrZXJuZWwgbG9naWMsIGFuZCBpdCAqaXMqIHJlYWNoYWJsZS4gQnV0IHRoZSBjaGFuZ2UgaXMganVzdCBhbiBvcmRlciBjaGFuZ2UuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgaW5zdHJ1Y3Rpb25zIHdhbnQgbWUgdG8gdmVyaWZ5IGl0JiMzOTtzIGV4ZWN1dGFibGUuCgpPa2F5LCBpZiBJICpkbyogcmV0dXJuIHRydWUgZm9yIGBXb3J0aEZ1enppbmdgLCB3aGF0IGRvIEkgcHV0IGluIGBGb2N1c1N5bWJvbHNgPyBUaGUgcHJvbXB0IHdhcm5zIGFnYWluc3QgaG90LXBhdGggZnVuY3Rpb25zLiBgY29weV9wcm9jZXNzYCBpcyBkZWZpbml0ZWx5IGhvdC1wYXRoLiBJcyB0aGVyZSBhIGxlc3MgY29tbW9uIGZ1bmN0aW9uIHRvIGZvY3VzIG9uPyBNYXliZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2A/IEJ1dCB0aGF0JiMzOTtzIHN0aWxsIGNhbGxlZCBmcm9tIGBjb3B5X3Byb2Nlc3NgLCB3aGljaCBpcyBob3QtcGF0aC4KCldhaXQgYSBzZWNvbmQsIHRoZSBidWcgKm9ubHkqIHRyaWdnZXJzIHdoZW4gZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBUaGF0JiMzOTtzIGEga2V5IGRldGFpbCEgU28gdGhlIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGNvbmZpZyBpcyBhIHByZXJlcXVpc2l0ZS4gTGV0IG1lIGNoZWNrIHRoZSBLY29uZmlnIGZvciBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgdG8gY29uZmlybSB0aGlzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC90cmFjZS9LY29uZmlnPTIzNT1jb25maWcgRlVOQ1RJT05fVFJBQ0VSXG4tLVxua2VybmVsL3RyYWNlL0tjb25maWctMjUzLVxua2VybmVsL3RyYWNlL0tjb25maWc6MjU0OmNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcbmtlcm5lbC90cmFjZS9LY29uZmlnLTI1NS1cdGJvb2wgXCYjMzQ7S2VybmVsIEZ1bmN0aW9uIEdyYXBoIFRyYWNlclwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NzYxCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHJldmlld2luZyB0aGUgS2NvbmZpZyBmb3IgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmA6CgoqKkFuYWx5emluZyB0aGUgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgS2NvbmZpZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBLY29uZmlnIGZvciBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgZGVwZW5kZW5jaWVzLCBhbmQgaW1wbGljYXRpb25zLiBJJiMzOTttIGxvb2tpbmcgZm9yIHRoZSBjb3JlIHNldHRpbmdzIHRoYXQgY29udHJvbCBpdHMgYmVoYXZpb3IsIGFueSBjb25kaXRpb25hbCBsb2dpYywgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciB0cmFjaW5nIG1lY2hhbmlzbXMuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0cnlpbmcgdG8gZGV0ZXJtaW5lOiBXaGF0IGFyZSB0aGUgYmFzZSByZXF1aXJlbWVudHMgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZT8gRG9lcyBpdCBkZXBlbmQgb24gc3BlY2lmaWMgY29tcGlsZXIgdmVyc2lvbnMgb3Iga2VybmVsIGZlYXR1cmVzPyBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRpZWQgdG8gcGFydGljdWxhciBjb25maWd1cmF0aW9ucywgZXNwZWNpYWxseSBpbiBoaWdoLWxvYWQgc2NlbmFyaW9zPyBJJiMzOTtsbCBhbHNvIGJlIHNlYXJjaGluZyBmb3IgcmVsYXRpb25zaGlwcyB0byB0aGUgYGZ0cmFjZWAgaW5mcmFzdHJ1Y3R1cmUgYW5kIGFueSBjb25mbGljdHMgd2l0aCBvdGhlciB0cmFjaW5nIGZlYXR1cmVzLiBJdCYjMzk7cyBjcnVjaWFsIHRvIGlkZW50aWZ5IHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9uIHN5c3RlbSBvdmVyaGVhZC4gTGV0JiMzOTtzIHNlZSBob3cgd2VsbCBkZWZpbmVkIHRoZSBkZXBlbmRlbmNpZXMgYXJlLCBhbmQgaWYgdGhlIGhlbHAgdGV4dCBpcyB1c2VmdWwgb3Igd2hldGhlciBpdCBpcyB2YWd1ZS4gSSBhbSBnb2luZyB0byBtYWtlIGEganVkZ2VtZW50IGNhbGwgaWYgaXQgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZCBmb3IgbXkgcHJvamVjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvdHJhY2UvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjU0Olx0Y29uZmlnIEZVTkNUSU9OX0dSQVBIX1RSQUNFUlxuIDI1NTpcdFx0Ym9vbCBcJiMzNDtLZXJuZWwgRnVuY3Rpb24gR3JhcGggVHJhY2VyXCYjMzQ7XG4gMjU2Olx0XHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXG4gMjU3Olx0XHRkZXBlbmRzIG9uIEZVTkNUSU9OX1RSQUNFUlxuIDI1ODpcdFx0ZGVwZW5kcyBvbiAhWDg2XzMyIHx8ICFDQ19PUFRJTUlaRV9GT1JfU0laRVxuIDI1OTpcdFx0ZGVmYXVsdCB5XG4gMjYwOlx0XHRoZWxwXG4gMjYxOlx0XHQgIEVuYWJsZSB0aGUga2VybmVsIHRvIHRyYWNlIGEgZnVuY3Rpb24gYXQgYm90aCBpdHMgcmV0dXJuXG4gMjYyOlx0XHQgIGFuZCBpdHMgZW50cnkuXG4gMjYzOlx0XHQgIEl0cyBmaXJzdCBwdXJwb3NlIGlzIHRvIHRyYWNlIHRoZSBkdXJhdGlvbiBvZiBmdW5jdGlvbnMgYW5kXG4gMjY0Olx0XHQgIGRyYXcgYSBjYWxsIGdyYXBoIGZvciBlYWNoIHRocmVhZCB3aXRoIHNvbWUgaW5mb3JtYXRpb24gbGlrZVxuIDI2NTpcdFx0ICB0aGUgcmV0dXJuIHZhbHVlLiBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUgY3VycmVudCByZXR1cm5cbiAyNjY6XHRcdCAgYWRkcmVzcyBvbiB0aGUgY3VycmVudCB0YXNrIHN0cnVjdHVyZSBpbnRvIGEgc3RhY2sgb2YgY2FsbHMuXG4gMjY3Olx0XG4gMjY4Olx0Y29uZmlnIEZVTkNUSU9OX0dSQVBIX1JFVFZBTFxuIDI2OTpcdFx0Ym9vbCBcJiMzNDtLZXJuZWwgRnVuY3Rpb24gR3JhcGggUmV0dXJuIFZhbHVlXCYjMzQ7XG4gMjcwOlx0XHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlJFR1NcbiAyNzE6XHRcdGRlcGVuZHMgb24gRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXG4gMjcyOlx0XHRkZWZhdWx0IG5cbiAyNzM6XHRcdGhlbHBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzM1NQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE4MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIHRoZSBgY29weV9wcm9jZXNzKClgIENoYW5nZSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2UgY29uZmlncywgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgYW5kIGBGVU5DVElPTl9UUkFDRVJgLiBUaGUgY2hhbmdlIGlzIGluIGBjb3B5X3Byb2Nlc3MoKWAsIHNwZWNpZmljYWxseSB3aGVyZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgaXMgY2FsbGVkLiBNeSBpbml0aWFsIGd1dCBmZWVsaW5nIGlzLCAmIzM0O0lzIHRoaXMgZXZlbiB3b3J0aCBmdXp6aW5nPyYjMzQ7IFRoZSBtb2RpZmljYXRpb24gaXMgd2l0aGluIGBjb3B5X3Byb2Nlc3MoKWAsIHdoaWNoIGdldHMgZXhlY3V0ZWQgb24gZXZlcnkgYGZvcmsoKWAgYW5kIGBjbG9uZSgpYC4gRXNzZW50aWFsbHksIGlmIHdlIGZ1enogdGhpcywgd2UmIzM5O3JlIHJlYWxseSBqdXN0IGZ1enppbmcgYGZvcmsoKWAgaXRzZWxmLCBidXQgd2l0aCBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYCBhY3RpdmUuIEFuZCB3ZSBhbHJlYWR5IGZ1enogYGZvcmsoKWAgcHJldHR5IGhlYXZpbHksIHJpZ2h0PwoKVGhlIGNvcmUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiBJcyB0aGVyZSBhIG1vcmUgdGFyZ2V0ZWQgZnVuY3Rpb24gb3IgYXJlYSB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYCB0aGF0JiMzOTtzIHNwZWNpZmljYWxseSB3b3J0aCBmb2N1c2luZyBvbj8gVGhlIHRyaWdnZXIgZm9yIHRoaXMgYnVnIGlzIHJlbGF0ZWQgdG8gYW4gZWFybHkgZmFpbHVyZSB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYC4gU28sIHRoZSBtb3JlIGludGVyZXN0aW5nIGF2ZW51ZSBpczogd2hhdCBjYW4gY2F1c2UgYGNvcHlfcHJvY2VzcygpYCB0byBmYWlsIGVhcmx5PyBMZXQmIzM5O3Mgem9vbSBpbiBvbiB0aGF0IHNlY3Rpb24gb2YgdGhlIGNvZGUgYmV0d2VlbiBgZHVwX3Rhc2tfc3RydWN0YCBhbmQgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIG9mIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKClgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGhhcHBlbmluZyBpbiB0aG9zZSBsaW5lcyB0aGF0IGNvdWxkIGxlYWQgdG8gYW4gZWFybHkgZXhpdCBhbmQgaG93IGl0IG1pZ2h0IGludGVyYWN0IHdpdGggdGhlIHRyYWNlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjEzOSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMTM5Olx0XHRwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpO1xuMjE0MDpcdFx0aWYgKCFwKVxuMjE0MTpcdFx0XHRnb3RvIGZvcmtfb3V0O1xuMjE0MjpcdFx0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcbjIxNDM6XHRcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XG4yMTQ0Olx0XHRpZiAocmV0dmFsKVxuMjE0NTpcdFx0XHRnb3RvIGJhZF9mb3JrX2ZyZWU7XG4yMTQ2Olx0XHRwLVx1MDAzZWZsYWdzIFx1MDAyNj0gflBGX0tUSFJFQUQ7XG4yMTQ3Olx0XHRpZiAoYXJncy1cdTAwM2VrdGhyZWFkKVxuMjE0ODpcdFx0XHRwLVx1MDAzZWZsYWdzIHw9IFBGX0tUSFJFQUQ7XG4yMTQ5Olx0XHRpZiAoYXJncy1cdTAwM2V1c2VyX3dvcmtlcikge1xuMjE1MDpcdFx0XHQvKlxuMjE1MTpcdFx0XHQgKiBNYXJrIHVzIGEgdXNlciB3b3JrZXIsIGFuZCBibG9jayBhbnkgc2lnbmFsIHRoYXQgaXNuJiMzOTt0XG4yMTUyOlx0XHRcdCAqIGZhdGFsIG9yIFNUT1BcbjIxNTM6XHRcdFx0ICovXG4yMTU0Olx0XHRcdHAtXHUwMDNlZmxhZ3MgfD0gUEZfVVNFUl9XT1JLRVI7XG4yMTU1Olx0XHRcdHNpZ2luaXRzZXRpbnYoXHUwMDI2cC1cdTAwM2VibG9ja2VkLCBzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHU1RPUCkpO1xuMjE1NjpcdFx0fVxuMjE1NzpcdFx0aWYgKGFyZ3MtXHUwMDNlaW9fdGhyZWFkKVxuMjE1ODpcdFx0XHRwLVx1MDAzZWZsYWdzIHw9IFBGX0lPX1dPUktFUjtcbjIxNTk6XHRcbjIxNjA6XHRcdGlmIChhcmdzLVx1MDAzZW5hbWUpXG4yMTYxOlx0XHRcdHN0cnNjcHlfcGFkKHAtXHUwMDNlY29tbSwgYXJncy1cdTAwM2VuYW1lLCBzaXplb2YocC1cdTAwM2Vjb21tKSk7XG4yMTYyOlx0XG4yMTYzOlx0XHRwLVx1MDAzZXNldF9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgXHUwMDI2IENMT05FX0NISUxEX1NFVFRJRCkgPyBhcmdzLVx1MDAzZWNoaWxkX3RpZCA6IE5VTEw7XG4yMTY0Olx0XHQvKlxuMjE2NTpcdFx0ICogVElEIGlzIGNsZWFyZWQgaW4gbW1fcmVsZWFzZSgpIHdoZW4gdGhlIHRhc2sgZXhpdHNcbjIxNjY6XHRcdCAqL1xuMjE2NzpcdFx0cC1cdTAwM2VjbGVhcl9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgXHUwMDI2IENMT05FX0NISUxEX0NMRUFSVElEKSA/IGFyZ3MtXHUwMDNlY2hpbGRfdGlkIDogTlVMTDtcbjIxNjg6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODM0MAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3NpbmcgYXMgYW4gZXhwZXJ0OgoKKipBbmFseXppbmcgdGhlIFBvdGVudGlhbCBJc3N1ZSBpbiBUYXNrIENsb25pbmcqKgoKUmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGR1cF90YXNrX3N0cnVjdGAgYW5kIHRoZSBvbGQgbG9jYXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIOKAkyBpbnRlcmVzdGluZy4gSXQmIzM5O3MgYWxtb3N0IGFsd2F5cyBhIGdvb2QgZXhlcmNpc2UgdG8gcmV2aXNpdCB3aGVyZSBhIGZ1bmN0aW9uIG9uY2UgbGl2ZWQsIGFuZCB3aHkgaXQgbW92ZWQuIFRoZSBjcml0aWNhbCBwb2ludCBvZiBjb25jZXJuLCB0aGUgcG90ZW50aWFsIGZhaWx1cmUgcG9pbnQgaWYgc29tZXRoaW5nIGJyZWFrcyBiZXR3ZWVuIHRoZXNlIHR3bywgc2VlbXMgdG8gYmUgYGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcClgLiBUaGF0IGxvb2tzIGxpa2UgdGhlIGN1bHByaXQuIEkgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgd2hhdCBgY29weV9leGVjX3N0YXRlYCBpcyBkb2luZy4gVGhpcyBoYXMgYWxsIHRoZSBoYWxsbWFya3Mgb2YgYSBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBpZiBub3QgZG9uZSBjb3JyZWN0bHksIHBhcnRpY3VsYXJseSBhcm91bmQgdGhlIGludGVyYWN0aW9ucyB3aXRoIGBjbG9uZV9mbGFnc2AuIEl0IGNvdWxkIGJlIHJlbGF0ZWQgdG8gc29tZSBvZiB0aGUgaXNzdWVzIEkmIzM5O3ZlIGJlZW4gc2VlaW5nIHdpdGggcHJvY2VzcyBjcmVhdGlvbiBhbmQgdHJhY2luZy4gVGltZSB0byBkaXZlIGludG8gdGhlIGNvZGUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29weV9leGVjX3N0YXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2ZvcmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jPTE1NzQ9c3RhdGljIGludCBjb3B5X21tKHU2NCBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxua2VybmVsL2ZvcmsuYy0xNjEwLVxua2VybmVsL2ZvcmsuYzoxNjExOnN0YXRpYyBpbnQgY29weV9leGVjX3N0YXRlKHU2NCBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG5rZXJuZWwvZm9yay5jLTE2MTIte1xuLS1cbmtlcm5lbC9mb3JrLmM9MjAxOD1fX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxuLS1cbmtlcm5lbC9mb3JrLmMtMjE0Mi1cdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG5rZXJuZWwvZm9yay5jOjIxNDM6XHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xua2VybmVsL2ZvcmsuYy0yMTQ0LVx0aWYgKHJldHZhbClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODgyNAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXBseSBmYW1pbGlhciB3aXRoIGNvZGUgZXhlY3V0aW9uIGFuZCBwcm9ncmFtIHN0YXRlczoKCioqQW5hbHl6aW5nIGBjb3B5X2V4ZWNfc3RhdGVgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gYGNvcHlfZXhlY19zdGF0ZWAuIFRoYXQgZnVuY3Rpb24gbmFtZSBpdHNlbGYgaXMgcHJldHR5IHRlbGxpbmcuIEl0IGltcGxpZXMgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBjcmVhdGluZyBhIHNuYXBzaG90LCBhIGR1cGxpY2F0ZSwgb2YgdGhlIHJ1bm5pbmcgZXhlY3V0aW9uIGVudmlyb25tZW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5ICp3aGF0KiBpdCYjMzk7cyBjb3B5aW5nLiBJcyBpdCB0aGUgZW50aXJlIHByb2Nlc3MgbWVtb3J5IHNwYWNlPyBKdXN0IHRoZSByZWdpc3RlciB2YWx1ZXM/IFRoZSBwcm9ncmFtIGNvdW50ZXI/IFRoZSBzdGFjaz8gVGhlIGhlYXA/IFRoZSBvcGVuIGZpbGUgZGVzY3JpcHRvcnM/CgpUaGUgaW1wbGljYXRpb25zIGFyZSBodWdlLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHRoZSAmIzM0O3N0YXRlLiYjMzQ7IEEgZnVsbCBtZW1vcnkgY29weSBpcyByZXNvdXJjZS1pbnRlbnNpdmUgYnV0IG9mZmVycyBhIHZlcnkgcHJlY2lzZSBzbmFwc2hvdC4gU2VsZWN0aXZlIGNvcHlpbmcgaXMgbW9yZSBlZmZpY2llbnQgYnV0IHJpc2tzIGxvc2luZyBjcml0aWNhbCBpbmZvcm1hdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB0byBmaWd1cmUgb3V0IHRoZSB0cmFkZS1vZmZzLgoKSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgc2NlbmFyaW9zIHdoZXJlIHlvdSBtaWdodCB1c2Ugc3VjaCBhIGZ1bmN0aW9uLiBEZWJ1Z2dpbmcgaXMgb2J2aW91cyDigJMgc2F2aW5nIGEgc3RhdGUgdG8gc3RlcCB0aHJvdWdoIGxhdGVyLiBCdXQgdGhlcmUgYXJlIG90aGVyczogcHJvY2VzcyBtaWdyYXRpb24sIGNoZWNrcG9pbnRpbmcgZm9yIGZhdWx0IHRvbGVyYW5jZSwgZXZlbiBzb21ldGhpbmcgbGlrZSBpbXBsZW1lbnRpbmcgYSB2aXJ0dWFsIG1hY2hpbmUuIEVhY2ggaGFzIGl0cyBvd24gY29uc3RyYWludHMgYW5kIGRlbWFuZHMgZm9yIHdoYXQgbmVlZHMgdG8gYmUgY29waWVkLgoKSSB3YW50IHRvIGtub3cgaWYgaXQmIzM5O3MgYSBkZWVwIGNvcHkgb3IgYSBzaGFsbG93IGNvcHkuIElmIGl0JiMzOTtzIHRoZSBsYXR0ZXIsIHRoZW4gbW9kaWZpY2F0aW9ucyB0byB0aGUgY29waWVkIHN0YXRlIHdvdWxkIGFsc28gYWZmZWN0IHRoZSBvcmlnaW5hbCBleGVjdXRpb24gc3RhdGUsIHdoaWNoIHdvdWxkIGRlZmVhdCB0aGUgcHVycG9zZS4gVGhlIGZ1bmN0aW9uIHdvdWxkIGxpa2VseSBiZSBtb3JlIGNvbXBsZXggaWYgaXQgbmVlZHMgdG8gcHJlc2VydmUgYSBjbGVhbiBzZXBhcmF0aW9uLgoKQWxzbywgaXMgaXQgdGhyZWFkLXNhZmU/IElmIHRoZSBvcmlnaW5hbCBzdGF0ZSBjYW4gY2hhbmdlIGR1cmluZyB0aGUgY29weSBwcm9jZXNzLCB0aGVyZeKAmXMgYSByaXNrIG9mIGludHJvZHVjaW5nIGluY29uc2lzdGVuY2llcy4gVGhhdCYjMzk7cyBhIGNyaXRpY2FsIGNvbnNpZGVyYXRpb24sIGVzcGVjaWFsbHkgaW4gYSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50LgpJJiMzOTttIHJlYWR5IHRvIGV4YW1pbmUgdGhlIGNvZGUuIExldCYjMzk7cyBnZXQgdG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2ZvcmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE2MTEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTYxMTpcdHN0YXRpYyBpbnQgY29weV9leGVjX3N0YXRlKHU2NCBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4xNjEyOlx0e1xuMTYxMzpcdFx0c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqZXhlY19zdGF0ZTtcbjE2MTQ6XHRcbjE2MTU6XHRcdC8qIENMT05FX1ZNIHNpYmxpbmdzIHJlZmNvdW50LXNoYXJlIHRoZSBwYXJlbnQmIzM5O3MgZXhlY19zdGF0ZS4gKi9cbjE2MTY6XHRcdGlmIChjbG9uZV9mbGFncyBcdTAwMjYgQ0xPTkVfVk0pIHtcbjE2MTc6XHRcdFx0ZXhlY19zdGF0ZSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoY3VycmVudC1cdTAwM2VleGVjX3N0YXRlLCB0cnVlKTtcbjE2MTg6XHRcdFx0cmVmY291bnRfaW5jKFx1MDAyNmV4ZWNfc3RhdGUtXHUwMDNlY291bnQpO1xuMTYxOTpcdFx0XHRyY3VfYXNzaWduX3BvaW50ZXIodHNrLVx1MDAzZWV4ZWNfc3RhdGUsIGV4ZWNfc3RhdGUpO1xuMTYyMDpcdFx0XHRyZXR1cm4gMDtcbjE2MjE6XHRcdH1cbjE2MjI6XHRcbjE2MjM6XHRcdC8qIEV2ZXJ5b25lIGVsc2UgaW5oZXJpdHMgYSBmcmVzaCBjb3B5LiAqL1xuMTYyNDpcdFx0cmV0dXJuIHRhc2tfZXhlY19zdGF0ZV9jb3B5KHRzayk7XG4xNjI1Olx0fVxuMTYyNjpcdFxuMTYyNzpcdHN0YXRpYyBpbnQgY29weV9mcyh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBib29sIHVtaClcbjE2Mjg6XHR7XG4xNjI5Olx0XHRzdHJ1Y3QgZnNfc3RydWN0ICpmcztcbjE2MzA6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTU1OAoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiBgdGFza19leGVjX3N0YXRlX2NvcHlgOgoKKipNeSBFeGFtaW5hdGlvbiBvZiBgdGFza19leGVjX3N0YXRlX2NvcHlgKioKCkFscmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCBgdGFza19leGVjX3N0YXRlX2NvcHlgLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGJyYWluIGtpY2tzIGluLCBjb25zaWRlcmluZyB3aGF0IGl0ICpzaG91bGQqIGRvLiBHaXZlbiB0aGUgbmFtZSwgaXQmIzM5O3MgY2xlYXIgdGhpcyBpcyBhYm91dCBjb3B5aW5nLCBzcGVjaWZpY2FsbHkgdGhlIGV4ZWN1dGlvbiBzdGF0ZSBvZiBhIHRhc2suIFRoZSBpbXBvcnRhbnQgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiAqd2h5KiBjb3B5IGl0PyBJcyB0aGlzIGZvciBjb250ZXh0IHN3aXRjaGluZywgY2hlY2twb2ludGluZywgcGVyaGFwcyB0aHJlYWQgY3JlYXRpb24/IE9yIG1heWJlIGVycm9yIGhhbmRsaW5nIHdoZXJlIHlvdSBuZWVkIHRvIHByZXNlcnZlIGEgc25hcHNob3Q/IFVuZGVyc3RhbmRpbmcgdGhlIHVzZSBjYXNlIHdpbGwgaW5mb3JtIHRoZSBudWFuY2VzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KCkkgc3RhcnQgcnVubmluZyB0aHJvdWdoIHRoZSBjb21tb24gZWxlbWVudHM6IEl0IGxpa2VseSBuZWVkcyB0byBoYW5kbGUgdGhlIHByb2dyYW0gY291bnRlciAoUEMpLCBzdGFjayBwb2ludGVyLCByZWdpc3RlciB2YWx1ZXMsIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgaGFyZHdhcmUgc3RhdGUgdGhhdCBkZWZpbmVzIHRoZSB0YXNrJiMzOTtzIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4gSSYjMzk7bGwgbmVlZCB0byBjb25zaWRlciB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZTsgYSBzaW1wbGUgUklTQyBtYWNoaW5lIHdpbGwgaGF2ZSBhIGRyYXN0aWNhbGx5IGRpZmZlcmVudCBzdGF0ZSBzaXplIHRoYW4gYSBjb21wbGV4IHg4NiBwcm9jZXNzb3Igd2l0aCBTSU1EIHJlZ2lzdGVycyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdHMuCgpUaGUgY29weSBpdHNlbGYgLSBob3cgaXMgaXQgZG9uZT8gSXMgdGhpcyBhIGRlZXAgY29weSwgYSBzaGFsbG93IGNvcHksIG9yIHNvbWV0aGluZyBtb3JlIG51YW5jZWQ/IE1lbW9yeSBtYW5hZ2VtZW50IGJlY29tZXMgYSBjZW50cmFsIGNvbnNpZGVyYXRpb24gaGVyZSwgZXNwZWNpYWxseSBpZiB0aGUgdGFzayBpbnZvbHZlcyBwb2ludGVycyB0byBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5LiBBIHNoYWxsb3cgY29weSwgY29weWluZyBqdXN0IHRoZSBwb2ludGVyIHZhbHVlcywgaXMgZWZmaWNpZW50LCBidXQgaXQgYWxzbyBjcmVhdGVzIHNoYXJpbmcgYW5kIHBvdGVudGlhbCBkYXRhIGNvcnJ1cHRpb24gaXNzdWVzLiBBIGRlZXAgY29weSByZXNvbHZlcyB0aGF0LCBidXQgZGVtYW5kcyBjYXJlZnVsIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBhbmQgZGFuZ2xpbmcgcG9pbnRlcnMuIFdlIG5lZWQgdG8gYmUgd2FyeSBvZiB0aGF0IG1lbW9yeSBjb3N0LCBwYXJ0aWN1bGFybHkgaWYgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBmcmVxdWVudCBjb250ZXh0IHN3aXRjaGVzIG9yIG1hc3NpdmUgYW1vdW50cyBvZiBleGVjdXRpb24gc3RhdGUuCgpGaW5hbGx5LCBJJiMzOTtsbCBzY3J1dGluaXplIHRoZSBlcnJvciBoYW5kbGluZy4gV2hhdCBoYXBwZW5zIGlmIHRoZSBjb3B5IGZhaWxzPyBXaGF0IGFyZSB0aGUgZmFpbHVyZSBtb2RlcyAoZS5nLiwgaW5zdWZmaWNpZW50IG1lbW9yeSwgaW52YWxpZCBzdGF0ZSk/IEhvdyByb2J1c3QgaXMgdGhlIGZ1bmN0aW9uIGluIHRoZSBmYWNlIG9mIHRoZXNlIHBvdGVudGlhbCBwcm9ibGVtcz8gRG9lcyBpdCByZXR1cm4gYW4gZXJyb3IgY29kZSBvciB0aHJvdyBhbiBleGNlcHRpb24/IEhvdyBpcyB0aGF0IGVycm9yIHByb3BhZ2F0ZWQgYW5kIG1hbmFnZWQ/IFRoZSBlcnJvciBoYW5kbGluZyBpcyBjcml0aWNhbCBpbiB0aGlzIGNvbnRleHQ7IGEgcG9vcmx5IGhhbmRsZWQgZmFpbHVyZSBjb3VsZCBkZXN0YWJpbGl6ZSB0aGUgZW50aXJlIHN5c3RlbS4gSSYjMzk7bGwgbmVlZCB0byBhc3Nlc3MgdGhlIGZ1bmN0aW9uJiMzOTtzIGFzc3VtcHRpb25zIGFib3V0IHRoZSBzb3VyY2UgdGFzayBzdGF0ZSDigJMgaXMgaXQgdmFsaWQsIGlzIGl0IGxvY2tlZCwgb3IgZG9lcyBpdCBvcGVyYXRlIGFzc3VtaW5nIGEgY29vcGVyYXRpdmUgb3IgcHJlZW10aXZlIHRocmVhZGluZyBtb2RlbD8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGFza19leGVjX3N0YXRlX2NvcHkmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9zY2hlZC9leGVjX3N0YXRlLmg9MjQ9c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqdGFza19leGVjX3N0YXRlX3JlcGxhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXG5pbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaC0yNS1cdFx0XHRcdFx0XHRzdHJ1Y3QgdGFza19leGVjX3N0YXRlICpleGVjX3N0YXRlKTtcbmluY2x1ZGUvbGludXgvc2NoZWQvZXhlY19zdGF0ZS5oOjI2OmludCB0YXNrX2V4ZWNfc3RhdGVfY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7XG5pbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaC0yNy12b2lkIF9faW5pdCBleGVjX3N0YXRlX2luaXQodm9pZCk7XG4tLVxua2VybmVsL2V4ZWNfc3RhdGUuYz01Mj1zdHJ1Y3QgdGFza19leGVjX3N0YXRlICp0YXNrX2V4ZWNfc3RhdGVfcmVwbGFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbi0tXG5rZXJuZWwvZXhlY19zdGF0ZS5jLTcwLSAqL1xua2VybmVsL2V4ZWNfc3RhdGUuYzo3MTppbnQgdGFza19leGVjX3N0YXRlX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG5rZXJuZWwvZXhlY19zdGF0ZS5jLTcyLXtcbi0tXG5rZXJuZWwvZm9yay5jPTE2MTE9c3RhdGljIGludCBjb3B5X2V4ZWNfc3RhdGUodTY0IGNsb25lX2ZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcbi0tXG5rZXJuZWwvZm9yay5jLTE2MjMtXHQvKiBFdmVyeW9uZSBlbHNlIGluaGVyaXRzIGEgZnJlc2ggY29weS4gKi9cbmtlcm5lbC9mb3JrLmM6MTYyNDpcdHJldHVybiB0YXNrX2V4ZWNfc3RhdGVfY29weSh0c2spO1xua2VybmVsL2ZvcmsuYy0xNjI1LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAzODcKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQW5hbHl6aW5nIGB0YXNrX2V4ZWNfc3RhdGVfY29weWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGB0YXNrX2V4ZWNfc3RhdGVfY29weWAgZnVuY3Rpb24uIE15IGZpcnN0IHRob3VnaHQgaXM6IHdoYXQgYXJlIHdlIHRyeWluZyB0byBhY2hpZXZlIGhlcmU/IEdpdmVuIHRoZSBuYW1lLCBJJiMzOTttIGltbWVkaWF0ZWx5IGV4cGVjdGluZyBpdCB0byBkZWFsIHdpdGggYSBjcnVjaWFsIHByb2Nlc3Mg4oCTIGxpa2VseSBjb3B5aW5nIHRoZSBleGVjdXRpb24gc3RhdGUgb2YgYSB0YXNrLiBUaGUgc3BlY2lmaWNzIHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE9TIGFuZCB0aGUgcnVudGltZSYjMzk7cyBhcmNoaXRlY3R1cmUsIGJ1dCB0aGUgZ2VuZXJhbCBjb25jZXB0IGlzIGNsZWFyOiBpdOKAmXMgYWJvdXQgY2FwdHVyaW5nIGEgc25hcHNob3Qgb2YgYSB0YXNrJiMzOTtzIGN1cnJlbnQgY29udGV4dC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgKmhvdyogaXQmIzM5O3MgaW1wbGVtZW50ZWQuIElzIGl0IGEgZGVlcCBjb3B5IG9yIHNoYWxsb3c/IEFyZSB3ZSB0YWxraW5nIGFib3V0IHJlZ2lzdGVycywgc3RhY2sgcG9pbnRlcnMsIG1lbW9yeSBtYXBzLCBtYXliZSBldmVuIHByb2Nlc3NvciBmbGFncz8gVGhlIGRldmlsIGlzIGluIHRoZSBkZXRhaWxzLCBhbmQgdGhvc2UgZGV0YWlscyBhcmUgd2hhdOKAmWxsIHRlbGwgbWUgaWYgaXTigJlzIGVmZmljaWVudCwgc2FmZSwgYW5kIGhhbmRsZXMgYWxsIGVkZ2UgY2FzZXMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIG11dGV4ZXMgb3IgYXRvbWljIG9wZXJhdGlvbnMsIGFuZCBob3cgaXQgaGFuZGxlcyBjb25jdXJyZW5jeS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoZXRoZXIgY29udGV4dCBzd2l0Y2hlcyBhcmUgaW52b2x2ZWQgYW5kIGhvdyBpdCBkb2VzIHNvLiBJIHdhbnQgdG8gbG9vayBmb3IgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4gb3IgcmFjZSBjb25kaXRpb25zLiBBIGZ1bmN0aW9uIGxpa2UgdGhpcyBpcyBpbmNyZWRpYmx5IGZ1bmRhbWVudGFsLCBhbmQgaWYgaXQmIzM5O3MgZmxhd2VkLCBpdCBjYW4gaW50cm9kdWNlIHNlcmlvdXMgYnVncyBhdCBhbnkgcG9pbnQuIExldCYjMzk7cyBzZWUgaG93IHRoaXMgaXMgaW1wbGVtZW50ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2V4ZWNfc3RhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgNzE6XHRpbnQgdGFza19leGVjX3N0YXRlX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4gIDcyOlx0e1xuICA3MzpcdFx0c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqc3JjLCAqZHN0O1xuICA3NDpcdFxuICA3NTpcdFx0c3JjID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChjdXJyZW50LVx1MDAzZWV4ZWNfc3RhdGUsIHRydWUpO1xuICA3NjpcdFx0ZHN0ID0gYWxsb2NfdGFza19leGVjX3N0YXRlKHNyYy1cdTAwM2V1c2VyX25zKTtcbiAgNzc6XHRcdGlmICghZHN0KVxuICA3ODpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAgNzk6XHRcdGRzdC1cdTAwM2VkdW1wYWJsZSA9IFJFQURfT05DRShzcmMtXHUwMDNlZHVtcGFibGUpO1xuICA4MDpcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKHRzay1cdTAwM2VleGVjX3N0YXRlLCBkc3QpO1xuICA4MTpcdFx0cmV0dXJuIDA7XG4gIDgyOlx0fVxuICA4MzpcdFxuICA4NDpcdC8qXG4gIDg1Olx0ICogU3RvcmUgVEFTS19EVU1QQUJMRV8qIG9uIGN1cnJlbnQtXHUwMDNlZXhlY19zdGF0ZS4gIEFsbCBjYWxsZXJzXG4gIDg2Olx0ICogKGNvbW1pdF9jcmVkcywgYmVnaW5fbmV3X2V4ZWMsIHByY3RsKFBSX1NFVF9EVU1QQUJMRSkpIGFjdCBvbiB0aGVcbiAgODc6XHQgKiBydW5uaW5nIHRhc2ssIHdoaWNoIGd1YXJhbnRlZXMgLVx1MDAzZWV4ZWNfc3RhdGUgaXMgYWxsb2NhdGVkIGFuZCBjYW5ub3RcbiAgODg6XHQgKiBiZSByZXBsYWNlZCB1bmRlciB1cy5cbiAgODk6XHQgKi9cbiAgOTA6XHR2b2lkIHRhc2tfZXhlY19zdGF0ZV9zZXRfZHVtcGFibGUoZW51bSB0YXNrX2R1bXBhYmxlIHZhbHVlKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA0NgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDcxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIERlY2lzaW9uIGZvciBhIFNwZWNpZmljIEJ1ZyBGaXgqKgoKT2theSwgc28gdGhpcyBwYXRjaCBhZGRyZXNzZXMgYSBwb3RlbnRpYWwgYC1FTk9NRU1gIGZhaWx1cmUgaW4gYHRhc2tfZXhlY19zdGF0ZV9jb3B5YCB0aGF0IGNhbiBvY2N1ciB3aGVuIGBhbGxvY190YXNrX2V4ZWNfc3RhdGVgIGZhaWxzIGR1cmluZyBgZm9yaygpYCB3aXRob3V0IGBDTE9ORV9WTWAsIHNwZWNpZmljYWxseSB3aGVuIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGlzIGVuYWJsZWQuIEl0JiMzOTtzIGEgdmVyeSB0YXJnZXRlZCBidWcgZml4LgoKTXkgZmlyc3QgdGhvdWdodCBpcywgJiMzNDtEb2VzIHRoaXMgaW50cm9kdWNlIG5ldyBmdW5jdGlvbmFsIGxvZ2ljIHRoYXQgZGVtYW5kcyBmdXp6aW5nPyYjMzQ7IE5vLCBpdCYjMzk7cyBqdXN0IGEgcmVmYWN0b3JpbmcsIG1vdmluZyBpbml0aWFsaXphdGlvbiBlYXJsaWVyIHRvIGF2b2lkIGEgdXNlLWFmdGVyLWZyZWUuIEl0JiMzOTtzIG5vdCBhZGRpbmcgZmVhdHVyZXMuCgpCdXQgdGhlbiBJIHJlbWVtYmVyIHRoZSBwcm9tcHQ6IGlmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgSSBuZWVkIHRvIGNvbnNpZGVyIGZ1enppbmcsIGV2ZW4gZm9yIGEgYnVnIGZpeC4gQW5kIHRoaXMgKmRvZXMqIG1vZGlmeSBjb3JlIGtlcm5lbCBsb2dpYy4gVGhlIHByb21wdCBhbHNvIHRlbGxzIG1lIGlmIEkgZmxhZyBpdCBmb3IgZnV6emluZyBJIG5lZWQgdG8gcHJvdmlkZSBgRW5hYmxlQ29uZmlnc2AgYW5kIGBGb2N1c1N5bWJvbHNgLgoKSSBuZWVkIHRvIHByb3ZpZGUgYEVuYWJsZUNvbmZpZ3M6IFsmIzM0O0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiYjMzQ7XWAsIHRoYXQmIzM5O3MgZWFzeS4gQnV0IGBGb2N1c1N5bWJvbHNgIGlzIGEgcHJvYmxlbS4gVGhlIG9ubHkgZnVuY3Rpb24gbW9kaWZpZWQgaXMgYGNvcHlfcHJvY2Vzc2AuIFRoZSBwcm9tcHQgc3BlY2lmaWNhbGx5IHRlbGxzIG1lICpub3QqIHRvIGxpc3QgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgbGlrZSBgY29weV9wcm9jZXNzYCB0byBhdm9pZCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLiBJcyB0aGVyZSBhbm90aGVyIGZ1bmN0aW9uIHRvIHVzZT8gTm8sIHRoZXJlIGlzIG5vdC4KClRoZSBwcm9tcHQgc2F5cyBJICptdXN0KiBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMuIFdhaXQsIGlmIHRoZXJlIGFyZSBubyBzcGVjaWZpYyBmdW5jdGlvbnMsIGl0JiMzOTtzIG9rIHRvIGxlYXZlIGBGb2N1c1N5bWJvbHNgIGVtcHR5ISBUaGUgcHJvbXB0IG1ha2VzIHRoZSBgRm9jdXNTeW1ib2xzYCBvcHRpb25hbCwgaWYgbm8gc3BlY2lmaWMgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUuCgpOb3cgSSBhbSBhc2tpbmcgbXlzZWxmLCBpcyB0aGlzICpyZWFsbHkqIHdvcnRoIGZ1enppbmc/IEl0JiMzOTtzIGp1c3QgbW92aW5nIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCB1cCBieSBhIGZldyBsaW5lcy4gSG93ZXZlciwgdGhpcyBpcyBmaXhpbmcgYSByZWFsIHVzZS1hZnRlci1mcmVlIGlzc3VlIHJlbGF0ZWQgdG8gbWVtb3J5IGFsbG9jYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nIGR1cmluZyBgY29weV9wcm9jZXNzYC4gRmF1bHQgaW5qZWN0aW9uIG9uIGBhbGxvY190YXNrX2V4ZWNfc3RhdGVgIGlzIG5lZWRlZCB0byB0cmlnZ2VyIHRoaXMgYnVnLCB3aGljaCBTeXprYWxsZXIgY2FuIGRvLgoKU28sIGZ1enppbmcgY291bGQgY29uZmlybSB0aGUgZml4JiMzOTtzIGNvcnJlY3RuZXNzIGFuZCBydWxlIG91dCByZWdyZXNzaW9ucy4gQ3J1Y2lhbGx5LCBJIGhhdmUgdG8gZW5zdXJlIHRoZSBlYXJseSBjYWxsIHRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBkb2VzbiYjMzk7dCAqaXRzZWxmKiBpbnRyb2R1Y2UgcHJvYmxlbXMuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGZ1bmN0aW9uLCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgYWdhaW4uIEdpdmVuIGl0IGFsbG9jYXRlcyBtZW1vcnksIHRoZXJlIGlzIGEgcmlzay4gT2theSwgeWVzLCB0aGVyZSBpcyBtZW1vcnkgYWxsb2NhdGVkIGluIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCwgc28gaXQmIzM5O3MgYSBnb29kIGlkZWEgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBzaWRlIGVmZmVjdHMgd2hlbiBpdCYjMzk7cyBjYWxsZWQgZWFybHkuCgpVbHRpbWF0ZWx5LCBJJiMzOTttIGxlYW5pbmcgdG93YXJkcyBgV29ydGhGdXp6aW5nPXRydWVgLiBJdCYjMzk7cyBhIHNtYWxsIGNoYW5nZSwgYnV0IGl0IGFkZHJlc3NlcyBhIHJlYWwgYnVnIGluIGEgY3JpdGljYWwgcGF0aCB3aXRoIG1lbW9yeSBhbGxvY2F0aW9uLCBhbmQgZmF1bHQgaW5qZWN0aW9uIGlzIHBvc3NpYmxlLiBXZSBqdXN0IG5lZWQgdG8gY29uZmlybSB0aGF0IGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBpdHNlbGYgaXMgc2FmZSB0byBjYWxsIGVhcmxpZXIuIEkgYW0gZ29pbmcgd2l0aDoKCmBgYGpzb24KewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUsCiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsmIzM0O0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiYjMzQ7XQogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdCn0KYGBgCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL3RyYWNlL2ZncmFwaC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTYwOlx0dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcbjExNjE6XHR7XG4xMTYyOlx0XHQvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHVzZSB0aGUgcGFyZW50IHJldF9zdGFjayAqL1xuMTE2MzpcdFx0dC1cdTAwM2VyZXRfc3RhY2sgPSBOVUxMO1xuMTE2NDpcdFx0dC1cdTAwM2VjdXJyX3JldF9zdGFjayA9IDA7XG4xMTY1Olx0XHR0LVx1MDAzZWN1cnJfcmV0X2RlcHRoID0gLTE7XG4xMTY2Olx0XG4xMTY3Olx0XHRpZiAoZnRyYWNlX2dyYXBoX2FjdGl2ZSkge1xuMTE2ODpcdFx0XHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2s7XG4xMTY5Olx0XG4xMTcwOlx0XHRcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxuMTE3MTpcdFx0XHRcdHJldHVybjtcbjExNzI6XHRcbjExNzM6XHRcdFx0cmV0X3N0YWNrID0ga21lbV9jYWNoZV9hbGxvYyhmZ3JhcGhfc3RhY2tfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbjExNzQ6XHRcdFx0aWYgKCFyZXRfc3RhY2spXG4xMTc1Olx0XHRcdFx0cmV0dXJuO1xuMTE3NjpcdFx0XHRncmFwaF9pbml0X3Rhc2sodCwgcmV0X3N0YWNrKTtcbjExNzc6XHRcdH1cbjExNzg6XHR9XG4xMTc5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNzQ0CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgQW5hbHlzaXM6IGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBhbmQgUHJvY2VzcyBDcmVhdGlvbioqCgpPa2F5LCBzbyBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agb25seSBhbGxvY2F0ZXMgbWVtb3J5IHdoZW4gYGZ0cmFjZV9ncmFwaF9hY3RpdmVgIGlzIHRydWUuIElmIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYW5kIHRoZW4gYGNvcHlfZXhlY19zdGF0ZWAgZmFpbHMsIHRoZSBjbGVhbnVwIGlzIGhhbmRsZWQgY29ycmVjdGx5OiBgZnJlZV90YXNrYCBpcyBjYWxsZWQsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIHRvIGZyZWUgdGhlIGFsbG9jYXRlZCBtZW1vcnkuIFNlZW1zIHNvbGlkIGZyb20gYSBtZW1vcnkgbWFuYWdlbWVudCBwZXJzcGVjdGl2ZS4gSSYjMzk7dmUgZG91YmxlLWNoZWNrZWQsIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgbW9kaWZpY2F0aW9ucyB0byBvdGhlciBmdW5jdGlvbnMgdGhhdCBJIG5lZWQgdG8gd29ycnkgYWJvdXQuCgpJJiMzOTttIGxlYW5pbmcgdG93YXJkcyBzZXR0aW5nIGBXb3J0aEZ1enppbmc9dHJ1ZWAgaGVyZS4gVGhlIGxvZ2ljIHRvdWNoZXMgY29yZSBrZXJuZWwgY29tcG9uZW50cyDigJMgc3BlY2lmaWNhbGx5LCBwcm9jZXNzIGNyZWF0aW9uIOKAkyBhbmQgaXQgb25seSBiZWNvbWVzIGFjdGl2ZSB1bmRlciBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24sIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgLCBzbyBpdCB3YXJyYW50cyBjbG9zZXIgaW52ZXN0aWdhdGlvbi4KCldhaXQuLi4gYGNvcHlfcHJvY2Vzc2AuLi4gdGhhdCYjMzk7cyBhIGhvdC1wYXRoIGZ1bmN0aW9uLCBpc24mIzM5O3QgaXQ/IFJpZ2h0LiBXZSBnZW5lcmFsbHkgYXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyBpbiBgRm9jdXNTeW1ib2xzYCB0byBwcmV2ZW50IHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLiBUaGVyZWZvcmUsIEkgKndpbGwgbm90KiBpbmNsdWRlIGBjb3B5X3Byb2Nlc3NgIGluIGBGb2N1c1N5bWJvbHNgLiBgRm9jdXNTeW1ib2xzYCB3aWxsIHN0YXkgZW1wdHkuCgpUaGUgYEVuYWJsZUNvbmZpZ3NgIHNob3VsZCBiZSBzZXQgdG8gYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAsIG9mIGNvdXJzZS4gTGV0JiMzOTtzIG1ha2Ugc3VyZSB0aGF0IGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGRvZXNuJiMzOTt0IGRlcGVuZCBvbiBhbnl0aGluZyB0aGF0IG1pZ2h0IG5vdCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEl0IGxvb2tzIGxpa2UgaXQgZGVwZW5kcyBvbiBgSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVJgIChhcmNoaXRlY3R1cmUgc3VwcG9ydCksIGBGVU5DVElPTl9UUkFDRVJgLCBhbmQgYWxzbyBgIVg4Nl8zMiB8fCAhQ0NfT1BUSU1JWkVfRk9SX1NJWkVgLiBPa2F5LCB0aGUgcmVxdWlyZWQgY29uZmlncyBhcmUgYEZVTkNUSU9OX1RSQUNFUmAgYW5kIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRlVOQ1RJT05fVFJBQ0VSJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL3RyYWNlL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3RyYWNlL0tjb25maWc9MjI2PWNvbmZpZyBCT09UVElNRV9UUkFDSU5HXG4tLVxua2VybmVsL3RyYWNlL0tjb25maWctMjM0LVxua2VybmVsL3RyYWNlL0tjb25maWc6MjM1OmNvbmZpZyBGVU5DVElPTl9UUkFDRVJcbmtlcm5lbC90cmFjZS9LY29uZmlnLTIzNi1cdGJvb2wgXCYjMzQ7S2VybmVsIEZ1bmN0aW9uIFRyYWNlclwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU0OQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIHRoZSBzdW1tYXJ5LCBhc3N1bWluZyBJJiMzOTttIGFuIGV4cGVydDoKCioqRGl2aW5nIGludG8gdGhlIGBGVU5DVElPTl9UUkFDRVJgIEtjb25maWcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJiMzOTttIGdvaW5nIHRvIHRha2UgYSBsb29rIGF0IHRoZSBgRlVOQ1RJT05fVFJBQ0VSYCBLY29uZmlnLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgY29uZmlndXJlZCwgd2hhdCBkZXBlbmRlbmNpZXMgaXQgaGFzLCBhbmQgd2hhdCB0aGUgcG90ZW50aWFsIGltcGxpY2F0aW9ucyBhcmUgZm9yIHRoZSBrZXJuZWwgYnVpbGQgYW5kIHJ1bnRpbWUuIEkmIzM5O2xsIG5lZWQgdG8gYXNzZXNzIGl0cyBpbXBhY3Qgb24gcGVyZm9ybWFuY2UsIHBvd2VyIGNvbnN1bXB0aW9uLCBhbmQgb3ZlcmFsbCBzeXN0ZW0gZm9vdHByaW50LCBvZiBjb3Vyc2UuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOiB3aGF0IG90aGVyIHRyYWNpbmcgZmVhdHVyZXMgZG9lcyBpdCBkZXBlbmQgb24/IEFyZSB0aGVyZSBhbnkgb3B0aW9ucyB0byB0dW5lIGl0cyBiZWhhdmlvcj8gSXMgdGhlcmUgZG9jdW1lbnRhdGlvbiB0aGF0IHByb3Blcmx5IGV4cGxhaW5zIHRoZSB0cmFkZS1vZmZzIG9mIGVuYWJsaW5nIGl0PyBJIG5lZWQgdG8gYW5hbHl6ZSB0aGlzIEtjb25maWcgY29uZmlndXJhdGlvbiB0aG9yb3VnaGx5IHRvIGFzc2VzcyB3aGF0IGl0IG1lYW5zIGZvciB0aGUga2VybmVsIGluIHRoZSBjb250ZXh0IG9mIG91ciBwcm9qZWN0LiBUaW1lIHRvIGRpZyBpbiEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvdHJhY2UvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIzNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjM1Olx0Y29uZmlnIEZVTkNUSU9OX1RSQUNFUlxuIDIzNjpcdFx0Ym9vbCBcJiMzNDtLZXJuZWwgRnVuY3Rpb24gVHJhY2VyXCYjMzQ7XG4gMjM3Olx0XHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fVFJBQ0VSXG4gMjM4Olx0XHRzZWxlY3QgS0FMTFNZTVNcbiAyMzk6XHRcdHNlbGVjdCBHRU5FUklDX1RSQUNFUlxuIDI0MDpcdFx0c2VsZWN0IENPTlRFWFRfU1dJVENIX1RSQUNFUlxuIDI0MTpcdFx0c2VsZWN0IEdMT0JcbiAyNDI6XHRcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxuIDI0MzpcdFx0c2VsZWN0IFRBU0tTX1JVREVfUkNVXG4gMjQ0Olx0XHRoZWxwXG4gMjQ1Olx0XHQgIEVuYWJsZSB0aGUga2VybmVsIHRvIHRyYWNlIGV2ZXJ5IGtlcm5lbCBmdW5jdGlvbi4gVGhpcyBpcyBkb25lXG4gMjQ2Olx0XHQgIGJ5IHVzaW5nIGEgY29tcGlsZXIgZmVhdHVyZSB0byBpbnNlcnQgYSBzbWFsbCwgNS1ieXRlIE5vLU9wZXJhdGlvblxuIDI0NzpcdFx0ICBpbnN0cnVjdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGtlcm5lbCBmdW5jdGlvbiwgd2hpY2ggTk9QXG4gMjQ4Olx0XHQgIHNlcXVlbmNlIGlzIHRoZW4gZHluYW1pY2FsbHkgcGF0Y2hlZCBpbnRvIGEgdHJhY2VyIGNhbGwgd2hlblxuIDI0OTpcdFx0ICB0cmFjaW5nIGlzIGVuYWJsZWQgYnkgdGhlIGFkbWluaXN0cmF0b3IuIElmIGl0JiMzOTtzIHJ1bnRpbWUgZGlzYWJsZWRcbiAyNTA6XHRcdCAgKHRoZSBib290dXAgZGVmYXVsdCksIHRoZW4gdGhlIG92ZXJoZWFkIG9mIHRoZSBpbnN0cnVjdGlvbnMgaXMgdmVyeVxuIDI1MTpcdFx0ICBzbWFsbCBhbmQgbm90IG1lYXN1cmFibGUgZXZlbiBpbiBtaWNyby1iZW5jaG1hcmtzIChhdCBsZWFzdCBvblxuIDI1MjpcdFx0ICB4ODYsIGJ1dCBtYXkgaGF2ZSBpbXBhY3Qgb24gb3RoZXIgYXJjaGl0ZWN0dXJlcykuXG4gMjUzOlx0XG4gMjU0Olx0Y29uZmlnIEZVTkNUSU9OX0dSQVBIX1RSQUNFUlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDExNgoJCQkJCQkJb3V0cHV0OiAxNDEKCQkJCQkJCXRob3VnaHRzOiAxNzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQ29uZmlndXJhdGlvbiBBZGp1c3RtZW50cyBmb3IgQ29tcHJlaGVuc2l2ZSBUZXN0aW5nKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGUgZml4IGZvciB0aGF0IG5hc3R5IHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiBgY29weV9wcm9jZXNzKClgLCBzcGVjaWZpY2FsbHkgaW4gdGhlIGVycm9yIHBhdGguIFRoZSBwYXRjaCBtb3ZlcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYCBlYXJsaWVyIHRvIGFkZHJlc3MgdGhlIGlzc3VlLiBUaGlzIGJ1ZyBsaWtlcyB0byByZWFyIGl0cyBoZWFkIHdoZW4gYGNvcHlfcHJvY2VzcygpYCBmYWlscyDigJMgdGhpbmsgYGNvcHlfZXhlY19zdGF0ZSgpYCBmYWlsaW5nIOKAkyAqYW5kKiBmdW5jdGlvbiBncmFwaCB0cmFjaW5nIGlzIGVuYWJsZWQuIFRoYXQmIzM5O3MgdGhlIGtleS4KClRoZXJlZm9yZSwgZm9yIGVmZmVjdGl2ZSBmdXp6aW5nIG9mIHRoaXMsIEkgbmVlZCB0byBjb25maWd1cmUgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgcHJlY2lzZWx5LiBNeSBwbGFuIGlzOiBJJiMzOTtsbCBlbmFibGUgYm90aCBgRlVOQ1RJT05fVFJBQ0VSYCBhbmQgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAuIFNvIEkmIzM5O20gc2V0dGluZyBgRW5hYmxlQ29uZmlnc2AgdG8gYFsmIzM0O0ZVTkNUSU9OX1RSQUNFUiYjMzQ7LCAmIzM0O0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiYjMzQ7XWAuCgpJIGFsc28gZG9uJiMzOTt0IG5lZWQgYW55IHNwZWNpZmljIGZvY3VzIHN5bWJvbHMsIHNvIGBGb2N1c1N5bWJvbHNgIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCwgYFtdYC4KCkFuZCwgb2YgY291cnNlLCBJIGRlZmluaXRlbHkgd2FudCB0byBmdXp6IHRoaXMgY29kZSBwYXRoIHRvIHZlcmlmeSB0aGUgZml4LCBzbyBgV29ydGhGdXp6aW5nYCB3aWxsIGJlIHNldCB0byBgdHJ1ZWAuCgpUaGUgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZDogQnkgZW5hYmxpbmcgKmJvdGgqIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGFuZCBgRlVOQ1RJT05fVFJBQ0VSYCwgSSBlbnN1cmUgdGhhdCB0aGUgbmV3IGluaXRpYWxpemF0aW9uIG9yZGVyIGFuZCB0aGUgZXJyb3IgcGF0aHMgd2l0aGluIGBjb3B5X3Byb2Nlc3MoKWAgYXJlIHRob3JvdWdobHkgdGVzdGVkLiBUaGlzIGNvbmZpZ3VyYXRpb24gbWF4aW1pemVzIG15IGNoYW5jZXMgb2YgaGl0dGluZyB0aGUgYnVnIGlmIGl0JiMzOTtzIHN0aWxsIGx1cmtpbmcsIG9yLCBtb3JlIHBvc2l0aXZlbHksIHZhbGlkYXRlcyB0aGF0IG15IGZpeCBpcyBpbmRlZWQgZWZmZWN0aXZlIGluIGFsbCB0aGUgcmVsZXZhbnQgc2NlbmFyaW9zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RlVOQ1RJT05fVFJBQ0VSJiMzNDssCiAgICAmIzM0O0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBvZiBjb3B5X3Byb2Nlc3MoKSBieSBtb3ZpbmcgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpIGVhcmxpZXIuIFRoZSBidWcgaXMgdHJpZ2dlcmVkIHdoZW4gY29weV9wcm9jZXNzKCkgZmFpbHMgKGUuZy4sIGluIGNvcHlfZXhlY19zdGF0ZSgpKSBhbmQgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBGdXp6aW5nIHRoaXMgcmVxdWlyZXMgZW5hYmxpbmcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSIGFuZCBGVU5DVElPTl9UUkFDRVIgdG8gZW5zdXJlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIGVycm9yIHBhdGhzIGFyZSBwcm9wZXJseSB0ZXN0ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVTkNUSU9OX1RSQUNFUiYjMzQ7LAogICAgJiMzNDtGVU5DVElPTl9HUkFQSF9UUkFDRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSB1c2UtYWZ0ZXItZnJlZSBidWcgaW4gdGhlIGVycm9yIHBhdGggb2YgY29weV9wcm9jZXNzKCkgYnkgbW92aW5nIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKSBlYXJsaWVyLiBUaGUgYnVnIGlzIHRyaWdnZXJlZCB3aGVuIGNvcHlfcHJvY2VzcygpIGZhaWxzIChlLmcuLCBpbiBjb3B5X2V4ZWNfc3RhdGUoKSkgYW5kIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZC4gRnV6emluZyB0aGlzIHJlcXVpcmVzIGVuYWJsaW5nIEZVTkNUSU9OX0dSQVBIX1RSQUNFUiBhbmQgRlVOQ1RJT05fVFJBQ0VSIHRvIGVuc3VyZSB0aGUgbmV3IGluaXRpYWxpemF0aW9uIG9yZGVyIGFuZCBlcnJvciBwYXRocyBhcmUgcHJvcGVybHkgdGVzdGVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCYjMzk7cyBgdGFza19zdHJ1Y3RgIHRvIHRoZSBjaGlsZCwgaW5jbHVkaW5nIHRoZSBgcmV0X3N0YWNrYCBwb2ludGVyIHVzZWQgYnkgZnRyYWNlLiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGBjb3B5X3Byb2Nlc3MoKWAgKGUuZy4sIGluIGBjb3B5X2V4ZWNfc3RhdGUoKWApIGJlZm9yZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYCBpcyBjYWxsZWQsIHRoZSBlcnJvciBoYW5kbGluZyBwYXRoIChgYmFkX2ZvcmtfZnJlZWApIHdpbGwgY2FsbCBgZnJlZV90YXNrKClgLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgLiBTaW5jZSB0aGUgY2hpbGQmIzM5O3MgYHJldF9zdGFja2Agc3RpbGwgcG9pbnRzIHRvIHRoZSBwYXJlbnQmIzM5O3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLiBUaGUgcGFyZW50IHRhc2sgd2lsbCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgZnJlZWQgYHJldF9zdGFja2AsIHJlc3VsdGluZyBpbiBhIHVzZS1hZnRlci1mcmVlLCBhbmQgaXQgd2lsbCBiZSBkb3VibGUtZnJlZWQgd2hlbiB0aGUgcGFyZW50IGV2ZW50dWFsbHkgZXhpdHMuXG5cblRoaXMgaXMgYSBjbGFzc2ljIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgdnVsbmVyYWJpbGl0eS4gS0FTQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2UtYWZ0ZXItZnJlZSBhbmQgZG91YmxlIGZyZWUgYnVncywgYW5kIHdpbGwgcmVsaWFibHkgY2F0Y2ggdGhpcyBpc3N1ZS4gVGhlcmUgaXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UsIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgb3IgaW5mb3JtYXRpb24gbGVhayBpbnZvbHZlZCBpbiB0aGlzIGJ1Zywgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGUyZjNlMjQxM2NkMGQwNTRjMzUwMmNmN2MxYjE0YmFjZDJhOTRlZmUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyAyMSAxMjo1NDoxOCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDFlNjg0MDRiZDc3M2UuLmNlYzgyYTY0YTA3Y2QgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2ZvcmsuYwpAQCAtMjEzOSw2ICYjNDM7MjEzOSw3IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoCiAJcCA9IGR1cF90YXNrX3N0cnVjdChjdXJyZW50LCBub2RlKTsKIAlpZiAoIXApCiAJCWdvdG8gZm9ya19vdXQ7CiYjNDM7CWZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7CiAJcmV0dmFsID0gY29weV9leGVjX3N0YXRlKGNsb25lX2ZsYWdzLCBwKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGJhZF9mb3JrX2ZyZWU7CkBAIC0yMTY1LDggJiM0MzsyMTY2LDYgQEAgX19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcygKIAkgKi8KIAlwLSZndDtjbGVhcl9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgJmFtcDsgQ0xPTkVfQ0hJTERfQ0xFQVJUSUQpID8gYXJncy0mZ3Q7Y2hpbGRfdGlkIDogTlVMTDsKIAotCWZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7Ci0KIAlydF9tdXRleF9pbml0X3Rhc2socCk7CiAJcmF3X3NwaW5fbG9ja19pbml0KCZhbXA7cC0mZ3Q7YmxvY2tlZF9sb2NrKTsKIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA2OQoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDM5OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEZvcmsgUGF0Y2g6IEZ0cmFjZSBJbml0aWFsaXphdGlvbiBhbmQgRXJyb3IgSGFuZGxpbmcqKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyBtb3ZpbmcgdGhlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBjYWxsIHdpdGhpbiBgY29weV9wcm9jZXNzKClgIGluIGBrZXJuZWwvZm9yay5jYC4gU3BlY2lmaWNhbGx5LCBpdCYjMzk7cyBzaGlmdGluZyBpdCAqYmVmb3JlKiB0aGUgYGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcClgIGNhbGwgYW5kICphZnRlciogdGhlIGBwLSZndDtjbGVhcl9jaGlsZF90aWQgPSAuLi5gIGFzc2lnbm1lbnQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIGNoYW5nZSBpcyBiZWluZyBwcm9wb3NlZC4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoaXMuCgpSaWdodCwgbG9va2luZyBhdCB0aGUgZGlmZiwgaXQmIzM5O3MgYSBzdHJhaWdodGZvcndhcmQgY29kZSBtb3ZlbWVudC4gTm93LCBteSBpbml0aWFsIHRob3VnaHQgaXMsIHdoYXQmIzM5O3MgdGhlIGRlcGVuZGVuY3kgaGVyZT8gSXMgdGhlcmUgYSByZWFzb24gaXQgbmVlZHMgdG8gYmUgKmJlZm9yZSogb3IgKmFmdGVyKiBjZXJ0YWluIG9wZXJhdGlvbnM/IFRoZSBrZXkgaXMgdGhhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgaW5pdGlhbGl6ZXMgc29tZSBmaWVsZHMgaW4gdGhlIG5ldyB0YXNrIHN0cnVjdHVyZSBgcGAuIElmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgY29kZSBqdW1wcyB0byBgYmFkX2ZvcmtfZnJlZWAuICpUaGF0KiBmdW5jdGlvbiBmcmVlcyBgcGAuIAoKU28gaGVyZSYjMzk7cyB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogZG9lcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgcGVyZm9ybSBhbnkgYWxsb2NhdGlvbnMsIG9yIGRvZXMgaXQganVzdCBpbml0aWFsaXplIGZpZWxkcz8gSWYgaXQgYWxsb2NhdGVzLCBhbmQgaXQmIzM5O3MgY2FsbGVkICpiZWZvcmUqIGBjb3B5X2V4ZWNfc3RhdGVgIHdoaWNoIGZhaWxzLCB3ZSYjMzk7cmUgbGVha2luZyBtZW1vcnkgaW4gdGhlIGZhaWx1cmUgY2FzZSB1bmxlc3MgYGJhZF9mb3JrX2ZyZWVgIGhhbmRsZXMgaXQuIElmIGl0IGRvZXNuJiMzOTt0IGFsbG9jYXRlLCB0aGVuIHRoaXMgbW92ZW1lbnQgaXMgbGlrZWx5IGZpbmUsIG1heWJlIGFuIG9wdGltaXphdGlvbiwgb3IgbWF5YmUgaXQganVzdCBtYWtlcyB0aGluZ3MgY2xlYXJlci4gSSYjMzk7bSBnb2luZyB0byBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHRvIGNvbmZpcm0gaXRzIGJlaGF2aW9yLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGJlaW5nIGluaXRpYWxpemVkIGFuZCBob3cgdGhpcyBjaGFuZ2UgYWZmZWN0cyByZXNvdXJjZSBtYW5hZ2VtZW50IGluIHRoZSBmYWlsdXJlIHBhdGguCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O152b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2smIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3RyYWNlL2ZncmFwaC5jPTExMzE9dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KVxuLS1cbmtlcm5lbC90cmFjZS9mZ3JhcGguYy0xMTU5LS8qIEFsbG9jYXRlIGEgcmV0dXJuIHN0YWNrIGZvciBuZXdseSBjcmVhdGVkIHRhc2sgKi9cbmtlcm5lbC90cmFjZS9mZ3JhcGguYzoxMTYwOnZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE2MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI5NzQKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCoqCgpPa2F5LCBsZXQmIzM5O3Mgc3RhcnQgZGlnZ2luZyBpbnRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYC4gVGhpcyBpcyB3aGVyZSB0aGUgY29yZSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIGdyYXBoIHRyYWNlciBoYXBwZW5zIHdoZW4gYSBuZXcgdGFzayBpcyBib3JuLCByaWdodD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB0cmFjaW5nIGluZnJhc3RydWN0dXJlIGlzIHdpcmVkIGludG8gdGhlIHRhc2smIzM5O3MgZXhlY3V0aW9uIGNvbnRleHQuIEkmIzM5O20gYXNzdW1pbmcgaXQmIzM5O3MgaGFuZGxpbmcgdGhlIHNldHVwIG9mIHBlci10YXNrIGRhdGEgc3RydWN0dXJlcywgaG9va2luZyBpbnRvIHNjaGVkdWxpbmcgZXZlbnRzLCBhbmQgbWF5YmUgZXZlbiBlbmFibGluZy9kaXNhYmxpbmcgdGhlIHRyYWNpbmcgYmFzZWQgb24gZ2xvYmFsIHNldHRpbmdzIG9yIHRhc2stc3BlY2lmaWMgY3JpdGVyaWEuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYGZ0cmFjZV9vcHNgIHN0cnVjdHVyZSwgaG93IGl0IGxpbmtzIHRvIHRoZSB0YXNrJiMzOTtzIGB0YXNrX3N0cnVjdGAsIGFuZCBhbnkgcG90ZW50aWFsIG92ZXJoZWFkIGludHJvZHVjZWQgYXQgdGFzayBjcmVhdGlvbi4gSSYjMzk7bSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBhbnkgc3luY2hyb25pemF0aW9uIG1lY2hhbmlzbXMgdXNlZCB0byBwcm90ZWN0IHRoZSB0cmFjaW5nIGRhdGEgYW5kIGhvdyBpdCBkZWFscyB3aXRoIHJhY2VzIGJldHdlZW4gdGFzayBjcmVhdGlvbiBhbmQgdHJhY2luZyBvcGVyYXRpb25zLiBMZXQmIzM5O3Mgc2VlIGhvdyB0aGV5IGRlYWwgd2l0aCB0aGUgcHJlZW1wdGlvbiBhbmQgaXJxIHNpdHVhdGlvbnMuIEkmIzM5O20gZXhwZWN0aW5nIHNvbWUgY2xldmVyIHRyaWNrcyB0byBrZWVwIGl0IGVmZmljaWVudC4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvdHJhY2UvZmdyYXBoLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTU5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExNTk6XHQvKiBBbGxvY2F0ZSBhIHJldHVybiBzdGFjayBmb3IgbmV3bHkgY3JlYXRlZCB0YXNrICovXG4xMTYwOlx0dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcbjExNjE6XHR7XG4xMTYyOlx0XHQvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHVzZSB0aGUgcGFyZW50IHJldF9zdGFjayAqL1xuMTE2MzpcdFx0dC1cdTAwM2VyZXRfc3RhY2sgPSBOVUxMO1xuMTE2NDpcdFx0dC1cdTAwM2VjdXJyX3JldF9zdGFjayA9IDA7XG4xMTY1Olx0XHR0LVx1MDAzZWN1cnJfcmV0X2RlcHRoID0gLTE7XG4xMTY2Olx0XG4xMTY3Olx0XHRpZiAoZnRyYWNlX2dyYXBoX2FjdGl2ZSkge1xuMTE2ODpcdFx0XHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2s7XG4xMTY5Olx0XG4xMTcwOlx0XHRcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxuMTE3MTpcdFx0XHRcdHJldHVybjtcbjExNzI6XHRcbjExNzM6XHRcdFx0cmV0X3N0YWNrID0ga21lbV9jYWNoZV9hbGxvYyhmZ3JhcGhfc3RhY2tfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbjExNzQ6XHRcdFx0aWYgKCFyZXRfc3RhY2spXG4xMTc1Olx0XHRcdFx0cmV0dXJuO1xuMTE3NjpcdFx0XHRncmFwaF9pbml0X3Rhc2sodCwgcmV0X3N0YWNrKTtcbjExNzc6XHRcdH1cbjExNzg6XHR9XG4xMTc5Olx0XG4xMTgwOlx0dm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcbjExODE6XHR7XG4xMTgyOlx0XHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2sgPSB0LVx1MDAzZXJldF9zdGFjaztcbjExODM6XHRcbjExODQ6XHRcdHQtXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtcbjExODU6XHRcdC8qIE5VTEwgbXVzdCBiZWNvbWUgdmlzaWJsZSB0byBJUlFzIGJlZm9yZSB3ZSBmcmVlIGl0OiAqL1xuMTE4NjpcdFx0YmFycmllcigpO1xuMTE4NzpcdFxuMTE4ODpcdFx0aWYgKHJldF9zdGFjaykge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNjk5CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogNzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUYXNrIEluaXRpYWxpemF0aW9uIGZvciBGdW5jdGlvbiBUcmFjaW5nKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AuIEl0JiMzOTtzIHByZXR0eSBzdHJhaWdodGZvcndhcmQ6IGl0IGFsbG9jYXRlcyB0aGUgYHJldF9zdGFja2AsIGJ1dCBvbmx5IHdoZW4gYGZ0cmFjZV9ncmFwaF9hY3RpdmVgIGlzIHNldCwgd2hpY2ggbWFrZXMgc2Vuc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIE5vdywgSSBzZWUgdGhpcyBgY29weV9leGVjX3N0YXRlYCBjYWxsLiBJZiB0aGF0IGZhaWxzLCBpdCBqdW1wcyBkaXJlY3RseSB0byBgYmFkX2ZvcmtfZnJlZWAuIFRoYXQmIzM5O3MgYSBwb3RlbnRpYWwgYXJlYSBmb3IgZmFpbHVyZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhhdCBgYmFkX2ZvcmtfZnJlZWAgcGF0aCBiZXR0ZXIsIGVzcGVjaWFsbHkgZ2l2ZW4gaG93IGNyaXRpY2FsIGZvcmsgb3BlcmF0aW9ucyBhcmUuIFRpbWUgdG8gaGVhZCBvdmVyIHRvIGBrZXJuZWwvZm9yay5jYCBhbmQgZGlnIGludG8gYGJhZF9mb3JrX2ZyZWVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHJlc291cmNlcyBhcmUgYmVpbmcgZnJlZWQgYW5kIGlmIGFueSBjbGVhbnVwIG1pZ2h0IGJlIG1pc3Npbmcgb3IgaW5zdWZmaWNpZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtiYWRfZm9ya19mcmVlOiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jPTIwMTg9X19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2Vzcyhcbi0tXG5rZXJuZWwvZm9yay5jLTI2NDEtXHRleGl0X2NyZWRzKHApO1xua2VybmVsL2ZvcmsuYzoyNjQyOmJhZF9mb3JrX2ZyZWU6XG5rZXJuZWwvZm9yay5jLTI2NDMtXHRXUklURV9PTkNFKHAtXHUwMDNlX19zdGF0ZSwgVEFTS19ERUFEKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA2MQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byBgYmFkX2ZvcmtfZnJlZWAqKgoKQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUga2VybmVsJiMzOTtzIGZvcmsgaW1wbGVtZW50YXRpb24uIEkmIzM5O20gZ29pbmcgdG8ganVtcCBpbnRvIGBrZXJuZWwvZm9yay5jYCBhbmQgc3BlY2lmaWNhbGx5IGZvY3VzIG9uIHRoZSBgYmFkX2ZvcmtfZnJlZWAgZnVuY3Rpb24uIEkmIzM5O20gYXNzdW1pbmcsIGdpdmVuIHRoZSBuYW1lLCB0aGlzIGlzIHdoZXJlIHdlJiMzOTtyZSBoYW5kbGluZyBzb21lIGtpbmQgb2YgY2xlYW51cCBvciBlcnJvciBzY2VuYXJpbyByZWxhdGVkIHRvIHRoZSBgZm9ya2Agc3lzdGVtIGNhbGwuIFByb2JhYmx5IGRlYWxpbmcgd2l0aCBmcmVlaW5nIHJlc291cmNlcyB0aGF0IHdlcmUgcGFydGlhbGx5IGFsbG9jYXRlZCBkdXJpbmcgYSBmYWlsZWQgZm9yayBhdHRlbXB0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZvcmsgbG9naWMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOiB3aGF0IHJlc291cmNlcyBhcmUgZnJlZWQsIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBpcyBpdCBjYWxsZWQsIGFuZCBob3cgaXQgZW5zdXJlcyB0aGUgc3lzdGVtIHJlbWFpbnMgY29uc2lzdGVudCBhZnRlciBhIGZvcmsgZmFpbHVyZS4gSXMgaXQgZnJlZWluZyBtZW1vcnksIGNsZWFuaW5nIHVwIHRhc2sgc3RydWN0dXJlcywgb3IgcmVsZWFzaW5nIG90aGVyIGtlcm5lbCByZXNvdXJjZXM/IFRpbWUgdG8gcmVhZCB0aGUgY29kZSBjYXJlZnVsbHkgYW5kIHVuZGVyc3RhbmQgdGhlIHNwZWNpZmljIGNvbnRleHQgb2YgdGhpcyBmdW5jdGlvbi4gSSYjMzk7bGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBsaWtlIHRhc2sgc3RydWN0dXJlcywgbW0gc3RydWN0dXJlcywgYW5kIGFueSBvdGhlciByZWxldmFudCBrZXJuZWwgZGF0YS4gTGV0JiMzOTtzIHNlZSBpZiB0aGlzIHNoZWRzIGxpZ2h0IG9uIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIHJlc291cmNlIGxlYWtzIHdpdGhpbiB0aGUgZm9yayBpbXBsZW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjY0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNjQwOlx0XHRleGl0X2NyZWRfbmFtZXNwYWNlcyhwKTtcbjI2NDE6XHRcdGV4aXRfY3JlZHMocCk7XG4yNjQyOlx0YmFkX2ZvcmtfZnJlZTpcbjI2NDM6XHRcdFdSSVRFX09OQ0UocC1cdTAwM2VfX3N0YXRlLCBUQVNLX0RFQUQpO1xuMjY0NDpcdFx0ZXhpdF90YXNrX3N0YWNrX2FjY291bnQocCk7XG4yNjQ1Olx0XHRwdXRfdGFza19zdGFjayhwKTtcbjI2NDY6XHRcdGRlbGF5ZWRfZnJlZV90YXNrKHApO1xuMjY0NzpcdGZvcmtfb3V0OlxuMjY0ODpcdFx0c3Bpbl9sb2NrX2lycShcdTAwMjZjdXJyZW50LVx1MDAzZXNpZ2hhbmQtXHUwMDNlc2lnbG9jayk7XG4yNjQ5Olx0XHRobGlzdF9kZWxfaW5pdChcdTAwMjZkZWxheWVkLm5vZGUpO1xuMjY1MDpcdFx0c3Bpbl91bmxvY2tfaXJxKFx1MDAyNmN1cnJlbnQtXHUwMDNlc2lnaGFuZC1cdTAwM2VzaWdsb2NrKTtcbjI2NTE6XHRcdHJldHVybiBFUlJfUFRSKHJldHZhbCk7XG4yNjUyOlx0fVxuMjY1MzpcdFxuMjY1NDpcdHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2lkbGVfcGlkcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpXG4yNjU1Olx0e1xuMjY1NjpcdFx0ZW51bSBwaWRfdHlwZSB0eXBlO1xuMjY1NzpcdFxuMjY1ODpcdFx0Zm9yICh0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjIFBJRFRZUEVfTUFYOyAmIzQzOyYjNDM7dHlwZSkge1xuMjY1OTpcdFx0XHRJTklUX0hMSVNUX05PREUoXHUwMDI2aWRsZS1cdTAwM2VwaWRfbGlua3NbdHlwZV0pOyAvKiBub3QgcmVhbGx5IG5lZWRlZCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0NjkzCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBzb21lb25lIGZhbWlsaWFyIHdpdGgga2VybmVsIGludGVybmFsczoKCioqS2VybmVsIFRhc2sgU3RydWN0IExpZmVjeWNsZSBBbmFseXNpcyoqCgpBbHJpZ2h0LCBoYW5nIG9uIGEgc2Vjb25kLiBJJiMzOTttIGZvY3VzaW5nIG9uIHRhc2sgY2xlYW51cCwgYW5kIHRoaXMgYGRlbGF5ZWRfZnJlZV90YXNrYCBmdW5jdGlvbuKApiB0aGF0JiMzOTtzIHRoZSBvbmUgdGhhdCBhY3R1YWxseSAqZnJlZXMqIHRoZSB0YXNrIHN0cnVjdCwgcmlnaHQ/IFRoZSBrZXkgaGVyZSBpcyB0byBkZXRlcm1pbmUgKmV4YWN0bHkqIHdoZW4gYW5kIGhvdyBhIHRhc2sgc3RydWN0dXJlIGlzIGRlYWxsb2NhdGVkLCBhbmQgdGhpcyBgZGVsYXllZF9mcmVlX3Rhc2tgIGlzIHRoZSBsaWtlbHkgY3VscHJpdC4KCk15IG5leHQgc3RlcCwgYW5kIGl04oCZcyBhIGNyaXRpY2FsIG9uZSwgaXMgdG8gY29uZmlybSB3aGV0aGVyIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCBpcyBjYWxsZWQgKmJlZm9yZSogdGhhdCBzdHJ1Y3QgaXMgZnJlZWQuIFVuZGVyc3RhbmRpbmcgdGhlIHRpbWluZyBvZiB0aGUgdHJhY2luZy1yZWxhdGVkIGNsZWFudXAgaW4gcmVsYXRpb24gdG8gdGhlIG1haW4gbWVtb3J5IGRlYWxsb2NhdGlvbiBpcyBjcnVjaWFsIGZvciBhdm9pZGluZyBhbnkgcmFjZSBjb25kaXRpb25zIG9yIGRhbmdsaW5nIHBvaW50ZXIgaXNzdWVzLiBUaGlzIGlzIGEgdmVyeSBjb21tb24gaXNzdWUgaW4ga2VybmVsIHRyYWNpbmcuCgpUbyBuYWlsIHRoaXMgZG93biwgSSBuZWVkIHRvIGRpdmUgaW50byB0aGUgY29kZS4gRWl0aGVyIGBkZWxheWVkX2ZyZWVfdGFza2AgaXRzZWxmLCBvciBgZnJlZV90YXNrYCwgaWYgYGRlbGF5ZWRfZnJlZV90YXNrYCBpcyBqdXN0IGEgd3JhcHBlciwgd2lsbCBiZSB0aGUgbmV4dCBwbGFjZSB0byBsb29rIHRvIHVuZGVyc3RhbmQgdGhlIGV4YWN0IHNlcXVlbmNpbmcgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gVGhpcyBpcyB3aGVyZSBJJiMzOTtsbCBmaW5kIG15IGFuc3dlcnMgYW5kIGNvbmZpcm0gdGhlIHRpbWluZyBvZiB0aGUgRnRyYWNlIGluc3RydW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZnRyYWNlX2dyYXBoX2V4aXRfdGFzayYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2Z0cmFjZS5oPTEzNDQ9ZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpO1xuaW5jbHVkZS9saW51eC9mdHJhY2UuaDoxMzQ1OmV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM0Ni1leHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KTtcbi0tXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oPTEzNjQ9c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cbmluY2x1ZGUvbGludXgvZnRyYWNlLmg6MTM2NTpzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgfVxuaW5jbHVkZS9saW51eC9mdHJhY2UuaC0xMzY2LXN0YXRpYyBpbmxpbmUgdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KSB7IH1cbi0tXG5rZXJuZWwvZm9yay5jPTUzMz12b2lkIGZyZWVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcbi0tXG5rZXJuZWwvZm9yay5jLTU1NS1cdHJ0X211dGV4X2RlYnVnX3Rhc2tfZnJlZSh0c2spO1xua2VybmVsL2ZvcmsuYzo1NTY6XHRmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHRzayk7XG5rZXJuZWwvZm9yay5jLTU1Ny1cdGFyY2hfcmVsZWFzZV90YXNrX3N0cnVjdCh0c2spO1xuLS1cbmtlcm5lbC90cmFjZS9mZ3JhcGguYz0xMTYwPXZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXG4tLVxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNzktXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM6MTE4MDp2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExODEte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NDQ4CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkEgUG90ZW50aWFsIE1lbW9yeSBDb3JydXB0aW9uIElzc3VlIGluIFRhc2sgRm9ya2luZyB3aXRoIEZ0cmFjZSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgaG93IHRhc2sgc3RydWN0dXJlcyBhcmUgaGFuZGxlZCBkdXJpbmcgYSBmb3JrLCBzcGVjaWZpY2FsbHkgd2l0aCBmdHJhY2UgZW5hYmxlZC4gSSBzZWUgdGhhdCBgZnJlZV90YXNrYCBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AsIHdoaWNoIGlzIGV4cGVjdGVkLiBOb3csIGlmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgYGJhZF9mb3JrX2ZyZWVgIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCwgbGVhZGluZyB0byBhIGRlbGF5ZWQgZnJlZSBvZiB0aGUgdGFzaywgdWx0aW1hdGVseSBjYWxsaW5nIGBmcmVlX3Rhc2tgIGFuZCB0aGVuIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCwgYXMgZXhwZWN0ZWQuCgpCdXQgd2FpdCwgdGhpcyBzbWVsbHMgZmlzaHkuIFdoYXQgaWYgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHdhcyBhY3R1YWxseSBjYWxsZWQgKmFmdGVyKiBgY29weV9leGVjX3N0YXRlYCB3aXRoaW4gYSBmb3JrIHNlcXVlbmNlLCBhbmQgKnRoZW4qIHRoZSBgY29weV9leGVjX3N0YXRlYCBmYWlscz8gSW4gdGhpcyBzY2VuYXJpbywgYGJhZF9mb3JrX2ZyZWVgIHdvdWxkIHN0aWxsIGNhbGwgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgLCBkZXNwaXRlIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxpbmcuCgpBIGxpZ2h0YnVsYiBqdXN0IHdlbnQgb2ZmISBUaGUgZnVuY3Rpb24gYHAgPSBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7YCBpcyBjYWxsZWQuIEl0IGNvcGllcyB0aGUgZW50aXJlIHRhc2sgc3RydWN0dXJlIGZyb20gdGhlIHBhcmVudCwgaW5jbHVkaW5nIHRoZSBgcC0mZ3Q7cmV0X3N0YWNrYC4gTm93IGlmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzIGFuZCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agd2FzIG5ldmVyIGNhbGxlZCwgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIHdvdWxkIGZyZWUgdGhlICpwYXJlbnQmIzM5O3MqIGByZXRfc3RhY2tgISBUaGlzIGlzIGRlZmluaXRlbHkgYSBtZW1vcnkgY29ycnVwdGlvbiB2dWxuZXJhYmlsaXR5IHdhaXRpbmcgdG8gaGFwcGVuLiBJIG5lZWQgdG8gZGl2ZSBpbnRvIGBkdXBfdGFza19zdHJ1Y3RgIHJpZ2h0IGF3YXkgdG8gY29uZmlybSBteSBzdXNwaWNpb25zIGFuZCBzZWUgaG93IHRoaXMgaXMgaGFuZGxlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTA4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMDgwOlx0fVxuMTA4MTpcdFxuMTA4MjpcdHN0YXRpYyB2b2lkIG1tYXBfaW5pdF9sb2NrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuMTA4MzpcdHtcbjEwODQ6XHRcdGluaXRfcndzZW0oXHUwMDI2bW0tXHUwMDNlbW1hcF9sb2NrKTtcbjEwODU6XHRcdG1tX2xvY2tfc2VxY291bnRfaW5pdChtbSk7XG4xMDg2Olx0I2lmZGVmIENPTkZJR19QRVJfVk1BX0xPQ0tcbjEwODc6XHRcdHJjdXdhaXRfaW5pdChcdTAwMjZtbS1cdTAwM2V2bWFfd3JpdGVyX3dhaXQpO1xuMTA4ODpcdCNlbmRpZlxuMTA4OTpcdH1cbjEwOTA6XHRcbjEwOTE6XHRzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqbW1faW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKVxuMTA5MjpcdHtcbjEwOTM6XHRcdG10X2luaXRfZmxhZ3MoXHUwMDI2bW0tXHUwMDNlbW1fbXQsIE1NX01UX0ZMQUdTKTtcbjEwOTQ6XHRcdG10X3NldF9leHRlcm5hbF9sb2NrKFx1MDAyNm1tLVx1MDAzZW1tX210LCBcdTAwMjZtbS1cdTAwM2VtbWFwX2xvY2spO1xuMTA5NTpcdFx0YXRvbWljX3NldChcdTAwMjZtbS1cdTAwM2VtbV91c2VycywgMSk7XG4xMDk2Olx0XHRhdG9taWNfc2V0KFx1MDAyNm1tLVx1MDAzZW1tX2NvdW50LCAxKTtcbjEwOTc6XHRcdHNlcWNvdW50X2luaXQoXHUwMDI2bW0tXHUwMDNld3JpdGVfcHJvdGVjdF9zZXEpO1xuMTA5ODpcdFx0bW1hcF9pbml0X2xvY2sobW0pO1xuMTA5OTpcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bW0tXHUwMDNlbW1saXN0KTtcbjExMDA6XHRcdG1tX3BndGFibGVzX2J5dGVzX2luaXQobW0pO1xuMTEwMTpcdFx0bW0tXHUwMDNlbWFwX2NvdW50ID0gMDtcbjExMDI6XHRcdG1tLVx1MDAzZWxvY2tlZF92bSA9IDA7XG4xMTAzOlx0XHRhdG9taWM2NF9zZXQoXHUwMDI2bW0tXHUwMDNlcGlubmVkX3ZtLCAwKTtcbjExMDQ6XHRcdG1lbXNldChcdTAwMjZtbS1cdTAwM2Vyc3Nfc3RhdCwgMCwgc2l6ZW9mKG1tLVx1MDAzZXJzc19zdGF0KSk7XG4xMTA1Olx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZtbS1cdTAwM2VwYWdlX3RhYmxlX2xvY2spO1xuMTEwNjpcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bW0tXHUwMDNlYXJnX2xvY2spO1xuMTEwNzpcdFx0bW1faW5pdF9jcHVtYXNrKG1tKTtcbjExMDg6XHRcdG1tX2luaXRfYWlvKG1tKTtcbjExMDk6XHRcdG1tX2luaXRfb3duZXIobW0sIHApO1xuMTExMDpcdFx0bW1fcGFzaWRfaW5pdChtbSk7XG4xMTExOlx0XHRSQ1VfSU5JVF9QT0lOVEVSKG1tLVx1MDAzZWV4ZV9maWxlLCBOVUxMKTtcbjExMTI6XHRcdG1tdV9ub3RpZmllcl9zdWJzY3JpcHRpb25zX2luaXQobW0pO1xuMTExMzpcdFx0aW5pdF90bGJfZmx1c2hfcGVuZGluZyhtbSk7XG4xMTE0Olx0I2lmIGRlZmluZWQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSBcdTAwMjZcdTAwMjYgIWRlZmluZWQoQ09ORklHX1NQTElUX1BNRF9QVExPQ0tTKVxuMTExNTpcdFx0bW0tXHUwMDNlcG1kX2h1Z2VfcHRlID0gTlVMTDtcbjExMTY6XHQjZW5kaWZcbjExMTc6XHRcdG1tX2luaXRfdXByb2Jlc19zdGF0ZShtbSk7XG4xMTE4Olx0XHRodWdldGxiX2NvdW50X2luaXQobW0pO1xuMTExOTpcdFx0ZnV0ZXhfbW1faW5pdChtbSk7XG4xMTIwOlx0XG4xMTIxOlx0XHRtbV9mbGFnc19jbGVhcl9hbGwobW0pO1xuMTEyMjpcdFx0aWYgKGN1cnJlbnQtXHUwMDNlbW0pIHtcbjExMjM6XHRcdFx0dW5zaWduZWQgbG9uZyBmbGFncyA9IF9fbW1fZmxhZ3NfZ2V0X3dvcmQoY3VycmVudC1cdTAwM2VtbSk7XG4xMTI0Olx0XG4xMTI1Olx0XHRcdF9fbW1fZmxhZ3Nfb3ZlcndyaXRlX3dvcmQobW0sIG1tZl9pbml0X2xlZ2FjeV9mbGFncyhmbGFncykpO1xuMTEyNjpcdFx0XHRtbS1cdTAwM2VkZWZfZmxhZ3MgPSBjdXJyZW50LVx1MDAzZW1tLVx1MDAzZWRlZl9mbGFncyBcdTAwMjYgVk1fSU5JVF9ERUZfTUFTSztcbjExMjc6XHRcdH0gZWxzZSB7XG4xMTI4Olx0XHRcdF9fbW1fZmxhZ3Nfb3ZlcndyaXRlX3dvcmQobW0sIGNvcmVkdW1wX2ZpbHRlcik7XG4xMTI5Olx0XHRcdG1tLVx1MDAzZWRlZl9mbGFncyA9IDA7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY5NDEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQ2hlY2tpbmcgYGR1cF90YXNrX3N0cnVjdGAqKgoKUmlnaHQsIGxldCBtZSBqdXN0IHBhdXNlIGFuZCBtYWtlIGEgcXVpY2sgbWVudGFsIG5vdGUg4oCTIEkgbmVlZCB0byBjaXJjbGUgYmFjayBhbmQgc3BlY2lmaWNhbGx5IGV4YW1pbmUgYGR1cF90YXNrX3N0cnVjdGAuIEdpdmVuIHRoZSBjb250ZXh0IG9mIHdoYXQgSSYjMzk7bSB3b3JraW5nIG9uLCBJIHN1c3BlY3QgdGhlcmUgbWlnaHQgYmUgc29tZSBudWFuY2VkIGJlaGF2aW9yIHRoZXJlIHRoYXQgY291bGQgaW1wYWN0IHRoZSBvdmVyYWxsIGRlc2lnbi4gSSYjMzk7bSB0aGlua2luZyBhYm91dCBwb3RlbnRpYWwgaW1wbGljYXRpb25zIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50IG9yIHBlcmhhcHMgaG93IHdlJiMzOTtyZSBoYW5kbGluZyB0aHJlYWQgY3JlYXRpb24uIEl04oCZcyBhbHdheXMgd29ydGggYSBxdWljayBjaGVjaywgZXNwZWNpYWxseSB3aXRoIHNvbWV0aGluZyB0aGF0IGRlYWxzIGRpcmVjdGx5IHdpdGggdGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHByb2Nlc3Nlcy4gTmVlZCB0byBzZWUgaG93IHRoYXQgZnVuY3Rpb27igJlzIGludGVybmFsIHdvcmtpbmdzIG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IGN1cnJlbnQgY2hhbmdlcywgYW5kLCBvZiBjb3Vyc2UsIGhvdyBhbnkgbW9kaWZpY2F0aW9ucyBjb3VsZCBpbmZsdWVuY2UgcGVyZm9ybWFuY2UuIFRpbWUgdG8gZGlnIGluIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtec3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCBcXCpkdXBfdGFza19zdHJ1Y3QmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2ZvcmsuYz05MDc9dm9pZCBzZXRfdGFza19zdGFja19lbmRfbWFnaWMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxua2VybmVsL2ZvcmsuYy05MTQtXG5rZXJuZWwvZm9yay5jOjkxNTpzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpkdXBfdGFza19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICpvcmlnLCBpbnQgbm9kZSlcbmtlcm5lbC9mb3JrLmMtOTE2LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzI0NwoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXAgaW4gdGhlIHdlZWRzIG9mIGtlcm5lbC1sZXZlbCBjb2RlOgoKKipEaXZpbmcgaW50byBgZHVwX3Rhc2tfc3RydWN0YCoqCgpBbHJpZ2h0LCB0aW1lIHRvIGNyYWNrIG9wZW4gdGhlIGBkdXBfdGFza19zdHJ1Y3RgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGlzIHdvcmtzLiBJIGtub3cgaXQmIzM5O3MgZnVuZGFtZW50YWwgdG8gcHJvY2VzcyBjcmVhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCwgc28gdGhpcyBuZWVkcyBteSBmdWxsIGF0dGVudGlvbi4gTGV0JiMzOTtzIHNlZSBob3cgaXQmIzM5O3MgaW1wbGVtZW50ZWQgYW5kIGFsbCB0aGUgcmVsZXZhbnQgZGF0YSBzdHJ1Y3R1cmVzIGl0IHRvdWNoZXMuIEkmIzM5O20gZ29pbmcgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc3RyYXRlZ2llcyBhbmQgaG93IHJlc291cmNlcyBhcmUgY29waWVkIChvciBzaGFyZWQsIG1vcmUgbGlrZWx5KS4gSXQmIzM5O3MgY3J1Y2lhbCB0byBncmFzcCB0aGUgc3VidGxldGllcyBoZXJlIOKAkyBlbnN1cmluZyBhIGNsZWFuIHNlcGFyYXRpb24gYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIHByb2Nlc3NlcyB3aGlsZSBhbHNvIG9wdGltaXppbmcgZm9yIHBlcmZvcm1hbmNlIGlzIGEgZGVsaWNhdGUgYmFsYW5jaW5nIGFjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA5MTU6XHRzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpkdXBfdGFza19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICpvcmlnLCBpbnQgbm9kZSlcbiA5MTY6XHR7XG4gOTE3Olx0XHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaztcbiA5MTg6XHRcdGludCBlcnI7XG4gOTE5Olx0XG4gOTIwOlx0XHRpZiAobm9kZSA9PSBOVU1BX05PX05PREUpXG4gOTIxOlx0XHRcdG5vZGUgPSB0c2tfZm9ya19nZXRfbm9kZShvcmlnKTtcbiA5MjI6XHRcdHRzayA9IGFsbG9jX3Rhc2tfc3RydWN0X25vZGUobm9kZSk7XG4gOTIzOlx0XHRpZiAoIXRzaylcbiA5MjQ6XHRcdFx0cmV0dXJuIE5VTEw7XG4gOTI1Olx0XG4gOTI2Olx0XHRlcnIgPSBhcmNoX2R1cF90YXNrX3N0cnVjdCh0c2ssIG9yaWcpO1xuIDkyNzpcdFx0aWYgKGVycilcbiA5Mjg6XHRcdFx0Z290byBmcmVlX3RzaztcbiA5Mjk6XHRcbiA5MzA6XHRcdGVyciA9IGFsbG9jX3RocmVhZF9zdGFja19ub2RlKHRzaywgbm9kZSk7XG4gOTMxOlx0XHRpZiAoZXJyKVxuIDkzMjpcdFx0XHRnb3RvIGZyZWVfdHNrO1xuIDkzMzpcdFxuIDkzNDpcdCNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTS1xuIDkzNTpcdFx0cmVmY291bnRfc2V0KFx1MDAyNnRzay1cdTAwM2VzdGFja19yZWZjb3VudCwgMSk7XG4gOTM2Olx0I2VuZGlmXG4gOTM3Olx0XHRhY2NvdW50X2tlcm5lbF9zdGFjayh0c2ssIDEpO1xuIDkzODpcdFxuIDkzOTpcdFx0ZXJyID0gc21wX3Rhc2tfaXBpX21hc2tfYWxsb2ModHNrKTtcbiA5NDA6XHRcdGlmIChlcnIpXG4gOTQxOlx0XHRcdGdvdG8gZnJlZV9zdGFjaztcbiA5NDI6XHRcbiA5NDM6XHRcdGVyciA9IHNjc19wcmVwYXJlKHRzaywgbm9kZSk7XG4gOTQ0Olx0XHRpZiAoZXJyKVxuIDk0NTpcdFx0XHRnb3RvIGZyZWVfaXBpX21hc2s7XG4gOTQ2Olx0XG4gOTQ3Olx0I2lmZGVmIENPTkZJR19TRUNDT01QXG4gOTQ4Olx0XHQvKlxuIDk0OTpcdFx0ICogV2UgbXVzdCBoYW5kbGUgc2V0dGluZyB1cCBzZWNjb21wIGZpbHRlcnMgb25jZSB3ZSYjMzk7cmUgdW5kZXJcbiA5NTA6XHRcdCAqIHRoZSBzaWdoYW5kIGxvY2sgaW4gY2FzZSBvcmlnIGhhcyBjaGFuZ2VkIGJldHdlZW4gbm93IGFuZFxuIDk1MTpcdFx0ICogdGhlbi4gVW50aWwgdGhlbiwgZmlsdGVyIG11c3QgYmUgTlVMTCB0byBhdm9pZCBtZXNzaW5nIHVwXG4gOTUyOlx0XHQgKiB0aGUgdXNhZ2UgY291bnRzIG9uIHRoZSBlcnJvciBwYXRoIGNhbGxpbmcgZnJlZV90YXNrLlxuIDk1MzpcdFx0ICovXG4gOTU0Olx0XHR0c2stXHUwMDNlc2VjY29tcC5maWx0ZXIgPSBOVUxMO1xuIDk1NTpcdCNlbmRpZlxuIDk1NjpcdFxuIDk1NzpcdFx0UkNVX0lOSVRfUE9JTlRFUih0c2stXHUwMDNlZXhlY19zdGF0ZSwgTlVMTCk7XG4gOTU4Olx0XG4gOTU5Olx0XHRzZXR1cF90aHJlYWRfc3RhY2sodHNrLCBvcmlnKTtcbiA5NjA6XHRcdGNsZWFyX3VzZXJfcmV0dXJuX25vdGlmaWVyKHRzayk7XG4gOTYxOlx0XHRjbGVhcl90c2tfbmVlZF9yZXNjaGVkKHRzayk7XG4gOTYyOlx0XHRzZXRfdGFza19zdGFja19lbmRfbWFnaWModHNrKTtcbiA5NjM6XHRcdGNsZWFyX3N5c2NhbGxfd29ya19zeXNjYWxsX3VzZXJfZGlzcGF0Y2godHNrKTtcbiA5NjQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODE3MAoJCQkJCQkJb3V0cHV0OiAzMjkKCQkJCQkJCXRob3VnaHRzOiAxMTU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBVc2UtQWZ0ZXItRnJlZS9Eb3VibGUgRnJlZSBpbiBUYXNrIENyZWF0aW9uIHdpdGggZnRyYWNlKioKCk9rYXksIHNvIGhlcmUmIzM5O3MgdGhlIGRlYWwuIGBhcmNoX2R1cF90YXNrX3N0cnVjdGAgZG9lcyBhIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIHBhcmVudCYjMzk7cyBgdGFza19zdHJ1Y3RgIHRvIHRoZSBjaGlsZC4gVGhhdCBtZWFucyB0aGUgYHJldF9zdGFja2AgcG9pbnRlciwgdXNlZCBieSBmdHJhY2UsIGdldHMgY29waWVkIHRvby4gVGhhdCBtYWtlcyBzZW5zZSwgYnV0IGl0IGNhbiBsZWFkIHRvIGEgcmVhbGx5IG5hc3R5IGJ1Zy4KCkxldCYjMzk7cyBzYXkgYGNvcHlfZXhlY19zdGF0ZWAgb3Igc29tZXRoaW5nIGVsc2UgZmFpbHMgZHVyaW5nIHRoZSB0YXNrIGNyZWF0aW9uLiBJZiB0aGF0IGhhcHBlbnMsIGBiYWRfZm9ya19mcmVlYCBnZXRzIGNhbGxlZCwgd2hpY2ggdWx0aW1hdGVseSBsZWFkcyB0byBgZnJlZV90YXNrYCwgYW5kIHRoZW4gYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgLiBIZXJlJiMzOTtzIHRoZSBraWNrZXI6IGlmIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCAqaGFzbiYjMzk7dCogYmVlbiBjYWxsZWQgeWV0LCB0aGUgY2hpbGQmIzM5O3MgYHJldF9zdGFja2Agc3RpbGwgcG9pbnRzIHRvIHRoZSAqcGFyZW50JiMzOTtzKiBgcmV0X3N0YWNrYCEKClNvLCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AgaXMgZ29pbmcgdG8gZnJlZSB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgISBUaGF0JiMzOTtzIGEgZG91YmxlIGZyZWUgd2FpdGluZyB0byBoYXBwZW4sIG9yIGEgdXNlLWFmdGVyLWZyZWUgZm9yIHRoZSBwYXJlbnQuIFRoZSBwYXJlbnQsIHdoaWNoIGlzIHN0aWxsIHJ1bm5pbmcsIGhhcHBpbHkgY2h1Z3MgYWxvbmcsIHVzaW5nIG1lbW9yeSB0aGF0IGhhcyBqdXN0IGJlZW4gKmZyZWVkKi4gIENsYXNzaWMgVUFGL2RvdWJsZSBmcmVlLgoKTm93LCBpcyB0aGlzIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlPyAgTm8uIEtNU0FOIGlzbiYjMzk7dCB0aGUgdG9vbCBoZXJlLiBUaGlzIGlzIGEgY2xlYXIgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWUuIEtBU0FOIGlzIHRoZSB3YXkgdG8gZ28uIEl0IHdpbGwgY2F0Y2ggdGhlIHBhcmVudCB1c2luZyB0aGUgZnJlZWQgbWVtb3J5IG9yIHRoZSBzZWNvbmQgYXR0ZW1wdCB0byBmcmVlIGl0LgoKVGhlIHByb3Bvc2VkIHBhdGNoIGlzIHNtYXJ0LiBJdCYjMzk7cyBtb3ZpbmcgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGVhcmxpZXIgaW4gdGhlIHByb2Nlc3MuIE5vdyB0aGUgY2hpbGQmIzM5O3MgYHJldF9zdGFja2AgZ2V0cyBzZXQgdG8gYE5VTExgIChhbmQgcG90ZW50aWFsbHkgYWxsb2NhdGVkIGEgbmV3IG9uZSkgYmVmb3JlIGFueSBlcnJvciBwYXRocy4gVGhhdCBmaXhlcyB0aGUgYnVnLiBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgZXhwbGljaXRseSBzZXRzIGB0LSZndDtyZXRfc3RhY2sgPSBOVUxMYC4KCkFscmlnaHQsIGxldCBtZSBzb2xpZGlmeSB0aGlzIHJlYXNvbmluZy4gVGhlIHBhdGNoIGFkZHJlc3NlcyBhIFVBRi9kb3VibGUgZnJlZS4gV2hlbiBhIG5ldyB0YXNrIGlzIGNyZWF0ZWQsIGBkdXBfdGFza19zdHJ1Y3RgIGR1cGxpY2F0ZXMgdGhlIHBhcmVudCYjMzk7cyBgdGFza19zdHJ1Y3RgLCBpbmNsdWRpbmcgZnRyYWNlJiMzOTtzIGByZXRfc3RhY2tgIHBvaW50ZXIuIElmIHNvbWV0aGluZyBnb2VzIHdyb25nICpiZWZvcmUqIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBpcyBydW4sIHRoZSBlcnJvciBwYXRoIGZyZWVzIHRoZSBjaGlsZCwgYnV0IHNpbmNlIGByZXRfc3RhY2tgIGlzIHN0aWxsIHBvaW50aW5nIHRvIHRoZSBwYXJlbnQmIzM5O3Mgc3RhY2ssIGl0IGVuZHMgdXAgZnJlZWluZyB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLiBUaGVuIHRoZSBwYXJlbnQga2VlcHMgcnVubmluZyB1c2luZyBtZW1vcnkgd2hpY2ggaXMgbm93IGZyZWUgYW5kIGhhcyBiZWVuIGZyZWVkLiBUaGlzIGNyZWF0ZXMgYSB1c2UtYWZ0ZXItZnJlZSwgb3IgYSBkb3VibGUgZnJlZS4gS0FTQU4gd2lsbCBjYXRjaCBpdCBiZWNhdXNlIGl0JiMzOTtzIGRlc2lnbmVkIGZvciB0aGlzIHNvcnQgb2YgbWVtb3J5IGNvcnJ1cHRpb24uCgpJIHdpbGwgdGhlcmVmb3JlIG1hcmsgdGhpcyBhcyBuZWVkaW5nIEtBU0FOIGFuZCBub3QgS01TQU4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCYjMzk7cyBgdGFza19zdHJ1Y3RgIHRvIHRoZSBjaGlsZCwgaW5jbHVkaW5nIHRoZSBgcmV0X3N0YWNrYCBwb2ludGVyIHVzZWQgYnkgZnRyYWNlLiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGBjb3B5X3Byb2Nlc3MoKWAgKGUuZy4sIGluIGBjb3B5X2V4ZWNfc3RhdGUoKWApIGJlZm9yZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYCBpcyBjYWxsZWQsIHRoZSBlcnJvciBoYW5kbGluZyBwYXRoIChgYmFkX2ZvcmtfZnJlZWApIHdpbGwgY2FsbCBgZnJlZV90YXNrKClgLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgLiBTaW5jZSB0aGUgY2hpbGQmIzM5O3MgYHJldF9zdGFja2Agc3RpbGwgcG9pbnRzIHRvIHRoZSBwYXJlbnQmIzM5O3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLiBUaGUgcGFyZW50IHRhc2sgd2lsbCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgZnJlZWQgYHJldF9zdGFja2AsIHJlc3VsdGluZyBpbiBhIHVzZS1hZnRlci1mcmVlLCBhbmQgaXQgd2lsbCBiZSBkb3VibGUtZnJlZWQgd2hlbiB0aGUgcGFyZW50IGV2ZW50dWFsbHkgZXhpdHMuXG5cblRoaXMgaXMgYSBjbGFzc2ljIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgdnVsbmVyYWJpbGl0eS4gS0FTQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2UtYWZ0ZXItZnJlZSBhbmQgZG91YmxlIGZyZWUgYnVncywgYW5kIHdpbGwgcmVsaWFibHkgY2F0Y2ggdGhpcyBpc3N1ZS4gVGhlcmUgaXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UsIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgb3IgaW5mb3JtYXRpb24gbGVhayBpbnZvbHZlZCBpbiB0aGlzIGJ1Zywgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb3ZlcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgZWFybGllciBpbiBgY29weV9wcm9jZXNzKClgIHRvIHByZXZlbnQgYSB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIGJ1Zy4gV2hlbiBhIG5ldyB0YXNrIGlzIGNyZWF0ZWQsIGBkdXBfdGFza19zdHJ1Y3QoKWAgY29waWVzIHRoZSBwYXJlbnQmIzM5O3MgYHRhc2tfc3RydWN0YCB0byB0aGUgY2hpbGQsIGluY2x1ZGluZyB0aGUgYHJldF9zdGFja2AgcG9pbnRlciB1c2VkIGJ5IGZ0cmFjZS4gSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBgY29weV9wcm9jZXNzKClgIChlLmcuLCBpbiBgY29weV9leGVjX3N0YXRlKClgKSBiZWZvcmUgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKWAgaXMgY2FsbGVkLCB0aGUgZXJyb3IgaGFuZGxpbmcgcGF0aCAoYGJhZF9mb3JrX2ZyZWVgKSB3aWxsIGNhbGwgYGZyZWVfdGFzaygpYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYC4gU2luY2UgdGhlIGNoaWxkJiMzOTtzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYCB3aWxsIGVycm9uZW91c2x5IGZyZWUgdGhlIHBhcmVudCYjMzk7cyBgcmV0X3N0YWNrYC4gVGhlIHBhcmVudCB0YXNrIHdpbGwgdGhlbiBjb250aW51ZSB0byB1c2UgdGhlIGZyZWVkIGByZXRfc3RhY2tgLCByZXN1bHRpbmcgaW4gYSB1c2UtYWZ0ZXItZnJlZSwgYW5kIGl0IHdpbGwgYmUgZG91YmxlLWZyZWVkIHdoZW4gdGhlIHBhcmVudCBldmVudHVhbGx5IGV4aXRzLlxuXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NDoxOS42MTE3MzE2NjNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTg2MDg2MTYxMjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRlVOQ1RJT05fVFJBQ0VSXCIsXG4gICAgXCJGVU5DVElPTl9HUkFQSF9UUkFDRVJcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb3ZlcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgZWFybGllciBpbiBgY29weV9wcm9jZXNzKClgIHRvIHByZXZlbnQgYSB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIGJ1Zy4gV2hlbiBhIG5ldyB0YXNrIGlzIGNyZWF0ZWQsIGBkdXBfdGFza19zdHJ1Y3QoKWAgY29waWVzIHRoZSBwYXJlbnQncyBgdGFza19zdHJ1Y3RgIHRvIHRoZSBjaGlsZCwgaW5jbHVkaW5nIHRoZSBgcmV0X3N0YWNrYCBwb2ludGVyIHVzZWQgYnkgZnRyYWNlLiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGBjb3B5X3Byb2Nlc3MoKWAgKGUuZy4sIGluIGBjb3B5X2V4ZWNfc3RhdGUoKWApIGJlZm9yZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYCBpcyBjYWxsZWQsIHRoZSBlcnJvciBoYW5kbGluZyBwYXRoIChgYmFkX2ZvcmtfZnJlZWApIHdpbGwgY2FsbCBgZnJlZV90YXNrKClgLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgLiBTaW5jZSB0aGUgY2hpbGQncyBgcmV0X3N0YWNrYCBzdGlsbCBwb2ludHMgdG8gdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgLCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYCB3aWxsIGVycm9uZW91c2x5IGZyZWUgdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgLiBUaGUgcGFyZW50IHRhc2sgd2lsbCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgZnJlZWQgYHJldF9zdGFja2AsIHJlc3VsdGluZyBpbiBhIHVzZS1hZnRlci1mcmVlLCBhbmQgaXQgd2lsbCBiZSBkb3VibGUtZnJlZWQgd2hlbiB0aGUgcGFyZW50IGV2ZW50dWFsbHkgZXhpdHMuXFxuXFxuVGhpcyBpcyBhIGNsYXNzaWMgdXNlLWFmdGVyLWZyZWUgLyBkb3VibGUgZnJlZSB2dWxuZXJhYmlsaXR5LiBLQVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGV0ZWN0IHVzZS1hZnRlci1mcmVlIGFuZCBkb3VibGUgZnJlZSBidWdzLCBhbmQgd2lsbCByZWxpYWJseSBjYXRjaCB0aGlzIGlzc3VlLiBUaGVyZSBpcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSwgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBvciBpbmZvcm1hdGlvbiBsZWFrIGludm9sdmVkIGluIHRoaXMgYnVnLCBzbyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBvZiBjb3B5X3Byb2Nlc3MoKSBieSBtb3ZpbmcgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpIGVhcmxpZXIuIFRoZSBidWcgaXMgdHJpZ2dlcmVkIHdoZW4gY29weV9wcm9jZXNzKCkgZmFpbHMgKGUuZy4sIGluIGNvcHlfZXhlY19zdGF0ZSgpKSBhbmQgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBGdXp6aW5nIHRoaXMgcmVxdWlyZXMgZW5hYmxpbmcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSIGFuZCBGVU5DVElPTl9UUkFDRVIgdG8gZW5zdXJlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIGVycm9yIHBhdGhzIGFyZSBwcm9wZXJseSB0ZXN0ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjE5LjYxMTczNzc0M1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDA5Njg4NjU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZTJmM2UyNDEzY2QwZDA1NGMzNTAyY2Y3YzFiMTRiYWNkMmE5NGVmZVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIEF1ZyAyMSAxMjo1NDoxOCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuY1xcbmluZGV4IDFlNjg0MDRiZDc3M2UuLmNlYzgyYTY0YTA3Y2QgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2ZvcmsuY1xcbisrKyBiL2tlcm5lbC9mb3JrLmNcXG5AQCAtMjEzOSw2ICsyMTM5LDcgQEAgX19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcyhcXG4gXFx0cCA9IGR1cF90YXNrX3N0cnVjdChjdXJyZW50LCBub2RlKTtcXG4gXFx0aWYgKCFwKVxcbiBcXHRcXHRnb3RvIGZvcmtfb3V0O1xcbitcXHRmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO1xcbiBcXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xcbiBcXHRpZiAocmV0dmFsKVxcbiBcXHRcXHRnb3RvIGJhZF9mb3JrX2ZyZWU7XFxuQEAgLTIxNjUsOCArMjE2Niw2IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXFxuIFxcdCAqL1xcbiBcXHRwLVxcdTAwM2VjbGVhcl9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgXFx1MDAyNiBDTE9ORV9DSElMRF9DTEVBUlRJRCkgPyBhcmdzLVxcdTAwM2VjaGlsZF90aWQgOiBOVUxMO1xcbiBcXG4tXFx0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcXG4tXFxuIFxcdHJ0X211dGV4X2luaXRfdGFzayhwKTtcXG4gXFx0cmF3X3NwaW5fbG9ja19pbml0KFxcdTAwMjZwLVxcdTAwM2VibG9ja2VkX2xvY2spO1xcbiBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6MjAuMDIyMTEyMzkxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6OTk4MzcwNzU5ODEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRlVOQ1RJT05fVFJBQ0VSXCIsXG4gICAgXCJGVU5DVElPTl9HUkFQSF9UUkFDRVJcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSB1c2UtYWZ0ZXItZnJlZSBidWcgaW4gdGhlIGVycm9yIHBhdGggb2YgY29weV9wcm9jZXNzKCkgYnkgbW92aW5nIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKSBlYXJsaWVyLiBUaGUgYnVnIGlzIHRyaWdnZXJlZCB3aGVuIGNvcHlfcHJvY2VzcygpIGZhaWxzIChlLmcuLCBpbiBjb3B5X2V4ZWNfc3RhdGUoKSkgYW5kIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZC4gRnV6emluZyB0aGlzIHJlcXVpcmVzIGVuYWJsaW5nIEZVTkNUSU9OX0dSQVBIX1RSQUNFUiBhbmQgRlVOQ1RJT05fVFJBQ0VSIHRvIGVuc3VyZSB0aGUgbmV3IGluaXRpYWxpemF0aW9uIG9yZGVyIGFuZCBlcnJvciBwYXRocyBhcmUgcHJvcGVybHkgdGVzdGVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBlMmYzZTI0MTNjZDBkMDU0YzM1MDJjZjdjMWIxNGJhY2QyYTk0ZWZlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMjEgMTI6NTQ6MTggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuY1xuaW5kZXggMWU2ODQwNGJkNzczZS4uY2VjODJhNjRhMDdjZCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9mb3JrLmNcbisrKyBiL2tlcm5lbC9mb3JrLmNcbkBAIC0yMTM5LDYgKzIxMzksNyBAQCBfX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxuIFx0cCA9IGR1cF90YXNrX3N0cnVjdChjdXJyZW50LCBub2RlKTtcbiBcdGlmICghcClcbiBcdFx0Z290byBmb3JrX291dDtcbitcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG4gXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xuIFx0aWYgKHJldHZhbClcbiBcdFx0Z290byBiYWRfZm9ya19mcmVlO1xuQEAgLTIxNjUsOCArMjE2Niw2IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXG4gXHQgKi9cbiBcdHAtXHUwMDNlY2xlYXJfY2hpbGRfdGlkID0gKGNsb25lX2ZsYWdzIFx1MDAyNiBDTE9ORV9DSElMRF9DTEVBUlRJRCkgPyBhcmdzLVx1MDAzZWNoaWxkX3RpZCA6IE5VTEw7XG4gXG4tXHRmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO1xuLVxuIFx0cnRfbXV0ZXhfaW5pdF90YXNrKHApO1xuIFx0cmF3X3NwaW5fbG9ja19pbml0KFx1MDAyNnAtXHUwMDNlYmxvY2tlZF9sb2NrKTtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjIwLjAyMjExNDM0WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTA4MDg4NzE3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBGb3JrIE9wdGltaXphdGlvbiBpbiBLZXJuZWwvZm9yay5jKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHNlZW1zIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCB5b3Uga25vdyBob3cgaXQgZ29lcyDigJMgZXZlbiBzbWFsbCBjaGFuZ2VzIGNhbiBiZSBzaWduaWZpY2FudC4gSXQncyBpbiBga2VybmVsL2ZvcmsuY2AsIGFuZCB0aGUga2V5IGhlcmUgaXMgdGhlIHJlbG9jYXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7YC4gVGhleSd2ZSBtb3ZlZCBpdCAqaW5zaWRlKiBgY29weV9wcm9jZXNzKClgLCB3aGljaCBpcyBhIGxpdHRsZSB1bnVzdWFsLiBJdCB3YXMgb3JpZ2luYWxseSBwb3NpdGlvbmVkICphZnRlciogdGhlIGFzc2lnbm1lbnQgdG8gYHAtXHUwMDNlY2xlYXJfY2hpbGRfdGlkYCwgYW5kIG5vdyBpdCdzIGhhcHBlbmluZyByaWdodCBhZnRlciB0aGUgYGR1cF90YXNrX3N0cnVjdChjdXJyZW50LCBub2RlKTtgIGNhbGwuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgaXMgbGlrZWx5IGEgc3VidGxlIGJ1ZyBmaXguIFBlcmhhcHMgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHdhcyBiZWluZyBjYWxsZWQgdG9vIGxhdGUgaW4gdGhlIHByb2Nlc3MsIG9yIG1heWJlIHRoZXJlIHdhcyBhIG1pc3NlZCBleGVjdXRpb24gcGF0aCB0aGF0IHdhcyBpbmFkdmVydGVudGx5IGJ5cGFzc2luZyBpdC4gVGhlIGZhY3QgdGhhdCB0aGUgY2hhbmdlIGlzIHNvIHRpZ2h0bHkgZm9jdXNlZCBzdWdnZXN0cyB0aGV5J3JlIHRyeWluZyB0byBhZGRyZXNzIGEgc3BlY2lmaWMsIGNvbnRhaW5lZCBpc3N1ZS4gSXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlcmUgd2FzIHNvbWUgZXJyb3IgaGFuZGxpbmcgbG9naWMgdGhhdCBjb3VsZCBza2lwIHRoZSBjYWxsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcy5cblxuQmVmb3JlIEkganVtcCB0byBhbnkgZGVmaW5pdGl2ZSBjb25jbHVzaW9ucywgSSBuZWVkIHRvIGRpZyBpbnRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBpdHNlbGYuIFRoYXQncyB0aGUgcmVhbCBrZXkgdG8gdW5kZXJzdGFuZGluZyAqd2h5KiB0aGlzIHNoaWZ0IHdhcyBuZWVkZWQgYW5kIHdoYXQgcG90ZW50aWFsIGltcGFjdCBpdCBoYXMgb24gdGhlIHN5c3RlbSdzIGJlaGF2aW9yLiBUaW1lIHRvIGRlbHZlIGludG8gdGhlIGZ1bmN0aW9uJ3MgaW1wbGVtZW50YXRpb24gYW5kIHVuZGVyc3RhbmQgaXRzIGludGVyYWN0aW9ucyB3aXRoaW4gdGhlIGJyb2FkZXIgdHJhY2luZyBmcmFtZXdvcmsuIFRoaXMgbWlub3IgY2hhbmdlIGhhcyBwaXF1ZWQgbXkgaW50ZXJlc3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNzIsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTgsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NDoyNS4xMDMwMDQ2MzlaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc3MDM5NDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZnRyYWNlX2dyYXBoX2luaXRfdGFza1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvZm9yay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9mb3JrLmM9MjAxOD1fX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxcbi0tXFxua2VybmVsL2ZvcmsuYy0yMTQxLVxcdFxcdGdvdG8gZm9ya19vdXQ7XFxua2VybmVsL2ZvcmsuYzoyMTQyOlxcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XFxua2VybmVsL2ZvcmsuYy0yMTQzLVxcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjI1LjE1MDcxMzMxOFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMwNjk3NDQ0MjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gZnRyYWNlX2dyYXBoX2luaXRfdGFzayoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gc29tZXRoaW5nIHJlbGF0ZWQgdG8gZnRyYWNlJ3MgZ3JhcGggdHJhY2luZyBpbml0aWFsaXphdGlvbi4gVGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBkZWZpbml0aW9uIG9mIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYC4gSSBuZWVkIGEgc29saWQgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGdyYXBoIHRyYWNlciBpcyBzZXQgdXAgZm9yIGEgbmV3bHkgY3JlYXRlZCB0YXNrLiBJIHN1c3BlY3QgaXQnbGwgaW52b2x2ZSBzZXR0aW5nIHVwIHBlci10YXNrIGRhdGEgc3RydWN0dXJlcywgY29uZmlndXJpbmcgdGhlIHRyYWNlIGJ1ZmZlciwgYW5kIGxpa2VseSBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIGdsb2JhbCBncmFwaCB0cmFjZXIgc3RhdGUuIEknbGwgcHJvYmFibHkgZmluZCBzb21lIGludGVyZXN0aW5nIGludGVyYWN0aW9ucyB3aXRoIHRoZSBzY2hlZHVsZXIgaGVyZSB0b28sIHBvc3NpYmx5IGhvb2tzIGludG8gdGFzayBjcmVhdGlvbiBvciBjb250ZXh0IHN3aXRjaGVzLiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzIVxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjQxLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6MjguMjIwNDYwMTQxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NTc4NjQwODUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZnRyYWNlX2dyYXBoX2luaXRfdGFza1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzQyPWV4dGVybiB0cmFjZV9mdW5jX2dyYXBoX2VudF90IGZ0cmFjZV9ncmFwaF9lbnRyeTtcXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNDMtXFxuaW5jbHVkZS9saW51eC9mdHJhY2UuaDoxMzQ0OmV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNDUtZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzU2PXN0YXRpYyBpbmxpbmUgdm9pZCB1bnBhdXNlX2dyYXBoX3RyYWNpbmcodm9pZClcXG4tLVxcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM2My1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNjQ6c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNjUtc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cXG4tLVxcbmtlcm5lbC9mb3JrLmM9MjAxOD1fX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxcbi0tXFxua2VybmVsL2ZvcmsuYy0yMTQxLVxcdFxcdGdvdG8gZm9ya19vdXQ7XFxua2VybmVsL2ZvcmsuYzoyMTQyOlxcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XFxua2VybmVsL2ZvcmsuYy0yMTQzLVxcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XFxuLS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM9MTEzMT12b2lkIGZ0cmFjZV9ncmFwaF9pbml0X2lkbGVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGludCBjcHUpXFxuLS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE1OS0vKiBBbGxvY2F0ZSBhIHJldHVybiBzdGFjayBmb3IgbmV3bHkgY3JlYXRlZCB0YXNrICovXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jOjExNjA6dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE2MS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjI5Ljk3ODMzMDcxNloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzOTg0MTQwNTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2sqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Ag4oCTIGEgcHJldHR5IHNwZWNpZmljIGZ1bmN0aW9uIG5hbWUuIEJhc2VkIG9uIGNvbnRleHQsIGl0J3MgbGlrZWx5IGludm9sdmVkIHdpdGggaW5pdGlhbGl6aW5nIHNvbWV0aGluZyByZWxhdGVkIHRvIGZ1bmN0aW9uIHRyYWNpbmcsIHNwZWNpZmljYWxseSB0aGUgZ3JhcGggdHJhY2VyLiBNeSBndXQgZmVlbGluZyBpcyBpdCdzIGhhbmRsaW5nIHRoZSBzZXR1cCBmb3IgYSBuZXcgdGFzayBvciBwcm9jZXNzLiBOb3csIHdoZXJlIGlzIHRoaXMgZnVuY3Rpb24gZGVmaW5lZD8gQWgsIGl0J3MgaW4gYGtlcm5lbC90cmFjZS9mZ3JhcGguY2AuIFRpbWUgdG8gZGlnIGludG8gdGhhdCBmaWxlIGFuZCBzZWUgZXhhY3RseSBob3cgaXQgd29ya3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBpbml0aWFsaXphdGlvbiBlbnRhaWxzLCB3aGF0IGRhdGEgc3RydWN0dXJlcyBpdCBtYW5pcHVsYXRlcywgYW5kIHdoYXQgaW1wbGljYXRpb25zIGl0IGhhcyBmb3IgdGhlIG92ZXJhbGwgdHJhY2luZyBtZWNoYW5pc20uIExldCdzIHNlZSB3aGF0IHdlIGNhbiBmaW5kIVxuXG5cbiIsIklucHV0VG9rZW5zIjozMjk1LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6MzMuMzc2NzQ2ODM4WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIwMTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC90cmFjZS9mZ3JhcGguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTU5LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTU5OlxcdC8qIEFsbG9jYXRlIGEgcmV0dXJuIHN0YWNrIGZvciBuZXdseSBjcmVhdGVkIHRhc2sgKi9cXG4xMTYwOlxcdHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxuMTE2MTpcXHR7XFxuMTE2MjpcXHRcXHQvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHVzZSB0aGUgcGFyZW50IHJldF9zdGFjayAqL1xcbjExNjM6XFx0XFx0dC1cXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtcXG4xMTY0OlxcdFxcdHQtXFx1MDAzZWN1cnJfcmV0X3N0YWNrID0gMDtcXG4xMTY1OlxcdFxcdHQtXFx1MDAzZWN1cnJfcmV0X2RlcHRoID0gLTE7XFxuMTE2NjpcXHRcXG4xMTY3OlxcdFxcdGlmIChmdHJhY2VfZ3JhcGhfYWN0aXZlKSB7XFxuMTE2ODpcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2s7XFxuMTE2OTpcXHRcXG4xMTcwOlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxcbjExNzE6XFx0XFx0XFx0XFx0cmV0dXJuO1xcbjExNzI6XFx0XFxuMTE3MzpcXHRcXHRcXHRyZXRfc3RhY2sgPSBrbWVtX2NhY2hlX2FsbG9jKGZncmFwaF9zdGFja19jYWNoZXAsIEdGUF9LRVJORUwpO1xcbjExNzQ6XFx0XFx0XFx0aWYgKCFyZXRfc3RhY2spXFxuMTE3NTpcXHRcXHRcXHRcXHRyZXR1cm47XFxuMTE3NjpcXHRcXHRcXHRncmFwaF9pbml0X3Rhc2sodCwgcmV0X3N0YWNrKTtcXG4xMTc3OlxcdFxcdH1cXG4xMTc4OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6MzMuMzc2ODY4NDI5WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTk2MDM1OTEwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIG1vdmluZyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgdG8gYSBzbGlnaHRseSBlYXJsaWVyIHBvaW50LCBzcGVjaWZpY2FsbHkgcmlnaHQgYWZ0ZXIgYHAgPSBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7YC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhpcyBpcyBhIGRlZmVuc2l2ZSBtb3ZlLiBJdCdzIGFsbW9zdCBjZXJ0YWlubHkgdG8gZW5zdXJlIHRoYXQgYHQtXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtgIGlzIHNldCAqYmVmb3JlKiBhbnkgcG90ZW50aWFsIGVycm9yIGNvbmRpdGlvbnMgdGhhdCBtaWdodCBjYXVzZSB0aGUgc3lzdGVtIHRvIGNhbGwgYGZyZWVfdGFzayhwKWAgb3IgYSBzaW1pbGFyIGZ1bmN0aW9uLiBJZiB0aGF0IHdhc24ndCBkb25lLCB0aGVyZSdzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHdlJ2QgdHJ5IHRvIGZyZWUgdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgIGJ5IGFjY2lkZW50IGR1cmluZyBhbiBlcnJvciBwYXRoLCBiZWNhdXNlIGBkdXBfdGFza19zdHJ1Y3RgIGNvcGllcyB0aGF0LlxuXG5Ib2xkIG9uLCAqcmlnaHQqLCBgZHVwX3Rhc2tfc3RydWN0YCBkb2VzIGEgZnVsbCBjb3B5IG9mIHRoZSBlbnRpcmUgYHRhc2tfc3RydWN0YC4gVGhhdCBtZWFucyBpZiB0aGUgcGFyZW50IHRhc2sgaGFzIGByZXRfc3RhY2tgIGFsbG9jYXRlZCwgdGhlIGNoaWxkIHRhc2sgd2lsbCBpbml0aWFsbHkgcG9pbnQgdG8gKnRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbiouIFNvLCBpZiBhbiBlcnJvciBoYXBwZW5zICpiZWZvcmUqIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBydW5zLCBmb3IgaW5zdGFuY2UsIGluIGBjb3B5X2V4ZWNfc3RhdGVgLCB0aGUgY2hpbGQgdGFzayBjb3VsZCBnZXQgZnJlZWQuIEFuZCBpZiBpdCBkb2VzLCBpdHMgYHJldF9zdGFja2AgcG9pbnRlciAod2hpY2ggaXMgYWN0dWFsbHkgdGhlIHBhcmVudCdzISkgY291bGQgYmUgZnJlZWQgb3IgY29ycnVwdGVkLCB3aGljaCB3b3VsZCBiZSBkaXNhc3Ryb3VzLlxuXG5XYWl0IGEgc2Vjb25kLi4uIGlzbid0IGBmcmVlX3Rhc2tgIHN1cHBvc2VkIHRvIGNhbGwgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2sodClgPyBJZiB0aGF0J3MgdGhlIGNhc2UsIHRoZW4gdGhpcyBjaGFuZ2UgbWlnaHQgbm90IGV2ZW4gYmUgbmVjZXNzYXJ5LiBMZXQgbWUgcXVpY2tseSBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIGFuZCBzZWUgaWYgaXQgZGVhbHMgd2l0aCB0aGlzIHNjZW5hcmlvLlxuXG5cbiIsIklucHV0VG9rZW5zIjozODM0LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjI3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6NDMuMzM3MjI5NzM2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzA1ODE1Nzk3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvZnRyYWNlLmg9MTM0ND1leHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCk7XFxuaW5jbHVkZS9saW51eC9mdHJhY2UuaDoxMzQ1OmV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNDYtZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oPTEzNjQ9c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNjU6c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNjYtc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X2lkbGVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGludCBjcHUpIHsgfVxcbi0tXFxua2VybmVsL2ZvcmsuYz01MzM9dm9pZCBmcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXFxuLS1cXG5rZXJuZWwvZm9yay5jLTU1NS1cXHRydF9tdXRleF9kZWJ1Z190YXNrX2ZyZWUodHNrKTtcXG5rZXJuZWwvZm9yay5jOjU1NjpcXHRmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHRzayk7XFxua2VybmVsL2ZvcmsuYy01NTctXFx0YXJjaF9yZWxlYXNlX3Rhc2tfc3RydWN0KHRzayk7XFxuLS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM9MTE2MD12b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxcbi0tXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNzktXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jOjExODA6dm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE4MS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjQ1LjA0MzA1MDk1M1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzU3MjE4NDMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkncmUgbXkgb3duOlxuXG4qKkFuYWx5emluZyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AqKlxuXG5BbHJpZ2h0LCBsZXQncyB0YWtlIGEgbG9vayBhdCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AuIE15IGluaXRpYWwgdGhvdWdodCBpcywgd2hhdCBzcGVjaWZpY2FsbHkgZG9lcyB0aGlzIGZ1bmN0aW9uIHJlcHJlc2VudCB3aXRoaW4gdGhlIGZ0cmFjZSBmcmFtZXdvcms/IEl0J3MgY2xlYXJseSB0aWVkIHRvIHRhc2sgZXhpdCBldmVudHMsIGJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTXkgaW1tZWRpYXRlIHF1ZXN0aW9ucyBhcmU6IGhvdyBkb2VzIGl0IGZpdCBpbnRvIHRoZSBicm9hZGVyIHRyYWNpbmcgcGljdHVyZT8gSXMgdGhpcyBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgY2xlYW51cCwgYm9va2tlZXBpbmcsIGRhdGEgYWdncmVnYXRpb24sIG9yIHBlcmhhcHMgc29tZSBraW5kIG9mIG5vdGlmaWNhdGlvbiByZWxhdGVkIHRvIHRoZSB0ZXJtaW5hdGlvbiBvZiBhIHRyYWNlZCB0YXNrPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgSSBuZWVkIHRvIGNvbnNpZGVyPyBLbm93aW5nIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGtlcm5lbCdzIHRyYWNpbmcgZGVzaWduLCBJJ20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgd2hlcmUgdGhpcyBmdW5jdGlvbiBzaXRzIGluIHRoZSBleGVjdXRpb24gcGF0aCB3aGVuIGEgcHJvY2VzcyBleGl0cyB3aGlsZSBiZWluZyB0cmFjZWQuIEkgd29uZGVyIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgdGhpczsgaXMgaXQgb25seSBkdXJpbmcgYSBcIm5vcm1hbFwiIGV4aXQgb3IgYWxzbyBmb3IgYWJub3JtYWwgdGVybWluYXRpb25zIGxpa2Ugc2lnbmFscz8gVGhlIGludGVycGxheSB3aXRoIG90aGVyIGZ0cmFjZSBncmFwaCBmdW5jdGlvbnMgaXMga2V5IGhlcmUuIEknbGwgbmVlZCB0byByZW1lbWJlciB0byBjaGVjayBmb3IgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBsb2NraW5nIG1lY2hhbmlzbXMgdGhhdCBwcm90ZWN0IHNoYXJlZCBkYXRhIHN0cnVjdHVyZXMuIFRoaXMgb25lIGlzIGdvaW5nIHRvIGJlIGltcG9ydGFudCBpbiB0ZXJtcyBvZiBob3cgdGhlIHRyYWNlZCB0YXNrIGV4aXRzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGVmaW5pdGVseSBwcm92aWRlIGluc2lnaHQgaW50byB0cmFjZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODYzLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6NDguODAwMjcxNzI2WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk5MjAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC90cmFjZS9mZ3JhcGguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTgwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTgwOlxcdHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxuMTE4MTpcXHR7XFxuMTE4MjpcXHRcXHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2sgPSB0LVxcdTAwM2VyZXRfc3RhY2s7XFxuMTE4MzpcXHRcXG4xMTg0OlxcdFxcdHQtXFx1MDAzZXJldF9zdGFjayA9IE5VTEw7XFxuMTE4NTpcXHRcXHQvKiBOVUxMIG11c3QgYmVjb21lIHZpc2libGUgdG8gSVJRcyBiZWZvcmUgd2UgZnJlZSBpdDogKi9cXG4xMTg2OlxcdFxcdGJhcnJpZXIoKTtcXG4xMTg3OlxcdFxcbjExODg6XFx0XFx0aWYgKHJldF9zdGFjaykge1xcbjExODk6XFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRSghZmdyYXBoX3N0YWNrX2NhY2hlcCkpXFxuMTE5MDpcXHRcXHRcXHRcXHRyZXR1cm47XFxuMTE5MTpcXHRcXHRcXHRrbWVtX2NhY2hlX2ZyZWUoZmdyYXBoX3N0YWNrX2NhY2hlcCwgcmV0X3N0YWNrKTtcXG4xMTkyOlxcdFxcdH1cXG4xMTkzOlxcdH1cXG4xMTk0OlxcdFxcbjExOTU6XFx0I2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRVxcbjExOTY6XFx0c3RhdGljIGludCBmZ3JhcGhfcGlkX2Z1bmMoc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnQgKnRyYWNlLFxcbjExOTc6XFx0XFx0XFx0XFx0ICAgc3RydWN0IGZncmFwaF9vcHMgKmdvcHMsXFxuMTE5ODpcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgZnRyYWNlX3JlZ3MgKmZyZWdzKVxcbjExOTk6XFx0e1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NDo0OC44MDAzNzIyNDZaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTg1MzUxNDM1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLZXJuZWwgQnVnIEZpeDogV29ydGggRnV6emluZz8qKlxuXG5Pa2F5LCBzbyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AgKmRvZXMqIGZyZWUgYHQtXHUwMDNlcmV0X3N0YWNrYC4gVGhhdCdzIHRoZSBzdGFydGluZyBwb2ludC4gQW5kIGlmIGBjb3B5X3Byb2Nlc3NgIGZhaWxzICpiZWZvcmUqIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBnZXRzIGNhbGxlZCwgYGZyZWVfdGFzayhwKWAga2lja3MgaW4uIFNpbmNlIGBwYCBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgY3VycmVudCB0YXNrLCBpdHMgYHJldF9zdGFja2Agd2lsbCBwb2ludCB0byB0aGUgc2FtZSBtZW1vcnkgYXMgdGhlIHBhcmVudCB0YXNrLiBOb3csIGhlcmUncyB0aGUga2lja2VyOiBgZnJlZV90YXNrKHApYCBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhwKWAsIGFuZCAqdGhhdCogZnJlZXMgdGhlICpwYXJlbnQncyogYHJldF9zdGFja2AhIENsYXNzaWMgdXNlLWFmdGVyLWZyZWUuXG5cblRoZSBmaXggbW92ZXMgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socClgIHRvIGhhcHBlbiBpbW1lZGlhdGVseSBhZnRlciBgZHVwX3Rhc2tfc3RydWN0YCB0byBhdm9pZCB0aGlzLiBTZWVtcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLCBmaXhpbmcgYSBjb25kaXRpb24gd2hlcmUgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkICphbmQqIGBjb3B5X3Byb2Nlc3NgIGZhaWxzIGVhcmx5LlxuXG5TbywgaXMgdGhpcyB3b3J0aCBmdXp6aW5nPyBUaGF0J3MgdGhlIHF1ZXN0aW9uLiBUaGUgY29kZSBjaGFuZ2UgaXRzZWxmIGlzIG1pbmltYWw7IGp1c3QgbW92aW5nIGEgZnVuY3Rpb24gY2FsbCBhcm91bmQuIEl0ICpmaXhlcyogYSBidWcuIERvZXMgaXQgaW50cm9kdWNlIG5ldyBsb2dpYyB0aGF0IG1pZ2h0IGJlIHZ1bG5lcmFibGU/IEkgZG9uJ3QgdGhpbmsgc28uIEl0J3MganVzdCBpbml0aWFsaXphdGlvbiBtb3ZlZCBlYXJsaWVyLlxuXG5IbW0sIGJ1dCBpZiBpdCdzIGEgYnVnIGZpeCwgZG8gdGhlIGluc3RydWN0aW9ucyBhcHBseT8gVGhleSBzYXkgXCJSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zLi4uIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMuLi4gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cy4uLiBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2guLi4gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2guLi4gRHJpdmVyIC5yZW1vdmUuLi5cIiBEb2Vzbid0IGV4cGxpY2l0bHkgc2F5IHRvIHJldHVybiBmYWxzZSBmb3Igc2ltcGxlIGJ1ZyBmaXhlcywgYnV0IHRoZSBwcm9tcHQgZW1waGFzaXplcyBmdW5jdGlvbmFsIGNoYW5nZXMuXG5cblRoaXMgKmRvZXMqIG1vZGlmeSBgY29weV9wcm9jZXNzYCBpbiBga2VybmVsL2ZvcmsuY2AuIFRoYXQncyBjb3JlIGtlcm5lbCBsb2dpYywgYW5kIGl0ICppcyogcmVhY2hhYmxlLiBCdXQgdGhlIGNoYW5nZSBpcyBqdXN0IGFuIG9yZGVyIGNoYW5nZS4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBpbnN0cnVjdGlvbnMgd2FudCBtZSB0byB2ZXJpZnkgaXQncyBleGVjdXRhYmxlLlxuXG5Pa2F5LCBpZiBJICpkbyogcmV0dXJuIHRydWUgZm9yIGBXb3J0aEZ1enppbmdgLCB3aGF0IGRvIEkgcHV0IGluIGBGb2N1c1N5bWJvbHNgPyBUaGUgcHJvbXB0IHdhcm5zIGFnYWluc3QgaG90LXBhdGggZnVuY3Rpb25zLiBgY29weV9wcm9jZXNzYCBpcyBkZWZpbml0ZWx5IGhvdC1wYXRoLiBJcyB0aGVyZSBhIGxlc3MgY29tbW9uIGZ1bmN0aW9uIHRvIGZvY3VzIG9uPyBNYXliZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2A/IEJ1dCB0aGF0J3Mgc3RpbGwgY2FsbGVkIGZyb20gYGNvcHlfcHJvY2Vzc2AsIHdoaWNoIGlzIGhvdC1wYXRoLlxuXG5XYWl0IGEgc2Vjb25kLCB0aGUgYnVnICpvbmx5KiB0cmlnZ2VycyB3aGVuIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZC4gVGhhdCdzIGEga2V5IGRldGFpbCEgU28gdGhlIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGNvbmZpZyBpcyBhIHByZXJlcXVpc2l0ZS4gTGV0IG1lIGNoZWNrIHRoZSBLY29uZmlnIGZvciBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgdG8gY29uZmlybSB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDg0LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTg0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6NTguNjUzODg5MTI1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTY5NjA5MjkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC90cmFjZS9LY29uZmlnPTIzNT1jb25maWcgRlVOQ1RJT05fVFJBQ0VSXFxuLS1cXG5rZXJuZWwvdHJhY2UvS2NvbmZpZy0yNTMtXFxua2VybmVsL3RyYWNlL0tjb25maWc6MjU0OmNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcXG5rZXJuZWwvdHJhY2UvS2NvbmZpZy0yNTUtXFx0Ym9vbCBcXFwiS2VybmVsIEZ1bmN0aW9uIEdyYXBoIFRyYWNlclxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6MDAuMjIzNTAzMzM2WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NzUyMDE4MjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgcmV2aWV3aW5nIHRoZSBLY29uZmlnIGZvciBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYDpcblxuKipBbmFseXppbmcgdGhlIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIEtjb25maWcqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhlIEtjb25maWcgZm9yIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29uZmlndXJhdGlvbiBvcHRpb25zLCBkZXBlbmRlbmNpZXMsIGFuZCBpbXBsaWNhdGlvbnMuIEknbSBsb29raW5nIGZvciB0aGUgY29yZSBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgaXRzIGJlaGF2aW9yLCBhbnkgY29uZGl0aW9uYWwgbG9naWMsIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggb3RoZXIgdHJhY2luZyBtZWNoYW5pc21zLiBTcGVjaWZpY2FsbHksIEknbSB0cnlpbmcgdG8gZGV0ZXJtaW5lOiBXaGF0IGFyZSB0aGUgYmFzZSByZXF1aXJlbWVudHMgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZT8gRG9lcyBpdCBkZXBlbmQgb24gc3BlY2lmaWMgY29tcGlsZXIgdmVyc2lvbnMgb3Iga2VybmVsIGZlYXR1cmVzPyBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRpZWQgdG8gcGFydGljdWxhciBjb25maWd1cmF0aW9ucywgZXNwZWNpYWxseSBpbiBoaWdoLWxvYWQgc2NlbmFyaW9zPyBJJ2xsIGFsc28gYmUgc2VhcmNoaW5nIGZvciByZWxhdGlvbnNoaXBzIHRvIHRoZSBgZnRyYWNlYCBpbmZyYXN0cnVjdHVyZSBhbmQgYW55IGNvbmZsaWN0cyB3aXRoIG90aGVyIHRyYWNpbmcgZmVhdHVyZXMuIEl0J3MgY3J1Y2lhbCB0byBpZGVudGlmeSB0aGUgcG90ZW50aWFsIGltcGFjdCBvbiBzeXN0ZW0gb3ZlcmhlYWQuIExldCdzIHNlZSBob3cgd2VsbCBkZWZpbmVkIHRoZSBkZXBlbmRlbmNpZXMgYXJlLCBhbmQgaWYgdGhlIGhlbHAgdGV4dCBpcyB1c2VmdWwgb3Igd2hldGhlciBpdCBpcyB2YWd1ZS4gSSBhbSBnb2luZyB0byBtYWtlIGEganVkZ2VtZW50IGNhbGwgaWYgaXQgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZCBmb3IgbXkgcHJvamVjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6Njc2MSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjAzLjY5ODcwODQyN1oiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjU4MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3RyYWNlL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMjU0LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjU0OlxcdGNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcXG4gMjU1OlxcdFxcdGJvb2wgXFxcIktlcm5lbCBGdW5jdGlvbiBHcmFwaCBUcmFjZXJcXFwiXFxuIDI1NjpcXHRcXHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXFxuIDI1NzpcXHRcXHRkZXBlbmRzIG9uIEZVTkNUSU9OX1RSQUNFUlxcbiAyNTg6XFx0XFx0ZGVwZW5kcyBvbiAhWDg2XzMyIHx8ICFDQ19PUFRJTUlaRV9GT1JfU0laRVxcbiAyNTk6XFx0XFx0ZGVmYXVsdCB5XFxuIDI2MDpcXHRcXHRoZWxwXFxuIDI2MTpcXHRcXHQgIEVuYWJsZSB0aGUga2VybmVsIHRvIHRyYWNlIGEgZnVuY3Rpb24gYXQgYm90aCBpdHMgcmV0dXJuXFxuIDI2MjpcXHRcXHQgIGFuZCBpdHMgZW50cnkuXFxuIDI2MzpcXHRcXHQgIEl0cyBmaXJzdCBwdXJwb3NlIGlzIHRvIHRyYWNlIHRoZSBkdXJhdGlvbiBvZiBmdW5jdGlvbnMgYW5kXFxuIDI2NDpcXHRcXHQgIGRyYXcgYSBjYWxsIGdyYXBoIGZvciBlYWNoIHRocmVhZCB3aXRoIHNvbWUgaW5mb3JtYXRpb24gbGlrZVxcbiAyNjU6XFx0XFx0ICB0aGUgcmV0dXJuIHZhbHVlLiBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUgY3VycmVudCByZXR1cm5cXG4gMjY2OlxcdFxcdCAgYWRkcmVzcyBvbiB0aGUgY3VycmVudCB0YXNrIHN0cnVjdHVyZSBpbnRvIGEgc3RhY2sgb2YgY2FsbHMuXFxuIDI2NzpcXHRcXG4gMjY4OlxcdGNvbmZpZyBGVU5DVElPTl9HUkFQSF9SRVRWQUxcXG4gMjY5OlxcdFxcdGJvb2wgXFxcIktlcm5lbCBGdW5jdGlvbiBHcmFwaCBSZXR1cm4gVmFsdWVcXFwiXFxuIDI3MDpcXHRcXHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlJFR1NcXG4gMjcxOlxcdFxcdGRlcGVuZHMgb24gRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXFxuIDI3MjpcXHRcXHRkZWZhdWx0IG5cXG4gMjczOlxcdFxcdGhlbHBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6MDMuNjk4ODM2Mjk3WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgxMTEyOTQyMTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyB0aGUgYGNvcHlfcHJvY2VzcygpYCBDaGFuZ2UqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBjb25maWdzLCBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYCBhbmQgYEZVTkNUSU9OX1RSQUNFUmAuIFRoZSBjaGFuZ2UgaXMgaW4gYGNvcHlfcHJvY2VzcygpYCwgc3BlY2lmaWNhbGx5IHdoZXJlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBpcyBjYWxsZWQuIE15IGluaXRpYWwgZ3V0IGZlZWxpbmcgaXMsIFwiSXMgdGhpcyBldmVuIHdvcnRoIGZ1enppbmc/XCIgVGhlIG1vZGlmaWNhdGlvbiBpcyB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYCwgd2hpY2ggZ2V0cyBleGVjdXRlZCBvbiBldmVyeSBgZm9yaygpYCBhbmQgYGNsb25lKClgLiBFc3NlbnRpYWxseSwgaWYgd2UgZnV6eiB0aGlzLCB3ZSdyZSByZWFsbHkganVzdCBmdXp6aW5nIGBmb3JrKClgIGl0c2VsZiwgYnV0IHdpdGggYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgYWN0aXZlLiBBbmQgd2UgYWxyZWFkeSBmdXp6IGBmb3JrKClgIHByZXR0eSBoZWF2aWx5LCByaWdodD9cblxuVGhlIGNvcmUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiBJcyB0aGVyZSBhIG1vcmUgdGFyZ2V0ZWQgZnVuY3Rpb24gb3IgYXJlYSB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYCB0aGF0J3Mgc3BlY2lmaWNhbGx5IHdvcnRoIGZvY3VzaW5nIG9uPyBUaGUgdHJpZ2dlciBmb3IgdGhpcyBidWcgaXMgcmVsYXRlZCB0byBhbiBlYXJseSBmYWlsdXJlIHdpdGhpbiBgY29weV9wcm9jZXNzKClgLiBTbywgdGhlIG1vcmUgaW50ZXJlc3RpbmcgYXZlbnVlIGlzOiB3aGF0IGNhbiBjYXVzZSBgY29weV9wcm9jZXNzKClgIHRvIGZhaWwgZWFybHk/IExldCdzIHpvb20gaW4gb24gdGhhdCBzZWN0aW9uIG9mIHRoZSBjb2RlIGJldHdlZW4gYGR1cF90YXNrX3N0cnVjdGAgYW5kIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBvZiBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyBpbiB0aG9zZSBsaW5lcyB0aGF0IGNvdWxkIGxlYWQgdG8gYW4gZWFybHkgZXhpdCBhbmQgaG93IGl0IG1pZ2h0IGludGVyYWN0IHdpdGggdGhlIHRyYWNlci5cblxuXG4iLCJJbnB1dFRva2VucyI6NzM1NSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjExLjgxMDEzMzM3M1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTI3NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2ZvcmsuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMTM5LFxuICBcIkxpbmVDb3VudFwiOiAzMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMTM5OlxcdFxcdHAgPSBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7XFxuMjE0MDpcXHRcXHRpZiAoIXApXFxuMjE0MTpcXHRcXHRcXHRnb3RvIGZvcmtfb3V0O1xcbjIxNDI6XFx0XFx0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcXG4yMTQzOlxcdFxcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XFxuMjE0NDpcXHRcXHRpZiAocmV0dmFsKVxcbjIxNDU6XFx0XFx0XFx0Z290byBiYWRfZm9ya19mcmVlO1xcbjIxNDY6XFx0XFx0cC1cXHUwMDNlZmxhZ3MgXFx1MDAyNj0gflBGX0tUSFJFQUQ7XFxuMjE0NzpcXHRcXHRpZiAoYXJncy1cXHUwMDNla3RocmVhZClcXG4yMTQ4OlxcdFxcdFxcdHAtXFx1MDAzZWZsYWdzIHw9IFBGX0tUSFJFQUQ7XFxuMjE0OTpcXHRcXHRpZiAoYXJncy1cXHUwMDNldXNlcl93b3JrZXIpIHtcXG4yMTUwOlxcdFxcdFxcdC8qXFxuMjE1MTpcXHRcXHRcXHQgKiBNYXJrIHVzIGEgdXNlciB3b3JrZXIsIGFuZCBibG9jayBhbnkgc2lnbmFsIHRoYXQgaXNuJ3RcXG4yMTUyOlxcdFxcdFxcdCAqIGZhdGFsIG9yIFNUT1BcXG4yMTUzOlxcdFxcdFxcdCAqL1xcbjIxNTQ6XFx0XFx0XFx0cC1cXHUwMDNlZmxhZ3MgfD0gUEZfVVNFUl9XT1JLRVI7XFxuMjE1NTpcXHRcXHRcXHRzaWdpbml0c2V0aW52KFxcdTAwMjZwLVxcdTAwM2VibG9ja2VkLCBzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHU1RPUCkpO1xcbjIxNTY6XFx0XFx0fVxcbjIxNTc6XFx0XFx0aWYgKGFyZ3MtXFx1MDAzZWlvX3RocmVhZClcXG4yMTU4OlxcdFxcdFxcdHAtXFx1MDAzZWZsYWdzIHw9IFBGX0lPX1dPUktFUjtcXG4yMTU5OlxcdFxcbjIxNjA6XFx0XFx0aWYgKGFyZ3MtXFx1MDAzZW5hbWUpXFxuMjE2MTpcXHRcXHRcXHRzdHJzY3B5X3BhZChwLVxcdTAwM2Vjb21tLCBhcmdzLVxcdTAwM2VuYW1lLCBzaXplb2YocC1cXHUwMDNlY29tbSkpO1xcbjIxNjI6XFx0XFxuMjE2MzpcXHRcXHRwLVxcdTAwM2VzZXRfY2hpbGRfdGlkID0gKGNsb25lX2ZsYWdzIFxcdTAwMjYgQ0xPTkVfQ0hJTERfU0VUVElEKSA/IGFyZ3MtXFx1MDAzZWNoaWxkX3RpZCA6IE5VTEw7XFxuMjE2NDpcXHRcXHQvKlxcbjIxNjU6XFx0XFx0ICogVElEIGlzIGNsZWFyZWQgaW4gbW1fcmVsZWFzZSgpIHdoZW4gdGhlIHRhc2sgZXhpdHNcXG4yMTY2OlxcdFxcdCAqL1xcbjIxNjc6XFx0XFx0cC1cXHUwMDNlY2xlYXJfY2hpbGRfdGlkID0gKGNsb25lX2ZsYWdzIFxcdTAwMjYgQ0xPTkVfQ0hJTERfQ0xFQVJUSUQpID8gYXJncy1cXHUwMDNlY2hpbGRfdGlkIDogTlVMTDtcXG4yMTY4OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NToxMS44MTAyODg3MzNaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzk3MTY4NzYwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3NpbmcgYXMgYW4gZXhwZXJ0OlxuXG4qKkFuYWx5emluZyB0aGUgUG90ZW50aWFsIElzc3VlIGluIFRhc2sgQ2xvbmluZyoqXG5cblJpZ2h0LCBzbyBJJ20gbG9va2luZyBhdCB0aGUgYGR1cF90YXNrX3N0cnVjdGAgYW5kIHRoZSBvbGQgbG9jYXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIOKAkyBpbnRlcmVzdGluZy4gSXQncyBhbG1vc3QgYWx3YXlzIGEgZ29vZCBleGVyY2lzZSB0byByZXZpc2l0IHdoZXJlIGEgZnVuY3Rpb24gb25jZSBsaXZlZCwgYW5kIHdoeSBpdCBtb3ZlZC4gVGhlIGNyaXRpY2FsIHBvaW50IG9mIGNvbmNlcm4sIHRoZSBwb3RlbnRpYWwgZmFpbHVyZSBwb2ludCBpZiBzb21ldGhpbmcgYnJlYWtzIGJldHdlZW4gdGhlc2UgdHdvLCBzZWVtcyB0byBiZSBgY29weV9leGVjX3N0YXRlKGNsb25lX2ZsYWdzLCBwKWAuIFRoYXQgbG9va3MgbGlrZSB0aGUgY3VscHJpdC4gSSBuZWVkIHRvIHRha2UgYSBjbG9zZXIgbG9vayBhdCB3aGF0IGBjb3B5X2V4ZWNfc3RhdGVgIGlzIGRvaW5nLiBUaGlzIGhhcyBhbGwgdGhlIGhhbGxtYXJrcyBvZiBhIHBvdGVudGlhbCBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGlmIG5vdCBkb25lIGNvcnJlY3RseSwgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgaW50ZXJhY3Rpb25zIHdpdGggYGNsb25lX2ZsYWdzYC4gSXQgY291bGQgYmUgcmVsYXRlZCB0byBzb21lIG9mIHRoZSBpc3N1ZXMgSSd2ZSBiZWVuIHNlZWluZyB3aXRoIHByb2Nlc3MgY3JlYXRpb24gYW5kIHRyYWNpbmcuIFRpbWUgdG8gZGl2ZSBpbnRvIHRoZSBjb2RlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjgzNDAsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjE1Ljc4MTk3OTA0NloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTMyMzM4MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29weV9leGVjX3N0YXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9mb3JrLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2ZvcmsuYz0xNTc0PXN0YXRpYyBpbnQgY29weV9tbSh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbi0tXFxua2VybmVsL2ZvcmsuYy0xNjEwLVxcbmtlcm5lbC9mb3JrLmM6MTYxMTpzdGF0aWMgaW50IGNvcHlfZXhlY19zdGF0ZSh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbmtlcm5lbC9mb3JrLmMtMTYxMi17XFxuLS1cXG5rZXJuZWwvZm9yay5jPTIwMTg9X19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcyhcXG4tLVxcbmtlcm5lbC9mb3JrLmMtMjE0Mi1cXHRmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO1xcbmtlcm5lbC9mb3JrLmM6MjE0MzpcXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xcbmtlcm5lbC9mb3JrLmMtMjE0NC1cXHRpZiAocmV0dmFsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NToxNS44MzUyMTkwNjVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY1NDMyNjEzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJ20gZGVlcGx5IGZhbWlsaWFyIHdpdGggY29kZSBleGVjdXRpb24gYW5kIHByb2dyYW0gc3RhdGVzOlxuXG4qKkFuYWx5emluZyBgY29weV9leGVjX3N0YXRlYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gYGNvcHlfZXhlY19zdGF0ZWAuIFRoYXQgZnVuY3Rpb24gbmFtZSBpdHNlbGYgaXMgcHJldHR5IHRlbGxpbmcuIEl0IGltcGxpZXMgd2UncmUgZGVhbGluZyB3aXRoIGNyZWF0aW5nIGEgc25hcHNob3QsIGEgZHVwbGljYXRlLCBvZiB0aGUgcnVubmluZyBleGVjdXRpb24gZW52aXJvbm1lbnQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgKndoYXQqIGl0J3MgY29weWluZy4gSXMgaXQgdGhlIGVudGlyZSBwcm9jZXNzIG1lbW9yeSBzcGFjZT8gSnVzdCB0aGUgcmVnaXN0ZXIgdmFsdWVzPyBUaGUgcHJvZ3JhbSBjb3VudGVyPyBUaGUgc3RhY2s/IFRoZSBoZWFwPyBUaGUgb3BlbiBmaWxlIGRlc2NyaXB0b3JzP1xuXG5UaGUgaW1wbGljYXRpb25zIGFyZSBodWdlLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHRoZSBcInN0YXRlLlwiIEEgZnVsbCBtZW1vcnkgY29weSBpcyByZXNvdXJjZS1pbnRlbnNpdmUgYnV0IG9mZmVycyBhIHZlcnkgcHJlY2lzZSBzbmFwc2hvdC4gU2VsZWN0aXZlIGNvcHlpbmcgaXMgbW9yZSBlZmZpY2llbnQgYnV0IHJpc2tzIGxvc2luZyBjcml0aWNhbCBpbmZvcm1hdGlvbi4gSSdsbCBuZWVkIHRvIGxvb2sgYXQgdGhlIGltcGxlbWVudGF0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlIHRyYWRlLW9mZnMuXG5cbkknbSB0aGlua2luZyBhYm91dCB0aGUgc2NlbmFyaW9zIHdoZXJlIHlvdSBtaWdodCB1c2Ugc3VjaCBhIGZ1bmN0aW9uLiBEZWJ1Z2dpbmcgaXMgb2J2aW91cyDigJMgc2F2aW5nIGEgc3RhdGUgdG8gc3RlcCB0aHJvdWdoIGxhdGVyLiBCdXQgdGhlcmUgYXJlIG90aGVyczogcHJvY2VzcyBtaWdyYXRpb24sIGNoZWNrcG9pbnRpbmcgZm9yIGZhdWx0IHRvbGVyYW5jZSwgZXZlbiBzb21ldGhpbmcgbGlrZSBpbXBsZW1lbnRpbmcgYSB2aXJ0dWFsIG1hY2hpbmUuIEVhY2ggaGFzIGl0cyBvd24gY29uc3RyYWludHMgYW5kIGRlbWFuZHMgZm9yIHdoYXQgbmVlZHMgdG8gYmUgY29waWVkLlxuXG5JIHdhbnQgdG8ga25vdyBpZiBpdCdzIGEgZGVlcCBjb3B5IG9yIGEgc2hhbGxvdyBjb3B5LiBJZiBpdCdzIHRoZSBsYXR0ZXIsIHRoZW4gbW9kaWZpY2F0aW9ucyB0byB0aGUgY29waWVkIHN0YXRlIHdvdWxkIGFsc28gYWZmZWN0IHRoZSBvcmlnaW5hbCBleGVjdXRpb24gc3RhdGUsIHdoaWNoIHdvdWxkIGRlZmVhdCB0aGUgcHVycG9zZS4gVGhlIGZ1bmN0aW9uIHdvdWxkIGxpa2VseSBiZSBtb3JlIGNvbXBsZXggaWYgaXQgbmVlZHMgdG8gcHJlc2VydmUgYSBjbGVhbiBzZXBhcmF0aW9uLlxuXG5BbHNvLCBpcyBpdCB0aHJlYWQtc2FmZT8gSWYgdGhlIG9yaWdpbmFsIHN0YXRlIGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBjb3B5IHByb2Nlc3MsIHRoZXJl4oCZcyBhIHJpc2sgb2YgaW50cm9kdWNpbmcgaW5jb25zaXN0ZW5jaWVzLiBUaGF0J3MgYSBjcml0aWNhbCBjb25zaWRlcmF0aW9uLCBlc3BlY2lhbGx5IGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudC5cbkknbSByZWFkeSB0byBleGFtaW5lIHRoZSBjb2RlLiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg4MjQsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NToyMC40ODk1NDg1MDlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyNzQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9mb3JrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTYxMSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTYxMTpcXHRzdGF0aWMgaW50IGNvcHlfZXhlY19zdGF0ZSh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbjE2MTI6XFx0e1xcbjE2MTM6XFx0XFx0c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqZXhlY19zdGF0ZTtcXG4xNjE0OlxcdFxcbjE2MTU6XFx0XFx0LyogQ0xPTkVfVk0gc2libGluZ3MgcmVmY291bnQtc2hhcmUgdGhlIHBhcmVudCdzIGV4ZWNfc3RhdGUuICovXFxuMTYxNjpcXHRcXHRpZiAoY2xvbmVfZmxhZ3MgXFx1MDAyNiBDTE9ORV9WTSkge1xcbjE2MTc6XFx0XFx0XFx0ZXhlY19zdGF0ZSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoY3VycmVudC1cXHUwMDNlZXhlY19zdGF0ZSwgdHJ1ZSk7XFxuMTYxODpcXHRcXHRcXHRyZWZjb3VudF9pbmMoXFx1MDAyNmV4ZWNfc3RhdGUtXFx1MDAzZWNvdW50KTtcXG4xNjE5OlxcdFxcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcih0c2stXFx1MDAzZWV4ZWNfc3RhdGUsIGV4ZWNfc3RhdGUpO1xcbjE2MjA6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMTYyMTpcXHRcXHR9XFxuMTYyMjpcXHRcXG4xNjIzOlxcdFxcdC8qIEV2ZXJ5b25lIGVsc2UgaW5oZXJpdHMgYSBmcmVzaCBjb3B5LiAqL1xcbjE2MjQ6XFx0XFx0cmV0dXJuIHRhc2tfZXhlY19zdGF0ZV9jb3B5KHRzayk7XFxuMTYyNTpcXHR9XFxuMTYyNjpcXHRcXG4xNjI3OlxcdHN0YXRpYyBpbnQgY29weV9mcyh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBib29sIHVtaClcXG4xNjI4OlxcdHtcXG4xNjI5OlxcdFxcdHN0cnVjdCBmc19zdHJ1Y3QgKmZzO1xcbjE2MzA6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjIwLjQ4OTcwMjkwOVoiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MzExMzYzMDMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gYHRhc2tfZXhlY19zdGF0ZV9jb3B5YDpcblxuKipNeSBFeGFtaW5hdGlvbiBvZiBgdGFza19leGVjX3N0YXRlX2NvcHlgKipcblxuQWxyaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgYHRhc2tfZXhlY19zdGF0ZV9jb3B5YC4gSW1tZWRpYXRlbHksIG15IGV4cGVydCBicmFpbiBraWNrcyBpbiwgY29uc2lkZXJpbmcgd2hhdCBpdCAqc2hvdWxkKiBkby4gR2l2ZW4gdGhlIG5hbWUsIGl0J3MgY2xlYXIgdGhpcyBpcyBhYm91dCBjb3B5aW5nLCBzcGVjaWZpY2FsbHkgdGhlIGV4ZWN1dGlvbiBzdGF0ZSBvZiBhIHRhc2suIFRoZSBpbXBvcnRhbnQgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiAqd2h5KiBjb3B5IGl0PyBJcyB0aGlzIGZvciBjb250ZXh0IHN3aXRjaGluZywgY2hlY2twb2ludGluZywgcGVyaGFwcyB0aHJlYWQgY3JlYXRpb24/IE9yIG1heWJlIGVycm9yIGhhbmRsaW5nIHdoZXJlIHlvdSBuZWVkIHRvIHByZXNlcnZlIGEgc25hcHNob3Q/IFVuZGVyc3RhbmRpbmcgdGhlIHVzZSBjYXNlIHdpbGwgaW5mb3JtIHRoZSBudWFuY2VzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi5cblxuSSBzdGFydCBydW5uaW5nIHRocm91Z2ggdGhlIGNvbW1vbiBlbGVtZW50czogSXQgbGlrZWx5IG5lZWRzIHRvIGhhbmRsZSB0aGUgcHJvZ3JhbSBjb3VudGVyIChQQyksIHN0YWNrIHBvaW50ZXIsIHJlZ2lzdGVyIHZhbHVlcywgYW5kIGFueSBvdGhlciByZWxldmFudCBoYXJkd2FyZSBzdGF0ZSB0aGF0IGRlZmluZXMgdGhlIHRhc2sncyBleGVjdXRpb24gZW52aXJvbm1lbnQuIEknbGwgbmVlZCB0byBjb25zaWRlciB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZTsgYSBzaW1wbGUgUklTQyBtYWNoaW5lIHdpbGwgaGF2ZSBhIGRyYXN0aWNhbGx5IGRpZmZlcmVudCBzdGF0ZSBzaXplIHRoYW4gYSBjb21wbGV4IHg4NiBwcm9jZXNzb3Igd2l0aCBTSU1EIHJlZ2lzdGVycyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdHMuXG5cblRoZSBjb3B5IGl0c2VsZiAtIGhvdyBpcyBpdCBkb25lPyBJcyB0aGlzIGEgZGVlcCBjb3B5LCBhIHNoYWxsb3cgY29weSwgb3Igc29tZXRoaW5nIG1vcmUgbnVhbmNlZD8gTWVtb3J5IG1hbmFnZW1lbnQgYmVjb21lcyBhIGNlbnRyYWwgY29uc2lkZXJhdGlvbiBoZXJlLCBlc3BlY2lhbGx5IGlmIHRoZSB0YXNrIGludm9sdmVzIHBvaW50ZXJzIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkuIEEgc2hhbGxvdyBjb3B5LCBjb3B5aW5nIGp1c3QgdGhlIHBvaW50ZXIgdmFsdWVzLCBpcyBlZmZpY2llbnQsIGJ1dCBpdCBhbHNvIGNyZWF0ZXMgc2hhcmluZyBhbmQgcG90ZW50aWFsIGRhdGEgY29ycnVwdGlvbiBpc3N1ZXMuIEEgZGVlcCBjb3B5IHJlc29sdmVzIHRoYXQsIGJ1dCBkZW1hbmRzIGNhcmVmdWwgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGFuZCBkYW5nbGluZyBwb2ludGVycy4gV2UgbmVlZCB0byBiZSB3YXJ5IG9mIHRoYXQgbWVtb3J5IGNvc3QsIHBhcnRpY3VsYXJseSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggZnJlcXVlbnQgY29udGV4dCBzd2l0Y2hlcyBvciBtYXNzaXZlIGFtb3VudHMgb2YgZXhlY3V0aW9uIHN0YXRlLlxuXG5GaW5hbGx5LCBJJ2xsIHNjcnV0aW5pemUgdGhlIGVycm9yIGhhbmRsaW5nLiBXaGF0IGhhcHBlbnMgaWYgdGhlIGNvcHkgZmFpbHM/IFdoYXQgYXJlIHRoZSBmYWlsdXJlIG1vZGVzIChlLmcuLCBpbnN1ZmZpY2llbnQgbWVtb3J5LCBpbnZhbGlkIHN0YXRlKT8gSG93IHJvYnVzdCBpcyB0aGUgZnVuY3Rpb24gaW4gdGhlIGZhY2Ugb2YgdGhlc2UgcG90ZW50aWFsIHByb2JsZW1zPyBEb2VzIGl0IHJldHVybiBhbiBlcnJvciBjb2RlIG9yIHRocm93IGFuIGV4Y2VwdGlvbj8gSG93IGlzIHRoYXQgZXJyb3IgcHJvcGFnYXRlZCBhbmQgbWFuYWdlZD8gVGhlIGVycm9yIGhhbmRsaW5nIGlzIGNyaXRpY2FsIGluIHRoaXMgY29udGV4dDsgYSBwb29ybHkgaGFuZGxlZCBmYWlsdXJlIGNvdWxkIGRlc3RhYmlsaXplIHRoZSBlbnRpcmUgc3lzdGVtLiBJJ2xsIG5lZWQgdG8gYXNzZXNzIHRoZSBmdW5jdGlvbidzIGFzc3VtcHRpb25zIGFib3V0IHRoZSBzb3VyY2UgdGFzayBzdGF0ZSDigJMgaXMgaXQgdmFsaWQsIGlzIGl0IGxvY2tlZCwgb3IgZG9lcyBpdCBvcGVyYXRlIGFzc3VtaW5nIGEgY29vcGVyYXRpdmUgb3IgcHJlZW10aXZlIHRocmVhZGluZyBtb2RlbD9cblxuXG4iLCJJbnB1dFRva2VucyI6OTU1OCwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6MjUuODAxMDY5NDMxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDIyNTgzMDg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRhc2tfZXhlY19zdGF0ZV9jb3B5XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaD0yND1zdHJ1Y3QgdGFza19leGVjX3N0YXRlICp0YXNrX2V4ZWNfc3RhdGVfcmVwbGFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcXG5pbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaC0yNS1cXHRcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgdGFza19leGVjX3N0YXRlICpleGVjX3N0YXRlKTtcXG5pbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaDoyNjppbnQgdGFza19leGVjX3N0YXRlX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spO1xcbmluY2x1ZGUvbGludXgvc2NoZWQvZXhlY19zdGF0ZS5oLTI3LXZvaWQgX19pbml0IGV4ZWNfc3RhdGVfaW5pdCh2b2lkKTtcXG4tLVxcbmtlcm5lbC9leGVjX3N0YXRlLmM9NTI9c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqdGFza19leGVjX3N0YXRlX3JlcGxhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuLS1cXG5rZXJuZWwvZXhlY19zdGF0ZS5jLTcwLSAqL1xcbmtlcm5lbC9leGVjX3N0YXRlLmM6NzE6aW50IHRhc2tfZXhlY19zdGF0ZV9jb3B5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbmtlcm5lbC9leGVjX3N0YXRlLmMtNzIte1xcbi0tXFxua2VybmVsL2ZvcmsuYz0xNjExPXN0YXRpYyBpbnQgY29weV9leGVjX3N0YXRlKHU2NCBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXFxuLS1cXG5rZXJuZWwvZm9yay5jLTE2MjMtXFx0LyogRXZlcnlvbmUgZWxzZSBpbmhlcml0cyBhIGZyZXNoIGNvcHkuICovXFxua2VybmVsL2ZvcmsuYzoxNjI0OlxcdHJldHVybiB0YXNrX2V4ZWNfc3RhdGVfY29weSh0c2spO1xcbmtlcm5lbC9mb3JrLmMtMTYyNS19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjI3LjgyMzY1ODIzOFoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTc5Njg2NTQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQW5hbHl6aW5nIGB0YXNrX2V4ZWNfc3RhdGVfY29weWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgdGFza19leGVjX3N0YXRlX2NvcHlgIGZ1bmN0aW9uLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiB3aGF0IGFyZSB3ZSB0cnlpbmcgdG8gYWNoaWV2ZSBoZXJlPyBHaXZlbiB0aGUgbmFtZSwgSSdtIGltbWVkaWF0ZWx5IGV4cGVjdGluZyBpdCB0byBkZWFsIHdpdGggYSBjcnVjaWFsIHByb2Nlc3Mg4oCTIGxpa2VseSBjb3B5aW5nIHRoZSBleGVjdXRpb24gc3RhdGUgb2YgYSB0YXNrLiBUaGUgc3BlY2lmaWNzIHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE9TIGFuZCB0aGUgcnVudGltZSdzIGFyY2hpdGVjdHVyZSwgYnV0IHRoZSBnZW5lcmFsIGNvbmNlcHQgaXMgY2xlYXI6IGl04oCZcyBhYm91dCBjYXB0dXJpbmcgYSBzbmFwc2hvdCBvZiBhIHRhc2sncyBjdXJyZW50IGNvbnRleHQuIEkgbmVlZCB0byB1bmRlcnN0YW5kICpob3cqIGl0J3MgaW1wbGVtZW50ZWQuIElzIGl0IGEgZGVlcCBjb3B5IG9yIHNoYWxsb3c/IEFyZSB3ZSB0YWxraW5nIGFib3V0IHJlZ2lzdGVycywgc3RhY2sgcG9pbnRlcnMsIG1lbW9yeSBtYXBzLCBtYXliZSBldmVuIHByb2Nlc3NvciBmbGFncz8gVGhlIGRldmlsIGlzIGluIHRoZSBkZXRhaWxzLCBhbmQgdGhvc2UgZGV0YWlscyBhcmUgd2hhdOKAmWxsIHRlbGwgbWUgaWYgaXTigJlzIGVmZmljaWVudCwgc2FmZSwgYW5kIGhhbmRsZXMgYWxsIGVkZ2UgY2FzZXMuIEknbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2UgbXV0ZXhlcyBvciBhdG9taWMgb3BlcmF0aW9ucywgYW5kIGhvdyBpdCBoYW5kbGVzIGNvbmN1cnJlbmN5LiBJJ2xsIG5lZWQgdG8ga25vdyB3aGV0aGVyIGNvbnRleHQgc3dpdGNoZXMgYXJlIGludm9sdmVkIGFuZCBob3cgaXQgZG9lcyBzby4gSSB3YW50IHRvIGxvb2sgZm9yIHBvdGVudGlhbCBhcmVhcyBvZiBjb25jZXJuIG9yIHJhY2UgY29uZGl0aW9ucy4gQSBmdW5jdGlvbiBsaWtlIHRoaXMgaXMgaW5jcmVkaWJseSBmdW5kYW1lbnRhbCwgYW5kIGlmIGl0J3MgZmxhd2VkLCBpdCBjYW4gaW50cm9kdWNlIHNlcmlvdXMgYnVncyBhdCBhbnkgcG9pbnQuIExldCdzIHNlZSBob3cgdGhpcyBpcyBpbXBsZW1lbnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAzODcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTozMS44MDMzNDgzNzNaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODMzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2V4ZWNfc3RhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA3MSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA3MTpcXHRpbnQgdGFza19leGVjX3N0YXRlX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXFxuICA3MjpcXHR7XFxuICA3MzpcXHRcXHRzdHJ1Y3QgdGFza19leGVjX3N0YXRlICpzcmMsICpkc3Q7XFxuICA3NDpcXHRcXG4gIDc1OlxcdFxcdHNyYyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoY3VycmVudC1cXHUwMDNlZXhlY19zdGF0ZSwgdHJ1ZSk7XFxuICA3NjpcXHRcXHRkc3QgPSBhbGxvY190YXNrX2V4ZWNfc3RhdGUoc3JjLVxcdTAwM2V1c2VyX25zKTtcXG4gIDc3OlxcdFxcdGlmICghZHN0KVxcbiAgNzg6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuICA3OTpcXHRcXHRkc3QtXFx1MDAzZWR1bXBhYmxlID0gUkVBRF9PTkNFKHNyYy1cXHUwMDNlZHVtcGFibGUpO1xcbiAgODA6XFx0XFx0cmN1X2Fzc2lnbl9wb2ludGVyKHRzay1cXHUwMDNlZXhlY19zdGF0ZSwgZHN0KTtcXG4gIDgxOlxcdFxcdHJldHVybiAwO1xcbiAgODI6XFx0fVxcbiAgODM6XFx0XFxuICA4NDpcXHQvKlxcbiAgODU6XFx0ICogU3RvcmUgVEFTS19EVU1QQUJMRV8qIG9uIGN1cnJlbnQtXFx1MDAzZWV4ZWNfc3RhdGUuICBBbGwgY2FsbGVyc1xcbiAgODY6XFx0ICogKGNvbW1pdF9jcmVkcywgYmVnaW5fbmV3X2V4ZWMsIHByY3RsKFBSX1NFVF9EVU1QQUJMRSkpIGFjdCBvbiB0aGVcXG4gIDg3OlxcdCAqIHJ1bm5pbmcgdGFzaywgd2hpY2ggZ3VhcmFudGVlcyAtXFx1MDAzZWV4ZWNfc3RhdGUgaXMgYWxsb2NhdGVkIGFuZCBjYW5ub3RcXG4gIDg4OlxcdCAqIGJlIHJlcGxhY2VkIHVuZGVyIHVzLlxcbiAgODk6XFx0ICovXFxuICA5MDpcXHR2b2lkIHRhc2tfZXhlY19zdGF0ZV9zZXRfZHVtcGFibGUoZW51bSB0YXNrX2R1bXBhYmxlIHZhbHVlKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTozMS44MDM0MzM4OTNaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTE0OTEzMzg4NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBEZWNpc2lvbiBmb3IgYSBTcGVjaWZpYyBCdWcgRml4KipcblxuT2theSwgc28gdGhpcyBwYXRjaCBhZGRyZXNzZXMgYSBwb3RlbnRpYWwgYC1FTk9NRU1gIGZhaWx1cmUgaW4gYHRhc2tfZXhlY19zdGF0ZV9jb3B5YCB0aGF0IGNhbiBvY2N1ciB3aGVuIGBhbGxvY190YXNrX2V4ZWNfc3RhdGVgIGZhaWxzIGR1cmluZyBgZm9yaygpYCB3aXRob3V0IGBDTE9ORV9WTWAsIHNwZWNpZmljYWxseSB3aGVuIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGlzIGVuYWJsZWQuIEl0J3MgYSB2ZXJ5IHRhcmdldGVkIGJ1ZyBmaXguXG5cbk15IGZpcnN0IHRob3VnaHQgaXMsIFwiRG9lcyB0aGlzIGludHJvZHVjZSBuZXcgZnVuY3Rpb25hbCBsb2dpYyB0aGF0IGRlbWFuZHMgZnV6emluZz9cIiBObywgaXQncyBqdXN0IGEgcmVmYWN0b3JpbmcsIG1vdmluZyBpbml0aWFsaXphdGlvbiBlYXJsaWVyIHRvIGF2b2lkIGEgdXNlLWFmdGVyLWZyZWUuIEl0J3Mgbm90IGFkZGluZyBmZWF0dXJlcy5cblxuQnV0IHRoZW4gSSByZW1lbWJlciB0aGUgcHJvbXB0OiBpZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIEkgbmVlZCB0byBjb25zaWRlciBmdXp6aW5nLCBldmVuIGZvciBhIGJ1ZyBmaXguIEFuZCB0aGlzICpkb2VzKiBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMuIFRoZSBwcm9tcHQgYWxzbyB0ZWxscyBtZSBpZiBJIGZsYWcgaXQgZm9yIGZ1enppbmcgSSBuZWVkIHRvIHByb3ZpZGUgYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYC5cblxuSSBuZWVkIHRvIHByb3ZpZGUgYEVuYWJsZUNvbmZpZ3M6IFtcIkZVTkNUSU9OX0dSQVBIX1RSQUNFUlwiXWAsIHRoYXQncyBlYXN5LiBCdXQgYEZvY3VzU3ltYm9sc2AgaXMgYSBwcm9ibGVtLiBUaGUgb25seSBmdW5jdGlvbiBtb2RpZmllZCBpcyBgY29weV9wcm9jZXNzYC4gVGhlIHByb21wdCBzcGVjaWZpY2FsbHkgdGVsbHMgbWUgKm5vdCogdG8gbGlzdCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyBsaWtlIGBjb3B5X3Byb2Nlc3NgIHRvIGF2b2lkIHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuIElzIHRoZXJlIGFub3RoZXIgZnVuY3Rpb24gdG8gdXNlPyBObywgdGhlcmUgaXMgbm90LlxuXG5UaGUgcHJvbXB0IHNheXMgSSAqbXVzdCogZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zLiBXYWl0LCBpZiB0aGVyZSBhcmUgbm8gc3BlY2lmaWMgZnVuY3Rpb25zLCBpdCdzIG9rIHRvIGxlYXZlIGBGb2N1c1N5bWJvbHNgIGVtcHR5ISBUaGUgcHJvbXB0IG1ha2VzIHRoZSBgRm9jdXNTeW1ib2xzYCBvcHRpb25hbCwgaWYgbm8gc3BlY2lmaWMgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUuXG5cbk5vdyBJIGFtIGFza2luZyBteXNlbGYsIGlzIHRoaXMgKnJlYWxseSogd29ydGggZnV6emluZz8gSXQncyBqdXN0IG1vdmluZyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgdXAgYnkgYSBmZXcgbGluZXMuIEhvd2V2ZXIsIHRoaXMgaXMgZml4aW5nIGEgcmVhbCB1c2UtYWZ0ZXItZnJlZSBpc3N1ZSByZWxhdGVkIHRvIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBkdXJpbmcgYGNvcHlfcHJvY2Vzc2AuIEZhdWx0IGluamVjdGlvbiBvbiBgYWxsb2NfdGFza19leGVjX3N0YXRlYCBpcyBuZWVkZWQgdG8gdHJpZ2dlciB0aGlzIGJ1Zywgd2hpY2ggU3l6a2FsbGVyIGNhbiBkby5cblxuU28sIGZ1enppbmcgY291bGQgY29uZmlybSB0aGUgZml4J3MgY29ycmVjdG5lc3MgYW5kIHJ1bGUgb3V0IHJlZ3Jlc3Npb25zLiBDcnVjaWFsbHksIEkgaGF2ZSB0byBlbnN1cmUgdGhlIGVhcmx5IGNhbGwgdG8gYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGRvZXNuJ3QgKml0c2VsZiogaW50cm9kdWNlIHByb2JsZW1zLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIGZ1bmN0aW9uLCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgYWdhaW4uIEdpdmVuIGl0IGFsbG9jYXRlcyBtZW1vcnksIHRoZXJlIGlzIGEgcmlzay4gT2theSwgeWVzLCB0aGVyZSBpcyBtZW1vcnkgYWxsb2NhdGVkIGluIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCwgc28gaXQncyBhIGdvb2QgaWRlYSB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIHNpZGUgZWZmZWN0cyB3aGVuIGl0J3MgY2FsbGVkIGVhcmx5LlxuXG5VbHRpbWF0ZWx5LCBJJ20gbGVhbmluZyB0b3dhcmRzIGBXb3J0aEZ1enppbmc9dHJ1ZWAuIEl0J3MgYSBzbWFsbCBjaGFuZ2UsIGJ1dCBpdCBhZGRyZXNzZXMgYSByZWFsIGJ1ZyBpbiBhIGNyaXRpY2FsIHBhdGggd2l0aCBtZW1vcnkgYWxsb2NhdGlvbiwgYW5kIGZhdWx0IGluamVjdGlvbiBpcyBwb3NzaWJsZS4gV2UganVzdCBuZWVkIHRvIGNvbmZpcm0gdGhhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgaXRzZWxmIGlzIHNhZmUgdG8gY2FsbCBlYXJsaWVyLiBJIGFtIGdvaW5nIHdpdGg6XG5cbmBgYGpzb25cbntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZSxcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcIkZVTkNUSU9OX0dSQVBIX1RSQUNFUlwiXVxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXVxufVxuYGBgXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMDQ2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzE0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NDMuMjk0Nzc3MjEzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2Nzc0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvdHJhY2UvZmdyYXBoLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTE2MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTE2MDpcXHR2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxcbjExNjE6XFx0e1xcbjExNjI6XFx0XFx0LyogTWFrZSBzdXJlIHdlIGRvIG5vdCB1c2UgdGhlIHBhcmVudCByZXRfc3RhY2sgKi9cXG4xMTYzOlxcdFxcdHQtXFx1MDAzZXJldF9zdGFjayA9IE5VTEw7XFxuMTE2NDpcXHRcXHR0LVxcdTAwM2VjdXJyX3JldF9zdGFjayA9IDA7XFxuMTE2NTpcXHRcXHR0LVxcdTAwM2VjdXJyX3JldF9kZXB0aCA9IC0xO1xcbjExNjY6XFx0XFxuMTE2NzpcXHRcXHRpZiAoZnRyYWNlX2dyYXBoX2FjdGl2ZSkge1xcbjExNjg6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyAqcmV0X3N0YWNrO1xcbjExNjk6XFx0XFxuMTE3MDpcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKCFmZ3JhcGhfc3RhY2tfY2FjaGVwKSlcXG4xMTcxOlxcdFxcdFxcdFxcdHJldHVybjtcXG4xMTcyOlxcdFxcbjExNzM6XFx0XFx0XFx0cmV0X3N0YWNrID0ga21lbV9jYWNoZV9hbGxvYyhmZ3JhcGhfc3RhY2tfY2FjaGVwLCBHRlBfS0VSTkVMKTtcXG4xMTc0OlxcdFxcdFxcdGlmICghcmV0X3N0YWNrKVxcbjExNzU6XFx0XFx0XFx0XFx0cmV0dXJuO1xcbjExNzY6XFx0XFx0XFx0Z3JhcGhfaW5pdF90YXNrKHQsIHJldF9zdGFjayk7XFxuMTE3NzpcXHRcXHR9XFxuMTE3ODpcXHR9XFxuMTE3OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NDMuMjk0OTQ2ODEzWiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY3MjI1OTYzMzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBBbmFseXNpczogYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGFuZCBQcm9jZXNzIENyZWF0aW9uKipcblxuT2theSwgc28gYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIG9ubHkgYWxsb2NhdGVzIG1lbW9yeSB3aGVuIGBmdHJhY2VfZ3JhcGhfYWN0aXZlYCBpcyB0cnVlLiBJZiBtZW1vcnkgaXMgYWxsb2NhdGVkIGFuZCB0aGVuIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgY2xlYW51cCBpcyBoYW5kbGVkIGNvcnJlY3RseTogYGZyZWVfdGFza2AgaXMgY2FsbGVkLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCB0byBmcmVlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiBTZWVtcyBzb2xpZCBmcm9tIGEgbWVtb3J5IG1hbmFnZW1lbnQgcGVyc3BlY3RpdmUuIEkndmUgZG91YmxlLWNoZWNrZWQsIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgbW9kaWZpY2F0aW9ucyB0byBvdGhlciBmdW5jdGlvbnMgdGhhdCBJIG5lZWQgdG8gd29ycnkgYWJvdXQuXG5cbkknbSBsZWFuaW5nIHRvd2FyZHMgc2V0dGluZyBgV29ydGhGdXp6aW5nPXRydWVgIGhlcmUuIFRoZSBsb2dpYyB0b3VjaGVzIGNvcmUga2VybmVsIGNvbXBvbmVudHMg4oCTIHNwZWNpZmljYWxseSwgcHJvY2VzcyBjcmVhdGlvbiDigJMgYW5kIGl0IG9ubHkgYmVjb21lcyBhY3RpdmUgdW5kZXIgYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uLCBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYCwgc28gaXQgd2FycmFudHMgY2xvc2VyIGludmVzdGlnYXRpb24uXG5cbldhaXQuLi4gYGNvcHlfcHJvY2Vzc2AuLi4gdGhhdCdzIGEgaG90LXBhdGggZnVuY3Rpb24sIGlzbid0IGl0PyBSaWdodC4gV2UgZ2VuZXJhbGx5IGF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgaW4gYEZvY3VzU3ltYm9sc2AgdG8gcHJldmVudCBza2V3aW5nIHRlc3QgZGlzdHJpYnV0aW9ucy4gVGhlcmVmb3JlLCBJICp3aWxsIG5vdCogaW5jbHVkZSBgY29weV9wcm9jZXNzYCBpbiBgRm9jdXNTeW1ib2xzYC4gYEZvY3VzU3ltYm9sc2Agd2lsbCBzdGF5IGVtcHR5LlxuXG5UaGUgYEVuYWJsZUNvbmZpZ3NgIHNob3VsZCBiZSBzZXQgdG8gYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAsIG9mIGNvdXJzZS4gTGV0J3MgbWFrZSBzdXJlIHRoYXQgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgZG9lc24ndCBkZXBlbmQgb24gYW55dGhpbmcgdGhhdCBtaWdodCBub3QgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiBJdCBsb29rcyBsaWtlIGl0IGRlcGVuZHMgb24gYEhBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYCAoYXJjaGl0ZWN0dXJlIHN1cHBvcnQpLCBgRlVOQ1RJT05fVFJBQ0VSYCwgYW5kIGFsc28gYCFYODZfMzIgfHwgIUNDX09QVElNSVpFX0ZPUl9TSVpFYC4gT2theSwgdGhlIHJlcXVpcmVkIGNvbmZpZ3MgYXJlIGBGVU5DVElPTl9UUkFDRVJgIGFuZCBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI3NDQsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTo1MC4wMTc1NDY3MzFaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3MTk4MzA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBGVU5DVElPTl9UUkFDRVJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL3RyYWNlL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL3RyYWNlL0tjb25maWc9MjI2PWNvbmZpZyBCT09UVElNRV9UUkFDSU5HXFxuLS1cXG5rZXJuZWwvdHJhY2UvS2NvbmZpZy0yMzQtXFxua2VybmVsL3RyYWNlL0tjb25maWc6MjM1OmNvbmZpZyBGVU5DVElPTl9UUkFDRVJcXG5rZXJuZWwvdHJhY2UvS2NvbmZpZy0yMzYtXFx0Ym9vbCBcXFwiS2VybmVsIEZ1bmN0aW9uIFRyYWNlclxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NTAuMDk0NzUxNDA5WiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0MTc4OTk0MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyB0aGUgc3VtbWFyeSwgYXNzdW1pbmcgSSdtIGFuIGV4cGVydDpcblxuKipEaXZpbmcgaW50byB0aGUgYEZVTkNUSU9OX1RSQUNFUmAgS2NvbmZpZyoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJ20gZ29pbmcgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGBGVU5DVElPTl9UUkFDRVJgIEtjb25maWcuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBjb25maWd1cmVkLCB3aGF0IGRlcGVuZGVuY2llcyBpdCBoYXMsIGFuZCB3aGF0IHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zIGFyZSBmb3IgdGhlIGtlcm5lbCBidWlsZCBhbmQgcnVudGltZS4gSSdsbCBuZWVkIHRvIGFzc2VzcyBpdHMgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLCBwb3dlciBjb25zdW1wdGlvbiwgYW5kIG92ZXJhbGwgc3lzdGVtIGZvb3RwcmludCwgb2YgY291cnNlLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOiB3aGF0IG90aGVyIHRyYWNpbmcgZmVhdHVyZXMgZG9lcyBpdCBkZXBlbmQgb24/IEFyZSB0aGVyZSBhbnkgb3B0aW9ucyB0byB0dW5lIGl0cyBiZWhhdmlvcj8gSXMgdGhlcmUgZG9jdW1lbnRhdGlvbiB0aGF0IHByb3Blcmx5IGV4cGxhaW5zIHRoZSB0cmFkZS1vZmZzIG9mIGVuYWJsaW5nIGl0PyBJIG5lZWQgdG8gYW5hbHl6ZSB0aGlzIEtjb25maWcgY29uZmlndXJhdGlvbiB0aG9yb3VnaGx5IHRvIGFzc2VzcyB3aGF0IGl0IG1lYW5zIGZvciB0aGUga2VybmVsIGluIHRoZSBjb250ZXh0IG9mIG91ciBwcm9qZWN0LiBUaW1lIHRvIGRpZyBpbiFcblxuXG4iLCJJbnB1dFRva2VucyI6MTM1NDksIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTo1My41MTI2NTQwMjFaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA2MjkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC90cmFjZS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIzNSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDIzNTpcXHRjb25maWcgRlVOQ1RJT05fVFJBQ0VSXFxuIDIzNjpcXHRcXHRib29sIFxcXCJLZXJuZWwgRnVuY3Rpb24gVHJhY2VyXFxcIlxcbiAyMzc6XFx0XFx0ZGVwZW5kcyBvbiBIQVZFX0ZVTkNUSU9OX1RSQUNFUlxcbiAyMzg6XFx0XFx0c2VsZWN0IEtBTExTWU1TXFxuIDIzOTpcXHRcXHRzZWxlY3QgR0VORVJJQ19UUkFDRVJcXG4gMjQwOlxcdFxcdHNlbGVjdCBDT05URVhUX1NXSVRDSF9UUkFDRVJcXG4gMjQxOlxcdFxcdHNlbGVjdCBHTE9CXFxuIDI0MjpcXHRcXHRzZWxlY3QgTkVFRF9UQVNLU19SQ1VcXG4gMjQzOlxcdFxcdHNlbGVjdCBUQVNLU19SVURFX1JDVVxcbiAyNDQ6XFx0XFx0aGVscFxcbiAyNDU6XFx0XFx0ICBFbmFibGUgdGhlIGtlcm5lbCB0byB0cmFjZSBldmVyeSBrZXJuZWwgZnVuY3Rpb24uIFRoaXMgaXMgZG9uZVxcbiAyNDY6XFx0XFx0ICBieSB1c2luZyBhIGNvbXBpbGVyIGZlYXR1cmUgdG8gaW5zZXJ0IGEgc21hbGwsIDUtYnl0ZSBOby1PcGVyYXRpb25cXG4gMjQ3OlxcdFxcdCAgaW5zdHJ1Y3Rpb24gYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSBrZXJuZWwgZnVuY3Rpb24sIHdoaWNoIE5PUFxcbiAyNDg6XFx0XFx0ICBzZXF1ZW5jZSBpcyB0aGVuIGR5bmFtaWNhbGx5IHBhdGNoZWQgaW50byBhIHRyYWNlciBjYWxsIHdoZW5cXG4gMjQ5OlxcdFxcdCAgdHJhY2luZyBpcyBlbmFibGVkIGJ5IHRoZSBhZG1pbmlzdHJhdG9yLiBJZiBpdCdzIHJ1bnRpbWUgZGlzYWJsZWRcXG4gMjUwOlxcdFxcdCAgKHRoZSBib290dXAgZGVmYXVsdCksIHRoZW4gdGhlIG92ZXJoZWFkIG9mIHRoZSBpbnN0cnVjdGlvbnMgaXMgdmVyeVxcbiAyNTE6XFx0XFx0ICBzbWFsbCBhbmQgbm90IG1lYXN1cmFibGUgZXZlbiBpbiBtaWNyby1iZW5jaG1hcmtzIChhdCBsZWFzdCBvblxcbiAyNTI6XFx0XFx0ICB4ODYsIGJ1dCBtYXkgaGF2ZSBpbXBhY3Qgb24gb3RoZXIgYXJjaGl0ZWN0dXJlcykuXFxuIDI1MzpcXHRcXG4gMjU0OlxcdGNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NTMuNTEyNzYyMzMxWiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYyNzAwNDA5MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQ29uZmlndXJhdGlvbiBBZGp1c3RtZW50cyBmb3IgQ29tcHJlaGVuc2l2ZSBUZXN0aW5nKipcblxuT2theSwgc28gSSd2ZSBnb3QgdGhlIGZpeCBmb3IgdGhhdCBuYXN0eSB1c2UtYWZ0ZXItZnJlZSBidWcgaW4gYGNvcHlfcHJvY2VzcygpYCwgc3BlY2lmaWNhbGx5IGluIHRoZSBlcnJvciBwYXRoLiBUaGUgcGF0Y2ggbW92ZXMgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKWAgZWFybGllciB0byBhZGRyZXNzIHRoZSBpc3N1ZS4gVGhpcyBidWcgbGlrZXMgdG8gcmVhciBpdHMgaGVhZCB3aGVuIGBjb3B5X3Byb2Nlc3MoKWAgZmFpbHMg4oCTIHRoaW5rIGBjb3B5X2V4ZWNfc3RhdGUoKWAgZmFpbGluZyDigJMgKmFuZCogZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBUaGF0J3MgdGhlIGtleS5cblxuVGhlcmVmb3JlLCBmb3IgZWZmZWN0aXZlIGZ1enppbmcgb2YgdGhpcywgSSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBwcmVjaXNlbHkuIE15IHBsYW4gaXM6IEknbGwgZW5hYmxlIGJvdGggYEZVTkNUSU9OX1RSQUNFUmAgYW5kIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgLiBTbyBJJ20gc2V0dGluZyBgRW5hYmxlQ29uZmlnc2AgdG8gYFtcIkZVTkNUSU9OX1RSQUNFUlwiLCBcIkZVTkNUSU9OX0dSQVBIX1RSQUNFUlwiXWAuXG5cbkkgYWxzbyBkb24ndCBuZWVkIGFueSBzcGVjaWZpYyBmb2N1cyBzeW1ib2xzLCBzbyBgRm9jdXNTeW1ib2xzYCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QsIGBbXWAuXG5cbkFuZCwgb2YgY291cnNlLCBJIGRlZmluaXRlbHkgd2FudCB0byBmdXp6IHRoaXMgY29kZSBwYXRoIHRvIHZlcmlmeSB0aGUgZml4LCBzbyBgV29ydGhGdXp6aW5nYCB3aWxsIGJlIHNldCB0byBgdHJ1ZWAuXG5cblRoZSByZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOiBCeSBlbmFibGluZyAqYm90aCogYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgYW5kIGBGVU5DVElPTl9UUkFDRVJgLCBJIGVuc3VyZSB0aGF0IHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIHRoZSBlcnJvciBwYXRocyB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYCBhcmUgdGhvcm91Z2hseSB0ZXN0ZWQuIFRoaXMgY29uZmlndXJhdGlvbiBtYXhpbWl6ZXMgbXkgY2hhbmNlcyBvZiBoaXR0aW5nIHRoZSBidWcgaWYgaXQncyBzdGlsbCBsdXJraW5nLCBvciwgbW9yZSBwb3NpdGl2ZWx5LCB2YWxpZGF0ZXMgdGhhdCBteSBmaXggaXMgaW5kZWVkIGVmZmVjdGl2ZSBpbiBhbGwgdGhlIHJlbGV2YW50IHNjZW5hcmlvcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQxMTYsIk91dHB1dFRva2VucyI6MTQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NTkuNzgyODA3NjQ0WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzYzNzY0OTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkZVTkNUSU9OX1RSQUNFUlwiLFxuICAgIFwiRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgdXNlLWFmdGVyLWZyZWUgYnVnIGluIHRoZSBlcnJvciBwYXRoIG9mIGNvcHlfcHJvY2VzcygpIGJ5IG1vdmluZyBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKCkgZWFybGllci4gVGhlIGJ1ZyBpcyB0cmlnZ2VyZWQgd2hlbiBjb3B5X3Byb2Nlc3MoKSBmYWlscyAoZS5nLiwgaW4gY29weV9leGVjX3N0YXRlKCkpIGFuZCBmdW5jdGlvbiBncmFwaCB0cmFjaW5nIGlzIGVuYWJsZWQuIEZ1enppbmcgdGhpcyByZXF1aXJlcyBlbmFibGluZyBGVU5DVElPTl9HUkFQSF9UUkFDRVIgYW5kIEZVTkNUSU9OX1RSQUNFUiB0byBlbnN1cmUgdGhlIG5ldyBpbml0aWFsaXphdGlvbiBvcmRlciBhbmQgZXJyb3IgcGF0aHMgYXJlIHByb3Blcmx5IHRlc3RlZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGVU5DVElPTl9UUkFDRVJcIixcbiAgICBcIkZVTkNUSU9OX0dSQVBIX1RSQUNFUlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBvZiBjb3B5X3Byb2Nlc3MoKSBieSBtb3ZpbmcgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpIGVhcmxpZXIuIFRoZSBidWcgaXMgdHJpZ2dlcmVkIHdoZW4gY29weV9wcm9jZXNzKCkgZmFpbHMgKGUuZy4sIGluIGNvcHlfZXhlY19zdGF0ZSgpKSBhbmQgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBGdXp6aW5nIHRoaXMgcmVxdWlyZXMgZW5hYmxpbmcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSIGFuZCBGVU5DVElPTl9UUkFDRVIgdG8gZW5zdXJlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIGVycm9yIHBhdGhzIGFyZSBwcm9wZXJseSB0ZXN0ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjU5Ljg1OTE5MjgwMloiLCJTZXEiOjM1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTgzNjExNDM2NDYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTo1OS44NTk3NzQ3MzJaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NTgzNjA1NTY2NDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCdzIGB0YXNrX3N0cnVjdGAgdG8gdGhlIGNoaWxkLCBpbmNsdWRpbmcgdGhlIGByZXRfc3RhY2tgIHBvaW50ZXIgdXNlZCBieSBmdHJhY2UuIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYGNvcHlfcHJvY2VzcygpYCAoZS5nLiwgaW4gYGNvcHlfZXhlY19zdGF0ZSgpYCkgYmVmb3JlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKClgIGlzIGNhbGxlZCwgdGhlIGVycm9yIGhhbmRsaW5nIHBhdGggKGBiYWRfZm9ya19mcmVlYCkgd2lsbCBjYWxsIGBmcmVlX3Rhc2soKWAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soKWAuIFNpbmNlIHRoZSBjaGlsZCdzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AuIFRoZSBwYXJlbnQgdGFzayB3aWxsIHRoZW4gY29udGludWUgdG8gdXNlIHRoZSBmcmVlZCBgcmV0X3N0YWNrYCwgcmVzdWx0aW5nIGluIGEgdXNlLWFmdGVyLWZyZWUsIGFuZCBpdCB3aWxsIGJlIGRvdWJsZS1mcmVlZCB3aGVuIHRoZSBwYXJlbnQgZXZlbnR1YWxseSBleGl0cy5cXG5cXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGUyZjNlMjQxM2NkMGQwNTRjMzUwMmNmN2MxYjE0YmFjZDJhOTRlZmVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyAyMSAxMjo1NDoxOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jXG5pbmRleCAxZTY4NDA0YmQ3NzNlLi5jZWM4MmE2NGEwN2NkIDEwMDY0NFxuLS0tIGEva2VybmVsL2ZvcmsuY1xuKysrIGIva2VybmVsL2ZvcmsuY1xuQEAgLTIxMzksNiArMjEzOSw3IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXG4gXHRwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpO1xuIFx0aWYgKCFwKVxuIFx0XHRnb3RvIGZvcmtfb3V0O1xuK1x0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcbiBcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XG4gXHRpZiAocmV0dmFsKVxuIFx0XHRnb3RvIGJhZF9mb3JrX2ZyZWU7XG5AQCAtMjE2NSw4ICsyMTY2LDYgQEAgX19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcyhcbiBcdCAqL1xuIFx0cC1cdTAwM2VjbGVhcl9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgXHUwMDI2IENMT05FX0NISUxEX0NMRUFSVElEKSA/IGFyZ3MtXHUwMDNlY2hpbGRfdGlkIDogTlVMTDtcbiBcbi1cdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG4tXG4gXHRydF9tdXRleF9pbml0X3Rhc2socCk7XG4gXHRyYXdfc3Bpbl9sb2NrX2luaXQoXHUwMDI2cC1cdTAwM2VibG9ja2VkX2xvY2spO1xuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NTkuODU5Nzc1NjEyWiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYwNzk4ODA5NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBGb3JrIFBhdGNoOiBGdHJhY2UgSW5pdGlhbGl6YXRpb24gYW5kIEVycm9yIEhhbmRsaW5nKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyBtb3ZpbmcgdGhlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBjYWxsIHdpdGhpbiBgY29weV9wcm9jZXNzKClgIGluIGBrZXJuZWwvZm9yay5jYC4gU3BlY2lmaWNhbGx5LCBpdCdzIHNoaWZ0aW5nIGl0ICpiZWZvcmUqIHRoZSBgY29weV9leGVjX3N0YXRlKGNsb25lX2ZsYWdzLCBwKWAgY2FsbCBhbmQgKmFmdGVyKiB0aGUgYHAtXHUwMDNlY2xlYXJfY2hpbGRfdGlkID0gLi4uYCBhc3NpZ25tZW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhpcyBjaGFuZ2UgaXMgYmVpbmcgcHJvcG9zZWQuIExldCdzIGRpZyBpbnRvIHRoaXMuXG5cblJpZ2h0LCBsb29raW5nIGF0IHRoZSBkaWZmLCBpdCdzIGEgc3RyYWlnaHRmb3J3YXJkIGNvZGUgbW92ZW1lbnQuIE5vdywgbXkgaW5pdGlhbCB0aG91Z2h0IGlzLCB3aGF0J3MgdGhlIGRlcGVuZGVuY3kgaGVyZT8gSXMgdGhlcmUgYSByZWFzb24gaXQgbmVlZHMgdG8gYmUgKmJlZm9yZSogb3IgKmFmdGVyKiBjZXJ0YWluIG9wZXJhdGlvbnM/IFRoZSBrZXkgaXMgdGhhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgaW5pdGlhbGl6ZXMgc29tZSBmaWVsZHMgaW4gdGhlIG5ldyB0YXNrIHN0cnVjdHVyZSBgcGAuIElmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgY29kZSBqdW1wcyB0byBgYmFkX2ZvcmtfZnJlZWAuICpUaGF0KiBmdW5jdGlvbiBmcmVlcyBgcGAuIFxuXG5TbyBoZXJlJ3MgdGhlIGNydWNpYWwgcXVlc3Rpb246IGRvZXMgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHBlcmZvcm0gYW55IGFsbG9jYXRpb25zLCBvciBkb2VzIGl0IGp1c3QgaW5pdGlhbGl6ZSBmaWVsZHM/IElmIGl0IGFsbG9jYXRlcywgYW5kIGl0J3MgY2FsbGVkICpiZWZvcmUqIGBjb3B5X2V4ZWNfc3RhdGVgIHdoaWNoIGZhaWxzLCB3ZSdyZSBsZWFraW5nIG1lbW9yeSBpbiB0aGUgZmFpbHVyZSBjYXNlIHVubGVzcyBgYmFkX2ZvcmtfZnJlZWAgaGFuZGxlcyBpdC4gSWYgaXQgZG9lc24ndCBhbGxvY2F0ZSwgdGhlbiB0aGlzIG1vdmVtZW50IGlzIGxpa2VseSBmaW5lLCBtYXliZSBhbiBvcHRpbWl6YXRpb24sIG9yIG1heWJlIGl0IGp1c3QgbWFrZXMgdGhpbmdzIGNsZWFyZXIuIEknbSBnb2luZyB0byBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHRvIGNvbmZpcm0gaXRzIGJlaGF2aW9yLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgYmVpbmcgaW5pdGlhbGl6ZWQgYW5kIGhvdyB0aGlzIGNoYW5nZSBhZmZlY3RzIHJlc291cmNlIG1hbmFnZW1lbnQgaW4gdGhlIGZhaWx1cmUgcGF0aC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA2OSwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM5OCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjA1LjkzOTY2MDMzWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTI2OTQyNjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl52b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL3RyYWNlL2ZncmFwaC5jPTExMzE9dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KVxcbi0tXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNTktLyogQWxsb2NhdGUgYSByZXR1cm4gc3RhY2sgZm9yIG5ld2x5IGNyZWF0ZWQgdGFzayAqL1xcbmtlcm5lbC90cmFjZS9mZ3JhcGguYzoxMTYwOnZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNjEte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjowNy44NjY2MDkwNFoiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODg2NjE3Mjg5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCoqXG5cbk9rYXksIGxldCdzIHN0YXJ0IGRpZ2dpbmcgaW50byBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AuIFRoaXMgaXMgd2hlcmUgdGhlIGNvcmUgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBmdW5jdGlvbiBncmFwaCB0cmFjZXIgaGFwcGVucyB3aGVuIGEgbmV3IHRhc2sgaXMgYm9ybiwgcmlnaHQ/IEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgdHJhY2luZyBpbmZyYXN0cnVjdHVyZSBpcyB3aXJlZCBpbnRvIHRoZSB0YXNrJ3MgZXhlY3V0aW9uIGNvbnRleHQuIEknbSBhc3N1bWluZyBpdCdzIGhhbmRsaW5nIHRoZSBzZXR1cCBvZiBwZXItdGFzayBkYXRhIHN0cnVjdHVyZXMsIGhvb2tpbmcgaW50byBzY2hlZHVsaW5nIGV2ZW50cywgYW5kIG1heWJlIGV2ZW4gZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSB0cmFjaW5nIGJhc2VkIG9uIGdsb2JhbCBzZXR0aW5ncyBvciB0YXNrLXNwZWNpZmljIGNyaXRlcmlhLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYGZ0cmFjZV9vcHNgIHN0cnVjdHVyZSwgaG93IGl0IGxpbmtzIHRvIHRoZSB0YXNrJ3MgYHRhc2tfc3RydWN0YCwgYW5kIGFueSBwb3RlbnRpYWwgb3ZlcmhlYWQgaW50cm9kdWNlZCBhdCB0YXNrIGNyZWF0aW9uLiBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gYW55IHN5bmNocm9uaXphdGlvbiBtZWNoYW5pc21zIHVzZWQgdG8gcHJvdGVjdCB0aGUgdHJhY2luZyBkYXRhIGFuZCBob3cgaXQgZGVhbHMgd2l0aCByYWNlcyBiZXR3ZWVuIHRhc2sgY3JlYXRpb24gYW5kIHRyYWNpbmcgb3BlcmF0aW9ucy4gTGV0J3Mgc2VlIGhvdyB0aGV5IGRlYWwgd2l0aCB0aGUgcHJlZW1wdGlvbiBhbmQgaXJxIHNpdHVhdGlvbnMuIEknbSBleHBlY3Rpbmcgc29tZSBjbGV2ZXIgdHJpY2tzIHRvIGtlZXAgaXQgZWZmaWNpZW50LiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5NzQsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjoxMS43NTMyMzAyNjlaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc5NTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC90cmFjZS9mZ3JhcGguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTU5LFxuICBcIkxpbmVDb3VudFwiOiAzMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTU5OlxcdC8qIEFsbG9jYXRlIGEgcmV0dXJuIHN0YWNrIGZvciBuZXdseSBjcmVhdGVkIHRhc2sgKi9cXG4xMTYwOlxcdHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxuMTE2MTpcXHR7XFxuMTE2MjpcXHRcXHQvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHVzZSB0aGUgcGFyZW50IHJldF9zdGFjayAqL1xcbjExNjM6XFx0XFx0dC1cXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtcXG4xMTY0OlxcdFxcdHQtXFx1MDAzZWN1cnJfcmV0X3N0YWNrID0gMDtcXG4xMTY1OlxcdFxcdHQtXFx1MDAzZWN1cnJfcmV0X2RlcHRoID0gLTE7XFxuMTE2NjpcXHRcXG4xMTY3OlxcdFxcdGlmIChmdHJhY2VfZ3JhcGhfYWN0aXZlKSB7XFxuMTE2ODpcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2s7XFxuMTE2OTpcXHRcXG4xMTcwOlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxcbjExNzE6XFx0XFx0XFx0XFx0cmV0dXJuO1xcbjExNzI6XFx0XFxuMTE3MzpcXHRcXHRcXHRyZXRfc3RhY2sgPSBrbWVtX2NhY2hlX2FsbG9jKGZncmFwaF9zdGFja19jYWNoZXAsIEdGUF9LRVJORUwpO1xcbjExNzQ6XFx0XFx0XFx0aWYgKCFyZXRfc3RhY2spXFxuMTE3NTpcXHRcXHRcXHRcXHRyZXR1cm47XFxuMTE3NjpcXHRcXHRcXHRncmFwaF9pbml0X3Rhc2sodCwgcmV0X3N0YWNrKTtcXG4xMTc3OlxcdFxcdH1cXG4xMTc4OlxcdH1cXG4xMTc5OlxcdFxcbjExODA6XFx0dm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcXG4xMTgxOlxcdHtcXG4xMTgyOlxcdFxcdHVuc2lnbmVkIGxvbmcgKnJldF9zdGFjayA9IHQtXFx1MDAzZXJldF9zdGFjaztcXG4xMTgzOlxcdFxcbjExODQ6XFx0XFx0dC1cXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtcXG4xMTg1OlxcdFxcdC8qIE5VTEwgbXVzdCBiZWNvbWUgdmlzaWJsZSB0byBJUlFzIGJlZm9yZSB3ZSBmcmVlIGl0OiAqL1xcbjExODY6XFx0XFx0YmFycmllcigpO1xcbjExODc6XFx0XFxuMTE4ODpcXHRcXHRpZiAocmV0X3N0YWNrKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjExLjc1MzQxMTkxOVoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzUxOTEyNDM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVGFzayBJbml0aWFsaXphdGlvbiBmb3IgRnVuY3Rpb24gVHJhY2luZyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYC4gSXQncyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBpdCBhbGxvY2F0ZXMgdGhlIGByZXRfc3RhY2tgLCBidXQgb25seSB3aGVuIGBmdHJhY2VfZ3JhcGhfYWN0aXZlYCBpcyBzZXQsIHdoaWNoIG1ha2VzIHNlbnNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBOb3csIEkgc2VlIHRoaXMgYGNvcHlfZXhlY19zdGF0ZWAgY2FsbC4gSWYgdGhhdCBmYWlscywgaXQganVtcHMgZGlyZWN0bHkgdG8gYGJhZF9mb3JrX2ZyZWVgLiBUaGF0J3MgYSBwb3RlbnRpYWwgYXJlYSBmb3IgZmFpbHVyZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhhdCBgYmFkX2ZvcmtfZnJlZWAgcGF0aCBiZXR0ZXIsIGVzcGVjaWFsbHkgZ2l2ZW4gaG93IGNyaXRpY2FsIGZvcmsgb3BlcmF0aW9ucyBhcmUuIFRpbWUgdG8gaGVhZCBvdmVyIHRvIGBrZXJuZWwvZm9yay5jYCBhbmQgZGlnIGludG8gYGJhZF9mb3JrX2ZyZWVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHJlc291cmNlcyBhcmUgYmVpbmcgZnJlZWQgYW5kIGlmIGFueSBjbGVhbnVwIG1pZ2h0IGJlIG1pc3Npbmcgb3IgaW5zdWZmaWNpZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjozNjk5LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjoxNS4xMDUzMjY2ODVaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MTg2Nzc3NjMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYmFkX2ZvcmtfZnJlZTpcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2ZvcmsuYz0yMDE4PV9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXFxuLS1cXG5rZXJuZWwvZm9yay5jLTI2NDEtXFx0ZXhpdF9jcmVkcyhwKTtcXG5rZXJuZWwvZm9yay5jOjI2NDI6YmFkX2ZvcmtfZnJlZTpcXG5rZXJuZWwvZm9yay5jLTI2NDMtXFx0V1JJVEVfT05DRShwLVxcdTAwM2VfX3N0YXRlLCBUQVNLX0RFQUQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjoxNi42MjQwMTEwMjhaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDM4NzUyNjEzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIGBiYWRfZm9ya19mcmVlYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGtlcm5lbCdzIGZvcmsgaW1wbGVtZW50YXRpb24uIEknbSBnb2luZyB0byBqdW1wIGludG8gYGtlcm5lbC9mb3JrLmNgIGFuZCBzcGVjaWZpY2FsbHkgZm9jdXMgb24gdGhlIGBiYWRfZm9ya19mcmVlYCBmdW5jdGlvbi4gSSdtIGFzc3VtaW5nLCBnaXZlbiB0aGUgbmFtZSwgdGhpcyBpcyB3aGVyZSB3ZSdyZSBoYW5kbGluZyBzb21lIGtpbmQgb2YgY2xlYW51cCBvciBlcnJvciBzY2VuYXJpbyByZWxhdGVkIHRvIHRoZSBgZm9ya2Agc3lzdGVtIGNhbGwuIFByb2JhYmx5IGRlYWxpbmcgd2l0aCBmcmVlaW5nIHJlc291cmNlcyB0aGF0IHdlcmUgcGFydGlhbGx5IGFsbG9jYXRlZCBkdXJpbmcgYSBmYWlsZWQgZm9yayBhdHRlbXB0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZvcmsgbG9naWMuIEknbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2U6IHdoYXQgcmVzb3VyY2VzIGFyZSBmcmVlZCwgdW5kZXIgd2hhdCBjb25kaXRpb25zIGlzIGl0IGNhbGxlZCwgYW5kIGhvdyBpdCBlbnN1cmVzIHRoZSBzeXN0ZW0gcmVtYWlucyBjb25zaXN0ZW50IGFmdGVyIGEgZm9yayBmYWlsdXJlLiBJcyBpdCBmcmVlaW5nIG1lbW9yeSwgY2xlYW5pbmcgdXAgdGFzayBzdHJ1Y3R1cmVzLCBvciByZWxlYXNpbmcgb3RoZXIga2VybmVsIHJlc291cmNlcz8gVGltZSB0byByZWFkIHRoZSBjb2RlIGNhcmVmdWxseSBhbmQgdW5kZXJzdGFuZCB0aGUgc3BlY2lmaWMgY29udGV4dCBvZiB0aGlzIGZ1bmN0aW9uLiBJJ2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgbGlrZSB0YXNrIHN0cnVjdHVyZXMsIG1tIHN0cnVjdHVyZXMsIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQga2VybmVsIGRhdGEuIExldCdzIHNlZSBpZiB0aGlzIHNoZWRzIGxpZ2h0IG9uIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIHJlc291cmNlIGxlYWtzIHdpdGhpbiB0aGUgZm9yayBpbXBsZW1lbnRhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDA2MSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjIxLjAxMTUzOTM2WiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNzU4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvZm9yay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI2NDAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjI2NDA6XFx0XFx0ZXhpdF9jcmVkX25hbWVzcGFjZXMocCk7XFxuMjY0MTpcXHRcXHRleGl0X2NyZWRzKHApO1xcbjI2NDI6XFx0YmFkX2ZvcmtfZnJlZTpcXG4yNjQzOlxcdFxcdFdSSVRFX09OQ0UocC1cXHUwMDNlX19zdGF0ZSwgVEFTS19ERUFEKTtcXG4yNjQ0OlxcdFxcdGV4aXRfdGFza19zdGFja19hY2NvdW50KHApO1xcbjI2NDU6XFx0XFx0cHV0X3Rhc2tfc3RhY2socCk7XFxuMjY0NjpcXHRcXHRkZWxheWVkX2ZyZWVfdGFzayhwKTtcXG4yNjQ3OlxcdGZvcmtfb3V0OlxcbjI2NDg6XFx0XFx0c3Bpbl9sb2NrX2lycShcXHUwMDI2Y3VycmVudC1cXHUwMDNlc2lnaGFuZC1cXHUwMDNlc2lnbG9jayk7XFxuMjY0OTpcXHRcXHRobGlzdF9kZWxfaW5pdChcXHUwMDI2ZGVsYXllZC5ub2RlKTtcXG4yNjUwOlxcdFxcdHNwaW5fdW5sb2NrX2lycShcXHUwMDI2Y3VycmVudC1cXHUwMDNlc2lnaGFuZC1cXHUwMDNlc2lnbG9jayk7XFxuMjY1MTpcXHRcXHRyZXR1cm4gRVJSX1BUUihyZXR2YWwpO1xcbjI2NTI6XFx0fVxcbjI2NTM6XFx0XFxuMjY1NDpcXHRzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9pZGxlX3BpZHMoc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKVxcbjI2NTU6XFx0e1xcbjI2NTY6XFx0XFx0ZW51bSBwaWRfdHlwZSB0eXBlO1xcbjI2NTc6XFx0XFxuMjY1ODpcXHRcXHRmb3IgKHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcXHUwMDNjIFBJRFRZUEVfTUFYOyArK3R5cGUpIHtcXG4yNjU5OlxcdFxcdFxcdElOSVRfSExJU1RfTk9ERShcXHUwMDI2aWRsZS1cXHUwMDNlcGlkX2xpbmtzW3R5cGVdKTsgLyogbm90IHJlYWxseSBuZWVkZWQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTY6MjEuMDExNjgwMjlaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA2MjE0NjIxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBzdW1tYXJpemVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgc29tZW9uZSBmYW1pbGlhciB3aXRoIGtlcm5lbCBpbnRlcm5hbHM6XG5cbioqS2VybmVsIFRhc2sgU3RydWN0IExpZmVjeWNsZSBBbmFseXNpcyoqXG5cbkFscmlnaHQsIGhhbmcgb24gYSBzZWNvbmQuIEknbSBmb2N1c2luZyBvbiB0YXNrIGNsZWFudXAsIGFuZCB0aGlzIGBkZWxheWVkX2ZyZWVfdGFza2AgZnVuY3Rpb27igKYgdGhhdCdzIHRoZSBvbmUgdGhhdCBhY3R1YWxseSAqZnJlZXMqIHRoZSB0YXNrIHN0cnVjdCwgcmlnaHQ/IFRoZSBrZXkgaGVyZSBpcyB0byBkZXRlcm1pbmUgKmV4YWN0bHkqIHdoZW4gYW5kIGhvdyBhIHRhc2sgc3RydWN0dXJlIGlzIGRlYWxsb2NhdGVkLCBhbmQgdGhpcyBgZGVsYXllZF9mcmVlX3Rhc2tgIGlzIHRoZSBsaWtlbHkgY3VscHJpdC5cblxuTXkgbmV4dCBzdGVwLCBhbmQgaXTigJlzIGEgY3JpdGljYWwgb25lLCBpcyB0byBjb25maXJtIHdoZXRoZXIgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIGlzIGNhbGxlZCAqYmVmb3JlKiB0aGF0IHN0cnVjdCBpcyBmcmVlZC4gVW5kZXJzdGFuZGluZyB0aGUgdGltaW5nIG9mIHRoZSB0cmFjaW5nLXJlbGF0ZWQgY2xlYW51cCBpbiByZWxhdGlvbiB0byB0aGUgbWFpbiBtZW1vcnkgZGVhbGxvY2F0aW9uIGlzIGNydWNpYWwgZm9yIGF2b2lkaW5nIGFueSByYWNlIGNvbmRpdGlvbnMgb3IgZGFuZ2xpbmcgcG9pbnRlciBpc3N1ZXMuIFRoaXMgaXMgYSB2ZXJ5IGNvbW1vbiBpc3N1ZSBpbiBrZXJuZWwgdHJhY2luZy5cblxuVG8gbmFpbCB0aGlzIGRvd24sIEkgbmVlZCB0byBkaXZlIGludG8gdGhlIGNvZGUuIEVpdGhlciBgZGVsYXllZF9mcmVlX3Rhc2tgIGl0c2VsZiwgb3IgYGZyZWVfdGFza2AsIGlmIGBkZWxheWVkX2ZyZWVfdGFza2AgaXMganVzdCBhIHdyYXBwZXIsIHdpbGwgYmUgdGhlIG5leHQgcGxhY2UgdG8gbG9vayB0byB1bmRlcnN0YW5kIHRoZSBleGFjdCBzZXF1ZW5jaW5nIG9mIHRoZXNlIG9wZXJhdGlvbnMuIFRoaXMgaXMgd2hlcmUgSSdsbCBmaW5kIG15IGFuc3dlcnMgYW5kIGNvbmZpcm0gdGhlIHRpbWluZyBvZiB0aGUgRnRyYWNlIGluc3RydW1lbnRhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDY5MywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTY6MjUuMDczODI5NTUzWiIsIlNlcSI6NDYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTg3MjkyNTcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzQ0PWV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNDU6ZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpO1xcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM0Ni1leHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KTtcXG4tLVxcbmluY2x1ZGUvbGludXgvZnRyYWNlLmg9MTM2ND1zdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgfVxcbmluY2x1ZGUvbGludXgvZnRyYWNlLmg6MTM2NTpzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgfVxcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM2Ni1zdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSkgeyB9XFxuLS1cXG5rZXJuZWwvZm9yay5jPTUzMz12b2lkIGZyZWVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG4tLVxcbmtlcm5lbC9mb3JrLmMtNTU1LVxcdHJ0X211dGV4X2RlYnVnX3Rhc2tfZnJlZSh0c2spO1xcbmtlcm5lbC9mb3JrLmM6NTU2OlxcdGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2sodHNrKTtcXG5rZXJuZWwvZm9yay5jLTU1Ny1cXHRhcmNoX3JlbGVhc2VfdGFza19zdHJ1Y3QodHNrKTtcXG4tLVxcbmtlcm5lbC90cmFjZS9mZ3JhcGguYz0xMTYwPXZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxuLS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE3OS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM6MTE4MDp2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxcbmtlcm5lbC90cmFjZS9mZ3JhcGguYy0xMTgxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTY6MjYuNjYxMTMwODg0WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU2Nzk3NDkwOTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQSBQb3RlbnRpYWwgTWVtb3J5IENvcnJ1cHRpb24gSXNzdWUgaW4gVGFzayBGb3JraW5nIHdpdGggRnRyYWNlKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgaG93IHRhc2sgc3RydWN0dXJlcyBhcmUgaGFuZGxlZCBkdXJpbmcgYSBmb3JrLCBzcGVjaWZpY2FsbHkgd2l0aCBmdHJhY2UgZW5hYmxlZC4gSSBzZWUgdGhhdCBgZnJlZV90YXNrYCBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AsIHdoaWNoIGlzIGV4cGVjdGVkLiBOb3csIGlmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgYGJhZF9mb3JrX2ZyZWVgIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCwgbGVhZGluZyB0byBhIGRlbGF5ZWQgZnJlZSBvZiB0aGUgdGFzaywgdWx0aW1hdGVseSBjYWxsaW5nIGBmcmVlX3Rhc2tgIGFuZCB0aGVuIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCwgYXMgZXhwZWN0ZWQuXG5cbkJ1dCB3YWl0LCB0aGlzIHNtZWxscyBmaXNoeS4gV2hhdCBpZiBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agd2FzIGFjdHVhbGx5IGNhbGxlZCAqYWZ0ZXIqIGBjb3B5X2V4ZWNfc3RhdGVgIHdpdGhpbiBhIGZvcmsgc2VxdWVuY2UsIGFuZCAqdGhlbiogdGhlIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzPyBJbiB0aGlzIHNjZW5hcmlvLCBgYmFkX2ZvcmtfZnJlZWAgd291bGQgc3RpbGwgY2FsbCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AsIGRlc3BpdGUgYGNvcHlfZXhlY19zdGF0ZWAgZmFpbGluZy5cblxuQSBsaWdodGJ1bGIganVzdCB3ZW50IG9mZiEgVGhlIGZ1bmN0aW9uIGBwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpO2AgaXMgY2FsbGVkLiBJdCBjb3BpZXMgdGhlIGVudGlyZSB0YXNrIHN0cnVjdHVyZSBmcm9tIHRoZSBwYXJlbnQsIGluY2x1ZGluZyB0aGUgYHAtXHUwMDNlcmV0X3N0YWNrYC4gTm93IGlmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzIGFuZCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agd2FzIG5ldmVyIGNhbGxlZCwgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIHdvdWxkIGZyZWUgdGhlICpwYXJlbnQncyogYHJldF9zdGFja2AhIFRoaXMgaXMgZGVmaW5pdGVseSBhIG1lbW9yeSBjb3JydXB0aW9uIHZ1bG5lcmFiaWxpdHkgd2FpdGluZyB0byBoYXBwZW4uIEkgbmVlZCB0byBkaXZlIGludG8gYGR1cF90YXNrX3N0cnVjdGAgcmlnaHQgYXdheSB0byBjb25maXJtIG15IHN1c3BpY2lvbnMgYW5kIHNlZSBob3cgdGhpcyBpcyBoYW5kbGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDQ4LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjMyLjM0MDg4Mzc0NloiLCJTZXEiOjQ4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTI4NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2ZvcmsuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDgwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMDgwOlxcdH1cXG4xMDgxOlxcdFxcbjEwODI6XFx0c3RhdGljIHZvaWQgbW1hcF9pbml0X2xvY2soc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuMTA4MzpcXHR7XFxuMTA4NDpcXHRcXHRpbml0X3J3c2VtKFxcdTAwMjZtbS1cXHUwMDNlbW1hcF9sb2NrKTtcXG4xMDg1OlxcdFxcdG1tX2xvY2tfc2VxY291bnRfaW5pdChtbSk7XFxuMTA4NjpcXHQjaWZkZWYgQ09ORklHX1BFUl9WTUFfTE9DS1xcbjEwODc6XFx0XFx0cmN1d2FpdF9pbml0KFxcdTAwMjZtbS1cXHUwMDNldm1hX3dyaXRlcl93YWl0KTtcXG4xMDg4OlxcdCNlbmRpZlxcbjEwODk6XFx0fVxcbjEwOTA6XFx0XFxuMTA5MTpcXHRzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqbW1faW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKVxcbjEwOTI6XFx0e1xcbjEwOTM6XFx0XFx0bXRfaW5pdF9mbGFncyhcXHUwMDI2bW0tXFx1MDAzZW1tX210LCBNTV9NVF9GTEFHUyk7XFxuMTA5NDpcXHRcXHRtdF9zZXRfZXh0ZXJuYWxfbG9jayhcXHUwMDI2bW0tXFx1MDAzZW1tX210LCBcXHUwMDI2bW0tXFx1MDAzZW1tYXBfbG9jayk7XFxuMTA5NTpcXHRcXHRhdG9taWNfc2V0KFxcdTAwMjZtbS1cXHUwMDNlbW1fdXNlcnMsIDEpO1xcbjEwOTY6XFx0XFx0YXRvbWljX3NldChcXHUwMDI2bW0tXFx1MDAzZW1tX2NvdW50LCAxKTtcXG4xMDk3OlxcdFxcdHNlcWNvdW50X2luaXQoXFx1MDAyNm1tLVxcdTAwM2V3cml0ZV9wcm90ZWN0X3NlcSk7XFxuMTA5ODpcXHRcXHRtbWFwX2luaXRfbG9jayhtbSk7XFxuMTA5OTpcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2bW0tXFx1MDAzZW1tbGlzdCk7XFxuMTEwMDpcXHRcXHRtbV9wZ3RhYmxlc19ieXRlc19pbml0KG1tKTtcXG4xMTAxOlxcdFxcdG1tLVxcdTAwM2VtYXBfY291bnQgPSAwO1xcbjExMDI6XFx0XFx0bW0tXFx1MDAzZWxvY2tlZF92bSA9IDA7XFxuMTEwMzpcXHRcXHRhdG9taWM2NF9zZXQoXFx1MDAyNm1tLVxcdTAwM2VwaW5uZWRfdm0sIDApO1xcbjExMDQ6XFx0XFx0bWVtc2V0KFxcdTAwMjZtbS1cXHUwMDNlcnNzX3N0YXQsIDAsIHNpemVvZihtbS1cXHUwMDNlcnNzX3N0YXQpKTtcXG4xMTA1OlxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZtbS1cXHUwMDNlcGFnZV90YWJsZV9sb2NrKTtcXG4xMTA2OlxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZtbS1cXHUwMDNlYXJnX2xvY2spO1xcbjExMDc6XFx0XFx0bW1faW5pdF9jcHVtYXNrKG1tKTtcXG4xMTA4OlxcdFxcdG1tX2luaXRfYWlvKG1tKTtcXG4xMTA5OlxcdFxcdG1tX2luaXRfb3duZXIobW0sIHApO1xcbjExMTA6XFx0XFx0bW1fcGFzaWRfaW5pdChtbSk7XFxuMTExMTpcXHRcXHRSQ1VfSU5JVF9QT0lOVEVSKG1tLVxcdTAwM2VleGVfZmlsZSwgTlVMTCk7XFxuMTExMjpcXHRcXHRtbXVfbm90aWZpZXJfc3Vic2NyaXB0aW9uc19pbml0KG1tKTtcXG4xMTEzOlxcdFxcdGluaXRfdGxiX2ZsdXNoX3BlbmRpbmcobW0pO1xcbjExMTQ6XFx0I2lmIGRlZmluZWQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSBcXHUwMDI2XFx1MDAyNiAhZGVmaW5lZChDT05GSUdfU1BMSVRfUE1EX1BUTE9DS1MpXFxuMTExNTpcXHRcXHRtbS1cXHUwMDNlcG1kX2h1Z2VfcHRlID0gTlVMTDtcXG4xMTE2OlxcdCNlbmRpZlxcbjExMTc6XFx0XFx0bW1faW5pdF91cHJvYmVzX3N0YXRlKG1tKTtcXG4xMTE4OlxcdFxcdGh1Z2V0bGJfY291bnRfaW5pdChtbSk7XFxuMTExOTpcXHRcXHRmdXRleF9tbV9pbml0KG1tKTtcXG4xMTIwOlxcdFxcbjExMjE6XFx0XFx0bW1fZmxhZ3NfY2xlYXJfYWxsKG1tKTtcXG4xMTIyOlxcdFxcdGlmIChjdXJyZW50LVxcdTAwM2VtbSkge1xcbjExMjM6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBmbGFncyA9IF9fbW1fZmxhZ3NfZ2V0X3dvcmQoY3VycmVudC1cXHUwMDNlbW0pO1xcbjExMjQ6XFx0XFxuMTEyNTpcXHRcXHRcXHRfX21tX2ZsYWdzX292ZXJ3cml0ZV93b3JkKG1tLCBtbWZfaW5pdF9sZWdhY3lfZmxhZ3MoZmxhZ3MpKTtcXG4xMTI2OlxcdFxcdFxcdG1tLVxcdTAwM2VkZWZfZmxhZ3MgPSBjdXJyZW50LVxcdTAwM2VtbS1cXHUwMDNlZGVmX2ZsYWdzIFxcdTAwMjYgVk1fSU5JVF9ERUZfTUFTSztcXG4xMTI3OlxcdFxcdH0gZWxzZSB7XFxuMTEyODpcXHRcXHRcXHRfX21tX2ZsYWdzX292ZXJ3cml0ZV93b3JkKG1tLCBjb3JlZHVtcF9maWx0ZXIpO1xcbjExMjk6XFx0XFx0XFx0bW0tXFx1MDAzZWRlZl9mbGFncyA9IDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjMyLjM0MTA3ODU4NloiLCJTZXEiOjQ5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzgxMDU3MDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQ2hlY2tpbmcgYGR1cF90YXNrX3N0cnVjdGAqKlxuXG5SaWdodCwgbGV0IG1lIGp1c3QgcGF1c2UgYW5kIG1ha2UgYSBxdWljayBtZW50YWwgbm90ZSDigJMgSSBuZWVkIHRvIGNpcmNsZSBiYWNrIGFuZCBzcGVjaWZpY2FsbHkgZXhhbWluZSBgZHVwX3Rhc2tfc3RydWN0YC4gR2l2ZW4gdGhlIGNvbnRleHQgb2Ygd2hhdCBJJ20gd29ya2luZyBvbiwgSSBzdXNwZWN0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgbnVhbmNlZCBiZWhhdmlvciB0aGVyZSB0aGF0IGNvdWxkIGltcGFjdCB0aGUgb3ZlcmFsbCBkZXNpZ24uIEknbSB0aGlua2luZyBhYm91dCBwb3RlbnRpYWwgaW1wbGljYXRpb25zIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50IG9yIHBlcmhhcHMgaG93IHdlJ3JlIGhhbmRsaW5nIHRocmVhZCBjcmVhdGlvbi4gSXTigJlzIGFsd2F5cyB3b3J0aCBhIHF1aWNrIGNoZWNrLCBlc3BlY2lhbGx5IHdpdGggc29tZXRoaW5nIHRoYXQgZGVhbHMgZGlyZWN0bHkgd2l0aCB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZSBmb3IgcHJvY2Vzc2VzLiBOZWVkIHRvIHNlZSBob3cgdGhhdCBmdW5jdGlvbuKAmXMgaW50ZXJuYWwgd29ya2luZ3MgbWlnaHQgYmUgYWZmZWN0ZWQgYnkgY3VycmVudCBjaGFuZ2VzLCBhbmQsIG9mIGNvdXJzZSwgaG93IGFueSBtb2RpZmljYXRpb25zIGNvdWxkIGluZmx1ZW5jZSBwZXJmb3JtYW5jZS4gVGltZSB0byBkaWcgaW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY5NDEsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjM1LjcyMjEzOTExWiIsIlNlcSI6NTAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjMzMzU3MDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0IFxcXFwqZHVwX3Rhc2tfc3RydWN0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9mb3JrLmM9OTA3PXZvaWQgc2V0X3Rhc2tfc3RhY2tfZW5kX21hZ2ljKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbi0tXFxua2VybmVsL2ZvcmsuYy05MTQtXFxua2VybmVsL2ZvcmsuYzo5MTU6c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqZHVwX3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqb3JpZywgaW50IG5vZGUpXFxua2VybmVsL2ZvcmsuYy05MTYte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjozOC4zNTU1MDI0OThaIiwiU2VxIjo1MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzExMjU4OTcwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJ20gZGVlcCBpbiB0aGUgd2VlZHMgb2Yga2VybmVsLWxldmVsIGNvZGU6XG5cbioqRGl2aW5nIGludG8gYGR1cF90YXNrX3N0cnVjdGAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGNyYWNrIG9wZW4gdGhlIGBkdXBfdGFza19zdHJ1Y3RgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGlzIHdvcmtzLiBJIGtub3cgaXQncyBmdW5kYW1lbnRhbCB0byBwcm9jZXNzIGNyZWF0aW9uIHdpdGhpbiB0aGUga2VybmVsLCBzbyB0aGlzIG5lZWRzIG15IGZ1bGwgYXR0ZW50aW9uLiBMZXQncyBzZWUgaG93IGl0J3MgaW1wbGVtZW50ZWQgYW5kIGFsbCB0aGUgcmVsZXZhbnQgZGF0YSBzdHJ1Y3R1cmVzIGl0IHRvdWNoZXMuIEknbSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVnaWVzIGFuZCBob3cgcmVzb3VyY2VzIGFyZSBjb3BpZWQgKG9yIHNoYXJlZCwgbW9yZSBsaWtlbHkpLiBJdCdzIGNydWNpYWwgdG8gZ3Jhc3AgdGhlIHN1YnRsZXRpZXMgaGVyZSDigJMgZW5zdXJpbmcgYSBjbGVhbiBzZXBhcmF0aW9uIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZCBwcm9jZXNzZXMgd2hpbGUgYWxzbyBvcHRpbWl6aW5nIGZvciBwZXJmb3JtYW5jZSBpcyBhIGRlbGljYXRlIGJhbGFuY2luZyBhY3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcyNDcsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1Njo0MS40NjgwOTQ4ODFaIiwiU2VxIjo1MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYwMzgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9mb3JrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTE1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgOTE1OlxcdHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmR1cF90YXNrX3N0cnVjdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9yaWcsIGludCBub2RlKVxcbiA5MTY6XFx0e1xcbiA5MTc6XFx0XFx0c3RydWN0IHRhc2tfc3RydWN0ICp0c2s7XFxuIDkxODpcXHRcXHRpbnQgZXJyO1xcbiA5MTk6XFx0XFxuIDkyMDpcXHRcXHRpZiAobm9kZSA9PSBOVU1BX05PX05PREUpXFxuIDkyMTpcXHRcXHRcXHRub2RlID0gdHNrX2ZvcmtfZ2V0X25vZGUob3JpZyk7XFxuIDkyMjpcXHRcXHR0c2sgPSBhbGxvY190YXNrX3N0cnVjdF9ub2RlKG5vZGUpO1xcbiA5MjM6XFx0XFx0aWYgKCF0c2spXFxuIDkyNDpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gOTI1OlxcdFxcbiA5MjY6XFx0XFx0ZXJyID0gYXJjaF9kdXBfdGFza19zdHJ1Y3QodHNrLCBvcmlnKTtcXG4gOTI3OlxcdFxcdGlmIChlcnIpXFxuIDkyODpcXHRcXHRcXHRnb3RvIGZyZWVfdHNrO1xcbiA5Mjk6XFx0XFxuIDkzMDpcXHRcXHRlcnIgPSBhbGxvY190aHJlYWRfc3RhY2tfbm9kZSh0c2ssIG5vZGUpO1xcbiA5MzE6XFx0XFx0aWYgKGVycilcXG4gOTMyOlxcdFxcdFxcdGdvdG8gZnJlZV90c2s7XFxuIDkzMzpcXHRcXG4gOTM0OlxcdCNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTS1xcbiA5MzU6XFx0XFx0cmVmY291bnRfc2V0KFxcdTAwMjZ0c2stXFx1MDAzZXN0YWNrX3JlZmNvdW50LCAxKTtcXG4gOTM2OlxcdCNlbmRpZlxcbiA5Mzc6XFx0XFx0YWNjb3VudF9rZXJuZWxfc3RhY2sodHNrLCAxKTtcXG4gOTM4OlxcdFxcbiA5Mzk6XFx0XFx0ZXJyID0gc21wX3Rhc2tfaXBpX21hc2tfYWxsb2ModHNrKTtcXG4gOTQwOlxcdFxcdGlmIChlcnIpXFxuIDk0MTpcXHRcXHRcXHRnb3RvIGZyZWVfc3RhY2s7XFxuIDk0MjpcXHRcXG4gOTQzOlxcdFxcdGVyciA9IHNjc19wcmVwYXJlKHRzaywgbm9kZSk7XFxuIDk0NDpcXHRcXHRpZiAoZXJyKVxcbiA5NDU6XFx0XFx0XFx0Z290byBmcmVlX2lwaV9tYXNrO1xcbiA5NDY6XFx0XFxuIDk0NzpcXHQjaWZkZWYgQ09ORklHX1NFQ0NPTVBcXG4gOTQ4OlxcdFxcdC8qXFxuIDk0OTpcXHRcXHQgKiBXZSBtdXN0IGhhbmRsZSBzZXR0aW5nIHVwIHNlY2NvbXAgZmlsdGVycyBvbmNlIHdlJ3JlIHVuZGVyXFxuIDk1MDpcXHRcXHQgKiB0aGUgc2lnaGFuZCBsb2NrIGluIGNhc2Ugb3JpZyBoYXMgY2hhbmdlZCBiZXR3ZWVuIG5vdyBhbmRcXG4gOTUxOlxcdFxcdCAqIHRoZW4uIFVudGlsIHRoZW4sIGZpbHRlciBtdXN0IGJlIE5VTEwgdG8gYXZvaWQgbWVzc2luZyB1cFxcbiA5NTI6XFx0XFx0ICogdGhlIHVzYWdlIGNvdW50cyBvbiB0aGUgZXJyb3IgcGF0aCBjYWxsaW5nIGZyZWVfdGFzay5cXG4gOTUzOlxcdFxcdCAqL1xcbiA5NTQ6XFx0XFx0dHNrLVxcdTAwM2VzZWNjb21wLmZpbHRlciA9IE5VTEw7XFxuIDk1NTpcXHQjZW5kaWZcXG4gOTU2OlxcdFxcbiA5NTc6XFx0XFx0UkNVX0lOSVRfUE9JTlRFUih0c2stXFx1MDAzZWV4ZWNfc3RhdGUsIE5VTEwpO1xcbiA5NTg6XFx0XFxuIDk1OTpcXHRcXHRzZXR1cF90aHJlYWRfc3RhY2sodHNrLCBvcmlnKTtcXG4gOTYwOlxcdFxcdGNsZWFyX3VzZXJfcmV0dXJuX25vdGlmaWVyKHRzayk7XFxuIDk2MTpcXHRcXHRjbGVhcl90c2tfbmVlZF9yZXNjaGVkKHRzayk7XFxuIDk2MjpcXHRcXHRzZXRfdGFza19zdGFja19lbmRfbWFnaWModHNrKTtcXG4gOTYzOlxcdFxcdGNsZWFyX3N5c2NhbGxfd29ya19zeXNjYWxsX3VzZXJfZGlzcGF0Y2godHNrKTtcXG4gOTY0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1Njo0MS40NjgyNTg1NDFaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTY3NTIwNDU2NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFVzZS1BZnRlci1GcmVlL0RvdWJsZSBGcmVlIGluIFRhc2sgQ3JlYXRpb24gd2l0aCBmdHJhY2UqKlxuXG5Pa2F5LCBzbyBoZXJlJ3MgdGhlIGRlYWwuIGBhcmNoX2R1cF90YXNrX3N0cnVjdGAgZG9lcyBhIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIHBhcmVudCdzIGB0YXNrX3N0cnVjdGAgdG8gdGhlIGNoaWxkLiBUaGF0IG1lYW5zIHRoZSBgcmV0X3N0YWNrYCBwb2ludGVyLCB1c2VkIGJ5IGZ0cmFjZSwgZ2V0cyBjb3BpZWQgdG9vLiBUaGF0IG1ha2VzIHNlbnNlLCBidXQgaXQgY2FuIGxlYWQgdG8gYSByZWFsbHkgbmFzdHkgYnVnLlxuXG5MZXQncyBzYXkgYGNvcHlfZXhlY19zdGF0ZWAgb3Igc29tZXRoaW5nIGVsc2UgZmFpbHMgZHVyaW5nIHRoZSB0YXNrIGNyZWF0aW9uLiBJZiB0aGF0IGhhcHBlbnMsIGBiYWRfZm9ya19mcmVlYCBnZXRzIGNhbGxlZCwgd2hpY2ggdWx0aW1hdGVseSBsZWFkcyB0byBgZnJlZV90YXNrYCwgYW5kIHRoZW4gYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgLiBIZXJlJ3MgdGhlIGtpY2tlcjogaWYgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgICpoYXNuJ3QqIGJlZW4gY2FsbGVkIHlldCwgdGhlIGNoaWxkJ3MgYHJldF9zdGFja2Agc3RpbGwgcG9pbnRzIHRvIHRoZSAqcGFyZW50J3MqIGByZXRfc3RhY2tgIVxuXG5TbywgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIGlzIGdvaW5nIHRvIGZyZWUgdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgISBUaGF0J3MgYSBkb3VibGUgZnJlZSB3YWl0aW5nIHRvIGhhcHBlbiwgb3IgYSB1c2UtYWZ0ZXItZnJlZSBmb3IgdGhlIHBhcmVudC4gVGhlIHBhcmVudCwgd2hpY2ggaXMgc3RpbGwgcnVubmluZywgaGFwcGlseSBjaHVncyBhbG9uZywgdXNpbmcgbWVtb3J5IHRoYXQgaGFzIGp1c3QgYmVlbiAqZnJlZWQqLiAgQ2xhc3NpYyBVQUYvZG91YmxlIGZyZWUuXG5cbk5vdywgaXMgdGhpcyBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZT8gIE5vLiBLTVNBTiBpc24ndCB0aGUgdG9vbCBoZXJlLiBUaGlzIGlzIGEgY2xlYXIgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWUuIEtBU0FOIGlzIHRoZSB3YXkgdG8gZ28uIEl0IHdpbGwgY2F0Y2ggdGhlIHBhcmVudCB1c2luZyB0aGUgZnJlZWQgbWVtb3J5IG9yIHRoZSBzZWNvbmQgYXR0ZW1wdCB0byBmcmVlIGl0LlxuXG5UaGUgcHJvcG9zZWQgcGF0Y2ggaXMgc21hcnQuIEl0J3MgbW92aW5nIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBlYXJsaWVyIGluIHRoZSBwcm9jZXNzLiBOb3cgdGhlIGNoaWxkJ3MgYHJldF9zdGFja2AgZ2V0cyBzZXQgdG8gYE5VTExgIChhbmQgcG90ZW50aWFsbHkgYWxsb2NhdGVkIGEgbmV3IG9uZSkgYmVmb3JlIGFueSBlcnJvciBwYXRocy4gVGhhdCBmaXhlcyB0aGUgYnVnLiBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgZXhwbGljaXRseSBzZXRzIGB0LVx1MDAzZXJldF9zdGFjayA9IE5VTExgLlxuXG5BbHJpZ2h0LCBsZXQgbWUgc29saWRpZnkgdGhpcyByZWFzb25pbmcuIFRoZSBwYXRjaCBhZGRyZXNzZXMgYSBVQUYvZG91YmxlIGZyZWUuIFdoZW4gYSBuZXcgdGFzayBpcyBjcmVhdGVkLCBgZHVwX3Rhc2tfc3RydWN0YCBkdXBsaWNhdGVzIHRoZSBwYXJlbnQncyBgdGFza19zdHJ1Y3RgLCBpbmNsdWRpbmcgZnRyYWNlJ3MgYHJldF9zdGFja2AgcG9pbnRlci4gSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgKmJlZm9yZSogYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGlzIHJ1biwgdGhlIGVycm9yIHBhdGggZnJlZXMgdGhlIGNoaWxkLCBidXQgc2luY2UgYHJldF9zdGFja2AgaXMgc3RpbGwgcG9pbnRpbmcgdG8gdGhlIHBhcmVudCdzIHN0YWNrLCBpdCBlbmRzIHVwIGZyZWVpbmcgdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgLiBUaGVuIHRoZSBwYXJlbnQga2VlcHMgcnVubmluZyB1c2luZyBtZW1vcnkgd2hpY2ggaXMgbm93IGZyZWUgYW5kIGhhcyBiZWVuIGZyZWVkLiBUaGlzIGNyZWF0ZXMgYSB1c2UtYWZ0ZXItZnJlZSwgb3IgYSBkb3VibGUgZnJlZS4gS0FTQU4gd2lsbCBjYXRjaCBpdCBiZWNhdXNlIGl0J3MgZGVzaWduZWQgZm9yIHRoaXMgc29ydCBvZiBtZW1vcnkgY29ycnVwdGlvbi5cblxuSSB3aWxsIHRoZXJlZm9yZSBtYXJrIHRoaXMgYXMgbmVlZGluZyBLQVNBTiBhbmQgbm90IEtNU0FOLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MTcwLCJPdXRwdXRUb2tlbnMiOjMyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExNTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1Njo1OC4yMjAzMDc4NDhaIiwiU2VxIjo1NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTUzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCdzIGB0YXNrX3N0cnVjdGAgdG8gdGhlIGNoaWxkLCBpbmNsdWRpbmcgdGhlIGByZXRfc3RhY2tgIHBvaW50ZXIgdXNlZCBieSBmdHJhY2UuIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYGNvcHlfcHJvY2VzcygpYCAoZS5nLiwgaW4gYGNvcHlfZXhlY19zdGF0ZSgpYCkgYmVmb3JlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKClgIGlzIGNhbGxlZCwgdGhlIGVycm9yIGhhbmRsaW5nIHBhdGggKGBiYWRfZm9ya19mcmVlYCkgd2lsbCBjYWxsIGBmcmVlX3Rhc2soKWAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soKWAuIFNpbmNlIHRoZSBjaGlsZCdzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AuIFRoZSBwYXJlbnQgdGFzayB3aWxsIHRoZW4gY29udGludWUgdG8gdXNlIHRoZSBmcmVlZCBgcmV0X3N0YWNrYCwgcmVzdWx0aW5nIGluIGEgdXNlLWFmdGVyLWZyZWUsIGFuZCBpdCB3aWxsIGJlIGRvdWJsZS1mcmVlZCB3aGVuIHRoZSBwYXJlbnQgZXZlbnR1YWxseSBleGl0cy5cXG5cXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCdzIGB0YXNrX3N0cnVjdGAgdG8gdGhlIGNoaWxkLCBpbmNsdWRpbmcgdGhlIGByZXRfc3RhY2tgIHBvaW50ZXIgdXNlZCBieSBmdHJhY2UuIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYGNvcHlfcHJvY2VzcygpYCAoZS5nLiwgaW4gYGNvcHlfZXhlY19zdGF0ZSgpYCkgYmVmb3JlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKClgIGlzIGNhbGxlZCwgdGhlIGVycm9yIGhhbmRsaW5nIHBhdGggKGBiYWRfZm9ya19mcmVlYCkgd2lsbCBjYWxsIGBmcmVlX3Rhc2soKWAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soKWAuIFNpbmNlIHRoZSBjaGlsZCdzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AuIFRoZSBwYXJlbnQgdGFzayB3aWxsIHRoZW4gY29udGludWUgdG8gdXNlIHRoZSBmcmVlZCBgcmV0X3N0YWNrYCwgcmVzdWx0aW5nIGluIGEgdXNlLWFmdGVyLWZyZWUsIGFuZCBpdCB3aWxsIGJlIGRvdWJsZS1mcmVlZCB3aGVuIHRoZSBwYXJlbnQgZXZlbnR1YWxseSBleGl0cy5cXG5cXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowmdrx9[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-21 12:25:06 +0000 UTC FinishedAt: 2026-08-21 12:56:59 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "55ab7e14222e5f0b0fd9f7711ca391d2924b35e3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FUNCTION_TRACER", "FUNCTION_GRAPH_TRACER" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "55ab7e14222e5f0b0fd9f7711ca391d2924b35e3", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FUNCTION_TRACER", "FUNCTION_GRAPH_TRACER" ], "series_id": "3596507b-cc8d-4da1-aa5b-42ea601545d2" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVTkNUSU9OX1RSQUNFUiYjMzQ7LAogICAgJiMzNDtGVU5DVElPTl9HUkFQSF9UUkFDRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb3ZlcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgZWFybGllciBpbiBgY29weV9wcm9jZXNzKClgIHRvIHByZXZlbnQgYSB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIGJ1Zy4gV2hlbiBhIG5ldyB0YXNrIGlzIGNyZWF0ZWQsIGBkdXBfdGFza19zdHJ1Y3QoKWAgY29waWVzIHRoZSBwYXJlbnQmIzM5O3MgYHRhc2tfc3RydWN0YCB0byB0aGUgY2hpbGQsIGluY2x1ZGluZyB0aGUgYHJldF9zdGFja2AgcG9pbnRlciB1c2VkIGJ5IGZ0cmFjZS4gSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBgY29weV9wcm9jZXNzKClgIChlLmcuLCBpbiBgY29weV9leGVjX3N0YXRlKClgKSBiZWZvcmUgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKWAgaXMgY2FsbGVkLCB0aGUgZXJyb3IgaGFuZGxpbmcgcGF0aCAoYGJhZF9mb3JrX2ZyZWVgKSB3aWxsIGNhbGwgYGZyZWVfdGFzaygpYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYC4gU2luY2UgdGhlIGNoaWxkJiMzOTtzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYCB3aWxsIGVycm9uZW91c2x5IGZyZWUgdGhlIHBhcmVudCYjMzk7cyBgcmV0X3N0YWNrYC4gVGhlIHBhcmVudCB0YXNrIHdpbGwgdGhlbiBjb250aW51ZSB0byB1c2UgdGhlIGZyZWVkIGByZXRfc3RhY2tgLCByZXN1bHRpbmcgaW4gYSB1c2UtYWZ0ZXItZnJlZSwgYW5kIGl0IHdpbGwgYmUgZG91YmxlLWZyZWVkIHdoZW4gdGhlIHBhcmVudCBldmVudHVhbGx5IGV4aXRzLlxuXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBvZiBjb3B5X3Byb2Nlc3MoKSBieSBtb3ZpbmcgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpIGVhcmxpZXIuIFRoZSBidWcgaXMgdHJpZ2dlcmVkIHdoZW4gY29weV9wcm9jZXNzKCkgZmFpbHMgKGUuZy4sIGluIGNvcHlfZXhlY19zdGF0ZSgpKSBhbmQgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBGdXp6aW5nIHRoaXMgcmVxdWlyZXMgZW5hYmxpbmcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSIGFuZCBGVU5DVElPTl9UUkFDRVIgdG8gZW5zdXJlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIGVycm9yIHBhdGhzIGFyZSBwcm9wZXJseSB0ZXN0ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBlMmYzZTI0MTNjZDBkMDU0YzM1MDJjZjdjMWIxNGJhY2QyYTk0ZWZlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMjEgMTI6NTQ6MTggMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmNcbmluZGV4IDFlNjg0MDRiZDc3M2UuLmNlYzgyYTY0YTA3Y2QgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvZm9yay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZm9yay5jXG5AQCAtMjEzOSw2ICYjNDM7MjEzOSw3IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXG4gXHRwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpO1xuIFx0aWYgKCFwKVxuIFx0XHRnb3RvIGZvcmtfb3V0O1xuJiM0MztcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG4gXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xuIFx0aWYgKHJldHZhbClcbiBcdFx0Z290byBiYWRfZm9ya19mcmVlO1xuQEAgLTIxNjUsOCAmIzQzOzIxNjYsNiBAQCBfX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxuIFx0ICovXG4gXHRwLVx1MDAzZWNsZWFyX2NoaWxkX3RpZCA9IChjbG9uZV9mbGFncyBcdTAwMjYgQ0xPTkVfQ0hJTERfQ0xFQVJUSUQpID8gYXJncy1cdTAwM2VjaGlsZF90aWQgOiBOVUxMO1xuIFxuLVx0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcbi1cbiBcdHJ0X211dGV4X2luaXRfdGFzayhwKTtcbiBcdHJhd19zcGluX2xvY2tfaW5pdChcdTAwMjZwLVx1MDAzZWJsb2NrZWRfbG9jayk7XG4gXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVTkNUSU9OX1RSQUNFUiYjMzQ7LAogICAgJiMzNDtGVU5DVElPTl9HUkFQSF9UUkFDRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSB1c2UtYWZ0ZXItZnJlZSBidWcgaW4gdGhlIGVycm9yIHBhdGggb2YgY29weV9wcm9jZXNzKCkgYnkgbW92aW5nIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKSBlYXJsaWVyLiBUaGUgYnVnIGlzIHRyaWdnZXJlZCB3aGVuIGNvcHlfcHJvY2VzcygpIGZhaWxzIChlLmcuLCBpbiBjb3B5X2V4ZWNfc3RhdGUoKSkgYW5kIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZC4gRnV6emluZyB0aGlzIHJlcXVpcmVzIGVuYWJsaW5nIEZVTkNUSU9OX0dSQVBIX1RSQUNFUiBhbmQgRlVOQ1RJT05fVFJBQ0VSIHRvIGVuc3VyZSB0aGUgbmV3IGluaXRpYWxpemF0aW9uIG9yZGVyIGFuZCBlcnJvciBwYXRocyBhcmUgcHJvcGVybHkgdGVzdGVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTJmM2UyNDEzY2QwZDA1NGMzNTAyY2Y3YzFiMTRiYWNkMmE5NGVmZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgQXVnIDIxIDEyOjU0OjE4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggMWU2ODQwNGJkNzczZS4uY2VjODJhNjRhMDdjZCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZm9yay5jCkBAIC0yMTM5LDYgJiM0MzsyMTM5LDcgQEAgX19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcygKIAlwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpOwogCWlmICghcCkKIAkJZ290byBmb3JrX291dDsKJiM0MzsJZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTsKIAlyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gYmFkX2ZvcmtfZnJlZTsKQEAgLTIxNjUsOCAmIzQzOzIxNjYsNiBAQCBfX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKAogCSAqLwogCXAtJmd0O2NsZWFyX2NoaWxkX3RpZCA9IChjbG9uZV9mbGFncyAmYW1wOyBDTE9ORV9DSElMRF9DTEVBUlRJRCkgPyBhcmdzLSZndDtjaGlsZF90aWQgOiBOVUxMOwogCi0JZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTsKLQogCXJ0X211dGV4X2luaXRfdGFzayhwKTsKIAlyYXdfc3Bpbl9sb2NrX2luaXQoJmFtcDtwLSZndDtibG9ja2VkX2xvY2spOwogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNzIKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgRm9yayBPcHRpbWl6YXRpb24gaW4gS2VybmVsL2ZvcmsuYyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHNlZW1zIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCB5b3Uga25vdyBob3cgaXQgZ29lcyDigJMgZXZlbiBzbWFsbCBjaGFuZ2VzIGNhbiBiZSBzaWduaWZpY2FudC4gSXQmIzM5O3MgaW4gYGtlcm5lbC9mb3JrLmNgLCBhbmQgdGhlIGtleSBoZXJlIGlzIHRoZSByZWxvY2F0aW9uIG9mIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO2AuIFRoZXkmIzM5O3ZlIG1vdmVkIGl0ICppbnNpZGUqIGBjb3B5X3Byb2Nlc3MoKWAsIHdoaWNoIGlzIGEgbGl0dGxlIHVudXN1YWwuIEl0IHdhcyBvcmlnaW5hbGx5IHBvc2l0aW9uZWQgKmFmdGVyKiB0aGUgYXNzaWdubWVudCB0byBgcC0mZ3Q7Y2xlYXJfY2hpbGRfdGlkYCwgYW5kIG5vdyBpdCYjMzk7cyBoYXBwZW5pbmcgcmlnaHQgYWZ0ZXIgdGhlIGBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7YCBjYWxsLgoKTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhpcyBpcyBsaWtlbHkgYSBzdWJ0bGUgYnVnIGZpeC4gUGVyaGFwcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agd2FzIGJlaW5nIGNhbGxlZCB0b28gbGF0ZSBpbiB0aGUgcHJvY2Vzcywgb3IgbWF5YmUgdGhlcmUgd2FzIGEgbWlzc2VkIGV4ZWN1dGlvbiBwYXRoIHRoYXQgd2FzIGluYWR2ZXJ0ZW50bHkgYnlwYXNzaW5nIGl0LiBUaGUgZmFjdCB0aGF0IHRoZSBjaGFuZ2UgaXMgc28gdGlnaHRseSBmb2N1c2VkIHN1Z2dlc3RzIHRoZXkmIzM5O3JlIHRyeWluZyB0byBhZGRyZXNzIGEgc3BlY2lmaWMsIGNvbnRhaW5lZCBpc3N1ZS4gSXQmIzM5O3MgYWxzbyBwb3NzaWJsZSB0aGF0IHRoZXJlIHdhcyBzb21lIGVycm9yIGhhbmRsaW5nIGxvZ2ljIHRoYXQgY291bGQgc2tpcCB0aGUgY2FsbCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuCgpCZWZvcmUgSSBqdW1wIHRvIGFueSBkZWZpbml0aXZlIGNvbmNsdXNpb25zLCBJIG5lZWQgdG8gZGlnIGludG8gYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGl0c2VsZi4gVGhhdCYjMzk7cyB0aGUgcmVhbCBrZXkgdG8gdW5kZXJzdGFuZGluZyAqd2h5KiB0aGlzIHNoaWZ0IHdhcyBuZWVkZWQgYW5kIHdoYXQgcG90ZW50aWFsIGltcGFjdCBpdCBoYXMgb24gdGhlIHN5c3RlbSYjMzk7cyBiZWhhdmlvci4gVGltZSB0byBkZWx2ZSBpbnRvIHRoZSBmdW5jdGlvbiYjMzk7cyBpbXBsZW1lbnRhdGlvbiBhbmQgdW5kZXJzdGFuZCBpdHMgaW50ZXJhY3Rpb25zIHdpdGhpbiB0aGUgYnJvYWRlciB0cmFjaW5nIGZyYW1ld29yay4gVGhpcyBtaW5vciBjaGFuZ2UgaGFzIHBpcXVlZCBteSBpbnRlcmVzdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmdHJhY2VfZ3JhcGhfaW5pdF90YXNrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2ZvcmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jPTIwMTg9X19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2Vzcyhcbi0tXG5rZXJuZWwvZm9yay5jLTIxNDEtXHRcdGdvdG8gZm9ya19vdXQ7XG5rZXJuZWwvZm9yay5jOjIxNDI6XHRmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO1xua2VybmVsL2ZvcmsuYy0yMTQzLVx0cmV0dmFsID0gY29weV9leGVjX3N0YXRlKGNsb25lX2ZsYWdzLCBwKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjQxCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHNvbWV0aGluZyByZWxhdGVkIHRvIGZ0cmFjZSYjMzk7cyBncmFwaCB0cmFjaW5nIGluaXRpYWxpemF0aW9uLiBUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGRlZmluaXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgLiBJIG5lZWQgYSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgZ3JhcGggdHJhY2VyIGlzIHNldCB1cCBmb3IgYSBuZXdseSBjcmVhdGVkIHRhc2suIEkgc3VzcGVjdCBpdCYjMzk7bGwgaW52b2x2ZSBzZXR0aW5nIHVwIHBlci10YXNrIGRhdGEgc3RydWN0dXJlcywgY29uZmlndXJpbmcgdGhlIHRyYWNlIGJ1ZmZlciwgYW5kIGxpa2VseSBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIGdsb2JhbCBncmFwaCB0cmFjZXIgc3RhdGUuIEkmIzM5O2xsIHByb2JhYmx5IGZpbmQgc29tZSBpbnRlcmVzdGluZyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgc2NoZWR1bGVyIGhlcmUgdG9vLCBwb3NzaWJseSBob29rcyBpbnRvIHRhc2sgY3JlYXRpb24gb3IgY29udGV4dCBzd2l0Y2hlcy4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBjb2RlIHJldmVhbHMhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZnRyYWNlX2dyYXBoX2luaXRfdGFzayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2Z0cmFjZS5oPTEzNDI9ZXh0ZXJuIHRyYWNlX2Z1bmNfZ3JhcGhfZW50X3QgZnRyYWNlX2dyYXBoX2VudHJ5O1xuaW5jbHVkZS9saW51eC9mdHJhY2UuaC0xMzQzLVxuaW5jbHVkZS9saW51eC9mdHJhY2UuaDoxMzQ0OmV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM0NS1leHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCk7XG4tLVxuaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzU2PXN0YXRpYyBpbmxpbmUgdm9pZCB1bnBhdXNlX2dyYXBoX3RyYWNpbmcodm9pZClcbi0tXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNjMtXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNjQ6c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM2NS1zdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgfVxuLS1cbmtlcm5lbC9mb3JrLmM9MjAxOD1fX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxuLS1cbmtlcm5lbC9mb3JrLmMtMjE0MS1cdFx0Z290byBmb3JrX291dDtcbmtlcm5lbC9mb3JrLmM6MjE0MjpcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG5rZXJuZWwvZm9yay5jLTIxNDMtXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xuLS1cbmtlcm5lbC90cmFjZS9mZ3JhcGguYz0xMTMxPXZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSlcbi0tXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE1OS0vKiBBbGxvY2F0ZSBhIHJldHVybiBzdGFjayBmb3IgbmV3bHkgY3JlYXRlZCB0YXNrICovXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM6MTE2MDp2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNjEte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyOTUKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Ag4oCTIGEgcHJldHR5IHNwZWNpZmljIGZ1bmN0aW9uIG5hbWUuIEJhc2VkIG9uIGNvbnRleHQsIGl0JiMzOTtzIGxpa2VseSBpbnZvbHZlZCB3aXRoIGluaXRpYWxpemluZyBzb21ldGhpbmcgcmVsYXRlZCB0byBmdW5jdGlvbiB0cmFjaW5nLCBzcGVjaWZpY2FsbHkgdGhlIGdyYXBoIHRyYWNlci4gTXkgZ3V0IGZlZWxpbmcgaXMgaXQmIzM5O3MgaGFuZGxpbmcgdGhlIHNldHVwIGZvciBhIG5ldyB0YXNrIG9yIHByb2Nlc3MuIE5vdywgd2hlcmUgaXMgdGhpcyBmdW5jdGlvbiBkZWZpbmVkPyBBaCwgaXQmIzM5O3MgaW4gYGtlcm5lbC90cmFjZS9mZ3JhcGguY2AuIFRpbWUgdG8gZGlnIGludG8gdGhhdCBmaWxlIGFuZCBzZWUgZXhhY3RseSBob3cgaXQgd29ya3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBpbml0aWFsaXphdGlvbiBlbnRhaWxzLCB3aGF0IGRhdGEgc3RydWN0dXJlcyBpdCBtYW5pcHVsYXRlcywgYW5kIHdoYXQgaW1wbGljYXRpb25zIGl0IGhhcyBmb3IgdGhlIG92ZXJhbGwgdHJhY2luZyBtZWNoYW5pc20uIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC90cmFjZS9mZ3JhcGguYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDExNTksCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTE1OTpcdC8qIEFsbG9jYXRlIGEgcmV0dXJuIHN0YWNrIGZvciBuZXdseSBjcmVhdGVkIHRhc2sgKi9cbjExNjA6XHR2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxuMTE2MTpcdHtcbjExNjI6XHRcdC8qIE1ha2Ugc3VyZSB3ZSBkbyBub3QgdXNlIHRoZSBwYXJlbnQgcmV0X3N0YWNrICovXG4xMTYzOlx0XHR0LVx1MDAzZXJldF9zdGFjayA9IE5VTEw7XG4xMTY0Olx0XHR0LVx1MDAzZWN1cnJfcmV0X3N0YWNrID0gMDtcbjExNjU6XHRcdHQtXHUwMDNlY3Vycl9yZXRfZGVwdGggPSAtMTtcbjExNjY6XHRcbjExNjc6XHRcdGlmIChmdHJhY2VfZ3JhcGhfYWN0aXZlKSB7XG4xMTY4Olx0XHRcdHVuc2lnbmVkIGxvbmcgKnJldF9zdGFjaztcbjExNjk6XHRcbjExNzA6XHRcdFx0aWYgKFdBUk5fT05fT05DRSghZmdyYXBoX3N0YWNrX2NhY2hlcCkpXG4xMTcxOlx0XHRcdFx0cmV0dXJuO1xuMTE3MjpcdFxuMTE3MzpcdFx0XHRyZXRfc3RhY2sgPSBrbWVtX2NhY2hlX2FsbG9jKGZncmFwaF9zdGFja19jYWNoZXAsIEdGUF9LRVJORUwpO1xuMTE3NDpcdFx0XHRpZiAoIXJldF9zdGFjaylcbjExNzU6XHRcdFx0XHRyZXR1cm47XG4xMTc2Olx0XHRcdGdyYXBoX2luaXRfdGFzayh0LCByZXRfc3RhY2spO1xuMTE3NzpcdFx0fVxuMTE3ODpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzODM0CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBQYXRjaCoqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIG1vdmluZyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgdG8gYSBzbGlnaHRseSBlYXJsaWVyIHBvaW50LCBzcGVjaWZpY2FsbHkgcmlnaHQgYWZ0ZXIgYHAgPSBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7YC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhpcyBpcyBhIGRlZmVuc2l2ZSBtb3ZlLiBJdCYjMzk7cyBhbG1vc3QgY2VydGFpbmx5IHRvIGVuc3VyZSB0aGF0IGB0LSZndDtyZXRfc3RhY2sgPSBOVUxMO2AgaXMgc2V0ICpiZWZvcmUqIGFueSBwb3RlbnRpYWwgZXJyb3IgY29uZGl0aW9ucyB0aGF0IG1pZ2h0IGNhdXNlIHRoZSBzeXN0ZW0gdG8gY2FsbCBgZnJlZV90YXNrKHApYCBvciBhIHNpbWlsYXIgZnVuY3Rpb24uIElmIHRoYXQgd2FzbiYjMzk7dCBkb25lLCB0aGVyZSYjMzk7cyB0aGUgcG9zc2liaWxpdHkgdGhhdCB3ZSYjMzk7ZCB0cnkgdG8gZnJlZSB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgIGJ5IGFjY2lkZW50IGR1cmluZyBhbiBlcnJvciBwYXRoLCBiZWNhdXNlIGBkdXBfdGFza19zdHJ1Y3RgIGNvcGllcyB0aGF0LgoKSG9sZCBvbiwgKnJpZ2h0KiwgYGR1cF90YXNrX3N0cnVjdGAgZG9lcyBhIGZ1bGwgY29weSBvZiB0aGUgZW50aXJlIGB0YXNrX3N0cnVjdGAuIFRoYXQgbWVhbnMgaWYgdGhlIHBhcmVudCB0YXNrIGhhcyBgcmV0X3N0YWNrYCBhbGxvY2F0ZWQsIHRoZSBjaGlsZCB0YXNrIHdpbGwgaW5pdGlhbGx5IHBvaW50IHRvICp0aGUgc2FtZSBtZW1vcnkgbG9jYXRpb24qLiBTbywgaWYgYW4gZXJyb3IgaGFwcGVucyAqYmVmb3JlKiBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgcnVucywgZm9yIGluc3RhbmNlLCBpbiBgY29weV9leGVjX3N0YXRlYCwgdGhlIGNoaWxkIHRhc2sgY291bGQgZ2V0IGZyZWVkLiBBbmQgaWYgaXQgZG9lcywgaXRzIGByZXRfc3RhY2tgIHBvaW50ZXIgKHdoaWNoIGlzIGFjdHVhbGx5IHRoZSBwYXJlbnQmIzM5O3MhKSBjb3VsZCBiZSBmcmVlZCBvciBjb3JydXB0ZWQsIHdoaWNoIHdvdWxkIGJlIGRpc2FzdHJvdXMuCgpXYWl0IGEgc2Vjb25kLi4uIGlzbiYjMzk7dCBgZnJlZV90YXNrYCBzdXBwb3NlZCB0byBjYWxsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHQpYD8gSWYgdGhhdCYjMzk7cyB0aGUgY2FzZSwgdGhlbiB0aGlzIGNoYW5nZSBtaWdodCBub3QgZXZlbiBiZSBuZWNlc3NhcnkuIExldCBtZSBxdWlja2x5IGNoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AgYW5kIHNlZSBpZiBpdCBkZWFscyB3aXRoIHRoaXMgc2NlbmFyaW8uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2Z0cmFjZV9ncmFwaF9leGl0X3Rhc2smIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzQ0PWV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcbmluY2x1ZGUvbGludXgvZnRyYWNlLmg6MTM0NTpleHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCk7XG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNDYtZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSk7XG4tLVxuaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzY0PXN0YXRpYyBpbmxpbmUgdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkgeyB9XG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNjU6c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM2Ni1zdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSkgeyB9XG4tLVxua2VybmVsL2ZvcmsuYz01MzM9dm9pZCBmcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxua2VybmVsL2ZvcmsuYy01NTUtXHRydF9tdXRleF9kZWJ1Z190YXNrX2ZyZWUodHNrKTtcbmtlcm5lbC9mb3JrLmM6NTU2Olx0ZnRyYWNlX2dyYXBoX2V4aXRfdGFzayh0c2spO1xua2VybmVsL2ZvcmsuYy01NTctXHRhcmNoX3JlbGVhc2VfdGFza19zdHJ1Y3QodHNrKTtcbi0tXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM9MTE2MD12b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxuLS1cbmtlcm5lbC90cmFjZS9mZ3JhcGguYy0xMTc5LVxua2VybmVsL3RyYWNlL2ZncmFwaC5jOjExODA6dm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcbmtlcm5lbC90cmFjZS9mZ3JhcGguYy0xMTgxLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDg2MwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSYjMzk7cmUgbXkgb3duOgoKKipBbmFseXppbmcgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgKioKCkFscmlnaHQsIGxldCYjMzk7cyB0YWtlIGEgbG9vayBhdCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AuIE15IGluaXRpYWwgdGhvdWdodCBpcywgd2hhdCBzcGVjaWZpY2FsbHkgZG9lcyB0aGlzIGZ1bmN0aW9uIHJlcHJlc2VudCB3aXRoaW4gdGhlIGZ0cmFjZSBmcmFtZXdvcms/IEl0JiMzOTtzIGNsZWFybHkgdGllZCB0byB0YXNrIGV4aXQgZXZlbnRzLCBiYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24uIE15IGltbWVkaWF0ZSBxdWVzdGlvbnMgYXJlOiBob3cgZG9lcyBpdCBmaXQgaW50byB0aGUgYnJvYWRlciB0cmFjaW5nIHBpY3R1cmU/IElzIHRoaXMgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIGNsZWFudXAsIGJvb2trZWVwaW5nLCBkYXRhIGFnZ3JlZ2F0aW9uLCBvciBwZXJoYXBzIHNvbWUga2luZCBvZiBub3RpZmljYXRpb24gcmVsYXRlZCB0byB0aGUgdGVybWluYXRpb24gb2YgYSB0cmFjZWQgdGFzaz8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIEkgbmVlZCB0byBjb25zaWRlcj8gS25vd2luZyB0aGUgc3BlY2lmaWNzIG9mIHRoZSBrZXJuZWwmIzM5O3MgdHJhY2luZyBkZXNpZ24sIEkmIzM5O20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgd2hlcmUgdGhpcyBmdW5jdGlvbiBzaXRzIGluIHRoZSBleGVjdXRpb24gcGF0aCB3aGVuIGEgcHJvY2VzcyBleGl0cyB3aGlsZSBiZWluZyB0cmFjZWQuIEkgd29uZGVyIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgdGhpczsgaXMgaXQgb25seSBkdXJpbmcgYSAmIzM0O25vcm1hbCYjMzQ7IGV4aXQgb3IgYWxzbyBmb3IgYWJub3JtYWwgdGVybWluYXRpb25zIGxpa2Ugc2lnbmFscz8gVGhlIGludGVycGxheSB3aXRoIG90aGVyIGZ0cmFjZSBncmFwaCBmdW5jdGlvbnMgaXMga2V5IGhlcmUuIEkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gY2hlY2sgZm9yIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgbG9ja2luZyBtZWNoYW5pc21zIHRoYXQgcHJvdGVjdCBzaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzLiBUaGlzIG9uZSBpcyBnb2luZyB0byBiZSBpbXBvcnRhbnQgaW4gdGVybXMgb2YgaG93IHRoZSB0cmFjZWQgdGFzayBleGl0cy4gVGhpcyBmdW5jdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvdmlkZSBpbnNpZ2h0IGludG8gdHJhY2UgcmVzdWx0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvdHJhY2UvZmdyYXBoLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExODA6XHR2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxuMTE4MTpcdHtcbjExODI6XHRcdHVuc2lnbmVkIGxvbmcgKnJldF9zdGFjayA9IHQtXHUwMDNlcmV0X3N0YWNrO1xuMTE4MzpcdFxuMTE4NDpcdFx0dC1cdTAwM2VyZXRfc3RhY2sgPSBOVUxMO1xuMTE4NTpcdFx0LyogTlVMTCBtdXN0IGJlY29tZSB2aXNpYmxlIHRvIElSUXMgYmVmb3JlIHdlIGZyZWUgaXQ6ICovXG4xMTg2Olx0XHRiYXJyaWVyKCk7XG4xMTg3Olx0XG4xMTg4Olx0XHRpZiAocmV0X3N0YWNrKSB7XG4xMTg5Olx0XHRcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxuMTE5MDpcdFx0XHRcdHJldHVybjtcbjExOTE6XHRcdFx0a21lbV9jYWNoZV9mcmVlKGZncmFwaF9zdGFja19jYWNoZXAsIHJldF9zdGFjayk7XG4xMTkyOlx0XHR9XG4xMTkzOlx0fVxuMTE5NDpcdFxuMTE5NTpcdCNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0VcbjExOTY6XHRzdGF0aWMgaW50IGZncmFwaF9waWRfZnVuYyhzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudCAqdHJhY2UsXG4xMTk3Olx0XHRcdFx0ICAgc3RydWN0IGZncmFwaF9vcHMgKmdvcHMsXG4xMTk4Olx0XHRcdFx0ICAgc3RydWN0IGZ0cmFjZV9yZWdzICpmcmVncylcbjExOTk6XHR7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU0ODQKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiA1ODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgS2VybmVsIEJ1ZyBGaXg6IFdvcnRoIEZ1enppbmc/KioKCk9rYXksIHNvIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCAqZG9lcyogZnJlZSBgdC0mZ3Q7cmV0X3N0YWNrYC4gVGhhdCYjMzk7cyB0aGUgc3RhcnRpbmcgcG9pbnQuIEFuZCBpZiBgY29weV9wcm9jZXNzYCBmYWlscyAqYmVmb3JlKiBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgZ2V0cyBjYWxsZWQsIGBmcmVlX3Rhc2socClgIGtpY2tzIGluLiBTaW5jZSBgcGAgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgdGFzaywgaXRzIGByZXRfc3RhY2tgIHdpbGwgcG9pbnQgdG8gdGhlIHNhbWUgbWVtb3J5IGFzIHRoZSBwYXJlbnQgdGFzay4gTm93LCBoZXJlJiMzOTtzIHRoZSBraWNrZXI6IGBmcmVlX3Rhc2socClgIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHApYCwgYW5kICp0aGF0KiBmcmVlcyB0aGUgKnBhcmVudCYjMzk7cyogYHJldF9zdGFja2AhIENsYXNzaWMgdXNlLWFmdGVyLWZyZWUuCgpUaGUgZml4IG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCB0byBoYXBwZW4gaW1tZWRpYXRlbHkgYWZ0ZXIgYGR1cF90YXNrX3N0cnVjdGAgdG8gYXZvaWQgdGhpcy4gU2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgZml4aW5nIGEgY29uZGl0aW9uIHdoZXJlIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZCAqYW5kKiBgY29weV9wcm9jZXNzYCBmYWlscyBlYXJseS4KClNvLCBpcyB0aGlzIHdvcnRoIGZ1enppbmc/IFRoYXQmIzM5O3MgdGhlIHF1ZXN0aW9uLiBUaGUgY29kZSBjaGFuZ2UgaXRzZWxmIGlzIG1pbmltYWw7IGp1c3QgbW92aW5nIGEgZnVuY3Rpb24gY2FsbCBhcm91bmQuIEl0ICpmaXhlcyogYSBidWcuIERvZXMgaXQgaW50cm9kdWNlIG5ldyBsb2dpYyB0aGF0IG1pZ2h0IGJlIHZ1bG5lcmFibGU/IEkgZG9uJiMzOTt0IHRoaW5rIHNvLiBJdCYjMzk7cyBqdXN0IGluaXRpYWxpemF0aW9uIG1vdmVkIGVhcmxpZXIuCgpIbW0sIGJ1dCBpZiBpdCYjMzk7cyBhIGJ1ZyBmaXgsIGRvIHRoZSBpbnN0cnVjdGlvbnMgYXBwbHk/IFRoZXkgc2F5ICYjMzQ7UmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWlucy4uLiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLiBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLi4uIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMuLi4gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoLi4uIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLi4uIERyaXZlciAucmVtb3ZlLi4uJiMzNDsgRG9lc24mIzM5O3QgZXhwbGljaXRseSBzYXkgdG8gcmV0dXJuIGZhbHNlIGZvciBzaW1wbGUgYnVnIGZpeGVzLCBidXQgdGhlIHByb21wdCBlbXBoYXNpemVzIGZ1bmN0aW9uYWwgY2hhbmdlcy4KClRoaXMgKmRvZXMqIG1vZGlmeSBgY29weV9wcm9jZXNzYCBpbiBga2VybmVsL2ZvcmsuY2AuIFRoYXQmIzM5O3MgY29yZSBrZXJuZWwgbG9naWMsIGFuZCBpdCAqaXMqIHJlYWNoYWJsZS4gQnV0IHRoZSBjaGFuZ2UgaXMganVzdCBhbiBvcmRlciBjaGFuZ2UuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgaW5zdHJ1Y3Rpb25zIHdhbnQgbWUgdG8gdmVyaWZ5IGl0JiMzOTtzIGV4ZWN1dGFibGUuCgpPa2F5LCBpZiBJICpkbyogcmV0dXJuIHRydWUgZm9yIGBXb3J0aEZ1enppbmdgLCB3aGF0IGRvIEkgcHV0IGluIGBGb2N1c1N5bWJvbHNgPyBUaGUgcHJvbXB0IHdhcm5zIGFnYWluc3QgaG90LXBhdGggZnVuY3Rpb25zLiBgY29weV9wcm9jZXNzYCBpcyBkZWZpbml0ZWx5IGhvdC1wYXRoLiBJcyB0aGVyZSBhIGxlc3MgY29tbW9uIGZ1bmN0aW9uIHRvIGZvY3VzIG9uPyBNYXliZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2A/IEJ1dCB0aGF0JiMzOTtzIHN0aWxsIGNhbGxlZCBmcm9tIGBjb3B5X3Byb2Nlc3NgLCB3aGljaCBpcyBob3QtcGF0aC4KCldhaXQgYSBzZWNvbmQsIHRoZSBidWcgKm9ubHkqIHRyaWdnZXJzIHdoZW4gZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBUaGF0JiMzOTtzIGEga2V5IGRldGFpbCEgU28gdGhlIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGNvbmZpZyBpcyBhIHByZXJlcXVpc2l0ZS4gTGV0IG1lIGNoZWNrIHRoZSBLY29uZmlnIGZvciBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgdG8gY29uZmlybSB0aGlzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC90cmFjZS9LY29uZmlnPTIzNT1jb25maWcgRlVOQ1RJT05fVFJBQ0VSXG4tLVxua2VybmVsL3RyYWNlL0tjb25maWctMjUzLVxua2VybmVsL3RyYWNlL0tjb25maWc6MjU0OmNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcbmtlcm5lbC90cmFjZS9LY29uZmlnLTI1NS1cdGJvb2wgXCYjMzQ7S2VybmVsIEZ1bmN0aW9uIEdyYXBoIFRyYWNlclwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NzYxCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHJldmlld2luZyB0aGUgS2NvbmZpZyBmb3IgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmA6CgoqKkFuYWx5emluZyB0aGUgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgS2NvbmZpZyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBLY29uZmlnIGZvciBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgZGVwZW5kZW5jaWVzLCBhbmQgaW1wbGljYXRpb25zLiBJJiMzOTttIGxvb2tpbmcgZm9yIHRoZSBjb3JlIHNldHRpbmdzIHRoYXQgY29udHJvbCBpdHMgYmVoYXZpb3IsIGFueSBjb25kaXRpb25hbCBsb2dpYywgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciB0cmFjaW5nIG1lY2hhbmlzbXMuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0cnlpbmcgdG8gZGV0ZXJtaW5lOiBXaGF0IGFyZSB0aGUgYmFzZSByZXF1aXJlbWVudHMgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZT8gRG9lcyBpdCBkZXBlbmQgb24gc3BlY2lmaWMgY29tcGlsZXIgdmVyc2lvbnMgb3Iga2VybmVsIGZlYXR1cmVzPyBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRpZWQgdG8gcGFydGljdWxhciBjb25maWd1cmF0aW9ucywgZXNwZWNpYWxseSBpbiBoaWdoLWxvYWQgc2NlbmFyaW9zPyBJJiMzOTtsbCBhbHNvIGJlIHNlYXJjaGluZyBmb3IgcmVsYXRpb25zaGlwcyB0byB0aGUgYGZ0cmFjZWAgaW5mcmFzdHJ1Y3R1cmUgYW5kIGFueSBjb25mbGljdHMgd2l0aCBvdGhlciB0cmFjaW5nIGZlYXR1cmVzLiBJdCYjMzk7cyBjcnVjaWFsIHRvIGlkZW50aWZ5IHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9uIHN5c3RlbSBvdmVyaGVhZC4gTGV0JiMzOTtzIHNlZSBob3cgd2VsbCBkZWZpbmVkIHRoZSBkZXBlbmRlbmNpZXMgYXJlLCBhbmQgaWYgdGhlIGhlbHAgdGV4dCBpcyB1c2VmdWwgb3Igd2hldGhlciBpdCBpcyB2YWd1ZS4gSSBhbSBnb2luZyB0byBtYWtlIGEganVkZ2VtZW50IGNhbGwgaWYgaXQgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZCBmb3IgbXkgcHJvamVjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvdHJhY2UvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjU0Olx0Y29uZmlnIEZVTkNUSU9OX0dSQVBIX1RSQUNFUlxuIDI1NTpcdFx0Ym9vbCBcJiMzNDtLZXJuZWwgRnVuY3Rpb24gR3JhcGggVHJhY2VyXCYjMzQ7XG4gMjU2Olx0XHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXG4gMjU3Olx0XHRkZXBlbmRzIG9uIEZVTkNUSU9OX1RSQUNFUlxuIDI1ODpcdFx0ZGVwZW5kcyBvbiAhWDg2XzMyIHx8ICFDQ19PUFRJTUlaRV9GT1JfU0laRVxuIDI1OTpcdFx0ZGVmYXVsdCB5XG4gMjYwOlx0XHRoZWxwXG4gMjYxOlx0XHQgIEVuYWJsZSB0aGUga2VybmVsIHRvIHRyYWNlIGEgZnVuY3Rpb24gYXQgYm90aCBpdHMgcmV0dXJuXG4gMjYyOlx0XHQgIGFuZCBpdHMgZW50cnkuXG4gMjYzOlx0XHQgIEl0cyBmaXJzdCBwdXJwb3NlIGlzIHRvIHRyYWNlIHRoZSBkdXJhdGlvbiBvZiBmdW5jdGlvbnMgYW5kXG4gMjY0Olx0XHQgIGRyYXcgYSBjYWxsIGdyYXBoIGZvciBlYWNoIHRocmVhZCB3aXRoIHNvbWUgaW5mb3JtYXRpb24gbGlrZVxuIDI2NTpcdFx0ICB0aGUgcmV0dXJuIHZhbHVlLiBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUgY3VycmVudCByZXR1cm5cbiAyNjY6XHRcdCAgYWRkcmVzcyBvbiB0aGUgY3VycmVudCB0YXNrIHN0cnVjdHVyZSBpbnRvIGEgc3RhY2sgb2YgY2FsbHMuXG4gMjY3Olx0XG4gMjY4Olx0Y29uZmlnIEZVTkNUSU9OX0dSQVBIX1JFVFZBTFxuIDI2OTpcdFx0Ym9vbCBcJiMzNDtLZXJuZWwgRnVuY3Rpb24gR3JhcGggUmV0dXJuIFZhbHVlXCYjMzQ7XG4gMjcwOlx0XHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlJFR1NcbiAyNzE6XHRcdGRlcGVuZHMgb24gRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXG4gMjcyOlx0XHRkZWZhdWx0IG5cbiAyNzM6XHRcdGhlbHBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzM1NQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE4MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIHRoZSBgY29weV9wcm9jZXNzKClgIENoYW5nZSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2UgY29uZmlncywgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgYW5kIGBGVU5DVElPTl9UUkFDRVJgLiBUaGUgY2hhbmdlIGlzIGluIGBjb3B5X3Byb2Nlc3MoKWAsIHNwZWNpZmljYWxseSB3aGVyZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgaXMgY2FsbGVkLiBNeSBpbml0aWFsIGd1dCBmZWVsaW5nIGlzLCAmIzM0O0lzIHRoaXMgZXZlbiB3b3J0aCBmdXp6aW5nPyYjMzQ7IFRoZSBtb2RpZmljYXRpb24gaXMgd2l0aGluIGBjb3B5X3Byb2Nlc3MoKWAsIHdoaWNoIGdldHMgZXhlY3V0ZWQgb24gZXZlcnkgYGZvcmsoKWAgYW5kIGBjbG9uZSgpYC4gRXNzZW50aWFsbHksIGlmIHdlIGZ1enogdGhpcywgd2UmIzM5O3JlIHJlYWxseSBqdXN0IGZ1enppbmcgYGZvcmsoKWAgaXRzZWxmLCBidXQgd2l0aCBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYCBhY3RpdmUuIEFuZCB3ZSBhbHJlYWR5IGZ1enogYGZvcmsoKWAgcHJldHR5IGhlYXZpbHksIHJpZ2h0PwoKVGhlIGNvcmUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiBJcyB0aGVyZSBhIG1vcmUgdGFyZ2V0ZWQgZnVuY3Rpb24gb3IgYXJlYSB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYCB0aGF0JiMzOTtzIHNwZWNpZmljYWxseSB3b3J0aCBmb2N1c2luZyBvbj8gVGhlIHRyaWdnZXIgZm9yIHRoaXMgYnVnIGlzIHJlbGF0ZWQgdG8gYW4gZWFybHkgZmFpbHVyZSB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYC4gU28sIHRoZSBtb3JlIGludGVyZXN0aW5nIGF2ZW51ZSBpczogd2hhdCBjYW4gY2F1c2UgYGNvcHlfcHJvY2VzcygpYCB0byBmYWlsIGVhcmx5PyBMZXQmIzM5O3Mgem9vbSBpbiBvbiB0aGF0IHNlY3Rpb24gb2YgdGhlIGNvZGUgYmV0d2VlbiBgZHVwX3Rhc2tfc3RydWN0YCBhbmQgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIG9mIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKClgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGhhcHBlbmluZyBpbiB0aG9zZSBsaW5lcyB0aGF0IGNvdWxkIGxlYWQgdG8gYW4gZWFybHkgZXhpdCBhbmQgaG93IGl0IG1pZ2h0IGludGVyYWN0IHdpdGggdGhlIHRyYWNlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjEzOSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMTM5Olx0XHRwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpO1xuMjE0MDpcdFx0aWYgKCFwKVxuMjE0MTpcdFx0XHRnb3RvIGZvcmtfb3V0O1xuMjE0MjpcdFx0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcbjIxNDM6XHRcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XG4yMTQ0Olx0XHRpZiAocmV0dmFsKVxuMjE0NTpcdFx0XHRnb3RvIGJhZF9mb3JrX2ZyZWU7XG4yMTQ2Olx0XHRwLVx1MDAzZWZsYWdzIFx1MDAyNj0gflBGX0tUSFJFQUQ7XG4yMTQ3Olx0XHRpZiAoYXJncy1cdTAwM2VrdGhyZWFkKVxuMjE0ODpcdFx0XHRwLVx1MDAzZWZsYWdzIHw9IFBGX0tUSFJFQUQ7XG4yMTQ5Olx0XHRpZiAoYXJncy1cdTAwM2V1c2VyX3dvcmtlcikge1xuMjE1MDpcdFx0XHQvKlxuMjE1MTpcdFx0XHQgKiBNYXJrIHVzIGEgdXNlciB3b3JrZXIsIGFuZCBibG9jayBhbnkgc2lnbmFsIHRoYXQgaXNuJiMzOTt0XG4yMTUyOlx0XHRcdCAqIGZhdGFsIG9yIFNUT1BcbjIxNTM6XHRcdFx0ICovXG4yMTU0Olx0XHRcdHAtXHUwMDNlZmxhZ3MgfD0gUEZfVVNFUl9XT1JLRVI7XG4yMTU1Olx0XHRcdHNpZ2luaXRzZXRpbnYoXHUwMDI2cC1cdTAwM2VibG9ja2VkLCBzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHU1RPUCkpO1xuMjE1NjpcdFx0fVxuMjE1NzpcdFx0aWYgKGFyZ3MtXHUwMDNlaW9fdGhyZWFkKVxuMjE1ODpcdFx0XHRwLVx1MDAzZWZsYWdzIHw9IFBGX0lPX1dPUktFUjtcbjIxNTk6XHRcbjIxNjA6XHRcdGlmIChhcmdzLVx1MDAzZW5hbWUpXG4yMTYxOlx0XHRcdHN0cnNjcHlfcGFkKHAtXHUwMDNlY29tbSwgYXJncy1cdTAwM2VuYW1lLCBzaXplb2YocC1cdTAwM2Vjb21tKSk7XG4yMTYyOlx0XG4yMTYzOlx0XHRwLVx1MDAzZXNldF9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgXHUwMDI2IENMT05FX0NISUxEX1NFVFRJRCkgPyBhcmdzLVx1MDAzZWNoaWxkX3RpZCA6IE5VTEw7XG4yMTY0Olx0XHQvKlxuMjE2NTpcdFx0ICogVElEIGlzIGNsZWFyZWQgaW4gbW1fcmVsZWFzZSgpIHdoZW4gdGhlIHRhc2sgZXhpdHNcbjIxNjY6XHRcdCAqL1xuMjE2NzpcdFx0cC1cdTAwM2VjbGVhcl9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgXHUwMDI2IENMT05FX0NISUxEX0NMRUFSVElEKSA/IGFyZ3MtXHUwMDNlY2hpbGRfdGlkIDogTlVMTDtcbjIxNjg6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODM0MAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3NpbmcgYXMgYW4gZXhwZXJ0OgoKKipBbmFseXppbmcgdGhlIFBvdGVudGlhbCBJc3N1ZSBpbiBUYXNrIENsb25pbmcqKgoKUmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYGR1cF90YXNrX3N0cnVjdGAgYW5kIHRoZSBvbGQgbG9jYXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIOKAkyBpbnRlcmVzdGluZy4gSXQmIzM5O3MgYWxtb3N0IGFsd2F5cyBhIGdvb2QgZXhlcmNpc2UgdG8gcmV2aXNpdCB3aGVyZSBhIGZ1bmN0aW9uIG9uY2UgbGl2ZWQsIGFuZCB3aHkgaXQgbW92ZWQuIFRoZSBjcml0aWNhbCBwb2ludCBvZiBjb25jZXJuLCB0aGUgcG90ZW50aWFsIGZhaWx1cmUgcG9pbnQgaWYgc29tZXRoaW5nIGJyZWFrcyBiZXR3ZWVuIHRoZXNlIHR3bywgc2VlbXMgdG8gYmUgYGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcClgLiBUaGF0IGxvb2tzIGxpa2UgdGhlIGN1bHByaXQuIEkgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgd2hhdCBgY29weV9leGVjX3N0YXRlYCBpcyBkb2luZy4gVGhpcyBoYXMgYWxsIHRoZSBoYWxsbWFya3Mgb2YgYSBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBpZiBub3QgZG9uZSBjb3JyZWN0bHksIHBhcnRpY3VsYXJseSBhcm91bmQgdGhlIGludGVyYWN0aW9ucyB3aXRoIGBjbG9uZV9mbGFnc2AuIEl0IGNvdWxkIGJlIHJlbGF0ZWQgdG8gc29tZSBvZiB0aGUgaXNzdWVzIEkmIzM5O3ZlIGJlZW4gc2VlaW5nIHdpdGggcHJvY2VzcyBjcmVhdGlvbiBhbmQgdHJhY2luZy4gVGltZSB0byBkaXZlIGludG8gdGhlIGNvZGUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29weV9leGVjX3N0YXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2ZvcmsuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jPTE1NzQ9c3RhdGljIGludCBjb3B5X21tKHU2NCBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxua2VybmVsL2ZvcmsuYy0xNjEwLVxua2VybmVsL2ZvcmsuYzoxNjExOnN0YXRpYyBpbnQgY29weV9leGVjX3N0YXRlKHU2NCBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG5rZXJuZWwvZm9yay5jLTE2MTIte1xuLS1cbmtlcm5lbC9mb3JrLmM9MjAxOD1fX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxuLS1cbmtlcm5lbC9mb3JrLmMtMjE0Mi1cdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG5rZXJuZWwvZm9yay5jOjIxNDM6XHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xua2VybmVsL2ZvcmsuYy0yMTQ0LVx0aWYgKHJldHZhbClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODgyNAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXBseSBmYW1pbGlhciB3aXRoIGNvZGUgZXhlY3V0aW9uIGFuZCBwcm9ncmFtIHN0YXRlczoKCioqQW5hbHl6aW5nIGBjb3B5X2V4ZWNfc3RhdGVgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gYGNvcHlfZXhlY19zdGF0ZWAuIFRoYXQgZnVuY3Rpb24gbmFtZSBpdHNlbGYgaXMgcHJldHR5IHRlbGxpbmcuIEl0IGltcGxpZXMgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBjcmVhdGluZyBhIHNuYXBzaG90LCBhIGR1cGxpY2F0ZSwgb2YgdGhlIHJ1bm5pbmcgZXhlY3V0aW9uIGVudmlyb25tZW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5ICp3aGF0KiBpdCYjMzk7cyBjb3B5aW5nLiBJcyBpdCB0aGUgZW50aXJlIHByb2Nlc3MgbWVtb3J5IHNwYWNlPyBKdXN0IHRoZSByZWdpc3RlciB2YWx1ZXM/IFRoZSBwcm9ncmFtIGNvdW50ZXI/IFRoZSBzdGFjaz8gVGhlIGhlYXA/IFRoZSBvcGVuIGZpbGUgZGVzY3JpcHRvcnM/CgpUaGUgaW1wbGljYXRpb25zIGFyZSBodWdlLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHRoZSAmIzM0O3N0YXRlLiYjMzQ7IEEgZnVsbCBtZW1vcnkgY29weSBpcyByZXNvdXJjZS1pbnRlbnNpdmUgYnV0IG9mZmVycyBhIHZlcnkgcHJlY2lzZSBzbmFwc2hvdC4gU2VsZWN0aXZlIGNvcHlpbmcgaXMgbW9yZSBlZmZpY2llbnQgYnV0IHJpc2tzIGxvc2luZyBjcml0aWNhbCBpbmZvcm1hdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB0byBmaWd1cmUgb3V0IHRoZSB0cmFkZS1vZmZzLgoKSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgc2NlbmFyaW9zIHdoZXJlIHlvdSBtaWdodCB1c2Ugc3VjaCBhIGZ1bmN0aW9uLiBEZWJ1Z2dpbmcgaXMgb2J2aW91cyDigJMgc2F2aW5nIGEgc3RhdGUgdG8gc3RlcCB0aHJvdWdoIGxhdGVyLiBCdXQgdGhlcmUgYXJlIG90aGVyczogcHJvY2VzcyBtaWdyYXRpb24sIGNoZWNrcG9pbnRpbmcgZm9yIGZhdWx0IHRvbGVyYW5jZSwgZXZlbiBzb21ldGhpbmcgbGlrZSBpbXBsZW1lbnRpbmcgYSB2aXJ0dWFsIG1hY2hpbmUuIEVhY2ggaGFzIGl0cyBvd24gY29uc3RyYWludHMgYW5kIGRlbWFuZHMgZm9yIHdoYXQgbmVlZHMgdG8gYmUgY29waWVkLgoKSSB3YW50IHRvIGtub3cgaWYgaXQmIzM5O3MgYSBkZWVwIGNvcHkgb3IgYSBzaGFsbG93IGNvcHkuIElmIGl0JiMzOTtzIHRoZSBsYXR0ZXIsIHRoZW4gbW9kaWZpY2F0aW9ucyB0byB0aGUgY29waWVkIHN0YXRlIHdvdWxkIGFsc28gYWZmZWN0IHRoZSBvcmlnaW5hbCBleGVjdXRpb24gc3RhdGUsIHdoaWNoIHdvdWxkIGRlZmVhdCB0aGUgcHVycG9zZS4gVGhlIGZ1bmN0aW9uIHdvdWxkIGxpa2VseSBiZSBtb3JlIGNvbXBsZXggaWYgaXQgbmVlZHMgdG8gcHJlc2VydmUgYSBjbGVhbiBzZXBhcmF0aW9uLgoKQWxzbywgaXMgaXQgdGhyZWFkLXNhZmU/IElmIHRoZSBvcmlnaW5hbCBzdGF0ZSBjYW4gY2hhbmdlIGR1cmluZyB0aGUgY29weSBwcm9jZXNzLCB0aGVyZeKAmXMgYSByaXNrIG9mIGludHJvZHVjaW5nIGluY29uc2lzdGVuY2llcy4gVGhhdCYjMzk7cyBhIGNyaXRpY2FsIGNvbnNpZGVyYXRpb24sIGVzcGVjaWFsbHkgaW4gYSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50LgpJJiMzOTttIHJlYWR5IHRvIGV4YW1pbmUgdGhlIGNvZGUuIExldCYjMzk7cyBnZXQgdG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2ZvcmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE2MTEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTYxMTpcdHN0YXRpYyBpbnQgY29weV9leGVjX3N0YXRlKHU2NCBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4xNjEyOlx0e1xuMTYxMzpcdFx0c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqZXhlY19zdGF0ZTtcbjE2MTQ6XHRcbjE2MTU6XHRcdC8qIENMT05FX1ZNIHNpYmxpbmdzIHJlZmNvdW50LXNoYXJlIHRoZSBwYXJlbnQmIzM5O3MgZXhlY19zdGF0ZS4gKi9cbjE2MTY6XHRcdGlmIChjbG9uZV9mbGFncyBcdTAwMjYgQ0xPTkVfVk0pIHtcbjE2MTc6XHRcdFx0ZXhlY19zdGF0ZSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoY3VycmVudC1cdTAwM2VleGVjX3N0YXRlLCB0cnVlKTtcbjE2MTg6XHRcdFx0cmVmY291bnRfaW5jKFx1MDAyNmV4ZWNfc3RhdGUtXHUwMDNlY291bnQpO1xuMTYxOTpcdFx0XHRyY3VfYXNzaWduX3BvaW50ZXIodHNrLVx1MDAzZWV4ZWNfc3RhdGUsIGV4ZWNfc3RhdGUpO1xuMTYyMDpcdFx0XHRyZXR1cm4gMDtcbjE2MjE6XHRcdH1cbjE2MjI6XHRcbjE2MjM6XHRcdC8qIEV2ZXJ5b25lIGVsc2UgaW5oZXJpdHMgYSBmcmVzaCBjb3B5LiAqL1xuMTYyNDpcdFx0cmV0dXJuIHRhc2tfZXhlY19zdGF0ZV9jb3B5KHRzayk7XG4xNjI1Olx0fVxuMTYyNjpcdFxuMTYyNzpcdHN0YXRpYyBpbnQgY29weV9mcyh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBib29sIHVtaClcbjE2Mjg6XHR7XG4xNjI5Olx0XHRzdHJ1Y3QgZnNfc3RydWN0ICpmcztcbjE2MzA6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTU1OAoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiBgdGFza19leGVjX3N0YXRlX2NvcHlgOgoKKipNeSBFeGFtaW5hdGlvbiBvZiBgdGFza19leGVjX3N0YXRlX2NvcHlgKioKCkFscmlnaHQsIHNvIEkmIzM5O20gbG9va2luZyBhdCBgdGFza19leGVjX3N0YXRlX2NvcHlgLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGJyYWluIGtpY2tzIGluLCBjb25zaWRlcmluZyB3aGF0IGl0ICpzaG91bGQqIGRvLiBHaXZlbiB0aGUgbmFtZSwgaXQmIzM5O3MgY2xlYXIgdGhpcyBpcyBhYm91dCBjb3B5aW5nLCBzcGVjaWZpY2FsbHkgdGhlIGV4ZWN1dGlvbiBzdGF0ZSBvZiBhIHRhc2suIFRoZSBpbXBvcnRhbnQgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiAqd2h5KiBjb3B5IGl0PyBJcyB0aGlzIGZvciBjb250ZXh0IHN3aXRjaGluZywgY2hlY2twb2ludGluZywgcGVyaGFwcyB0aHJlYWQgY3JlYXRpb24/IE9yIG1heWJlIGVycm9yIGhhbmRsaW5nIHdoZXJlIHlvdSBuZWVkIHRvIHByZXNlcnZlIGEgc25hcHNob3Q/IFVuZGVyc3RhbmRpbmcgdGhlIHVzZSBjYXNlIHdpbGwgaW5mb3JtIHRoZSBudWFuY2VzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KCkkgc3RhcnQgcnVubmluZyB0aHJvdWdoIHRoZSBjb21tb24gZWxlbWVudHM6IEl0IGxpa2VseSBuZWVkcyB0byBoYW5kbGUgdGhlIHByb2dyYW0gY291bnRlciAoUEMpLCBzdGFjayBwb2ludGVyLCByZWdpc3RlciB2YWx1ZXMsIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQgaGFyZHdhcmUgc3RhdGUgdGhhdCBkZWZpbmVzIHRoZSB0YXNrJiMzOTtzIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4gSSYjMzk7bGwgbmVlZCB0byBjb25zaWRlciB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZTsgYSBzaW1wbGUgUklTQyBtYWNoaW5lIHdpbGwgaGF2ZSBhIGRyYXN0aWNhbGx5IGRpZmZlcmVudCBzdGF0ZSBzaXplIHRoYW4gYSBjb21wbGV4IHg4NiBwcm9jZXNzb3Igd2l0aCBTSU1EIHJlZ2lzdGVycyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdHMuCgpUaGUgY29weSBpdHNlbGYgLSBob3cgaXMgaXQgZG9uZT8gSXMgdGhpcyBhIGRlZXAgY29weSwgYSBzaGFsbG93IGNvcHksIG9yIHNvbWV0aGluZyBtb3JlIG51YW5jZWQ/IE1lbW9yeSBtYW5hZ2VtZW50IGJlY29tZXMgYSBjZW50cmFsIGNvbnNpZGVyYXRpb24gaGVyZSwgZXNwZWNpYWxseSBpZiB0aGUgdGFzayBpbnZvbHZlcyBwb2ludGVycyB0byBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5LiBBIHNoYWxsb3cgY29weSwgY29weWluZyBqdXN0IHRoZSBwb2ludGVyIHZhbHVlcywgaXMgZWZmaWNpZW50LCBidXQgaXQgYWxzbyBjcmVhdGVzIHNoYXJpbmcgYW5kIHBvdGVudGlhbCBkYXRhIGNvcnJ1cHRpb24gaXNzdWVzLiBBIGRlZXAgY29weSByZXNvbHZlcyB0aGF0LCBidXQgZGVtYW5kcyBjYXJlZnVsIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBhbmQgZGFuZ2xpbmcgcG9pbnRlcnMuIFdlIG5lZWQgdG8gYmUgd2FyeSBvZiB0aGF0IG1lbW9yeSBjb3N0LCBwYXJ0aWN1bGFybHkgaWYgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBmcmVxdWVudCBjb250ZXh0IHN3aXRjaGVzIG9yIG1hc3NpdmUgYW1vdW50cyBvZiBleGVjdXRpb24gc3RhdGUuCgpGaW5hbGx5LCBJJiMzOTtsbCBzY3J1dGluaXplIHRoZSBlcnJvciBoYW5kbGluZy4gV2hhdCBoYXBwZW5zIGlmIHRoZSBjb3B5IGZhaWxzPyBXaGF0IGFyZSB0aGUgZmFpbHVyZSBtb2RlcyAoZS5nLiwgaW5zdWZmaWNpZW50IG1lbW9yeSwgaW52YWxpZCBzdGF0ZSk/IEhvdyByb2J1c3QgaXMgdGhlIGZ1bmN0aW9uIGluIHRoZSBmYWNlIG9mIHRoZXNlIHBvdGVudGlhbCBwcm9ibGVtcz8gRG9lcyBpdCByZXR1cm4gYW4gZXJyb3IgY29kZSBvciB0aHJvdyBhbiBleGNlcHRpb24/IEhvdyBpcyB0aGF0IGVycm9yIHByb3BhZ2F0ZWQgYW5kIG1hbmFnZWQ/IFRoZSBlcnJvciBoYW5kbGluZyBpcyBjcml0aWNhbCBpbiB0aGlzIGNvbnRleHQ7IGEgcG9vcmx5IGhhbmRsZWQgZmFpbHVyZSBjb3VsZCBkZXN0YWJpbGl6ZSB0aGUgZW50aXJlIHN5c3RlbS4gSSYjMzk7bGwgbmVlZCB0byBhc3Nlc3MgdGhlIGZ1bmN0aW9uJiMzOTtzIGFzc3VtcHRpb25zIGFib3V0IHRoZSBzb3VyY2UgdGFzayBzdGF0ZSDigJMgaXMgaXQgdmFsaWQsIGlzIGl0IGxvY2tlZCwgb3IgZG9lcyBpdCBvcGVyYXRlIGFzc3VtaW5nIGEgY29vcGVyYXRpdmUgb3IgcHJlZW10aXZlIHRocmVhZGluZyBtb2RlbD8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGFza19leGVjX3N0YXRlX2NvcHkmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9zY2hlZC9leGVjX3N0YXRlLmg9MjQ9c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqdGFza19leGVjX3N0YXRlX3JlcGxhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXG5pbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaC0yNS1cdFx0XHRcdFx0XHRzdHJ1Y3QgdGFza19leGVjX3N0YXRlICpleGVjX3N0YXRlKTtcbmluY2x1ZGUvbGludXgvc2NoZWQvZXhlY19zdGF0ZS5oOjI2OmludCB0YXNrX2V4ZWNfc3RhdGVfY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7XG5pbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaC0yNy12b2lkIF9faW5pdCBleGVjX3N0YXRlX2luaXQodm9pZCk7XG4tLVxua2VybmVsL2V4ZWNfc3RhdGUuYz01Mj1zdHJ1Y3QgdGFza19leGVjX3N0YXRlICp0YXNrX2V4ZWNfc3RhdGVfcmVwbGFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbi0tXG5rZXJuZWwvZXhlY19zdGF0ZS5jLTcwLSAqL1xua2VybmVsL2V4ZWNfc3RhdGUuYzo3MTppbnQgdGFza19leGVjX3N0YXRlX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG5rZXJuZWwvZXhlY19zdGF0ZS5jLTcyLXtcbi0tXG5rZXJuZWwvZm9yay5jPTE2MTE9c3RhdGljIGludCBjb3B5X2V4ZWNfc3RhdGUodTY0IGNsb25lX2ZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcbi0tXG5rZXJuZWwvZm9yay5jLTE2MjMtXHQvKiBFdmVyeW9uZSBlbHNlIGluaGVyaXRzIGEgZnJlc2ggY29weS4gKi9cbmtlcm5lbC9mb3JrLmM6MTYyNDpcdHJldHVybiB0YXNrX2V4ZWNfc3RhdGVfY29weSh0c2spO1xua2VybmVsL2ZvcmsuYy0xNjI1LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAzODcKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQW5hbHl6aW5nIGB0YXNrX2V4ZWNfc3RhdGVfY29weWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGB0YXNrX2V4ZWNfc3RhdGVfY29weWAgZnVuY3Rpb24uIE15IGZpcnN0IHRob3VnaHQgaXM6IHdoYXQgYXJlIHdlIHRyeWluZyB0byBhY2hpZXZlIGhlcmU/IEdpdmVuIHRoZSBuYW1lLCBJJiMzOTttIGltbWVkaWF0ZWx5IGV4cGVjdGluZyBpdCB0byBkZWFsIHdpdGggYSBjcnVjaWFsIHByb2Nlc3Mg4oCTIGxpa2VseSBjb3B5aW5nIHRoZSBleGVjdXRpb24gc3RhdGUgb2YgYSB0YXNrLiBUaGUgc3BlY2lmaWNzIHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE9TIGFuZCB0aGUgcnVudGltZSYjMzk7cyBhcmNoaXRlY3R1cmUsIGJ1dCB0aGUgZ2VuZXJhbCBjb25jZXB0IGlzIGNsZWFyOiBpdOKAmXMgYWJvdXQgY2FwdHVyaW5nIGEgc25hcHNob3Qgb2YgYSB0YXNrJiMzOTtzIGN1cnJlbnQgY29udGV4dC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgKmhvdyogaXQmIzM5O3MgaW1wbGVtZW50ZWQuIElzIGl0IGEgZGVlcCBjb3B5IG9yIHNoYWxsb3c/IEFyZSB3ZSB0YWxraW5nIGFib3V0IHJlZ2lzdGVycywgc3RhY2sgcG9pbnRlcnMsIG1lbW9yeSBtYXBzLCBtYXliZSBldmVuIHByb2Nlc3NvciBmbGFncz8gVGhlIGRldmlsIGlzIGluIHRoZSBkZXRhaWxzLCBhbmQgdGhvc2UgZGV0YWlscyBhcmUgd2hhdOKAmWxsIHRlbGwgbWUgaWYgaXTigJlzIGVmZmljaWVudCwgc2FmZSwgYW5kIGhhbmRsZXMgYWxsIGVkZ2UgY2FzZXMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIG11dGV4ZXMgb3IgYXRvbWljIG9wZXJhdGlvbnMsIGFuZCBob3cgaXQgaGFuZGxlcyBjb25jdXJyZW5jeS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoZXRoZXIgY29udGV4dCBzd2l0Y2hlcyBhcmUgaW52b2x2ZWQgYW5kIGhvdyBpdCBkb2VzIHNvLiBJIHdhbnQgdG8gbG9vayBmb3IgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4gb3IgcmFjZSBjb25kaXRpb25zLiBBIGZ1bmN0aW9uIGxpa2UgdGhpcyBpcyBpbmNyZWRpYmx5IGZ1bmRhbWVudGFsLCBhbmQgaWYgaXQmIzM5O3MgZmxhd2VkLCBpdCBjYW4gaW50cm9kdWNlIHNlcmlvdXMgYnVncyBhdCBhbnkgcG9pbnQuIExldCYjMzk7cyBzZWUgaG93IHRoaXMgaXMgaW1wbGVtZW50ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2V4ZWNfc3RhdGUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgNzE6XHRpbnQgdGFza19leGVjX3N0YXRlX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4gIDcyOlx0e1xuICA3MzpcdFx0c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqc3JjLCAqZHN0O1xuICA3NDpcdFxuICA3NTpcdFx0c3JjID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChjdXJyZW50LVx1MDAzZWV4ZWNfc3RhdGUsIHRydWUpO1xuICA3NjpcdFx0ZHN0ID0gYWxsb2NfdGFza19leGVjX3N0YXRlKHNyYy1cdTAwM2V1c2VyX25zKTtcbiAgNzc6XHRcdGlmICghZHN0KVxuICA3ODpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAgNzk6XHRcdGRzdC1cdTAwM2VkdW1wYWJsZSA9IFJFQURfT05DRShzcmMtXHUwMDNlZHVtcGFibGUpO1xuICA4MDpcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKHRzay1cdTAwM2VleGVjX3N0YXRlLCBkc3QpO1xuICA4MTpcdFx0cmV0dXJuIDA7XG4gIDgyOlx0fVxuICA4MzpcdFxuICA4NDpcdC8qXG4gIDg1Olx0ICogU3RvcmUgVEFTS19EVU1QQUJMRV8qIG9uIGN1cnJlbnQtXHUwMDNlZXhlY19zdGF0ZS4gIEFsbCBjYWxsZXJzXG4gIDg2Olx0ICogKGNvbW1pdF9jcmVkcywgYmVnaW5fbmV3X2V4ZWMsIHByY3RsKFBSX1NFVF9EVU1QQUJMRSkpIGFjdCBvbiB0aGVcbiAgODc6XHQgKiBydW5uaW5nIHRhc2ssIHdoaWNoIGd1YXJhbnRlZXMgLVx1MDAzZWV4ZWNfc3RhdGUgaXMgYWxsb2NhdGVkIGFuZCBjYW5ub3RcbiAgODg6XHQgKiBiZSByZXBsYWNlZCB1bmRlciB1cy5cbiAgODk6XHQgKi9cbiAgOTA6XHR2b2lkIHRhc2tfZXhlY19zdGF0ZV9zZXRfZHVtcGFibGUoZW51bSB0YXNrX2R1bXBhYmxlIHZhbHVlKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA0NgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDcxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIERlY2lzaW9uIGZvciBhIFNwZWNpZmljIEJ1ZyBGaXgqKgoKT2theSwgc28gdGhpcyBwYXRjaCBhZGRyZXNzZXMgYSBwb3RlbnRpYWwgYC1FTk9NRU1gIGZhaWx1cmUgaW4gYHRhc2tfZXhlY19zdGF0ZV9jb3B5YCB0aGF0IGNhbiBvY2N1ciB3aGVuIGBhbGxvY190YXNrX2V4ZWNfc3RhdGVgIGZhaWxzIGR1cmluZyBgZm9yaygpYCB3aXRob3V0IGBDTE9ORV9WTWAsIHNwZWNpZmljYWxseSB3aGVuIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGlzIGVuYWJsZWQuIEl0JiMzOTtzIGEgdmVyeSB0YXJnZXRlZCBidWcgZml4LgoKTXkgZmlyc3QgdGhvdWdodCBpcywgJiMzNDtEb2VzIHRoaXMgaW50cm9kdWNlIG5ldyBmdW5jdGlvbmFsIGxvZ2ljIHRoYXQgZGVtYW5kcyBmdXp6aW5nPyYjMzQ7IE5vLCBpdCYjMzk7cyBqdXN0IGEgcmVmYWN0b3JpbmcsIG1vdmluZyBpbml0aWFsaXphdGlvbiBlYXJsaWVyIHRvIGF2b2lkIGEgdXNlLWFmdGVyLWZyZWUuIEl0JiMzOTtzIG5vdCBhZGRpbmcgZmVhdHVyZXMuCgpCdXQgdGhlbiBJIHJlbWVtYmVyIHRoZSBwcm9tcHQ6IGlmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgSSBuZWVkIHRvIGNvbnNpZGVyIGZ1enppbmcsIGV2ZW4gZm9yIGEgYnVnIGZpeC4gQW5kIHRoaXMgKmRvZXMqIG1vZGlmeSBjb3JlIGtlcm5lbCBsb2dpYy4gVGhlIHByb21wdCBhbHNvIHRlbGxzIG1lIGlmIEkgZmxhZyBpdCBmb3IgZnV6emluZyBJIG5lZWQgdG8gcHJvdmlkZSBgRW5hYmxlQ29uZmlnc2AgYW5kIGBGb2N1c1N5bWJvbHNgLgoKSSBuZWVkIHRvIHByb3ZpZGUgYEVuYWJsZUNvbmZpZ3M6IFsmIzM0O0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiYjMzQ7XWAsIHRoYXQmIzM5O3MgZWFzeS4gQnV0IGBGb2N1c1N5bWJvbHNgIGlzIGEgcHJvYmxlbS4gVGhlIG9ubHkgZnVuY3Rpb24gbW9kaWZpZWQgaXMgYGNvcHlfcHJvY2Vzc2AuIFRoZSBwcm9tcHQgc3BlY2lmaWNhbGx5IHRlbGxzIG1lICpub3QqIHRvIGxpc3QgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgbGlrZSBgY29weV9wcm9jZXNzYCB0byBhdm9pZCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLiBJcyB0aGVyZSBhbm90aGVyIGZ1bmN0aW9uIHRvIHVzZT8gTm8sIHRoZXJlIGlzIG5vdC4KClRoZSBwcm9tcHQgc2F5cyBJICptdXN0KiBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMuIFdhaXQsIGlmIHRoZXJlIGFyZSBubyBzcGVjaWZpYyBmdW5jdGlvbnMsIGl0JiMzOTtzIG9rIHRvIGxlYXZlIGBGb2N1c1N5bWJvbHNgIGVtcHR5ISBUaGUgcHJvbXB0IG1ha2VzIHRoZSBgRm9jdXNTeW1ib2xzYCBvcHRpb25hbCwgaWYgbm8gc3BlY2lmaWMgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUuCgpOb3cgSSBhbSBhc2tpbmcgbXlzZWxmLCBpcyB0aGlzICpyZWFsbHkqIHdvcnRoIGZ1enppbmc/IEl0JiMzOTtzIGp1c3QgbW92aW5nIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCB1cCBieSBhIGZldyBsaW5lcy4gSG93ZXZlciwgdGhpcyBpcyBmaXhpbmcgYSByZWFsIHVzZS1hZnRlci1mcmVlIGlzc3VlIHJlbGF0ZWQgdG8gbWVtb3J5IGFsbG9jYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nIGR1cmluZyBgY29weV9wcm9jZXNzYC4gRmF1bHQgaW5qZWN0aW9uIG9uIGBhbGxvY190YXNrX2V4ZWNfc3RhdGVgIGlzIG5lZWRlZCB0byB0cmlnZ2VyIHRoaXMgYnVnLCB3aGljaCBTeXprYWxsZXIgY2FuIGRvLgoKU28sIGZ1enppbmcgY291bGQgY29uZmlybSB0aGUgZml4JiMzOTtzIGNvcnJlY3RuZXNzIGFuZCBydWxlIG91dCByZWdyZXNzaW9ucy4gQ3J1Y2lhbGx5LCBJIGhhdmUgdG8gZW5zdXJlIHRoZSBlYXJseSBjYWxsIHRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBkb2VzbiYjMzk7dCAqaXRzZWxmKiBpbnRyb2R1Y2UgcHJvYmxlbXMuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGZ1bmN0aW9uLCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgYWdhaW4uIEdpdmVuIGl0IGFsbG9jYXRlcyBtZW1vcnksIHRoZXJlIGlzIGEgcmlzay4gT2theSwgeWVzLCB0aGVyZSBpcyBtZW1vcnkgYWxsb2NhdGVkIGluIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCwgc28gaXQmIzM5O3MgYSBnb29kIGlkZWEgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBzaWRlIGVmZmVjdHMgd2hlbiBpdCYjMzk7cyBjYWxsZWQgZWFybHkuCgpVbHRpbWF0ZWx5LCBJJiMzOTttIGxlYW5pbmcgdG93YXJkcyBgV29ydGhGdXp6aW5nPXRydWVgLiBJdCYjMzk7cyBhIHNtYWxsIGNoYW5nZSwgYnV0IGl0IGFkZHJlc3NlcyBhIHJlYWwgYnVnIGluIGEgY3JpdGljYWwgcGF0aCB3aXRoIG1lbW9yeSBhbGxvY2F0aW9uLCBhbmQgZmF1bHQgaW5qZWN0aW9uIGlzIHBvc3NpYmxlLiBXZSBqdXN0IG5lZWQgdG8gY29uZmlybSB0aGF0IGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBpdHNlbGYgaXMgc2FmZSB0byBjYWxsIGVhcmxpZXIuIEkgYW0gZ29pbmcgd2l0aDoKCmBgYGpzb24KewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUsCiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsmIzM0O0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiYjMzQ7XQogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdCn0KYGBgCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL3RyYWNlL2ZncmFwaC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE2MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTYwOlx0dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcbjExNjE6XHR7XG4xMTYyOlx0XHQvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHVzZSB0aGUgcGFyZW50IHJldF9zdGFjayAqL1xuMTE2MzpcdFx0dC1cdTAwM2VyZXRfc3RhY2sgPSBOVUxMO1xuMTE2NDpcdFx0dC1cdTAwM2VjdXJyX3JldF9zdGFjayA9IDA7XG4xMTY1Olx0XHR0LVx1MDAzZWN1cnJfcmV0X2RlcHRoID0gLTE7XG4xMTY2Olx0XG4xMTY3Olx0XHRpZiAoZnRyYWNlX2dyYXBoX2FjdGl2ZSkge1xuMTE2ODpcdFx0XHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2s7XG4xMTY5Olx0XG4xMTcwOlx0XHRcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxuMTE3MTpcdFx0XHRcdHJldHVybjtcbjExNzI6XHRcbjExNzM6XHRcdFx0cmV0X3N0YWNrID0ga21lbV9jYWNoZV9hbGxvYyhmZ3JhcGhfc3RhY2tfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbjExNzQ6XHRcdFx0aWYgKCFyZXRfc3RhY2spXG4xMTc1Olx0XHRcdFx0cmV0dXJuO1xuMTE3NjpcdFx0XHRncmFwaF9pbml0X3Rhc2sodCwgcmV0X3N0YWNrKTtcbjExNzc6XHRcdH1cbjExNzg6XHR9XG4xMTc5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNzQ0CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgQW5hbHlzaXM6IGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBhbmQgUHJvY2VzcyBDcmVhdGlvbioqCgpPa2F5LCBzbyBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agb25seSBhbGxvY2F0ZXMgbWVtb3J5IHdoZW4gYGZ0cmFjZV9ncmFwaF9hY3RpdmVgIGlzIHRydWUuIElmIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYW5kIHRoZW4gYGNvcHlfZXhlY19zdGF0ZWAgZmFpbHMsIHRoZSBjbGVhbnVwIGlzIGhhbmRsZWQgY29ycmVjdGx5OiBgZnJlZV90YXNrYCBpcyBjYWxsZWQsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIHRvIGZyZWUgdGhlIGFsbG9jYXRlZCBtZW1vcnkuIFNlZW1zIHNvbGlkIGZyb20gYSBtZW1vcnkgbWFuYWdlbWVudCBwZXJzcGVjdGl2ZS4gSSYjMzk7dmUgZG91YmxlLWNoZWNrZWQsIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgbW9kaWZpY2F0aW9ucyB0byBvdGhlciBmdW5jdGlvbnMgdGhhdCBJIG5lZWQgdG8gd29ycnkgYWJvdXQuCgpJJiMzOTttIGxlYW5pbmcgdG93YXJkcyBzZXR0aW5nIGBXb3J0aEZ1enppbmc9dHJ1ZWAgaGVyZS4gVGhlIGxvZ2ljIHRvdWNoZXMgY29yZSBrZXJuZWwgY29tcG9uZW50cyDigJMgc3BlY2lmaWNhbGx5LCBwcm9jZXNzIGNyZWF0aW9uIOKAkyBhbmQgaXQgb25seSBiZWNvbWVzIGFjdGl2ZSB1bmRlciBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24sIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgLCBzbyBpdCB3YXJyYW50cyBjbG9zZXIgaW52ZXN0aWdhdGlvbi4KCldhaXQuLi4gYGNvcHlfcHJvY2Vzc2AuLi4gdGhhdCYjMzk7cyBhIGhvdC1wYXRoIGZ1bmN0aW9uLCBpc24mIzM5O3QgaXQ/IFJpZ2h0LiBXZSBnZW5lcmFsbHkgYXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyBpbiBgRm9jdXNTeW1ib2xzYCB0byBwcmV2ZW50IHNrZXdpbmcgdGVzdCBkaXN0cmlidXRpb25zLiBUaGVyZWZvcmUsIEkgKndpbGwgbm90KiBpbmNsdWRlIGBjb3B5X3Byb2Nlc3NgIGluIGBGb2N1c1N5bWJvbHNgLiBgRm9jdXNTeW1ib2xzYCB3aWxsIHN0YXkgZW1wdHkuCgpUaGUgYEVuYWJsZUNvbmZpZ3NgIHNob3VsZCBiZSBzZXQgdG8gYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAsIG9mIGNvdXJzZS4gTGV0JiMzOTtzIG1ha2Ugc3VyZSB0aGF0IGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGRvZXNuJiMzOTt0IGRlcGVuZCBvbiBhbnl0aGluZyB0aGF0IG1pZ2h0IG5vdCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEl0IGxvb2tzIGxpa2UgaXQgZGVwZW5kcyBvbiBgSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVJgIChhcmNoaXRlY3R1cmUgc3VwcG9ydCksIGBGVU5DVElPTl9UUkFDRVJgLCBhbmQgYWxzbyBgIVg4Nl8zMiB8fCAhQ0NfT1BUSU1JWkVfRk9SX1NJWkVgLiBPa2F5LCB0aGUgcmVxdWlyZWQgY29uZmlncyBhcmUgYEZVTkNUSU9OX1RSQUNFUmAgYW5kIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRlVOQ1RJT05fVFJBQ0VSJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL3RyYWNlL0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3RyYWNlL0tjb25maWc9MjI2PWNvbmZpZyBCT09UVElNRV9UUkFDSU5HXG4tLVxua2VybmVsL3RyYWNlL0tjb25maWctMjM0LVxua2VybmVsL3RyYWNlL0tjb25maWc6MjM1OmNvbmZpZyBGVU5DVElPTl9UUkFDRVJcbmtlcm5lbC90cmFjZS9LY29uZmlnLTIzNi1cdGJvb2wgXCYjMzQ7S2VybmVsIEZ1bmN0aW9uIFRyYWNlclwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU0OQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIHRoZSBzdW1tYXJ5LCBhc3N1bWluZyBJJiMzOTttIGFuIGV4cGVydDoKCioqRGl2aW5nIGludG8gdGhlIGBGVU5DVElPTl9UUkFDRVJgIEtjb25maWcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJiMzOTttIGdvaW5nIHRvIHRha2UgYSBsb29rIGF0IHRoZSBgRlVOQ1RJT05fVFJBQ0VSYCBLY29uZmlnLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgY29uZmlndXJlZCwgd2hhdCBkZXBlbmRlbmNpZXMgaXQgaGFzLCBhbmQgd2hhdCB0aGUgcG90ZW50aWFsIGltcGxpY2F0aW9ucyBhcmUgZm9yIHRoZSBrZXJuZWwgYnVpbGQgYW5kIHJ1bnRpbWUuIEkmIzM5O2xsIG5lZWQgdG8gYXNzZXNzIGl0cyBpbXBhY3Qgb24gcGVyZm9ybWFuY2UsIHBvd2VyIGNvbnN1bXB0aW9uLCBhbmQgb3ZlcmFsbCBzeXN0ZW0gZm9vdHByaW50LCBvZiBjb3Vyc2UuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOiB3aGF0IG90aGVyIHRyYWNpbmcgZmVhdHVyZXMgZG9lcyBpdCBkZXBlbmQgb24/IEFyZSB0aGVyZSBhbnkgb3B0aW9ucyB0byB0dW5lIGl0cyBiZWhhdmlvcj8gSXMgdGhlcmUgZG9jdW1lbnRhdGlvbiB0aGF0IHByb3Blcmx5IGV4cGxhaW5zIHRoZSB0cmFkZS1vZmZzIG9mIGVuYWJsaW5nIGl0PyBJIG5lZWQgdG8gYW5hbHl6ZSB0aGlzIEtjb25maWcgY29uZmlndXJhdGlvbiB0aG9yb3VnaGx5IHRvIGFzc2VzcyB3aGF0IGl0IG1lYW5zIGZvciB0aGUga2VybmVsIGluIHRoZSBjb250ZXh0IG9mIG91ciBwcm9qZWN0LiBUaW1lIHRvIGRpZyBpbiEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvdHJhY2UvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIzNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjM1Olx0Y29uZmlnIEZVTkNUSU9OX1RSQUNFUlxuIDIzNjpcdFx0Ym9vbCBcJiMzNDtLZXJuZWwgRnVuY3Rpb24gVHJhY2VyXCYjMzQ7XG4gMjM3Olx0XHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fVFJBQ0VSXG4gMjM4Olx0XHRzZWxlY3QgS0FMTFNZTVNcbiAyMzk6XHRcdHNlbGVjdCBHRU5FUklDX1RSQUNFUlxuIDI0MDpcdFx0c2VsZWN0IENPTlRFWFRfU1dJVENIX1RSQUNFUlxuIDI0MTpcdFx0c2VsZWN0IEdMT0JcbiAyNDI6XHRcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxuIDI0MzpcdFx0c2VsZWN0IFRBU0tTX1JVREVfUkNVXG4gMjQ0Olx0XHRoZWxwXG4gMjQ1Olx0XHQgIEVuYWJsZSB0aGUga2VybmVsIHRvIHRyYWNlIGV2ZXJ5IGtlcm5lbCBmdW5jdGlvbi4gVGhpcyBpcyBkb25lXG4gMjQ2Olx0XHQgIGJ5IHVzaW5nIGEgY29tcGlsZXIgZmVhdHVyZSB0byBpbnNlcnQgYSBzbWFsbCwgNS1ieXRlIE5vLU9wZXJhdGlvblxuIDI0NzpcdFx0ICBpbnN0cnVjdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGtlcm5lbCBmdW5jdGlvbiwgd2hpY2ggTk9QXG4gMjQ4Olx0XHQgIHNlcXVlbmNlIGlzIHRoZW4gZHluYW1pY2FsbHkgcGF0Y2hlZCBpbnRvIGEgdHJhY2VyIGNhbGwgd2hlblxuIDI0OTpcdFx0ICB0cmFjaW5nIGlzIGVuYWJsZWQgYnkgdGhlIGFkbWluaXN0cmF0b3IuIElmIGl0JiMzOTtzIHJ1bnRpbWUgZGlzYWJsZWRcbiAyNTA6XHRcdCAgKHRoZSBib290dXAgZGVmYXVsdCksIHRoZW4gdGhlIG92ZXJoZWFkIG9mIHRoZSBpbnN0cnVjdGlvbnMgaXMgdmVyeVxuIDI1MTpcdFx0ICBzbWFsbCBhbmQgbm90IG1lYXN1cmFibGUgZXZlbiBpbiBtaWNyby1iZW5jaG1hcmtzIChhdCBsZWFzdCBvblxuIDI1MjpcdFx0ICB4ODYsIGJ1dCBtYXkgaGF2ZSBpbXBhY3Qgb24gb3RoZXIgYXJjaGl0ZWN0dXJlcykuXG4gMjUzOlx0XG4gMjU0Olx0Y29uZmlnIEZVTkNUSU9OX0dSQVBIX1RSQUNFUlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDExNgoJCQkJCQkJb3V0cHV0OiAxNDEKCQkJCQkJCXRob3VnaHRzOiAxNzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQ29uZmlndXJhdGlvbiBBZGp1c3RtZW50cyBmb3IgQ29tcHJlaGVuc2l2ZSBUZXN0aW5nKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGUgZml4IGZvciB0aGF0IG5hc3R5IHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiBgY29weV9wcm9jZXNzKClgLCBzcGVjaWZpY2FsbHkgaW4gdGhlIGVycm9yIHBhdGguIFRoZSBwYXRjaCBtb3ZlcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYCBlYXJsaWVyIHRvIGFkZHJlc3MgdGhlIGlzc3VlLiBUaGlzIGJ1ZyBsaWtlcyB0byByZWFyIGl0cyBoZWFkIHdoZW4gYGNvcHlfcHJvY2VzcygpYCBmYWlscyDigJMgdGhpbmsgYGNvcHlfZXhlY19zdGF0ZSgpYCBmYWlsaW5nIOKAkyAqYW5kKiBmdW5jdGlvbiBncmFwaCB0cmFjaW5nIGlzIGVuYWJsZWQuIFRoYXQmIzM5O3MgdGhlIGtleS4KClRoZXJlZm9yZSwgZm9yIGVmZmVjdGl2ZSBmdXp6aW5nIG9mIHRoaXMsIEkgbmVlZCB0byBjb25maWd1cmUgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgcHJlY2lzZWx5LiBNeSBwbGFuIGlzOiBJJiMzOTtsbCBlbmFibGUgYm90aCBgRlVOQ1RJT05fVFJBQ0VSYCBhbmQgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAuIFNvIEkmIzM5O20gc2V0dGluZyBgRW5hYmxlQ29uZmlnc2AgdG8gYFsmIzM0O0ZVTkNUSU9OX1RSQUNFUiYjMzQ7LCAmIzM0O0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiYjMzQ7XWAuCgpJIGFsc28gZG9uJiMzOTt0IG5lZWQgYW55IHNwZWNpZmljIGZvY3VzIHN5bWJvbHMsIHNvIGBGb2N1c1N5bWJvbHNgIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCwgYFtdYC4KCkFuZCwgb2YgY291cnNlLCBJIGRlZmluaXRlbHkgd2FudCB0byBmdXp6IHRoaXMgY29kZSBwYXRoIHRvIHZlcmlmeSB0aGUgZml4LCBzbyBgV29ydGhGdXp6aW5nYCB3aWxsIGJlIHNldCB0byBgdHJ1ZWAuCgpUaGUgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZDogQnkgZW5hYmxpbmcgKmJvdGgqIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGFuZCBgRlVOQ1RJT05fVFJBQ0VSYCwgSSBlbnN1cmUgdGhhdCB0aGUgbmV3IGluaXRpYWxpemF0aW9uIG9yZGVyIGFuZCB0aGUgZXJyb3IgcGF0aHMgd2l0aGluIGBjb3B5X3Byb2Nlc3MoKWAgYXJlIHRob3JvdWdobHkgdGVzdGVkLiBUaGlzIGNvbmZpZ3VyYXRpb24gbWF4aW1pemVzIG15IGNoYW5jZXMgb2YgaGl0dGluZyB0aGUgYnVnIGlmIGl0JiMzOTtzIHN0aWxsIGx1cmtpbmcsIG9yLCBtb3JlIHBvc2l0aXZlbHksIHZhbGlkYXRlcyB0aGF0IG15IGZpeCBpcyBpbmRlZWQgZWZmZWN0aXZlIGluIGFsbCB0aGUgcmVsZXZhbnQgc2NlbmFyaW9zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RlVOQ1RJT05fVFJBQ0VSJiMzNDssCiAgICAmIzM0O0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBvZiBjb3B5X3Byb2Nlc3MoKSBieSBtb3ZpbmcgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpIGVhcmxpZXIuIFRoZSBidWcgaXMgdHJpZ2dlcmVkIHdoZW4gY29weV9wcm9jZXNzKCkgZmFpbHMgKGUuZy4sIGluIGNvcHlfZXhlY19zdGF0ZSgpKSBhbmQgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBGdXp6aW5nIHRoaXMgcmVxdWlyZXMgZW5hYmxpbmcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSIGFuZCBGVU5DVElPTl9UUkFDRVIgdG8gZW5zdXJlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIGVycm9yIHBhdGhzIGFyZSBwcm9wZXJseSB0ZXN0ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZVTkNUSU9OX1RSQUNFUiYjMzQ7LAogICAgJiMzNDtGVU5DVElPTl9HUkFQSF9UUkFDRVImIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSB1c2UtYWZ0ZXItZnJlZSBidWcgaW4gdGhlIGVycm9yIHBhdGggb2YgY29weV9wcm9jZXNzKCkgYnkgbW92aW5nIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKSBlYXJsaWVyLiBUaGUgYnVnIGlzIHRyaWdnZXJlZCB3aGVuIGNvcHlfcHJvY2VzcygpIGZhaWxzIChlLmcuLCBpbiBjb3B5X2V4ZWNfc3RhdGUoKSkgYW5kIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZC4gRnV6emluZyB0aGlzIHJlcXVpcmVzIGVuYWJsaW5nIEZVTkNUSU9OX0dSQVBIX1RSQUNFUiBhbmQgRlVOQ1RJT05fVFJBQ0VSIHRvIGVuc3VyZSB0aGUgbmV3IGluaXRpYWxpemF0aW9uIG9yZGVyIGFuZCBlcnJvciBwYXRocyBhcmUgcHJvcGVybHkgdGVzdGVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU1PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCYjMzk7cyBgdGFza19zdHJ1Y3RgIHRvIHRoZSBjaGlsZCwgaW5jbHVkaW5nIHRoZSBgcmV0X3N0YWNrYCBwb2ludGVyIHVzZWQgYnkgZnRyYWNlLiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGBjb3B5X3Byb2Nlc3MoKWAgKGUuZy4sIGluIGBjb3B5X2V4ZWNfc3RhdGUoKWApIGJlZm9yZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYCBpcyBjYWxsZWQsIHRoZSBlcnJvciBoYW5kbGluZyBwYXRoIChgYmFkX2ZvcmtfZnJlZWApIHdpbGwgY2FsbCBgZnJlZV90YXNrKClgLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgLiBTaW5jZSB0aGUgY2hpbGQmIzM5O3MgYHJldF9zdGFja2Agc3RpbGwgcG9pbnRzIHRvIHRoZSBwYXJlbnQmIzM5O3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLiBUaGUgcGFyZW50IHRhc2sgd2lsbCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgZnJlZWQgYHJldF9zdGFja2AsIHJlc3VsdGluZyBpbiBhIHVzZS1hZnRlci1mcmVlLCBhbmQgaXQgd2lsbCBiZSBkb3VibGUtZnJlZWQgd2hlbiB0aGUgcGFyZW50IGV2ZW50dWFsbHkgZXhpdHMuXG5cblRoaXMgaXMgYSBjbGFzc2ljIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgdnVsbmVyYWJpbGl0eS4gS0FTQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2UtYWZ0ZXItZnJlZSBhbmQgZG91YmxlIGZyZWUgYnVncywgYW5kIHdpbGwgcmVsaWFibHkgY2F0Y2ggdGhpcyBpc3N1ZS4gVGhlcmUgaXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UsIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgb3IgaW5mb3JtYXRpb24gbGVhayBpbnZvbHZlZCBpbiB0aGlzIGJ1Zywgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGUyZjNlMjQxM2NkMGQwNTRjMzUwMmNmN2MxYjE0YmFjZDJhOTRlZmUKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyAyMSAxMjo1NDoxOCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDFlNjg0MDRiZDc3M2UuLmNlYzgyYTY0YTA3Y2QgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2ZvcmsuYwpAQCAtMjEzOSw2ICYjNDM7MjEzOSw3IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoCiAJcCA9IGR1cF90YXNrX3N0cnVjdChjdXJyZW50LCBub2RlKTsKIAlpZiAoIXApCiAJCWdvdG8gZm9ya19vdXQ7CiYjNDM7CWZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7CiAJcmV0dmFsID0gY29weV9leGVjX3N0YXRlKGNsb25lX2ZsYWdzLCBwKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGJhZF9mb3JrX2ZyZWU7CkBAIC0yMTY1LDggJiM0MzsyMTY2LDYgQEAgX19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcygKIAkgKi8KIAlwLSZndDtjbGVhcl9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgJmFtcDsgQ0xPTkVfQ0hJTERfQ0xFQVJUSUQpID8gYXJncy0mZ3Q7Y2hpbGRfdGlkIDogTlVMTDsKIAotCWZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7Ci0KIAlydF9tdXRleF9pbml0X3Rhc2socCk7CiAJcmF3X3NwaW5fbG9ja19pbml0KCZhbXA7cC0mZ3Q7YmxvY2tlZF9sb2NrKTsKIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA2OQoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDM5OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEZvcmsgUGF0Y2g6IEZ0cmFjZSBJbml0aWFsaXphdGlvbiBhbmQgRXJyb3IgSGFuZGxpbmcqKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyBtb3ZpbmcgdGhlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBjYWxsIHdpdGhpbiBgY29weV9wcm9jZXNzKClgIGluIGBrZXJuZWwvZm9yay5jYC4gU3BlY2lmaWNhbGx5LCBpdCYjMzk7cyBzaGlmdGluZyBpdCAqYmVmb3JlKiB0aGUgYGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcClgIGNhbGwgYW5kICphZnRlciogdGhlIGBwLSZndDtjbGVhcl9jaGlsZF90aWQgPSAuLi5gIGFzc2lnbm1lbnQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIGNoYW5nZSBpcyBiZWluZyBwcm9wb3NlZC4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoaXMuCgpSaWdodCwgbG9va2luZyBhdCB0aGUgZGlmZiwgaXQmIzM5O3MgYSBzdHJhaWdodGZvcndhcmQgY29kZSBtb3ZlbWVudC4gTm93LCBteSBpbml0aWFsIHRob3VnaHQgaXMsIHdoYXQmIzM5O3MgdGhlIGRlcGVuZGVuY3kgaGVyZT8gSXMgdGhlcmUgYSByZWFzb24gaXQgbmVlZHMgdG8gYmUgKmJlZm9yZSogb3IgKmFmdGVyKiBjZXJ0YWluIG9wZXJhdGlvbnM/IFRoZSBrZXkgaXMgdGhhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgaW5pdGlhbGl6ZXMgc29tZSBmaWVsZHMgaW4gdGhlIG5ldyB0YXNrIHN0cnVjdHVyZSBgcGAuIElmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgY29kZSBqdW1wcyB0byBgYmFkX2ZvcmtfZnJlZWAuICpUaGF0KiBmdW5jdGlvbiBmcmVlcyBgcGAuIAoKU28gaGVyZSYjMzk7cyB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogZG9lcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgcGVyZm9ybSBhbnkgYWxsb2NhdGlvbnMsIG9yIGRvZXMgaXQganVzdCBpbml0aWFsaXplIGZpZWxkcz8gSWYgaXQgYWxsb2NhdGVzLCBhbmQgaXQmIzM5O3MgY2FsbGVkICpiZWZvcmUqIGBjb3B5X2V4ZWNfc3RhdGVgIHdoaWNoIGZhaWxzLCB3ZSYjMzk7cmUgbGVha2luZyBtZW1vcnkgaW4gdGhlIGZhaWx1cmUgY2FzZSB1bmxlc3MgYGJhZF9mb3JrX2ZyZWVgIGhhbmRsZXMgaXQuIElmIGl0IGRvZXNuJiMzOTt0IGFsbG9jYXRlLCB0aGVuIHRoaXMgbW92ZW1lbnQgaXMgbGlrZWx5IGZpbmUsIG1heWJlIGFuIG9wdGltaXphdGlvbiwgb3IgbWF5YmUgaXQganVzdCBtYWtlcyB0aGluZ3MgY2xlYXJlci4gSSYjMzk7bSBnb2luZyB0byBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHRvIGNvbmZpcm0gaXRzIGJlaGF2aW9yLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGJlaW5nIGluaXRpYWxpemVkIGFuZCBob3cgdGhpcyBjaGFuZ2UgYWZmZWN0cyByZXNvdXJjZSBtYW5hZ2VtZW50IGluIHRoZSBmYWlsdXJlIHBhdGguCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O152b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2smIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3RyYWNlL2ZncmFwaC5jPTExMzE9dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KVxuLS1cbmtlcm5lbC90cmFjZS9mZ3JhcGguYy0xMTU5LS8qIEFsbG9jYXRlIGEgcmV0dXJuIHN0YWNrIGZvciBuZXdseSBjcmVhdGVkIHRhc2sgKi9cbmtlcm5lbC90cmFjZS9mZ3JhcGguYzoxMTYwOnZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE2MS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI5NzQKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCoqCgpPa2F5LCBsZXQmIzM5O3Mgc3RhcnQgZGlnZ2luZyBpbnRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYC4gVGhpcyBpcyB3aGVyZSB0aGUgY29yZSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIGdyYXBoIHRyYWNlciBoYXBwZW5zIHdoZW4gYSBuZXcgdGFzayBpcyBib3JuLCByaWdodD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB0cmFjaW5nIGluZnJhc3RydWN0dXJlIGlzIHdpcmVkIGludG8gdGhlIHRhc2smIzM5O3MgZXhlY3V0aW9uIGNvbnRleHQuIEkmIzM5O20gYXNzdW1pbmcgaXQmIzM5O3MgaGFuZGxpbmcgdGhlIHNldHVwIG9mIHBlci10YXNrIGRhdGEgc3RydWN0dXJlcywgaG9va2luZyBpbnRvIHNjaGVkdWxpbmcgZXZlbnRzLCBhbmQgbWF5YmUgZXZlbiBlbmFibGluZy9kaXNhYmxpbmcgdGhlIHRyYWNpbmcgYmFzZWQgb24gZ2xvYmFsIHNldHRpbmdzIG9yIHRhc2stc3BlY2lmaWMgY3JpdGVyaWEuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYGZ0cmFjZV9vcHNgIHN0cnVjdHVyZSwgaG93IGl0IGxpbmtzIHRvIHRoZSB0YXNrJiMzOTtzIGB0YXNrX3N0cnVjdGAsIGFuZCBhbnkgcG90ZW50aWFsIG92ZXJoZWFkIGludHJvZHVjZWQgYXQgdGFzayBjcmVhdGlvbi4gSSYjMzk7bSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBhbnkgc3luY2hyb25pemF0aW9uIG1lY2hhbmlzbXMgdXNlZCB0byBwcm90ZWN0IHRoZSB0cmFjaW5nIGRhdGEgYW5kIGhvdyBpdCBkZWFscyB3aXRoIHJhY2VzIGJldHdlZW4gdGFzayBjcmVhdGlvbiBhbmQgdHJhY2luZyBvcGVyYXRpb25zLiBMZXQmIzM5O3Mgc2VlIGhvdyB0aGV5IGRlYWwgd2l0aCB0aGUgcHJlZW1wdGlvbiBhbmQgaXJxIHNpdHVhdGlvbnMuIEkmIzM5O20gZXhwZWN0aW5nIHNvbWUgY2xldmVyIHRyaWNrcyB0byBrZWVwIGl0IGVmZmljaWVudC4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvdHJhY2UvZmdyYXBoLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTU5LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzExNTk6XHQvKiBBbGxvY2F0ZSBhIHJldHVybiBzdGFjayBmb3IgbmV3bHkgY3JlYXRlZCB0YXNrICovXG4xMTYwOlx0dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcbjExNjE6XHR7XG4xMTYyOlx0XHQvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHVzZSB0aGUgcGFyZW50IHJldF9zdGFjayAqL1xuMTE2MzpcdFx0dC1cdTAwM2VyZXRfc3RhY2sgPSBOVUxMO1xuMTE2NDpcdFx0dC1cdTAwM2VjdXJyX3JldF9zdGFjayA9IDA7XG4xMTY1Olx0XHR0LVx1MDAzZWN1cnJfcmV0X2RlcHRoID0gLTE7XG4xMTY2Olx0XG4xMTY3Olx0XHRpZiAoZnRyYWNlX2dyYXBoX2FjdGl2ZSkge1xuMTE2ODpcdFx0XHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2s7XG4xMTY5Olx0XG4xMTcwOlx0XHRcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxuMTE3MTpcdFx0XHRcdHJldHVybjtcbjExNzI6XHRcbjExNzM6XHRcdFx0cmV0X3N0YWNrID0ga21lbV9jYWNoZV9hbGxvYyhmZ3JhcGhfc3RhY2tfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbjExNzQ6XHRcdFx0aWYgKCFyZXRfc3RhY2spXG4xMTc1Olx0XHRcdFx0cmV0dXJuO1xuMTE3NjpcdFx0XHRncmFwaF9pbml0X3Rhc2sodCwgcmV0X3N0YWNrKTtcbjExNzc6XHRcdH1cbjExNzg6XHR9XG4xMTc5Olx0XG4xMTgwOlx0dm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcbjExODE6XHR7XG4xMTgyOlx0XHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2sgPSB0LVx1MDAzZXJldF9zdGFjaztcbjExODM6XHRcbjExODQ6XHRcdHQtXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtcbjExODU6XHRcdC8qIE5VTEwgbXVzdCBiZWNvbWUgdmlzaWJsZSB0byBJUlFzIGJlZm9yZSB3ZSBmcmVlIGl0OiAqL1xuMTE4NjpcdFx0YmFycmllcigpO1xuMTE4NzpcdFxuMTE4ODpcdFx0aWYgKHJldF9zdGFjaykge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNjk5CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogNzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUYXNrIEluaXRpYWxpemF0aW9uIGZvciBGdW5jdGlvbiBUcmFjaW5nKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AuIEl0JiMzOTtzIHByZXR0eSBzdHJhaWdodGZvcndhcmQ6IGl0IGFsbG9jYXRlcyB0aGUgYHJldF9zdGFja2AsIGJ1dCBvbmx5IHdoZW4gYGZ0cmFjZV9ncmFwaF9hY3RpdmVgIGlzIHNldCwgd2hpY2ggbWFrZXMgc2Vuc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIE5vdywgSSBzZWUgdGhpcyBgY29weV9leGVjX3N0YXRlYCBjYWxsLiBJZiB0aGF0IGZhaWxzLCBpdCBqdW1wcyBkaXJlY3RseSB0byBgYmFkX2ZvcmtfZnJlZWAuIFRoYXQmIzM5O3MgYSBwb3RlbnRpYWwgYXJlYSBmb3IgZmFpbHVyZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhhdCBgYmFkX2ZvcmtfZnJlZWAgcGF0aCBiZXR0ZXIsIGVzcGVjaWFsbHkgZ2l2ZW4gaG93IGNyaXRpY2FsIGZvcmsgb3BlcmF0aW9ucyBhcmUuIFRpbWUgdG8gaGVhZCBvdmVyIHRvIGBrZXJuZWwvZm9yay5jYCBhbmQgZGlnIGludG8gYGJhZF9mb3JrX2ZyZWVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHJlc291cmNlcyBhcmUgYmVpbmcgZnJlZWQgYW5kIGlmIGFueSBjbGVhbnVwIG1pZ2h0IGJlIG1pc3Npbmcgb3IgaW5zdWZmaWNpZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtiYWRfZm9ya19mcmVlOiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jPTIwMTg9X19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2Vzcyhcbi0tXG5rZXJuZWwvZm9yay5jLTI2NDEtXHRleGl0X2NyZWRzKHApO1xua2VybmVsL2ZvcmsuYzoyNjQyOmJhZF9mb3JrX2ZyZWU6XG5rZXJuZWwvZm9yay5jLTI2NDMtXHRXUklURV9PTkNFKHAtXHUwMDNlX19zdGF0ZSwgVEFTS19ERUFEKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA2MQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byBgYmFkX2ZvcmtfZnJlZWAqKgoKQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUga2VybmVsJiMzOTtzIGZvcmsgaW1wbGVtZW50YXRpb24uIEkmIzM5O20gZ29pbmcgdG8ganVtcCBpbnRvIGBrZXJuZWwvZm9yay5jYCBhbmQgc3BlY2lmaWNhbGx5IGZvY3VzIG9uIHRoZSBgYmFkX2ZvcmtfZnJlZWAgZnVuY3Rpb24uIEkmIzM5O20gYXNzdW1pbmcsIGdpdmVuIHRoZSBuYW1lLCB0aGlzIGlzIHdoZXJlIHdlJiMzOTtyZSBoYW5kbGluZyBzb21lIGtpbmQgb2YgY2xlYW51cCBvciBlcnJvciBzY2VuYXJpbyByZWxhdGVkIHRvIHRoZSBgZm9ya2Agc3lzdGVtIGNhbGwuIFByb2JhYmx5IGRlYWxpbmcgd2l0aCBmcmVlaW5nIHJlc291cmNlcyB0aGF0IHdlcmUgcGFydGlhbGx5IGFsbG9jYXRlZCBkdXJpbmcgYSBmYWlsZWQgZm9yayBhdHRlbXB0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZvcmsgbG9naWMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOiB3aGF0IHJlc291cmNlcyBhcmUgZnJlZWQsIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBpcyBpdCBjYWxsZWQsIGFuZCBob3cgaXQgZW5zdXJlcyB0aGUgc3lzdGVtIHJlbWFpbnMgY29uc2lzdGVudCBhZnRlciBhIGZvcmsgZmFpbHVyZS4gSXMgaXQgZnJlZWluZyBtZW1vcnksIGNsZWFuaW5nIHVwIHRhc2sgc3RydWN0dXJlcywgb3IgcmVsZWFzaW5nIG90aGVyIGtlcm5lbCByZXNvdXJjZXM/IFRpbWUgdG8gcmVhZCB0aGUgY29kZSBjYXJlZnVsbHkgYW5kIHVuZGVyc3RhbmQgdGhlIHNwZWNpZmljIGNvbnRleHQgb2YgdGhpcyBmdW5jdGlvbi4gSSYjMzk7bGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBsaWtlIHRhc2sgc3RydWN0dXJlcywgbW0gc3RydWN0dXJlcywgYW5kIGFueSBvdGhlciByZWxldmFudCBrZXJuZWwgZGF0YS4gTGV0JiMzOTtzIHNlZSBpZiB0aGlzIHNoZWRzIGxpZ2h0IG9uIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIHJlc291cmNlIGxlYWtzIHdpdGhpbiB0aGUgZm9yayBpbXBsZW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjY0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNjQwOlx0XHRleGl0X2NyZWRfbmFtZXNwYWNlcyhwKTtcbjI2NDE6XHRcdGV4aXRfY3JlZHMocCk7XG4yNjQyOlx0YmFkX2ZvcmtfZnJlZTpcbjI2NDM6XHRcdFdSSVRFX09OQ0UocC1cdTAwM2VfX3N0YXRlLCBUQVNLX0RFQUQpO1xuMjY0NDpcdFx0ZXhpdF90YXNrX3N0YWNrX2FjY291bnQocCk7XG4yNjQ1Olx0XHRwdXRfdGFza19zdGFjayhwKTtcbjI2NDY6XHRcdGRlbGF5ZWRfZnJlZV90YXNrKHApO1xuMjY0NzpcdGZvcmtfb3V0OlxuMjY0ODpcdFx0c3Bpbl9sb2NrX2lycShcdTAwMjZjdXJyZW50LVx1MDAzZXNpZ2hhbmQtXHUwMDNlc2lnbG9jayk7XG4yNjQ5Olx0XHRobGlzdF9kZWxfaW5pdChcdTAwMjZkZWxheWVkLm5vZGUpO1xuMjY1MDpcdFx0c3Bpbl91bmxvY2tfaXJxKFx1MDAyNmN1cnJlbnQtXHUwMDNlc2lnaGFuZC1cdTAwM2VzaWdsb2NrKTtcbjI2NTE6XHRcdHJldHVybiBFUlJfUFRSKHJldHZhbCk7XG4yNjUyOlx0fVxuMjY1MzpcdFxuMjY1NDpcdHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2lkbGVfcGlkcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpXG4yNjU1Olx0e1xuMjY1NjpcdFx0ZW51bSBwaWRfdHlwZSB0eXBlO1xuMjY1NzpcdFxuMjY1ODpcdFx0Zm9yICh0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjIFBJRFRZUEVfTUFYOyAmIzQzOyYjNDM7dHlwZSkge1xuMjY1OTpcdFx0XHRJTklUX0hMSVNUX05PREUoXHUwMDI2aWRsZS1cdTAwM2VwaWRfbGlua3NbdHlwZV0pOyAvKiBub3QgcmVhbGx5IG5lZWRlZCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0NjkzCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogNDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBteSBwZXJzcGVjdGl2ZSBhcyBzb21lb25lIGZhbWlsaWFyIHdpdGgga2VybmVsIGludGVybmFsczoKCioqS2VybmVsIFRhc2sgU3RydWN0IExpZmVjeWNsZSBBbmFseXNpcyoqCgpBbHJpZ2h0LCBoYW5nIG9uIGEgc2Vjb25kLiBJJiMzOTttIGZvY3VzaW5nIG9uIHRhc2sgY2xlYW51cCwgYW5kIHRoaXMgYGRlbGF5ZWRfZnJlZV90YXNrYCBmdW5jdGlvbuKApiB0aGF0JiMzOTtzIHRoZSBvbmUgdGhhdCBhY3R1YWxseSAqZnJlZXMqIHRoZSB0YXNrIHN0cnVjdCwgcmlnaHQ/IFRoZSBrZXkgaGVyZSBpcyB0byBkZXRlcm1pbmUgKmV4YWN0bHkqIHdoZW4gYW5kIGhvdyBhIHRhc2sgc3RydWN0dXJlIGlzIGRlYWxsb2NhdGVkLCBhbmQgdGhpcyBgZGVsYXllZF9mcmVlX3Rhc2tgIGlzIHRoZSBsaWtlbHkgY3VscHJpdC4KCk15IG5leHQgc3RlcCwgYW5kIGl04oCZcyBhIGNyaXRpY2FsIG9uZSwgaXMgdG8gY29uZmlybSB3aGV0aGVyIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCBpcyBjYWxsZWQgKmJlZm9yZSogdGhhdCBzdHJ1Y3QgaXMgZnJlZWQuIFVuZGVyc3RhbmRpbmcgdGhlIHRpbWluZyBvZiB0aGUgdHJhY2luZy1yZWxhdGVkIGNsZWFudXAgaW4gcmVsYXRpb24gdG8gdGhlIG1haW4gbWVtb3J5IGRlYWxsb2NhdGlvbiBpcyBjcnVjaWFsIGZvciBhdm9pZGluZyBhbnkgcmFjZSBjb25kaXRpb25zIG9yIGRhbmdsaW5nIHBvaW50ZXIgaXNzdWVzLiBUaGlzIGlzIGEgdmVyeSBjb21tb24gaXNzdWUgaW4ga2VybmVsIHRyYWNpbmcuCgpUbyBuYWlsIHRoaXMgZG93biwgSSBuZWVkIHRvIGRpdmUgaW50byB0aGUgY29kZS4gRWl0aGVyIGBkZWxheWVkX2ZyZWVfdGFza2AgaXRzZWxmLCBvciBgZnJlZV90YXNrYCwgaWYgYGRlbGF5ZWRfZnJlZV90YXNrYCBpcyBqdXN0IGEgd3JhcHBlciwgd2lsbCBiZSB0aGUgbmV4dCBwbGFjZSB0byBsb29rIHRvIHVuZGVyc3RhbmQgdGhlIGV4YWN0IHNlcXVlbmNpbmcgb2YgdGhlc2Ugb3BlcmF0aW9ucy4gVGhpcyBpcyB3aGVyZSBJJiMzOTtsbCBmaW5kIG15IGFuc3dlcnMgYW5kIGNvbmZpcm0gdGhlIHRpbWluZyBvZiB0aGUgRnRyYWNlIGluc3RydW1lbnRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZnRyYWNlX2dyYXBoX2V4aXRfdGFzayYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2Z0cmFjZS5oPTEzNDQ9ZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpO1xuaW5jbHVkZS9saW51eC9mdHJhY2UuaDoxMzQ1OmV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM0Ni1leHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KTtcbi0tXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oPTEzNjQ9c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cbmluY2x1ZGUvbGludXgvZnRyYWNlLmg6MTM2NTpzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgfVxuaW5jbHVkZS9saW51eC9mdHJhY2UuaC0xMzY2LXN0YXRpYyBpbmxpbmUgdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KSB7IH1cbi0tXG5rZXJuZWwvZm9yay5jPTUzMz12b2lkIGZyZWVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcbi0tXG5rZXJuZWwvZm9yay5jLTU1NS1cdHJ0X211dGV4X2RlYnVnX3Rhc2tfZnJlZSh0c2spO1xua2VybmVsL2ZvcmsuYzo1NTY6XHRmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHRzayk7XG5rZXJuZWwvZm9yay5jLTU1Ny1cdGFyY2hfcmVsZWFzZV90YXNrX3N0cnVjdCh0c2spO1xuLS1cbmtlcm5lbC90cmFjZS9mZ3JhcGguYz0xMTYwPXZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXG4tLVxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNzktXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM6MTE4MDp2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExODEte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NDQ4CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkEgUG90ZW50aWFsIE1lbW9yeSBDb3JydXB0aW9uIElzc3VlIGluIFRhc2sgRm9ya2luZyB3aXRoIEZ0cmFjZSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgaG93IHRhc2sgc3RydWN0dXJlcyBhcmUgaGFuZGxlZCBkdXJpbmcgYSBmb3JrLCBzcGVjaWZpY2FsbHkgd2l0aCBmdHJhY2UgZW5hYmxlZC4gSSBzZWUgdGhhdCBgZnJlZV90YXNrYCBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AsIHdoaWNoIGlzIGV4cGVjdGVkLiBOb3csIGlmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgYGJhZF9mb3JrX2ZyZWVgIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCwgbGVhZGluZyB0byBhIGRlbGF5ZWQgZnJlZSBvZiB0aGUgdGFzaywgdWx0aW1hdGVseSBjYWxsaW5nIGBmcmVlX3Rhc2tgIGFuZCB0aGVuIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCwgYXMgZXhwZWN0ZWQuCgpCdXQgd2FpdCwgdGhpcyBzbWVsbHMgZmlzaHkuIFdoYXQgaWYgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHdhcyBhY3R1YWxseSBjYWxsZWQgKmFmdGVyKiBgY29weV9leGVjX3N0YXRlYCB3aXRoaW4gYSBmb3JrIHNlcXVlbmNlLCBhbmQgKnRoZW4qIHRoZSBgY29weV9leGVjX3N0YXRlYCBmYWlscz8gSW4gdGhpcyBzY2VuYXJpbywgYGJhZF9mb3JrX2ZyZWVgIHdvdWxkIHN0aWxsIGNhbGwgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgLCBkZXNwaXRlIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxpbmcuCgpBIGxpZ2h0YnVsYiBqdXN0IHdlbnQgb2ZmISBUaGUgZnVuY3Rpb24gYHAgPSBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7YCBpcyBjYWxsZWQuIEl0IGNvcGllcyB0aGUgZW50aXJlIHRhc2sgc3RydWN0dXJlIGZyb20gdGhlIHBhcmVudCwgaW5jbHVkaW5nIHRoZSBgcC0mZ3Q7cmV0X3N0YWNrYC4gTm93IGlmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzIGFuZCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agd2FzIG5ldmVyIGNhbGxlZCwgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIHdvdWxkIGZyZWUgdGhlICpwYXJlbnQmIzM5O3MqIGByZXRfc3RhY2tgISBUaGlzIGlzIGRlZmluaXRlbHkgYSBtZW1vcnkgY29ycnVwdGlvbiB2dWxuZXJhYmlsaXR5IHdhaXRpbmcgdG8gaGFwcGVuLiBJIG5lZWQgdG8gZGl2ZSBpbnRvIGBkdXBfdGFza19zdHJ1Y3RgIHJpZ2h0IGF3YXkgdG8gY29uZmlybSBteSBzdXNwaWNpb25zIGFuZCBzZWUgaG93IHRoaXMgaXMgaGFuZGxlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTA4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMDgwOlx0fVxuMTA4MTpcdFxuMTA4MjpcdHN0YXRpYyB2b2lkIG1tYXBfaW5pdF9sb2NrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKVxuMTA4MzpcdHtcbjEwODQ6XHRcdGluaXRfcndzZW0oXHUwMDI2bW0tXHUwMDNlbW1hcF9sb2NrKTtcbjEwODU6XHRcdG1tX2xvY2tfc2VxY291bnRfaW5pdChtbSk7XG4xMDg2Olx0I2lmZGVmIENPTkZJR19QRVJfVk1BX0xPQ0tcbjEwODc6XHRcdHJjdXdhaXRfaW5pdChcdTAwMjZtbS1cdTAwM2V2bWFfd3JpdGVyX3dhaXQpO1xuMTA4ODpcdCNlbmRpZlxuMTA4OTpcdH1cbjEwOTA6XHRcbjEwOTE6XHRzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqbW1faW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKVxuMTA5MjpcdHtcbjEwOTM6XHRcdG10X2luaXRfZmxhZ3MoXHUwMDI2bW0tXHUwMDNlbW1fbXQsIE1NX01UX0ZMQUdTKTtcbjEwOTQ6XHRcdG10X3NldF9leHRlcm5hbF9sb2NrKFx1MDAyNm1tLVx1MDAzZW1tX210LCBcdTAwMjZtbS1cdTAwM2VtbWFwX2xvY2spO1xuMTA5NTpcdFx0YXRvbWljX3NldChcdTAwMjZtbS1cdTAwM2VtbV91c2VycywgMSk7XG4xMDk2Olx0XHRhdG9taWNfc2V0KFx1MDAyNm1tLVx1MDAzZW1tX2NvdW50LCAxKTtcbjEwOTc6XHRcdHNlcWNvdW50X2luaXQoXHUwMDI2bW0tXHUwMDNld3JpdGVfcHJvdGVjdF9zZXEpO1xuMTA5ODpcdFx0bW1hcF9pbml0X2xvY2sobW0pO1xuMTA5OTpcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bW0tXHUwMDNlbW1saXN0KTtcbjExMDA6XHRcdG1tX3BndGFibGVzX2J5dGVzX2luaXQobW0pO1xuMTEwMTpcdFx0bW0tXHUwMDNlbWFwX2NvdW50ID0gMDtcbjExMDI6XHRcdG1tLVx1MDAzZWxvY2tlZF92bSA9IDA7XG4xMTAzOlx0XHRhdG9taWM2NF9zZXQoXHUwMDI2bW0tXHUwMDNlcGlubmVkX3ZtLCAwKTtcbjExMDQ6XHRcdG1lbXNldChcdTAwMjZtbS1cdTAwM2Vyc3Nfc3RhdCwgMCwgc2l6ZW9mKG1tLVx1MDAzZXJzc19zdGF0KSk7XG4xMTA1Olx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZtbS1cdTAwM2VwYWdlX3RhYmxlX2xvY2spO1xuMTEwNjpcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bW0tXHUwMDNlYXJnX2xvY2spO1xuMTEwNzpcdFx0bW1faW5pdF9jcHVtYXNrKG1tKTtcbjExMDg6XHRcdG1tX2luaXRfYWlvKG1tKTtcbjExMDk6XHRcdG1tX2luaXRfb3duZXIobW0sIHApO1xuMTExMDpcdFx0bW1fcGFzaWRfaW5pdChtbSk7XG4xMTExOlx0XHRSQ1VfSU5JVF9QT0lOVEVSKG1tLVx1MDAzZWV4ZV9maWxlLCBOVUxMKTtcbjExMTI6XHRcdG1tdV9ub3RpZmllcl9zdWJzY3JpcHRpb25zX2luaXQobW0pO1xuMTExMzpcdFx0aW5pdF90bGJfZmx1c2hfcGVuZGluZyhtbSk7XG4xMTE0Olx0I2lmIGRlZmluZWQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSBcdTAwMjZcdTAwMjYgIWRlZmluZWQoQ09ORklHX1NQTElUX1BNRF9QVExPQ0tTKVxuMTExNTpcdFx0bW0tXHUwMDNlcG1kX2h1Z2VfcHRlID0gTlVMTDtcbjExMTY6XHQjZW5kaWZcbjExMTc6XHRcdG1tX2luaXRfdXByb2Jlc19zdGF0ZShtbSk7XG4xMTE4Olx0XHRodWdldGxiX2NvdW50X2luaXQobW0pO1xuMTExOTpcdFx0ZnV0ZXhfbW1faW5pdChtbSk7XG4xMTIwOlx0XG4xMTIxOlx0XHRtbV9mbGFnc19jbGVhcl9hbGwobW0pO1xuMTEyMjpcdFx0aWYgKGN1cnJlbnQtXHUwMDNlbW0pIHtcbjExMjM6XHRcdFx0dW5zaWduZWQgbG9uZyBmbGFncyA9IF9fbW1fZmxhZ3NfZ2V0X3dvcmQoY3VycmVudC1cdTAwM2VtbSk7XG4xMTI0Olx0XG4xMTI1Olx0XHRcdF9fbW1fZmxhZ3Nfb3ZlcndyaXRlX3dvcmQobW0sIG1tZl9pbml0X2xlZ2FjeV9mbGFncyhmbGFncykpO1xuMTEyNjpcdFx0XHRtbS1cdTAwM2VkZWZfZmxhZ3MgPSBjdXJyZW50LVx1MDAzZW1tLVx1MDAzZWRlZl9mbGFncyBcdTAwMjYgVk1fSU5JVF9ERUZfTUFTSztcbjExMjc6XHRcdH0gZWxzZSB7XG4xMTI4Olx0XHRcdF9fbW1fZmxhZ3Nfb3ZlcndyaXRlX3dvcmQobW0sIGNvcmVkdW1wX2ZpbHRlcik7XG4xMTI5Olx0XHRcdG1tLVx1MDAzZWRlZl9mbGFncyA9IDA7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY5NDEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQ2hlY2tpbmcgYGR1cF90YXNrX3N0cnVjdGAqKgoKUmlnaHQsIGxldCBtZSBqdXN0IHBhdXNlIGFuZCBtYWtlIGEgcXVpY2sgbWVudGFsIG5vdGUg4oCTIEkgbmVlZCB0byBjaXJjbGUgYmFjayBhbmQgc3BlY2lmaWNhbGx5IGV4YW1pbmUgYGR1cF90YXNrX3N0cnVjdGAuIEdpdmVuIHRoZSBjb250ZXh0IG9mIHdoYXQgSSYjMzk7bSB3b3JraW5nIG9uLCBJIHN1c3BlY3QgdGhlcmUgbWlnaHQgYmUgc29tZSBudWFuY2VkIGJlaGF2aW9yIHRoZXJlIHRoYXQgY291bGQgaW1wYWN0IHRoZSBvdmVyYWxsIGRlc2lnbi4gSSYjMzk7bSB0aGlua2luZyBhYm91dCBwb3RlbnRpYWwgaW1wbGljYXRpb25zIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50IG9yIHBlcmhhcHMgaG93IHdlJiMzOTtyZSBoYW5kbGluZyB0aHJlYWQgY3JlYXRpb24uIEl04oCZcyBhbHdheXMgd29ydGggYSBxdWljayBjaGVjaywgZXNwZWNpYWxseSB3aXRoIHNvbWV0aGluZyB0aGF0IGRlYWxzIGRpcmVjdGx5IHdpdGggdGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHByb2Nlc3Nlcy4gTmVlZCB0byBzZWUgaG93IHRoYXQgZnVuY3Rpb27igJlzIGludGVybmFsIHdvcmtpbmdzIG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IGN1cnJlbnQgY2hhbmdlcywgYW5kLCBvZiBjb3Vyc2UsIGhvdyBhbnkgbW9kaWZpY2F0aW9ucyBjb3VsZCBpbmZsdWVuY2UgcGVyZm9ybWFuY2UuIFRpbWUgdG8gZGlnIGluIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMSAxMjo1NjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtec3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCBcXCpkdXBfdGFza19zdHJ1Y3QmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2ZvcmsuYz05MDc9dm9pZCBzZXRfdGFza19zdGFja19lbmRfbWFnaWMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxua2VybmVsL2ZvcmsuYy05MTQtXG5rZXJuZWwvZm9yay5jOjkxNTpzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpkdXBfdGFza19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICpvcmlnLCBpbnQgbm9kZSlcbmtlcm5lbC9mb3JrLmMtOTE2LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzI0NwoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXAgaW4gdGhlIHdlZWRzIG9mIGtlcm5lbC1sZXZlbCBjb2RlOgoKKipEaXZpbmcgaW50byBgZHVwX3Rhc2tfc3RydWN0YCoqCgpBbHJpZ2h0LCB0aW1lIHRvIGNyYWNrIG9wZW4gdGhlIGBkdXBfdGFza19zdHJ1Y3RgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGlzIHdvcmtzLiBJIGtub3cgaXQmIzM5O3MgZnVuZGFtZW50YWwgdG8gcHJvY2VzcyBjcmVhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCwgc28gdGhpcyBuZWVkcyBteSBmdWxsIGF0dGVudGlvbi4gTGV0JiMzOTtzIHNlZSBob3cgaXQmIzM5O3MgaW1wbGVtZW50ZWQgYW5kIGFsbCB0aGUgcmVsZXZhbnQgZGF0YSBzdHJ1Y3R1cmVzIGl0IHRvdWNoZXMuIEkmIzM5O20gZ29pbmcgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc3RyYXRlZ2llcyBhbmQgaG93IHJlc291cmNlcyBhcmUgY29waWVkIChvciBzaGFyZWQsIG1vcmUgbGlrZWx5KS4gSXQmIzM5O3MgY3J1Y2lhbCB0byBncmFzcCB0aGUgc3VidGxldGllcyBoZXJlIOKAkyBlbnN1cmluZyBhIGNsZWFuIHNlcGFyYXRpb24gYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIHByb2Nlc3NlcyB3aGlsZSBhbHNvIG9wdGltaXppbmcgZm9yIHBlcmZvcm1hbmNlIGlzIGEgZGVsaWNhdGUgYmFsYW5jaW5nIGFjdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvZm9yay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA5MTU6XHRzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpkdXBfdGFza19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICpvcmlnLCBpbnQgbm9kZSlcbiA5MTY6XHR7XG4gOTE3Olx0XHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaztcbiA5MTg6XHRcdGludCBlcnI7XG4gOTE5Olx0XG4gOTIwOlx0XHRpZiAobm9kZSA9PSBOVU1BX05PX05PREUpXG4gOTIxOlx0XHRcdG5vZGUgPSB0c2tfZm9ya19nZXRfbm9kZShvcmlnKTtcbiA5MjI6XHRcdHRzayA9IGFsbG9jX3Rhc2tfc3RydWN0X25vZGUobm9kZSk7XG4gOTIzOlx0XHRpZiAoIXRzaylcbiA5MjQ6XHRcdFx0cmV0dXJuIE5VTEw7XG4gOTI1Olx0XG4gOTI2Olx0XHRlcnIgPSBhcmNoX2R1cF90YXNrX3N0cnVjdCh0c2ssIG9yaWcpO1xuIDkyNzpcdFx0aWYgKGVycilcbiA5Mjg6XHRcdFx0Z290byBmcmVlX3RzaztcbiA5Mjk6XHRcbiA5MzA6XHRcdGVyciA9IGFsbG9jX3RocmVhZF9zdGFja19ub2RlKHRzaywgbm9kZSk7XG4gOTMxOlx0XHRpZiAoZXJyKVxuIDkzMjpcdFx0XHRnb3RvIGZyZWVfdHNrO1xuIDkzMzpcdFxuIDkzNDpcdCNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTS1xuIDkzNTpcdFx0cmVmY291bnRfc2V0KFx1MDAyNnRzay1cdTAwM2VzdGFja19yZWZjb3VudCwgMSk7XG4gOTM2Olx0I2VuZGlmXG4gOTM3Olx0XHRhY2NvdW50X2tlcm5lbF9zdGFjayh0c2ssIDEpO1xuIDkzODpcdFxuIDkzOTpcdFx0ZXJyID0gc21wX3Rhc2tfaXBpX21hc2tfYWxsb2ModHNrKTtcbiA5NDA6XHRcdGlmIChlcnIpXG4gOTQxOlx0XHRcdGdvdG8gZnJlZV9zdGFjaztcbiA5NDI6XHRcbiA5NDM6XHRcdGVyciA9IHNjc19wcmVwYXJlKHRzaywgbm9kZSk7XG4gOTQ0Olx0XHRpZiAoZXJyKVxuIDk0NTpcdFx0XHRnb3RvIGZyZWVfaXBpX21hc2s7XG4gOTQ2Olx0XG4gOTQ3Olx0I2lmZGVmIENPTkZJR19TRUNDT01QXG4gOTQ4Olx0XHQvKlxuIDk0OTpcdFx0ICogV2UgbXVzdCBoYW5kbGUgc2V0dGluZyB1cCBzZWNjb21wIGZpbHRlcnMgb25jZSB3ZSYjMzk7cmUgdW5kZXJcbiA5NTA6XHRcdCAqIHRoZSBzaWdoYW5kIGxvY2sgaW4gY2FzZSBvcmlnIGhhcyBjaGFuZ2VkIGJldHdlZW4gbm93IGFuZFxuIDk1MTpcdFx0ICogdGhlbi4gVW50aWwgdGhlbiwgZmlsdGVyIG11c3QgYmUgTlVMTCB0byBhdm9pZCBtZXNzaW5nIHVwXG4gOTUyOlx0XHQgKiB0aGUgdXNhZ2UgY291bnRzIG9uIHRoZSBlcnJvciBwYXRoIGNhbGxpbmcgZnJlZV90YXNrLlxuIDk1MzpcdFx0ICovXG4gOTU0Olx0XHR0c2stXHUwMDNlc2VjY29tcC5maWx0ZXIgPSBOVUxMO1xuIDk1NTpcdCNlbmRpZlxuIDk1NjpcdFxuIDk1NzpcdFx0UkNVX0lOSVRfUE9JTlRFUih0c2stXHUwMDNlZXhlY19zdGF0ZSwgTlVMTCk7XG4gOTU4Olx0XG4gOTU5Olx0XHRzZXR1cF90aHJlYWRfc3RhY2sodHNrLCBvcmlnKTtcbiA5NjA6XHRcdGNsZWFyX3VzZXJfcmV0dXJuX25vdGlmaWVyKHRzayk7XG4gOTYxOlx0XHRjbGVhcl90c2tfbmVlZF9yZXNjaGVkKHRzayk7XG4gOTYyOlx0XHRzZXRfdGFza19zdGFja19lbmRfbWFnaWModHNrKTtcbiA5NjM6XHRcdGNsZWFyX3N5c2NhbGxfd29ya19zeXNjYWxsX3VzZXJfZGlzcGF0Y2godHNrKTtcbiA5NjQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjEgMTI6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODE3MAoJCQkJCQkJb3V0cHV0OiAzMjkKCQkJCQkJCXRob3VnaHRzOiAxMTU0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBVc2UtQWZ0ZXItRnJlZS9Eb3VibGUgRnJlZSBpbiBUYXNrIENyZWF0aW9uIHdpdGggZnRyYWNlKioKCk9rYXksIHNvIGhlcmUmIzM5O3MgdGhlIGRlYWwuIGBhcmNoX2R1cF90YXNrX3N0cnVjdGAgZG9lcyBhIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIHBhcmVudCYjMzk7cyBgdGFza19zdHJ1Y3RgIHRvIHRoZSBjaGlsZC4gVGhhdCBtZWFucyB0aGUgYHJldF9zdGFja2AgcG9pbnRlciwgdXNlZCBieSBmdHJhY2UsIGdldHMgY29waWVkIHRvby4gVGhhdCBtYWtlcyBzZW5zZSwgYnV0IGl0IGNhbiBsZWFkIHRvIGEgcmVhbGx5IG5hc3R5IGJ1Zy4KCkxldCYjMzk7cyBzYXkgYGNvcHlfZXhlY19zdGF0ZWAgb3Igc29tZXRoaW5nIGVsc2UgZmFpbHMgZHVyaW5nIHRoZSB0YXNrIGNyZWF0aW9uLiBJZiB0aGF0IGhhcHBlbnMsIGBiYWRfZm9ya19mcmVlYCBnZXRzIGNhbGxlZCwgd2hpY2ggdWx0aW1hdGVseSBsZWFkcyB0byBgZnJlZV90YXNrYCwgYW5kIHRoZW4gYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgLiBIZXJlJiMzOTtzIHRoZSBraWNrZXI6IGlmIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCAqaGFzbiYjMzk7dCogYmVlbiBjYWxsZWQgeWV0LCB0aGUgY2hpbGQmIzM5O3MgYHJldF9zdGFja2Agc3RpbGwgcG9pbnRzIHRvIHRoZSAqcGFyZW50JiMzOTtzKiBgcmV0X3N0YWNrYCEKClNvLCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AgaXMgZ29pbmcgdG8gZnJlZSB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgISBUaGF0JiMzOTtzIGEgZG91YmxlIGZyZWUgd2FpdGluZyB0byBoYXBwZW4sIG9yIGEgdXNlLWFmdGVyLWZyZWUgZm9yIHRoZSBwYXJlbnQuIFRoZSBwYXJlbnQsIHdoaWNoIGlzIHN0aWxsIHJ1bm5pbmcsIGhhcHBpbHkgY2h1Z3MgYWxvbmcsIHVzaW5nIG1lbW9yeSB0aGF0IGhhcyBqdXN0IGJlZW4gKmZyZWVkKi4gIENsYXNzaWMgVUFGL2RvdWJsZSBmcmVlLgoKTm93LCBpcyB0aGlzIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlPyAgTm8uIEtNU0FOIGlzbiYjMzk7dCB0aGUgdG9vbCBoZXJlLiBUaGlzIGlzIGEgY2xlYXIgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWUuIEtBU0FOIGlzIHRoZSB3YXkgdG8gZ28uIEl0IHdpbGwgY2F0Y2ggdGhlIHBhcmVudCB1c2luZyB0aGUgZnJlZWQgbWVtb3J5IG9yIHRoZSBzZWNvbmQgYXR0ZW1wdCB0byBmcmVlIGl0LgoKVGhlIHByb3Bvc2VkIHBhdGNoIGlzIHNtYXJ0LiBJdCYjMzk7cyBtb3ZpbmcgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGVhcmxpZXIgaW4gdGhlIHByb2Nlc3MuIE5vdyB0aGUgY2hpbGQmIzM5O3MgYHJldF9zdGFja2AgZ2V0cyBzZXQgdG8gYE5VTExgIChhbmQgcG90ZW50aWFsbHkgYWxsb2NhdGVkIGEgbmV3IG9uZSkgYmVmb3JlIGFueSBlcnJvciBwYXRocy4gVGhhdCBmaXhlcyB0aGUgYnVnLiBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgZXhwbGljaXRseSBzZXRzIGB0LSZndDtyZXRfc3RhY2sgPSBOVUxMYC4KCkFscmlnaHQsIGxldCBtZSBzb2xpZGlmeSB0aGlzIHJlYXNvbmluZy4gVGhlIHBhdGNoIGFkZHJlc3NlcyBhIFVBRi9kb3VibGUgZnJlZS4gV2hlbiBhIG5ldyB0YXNrIGlzIGNyZWF0ZWQsIGBkdXBfdGFza19zdHJ1Y3RgIGR1cGxpY2F0ZXMgdGhlIHBhcmVudCYjMzk7cyBgdGFza19zdHJ1Y3RgLCBpbmNsdWRpbmcgZnRyYWNlJiMzOTtzIGByZXRfc3RhY2tgIHBvaW50ZXIuIElmIHNvbWV0aGluZyBnb2VzIHdyb25nICpiZWZvcmUqIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBpcyBydW4sIHRoZSBlcnJvciBwYXRoIGZyZWVzIHRoZSBjaGlsZCwgYnV0IHNpbmNlIGByZXRfc3RhY2tgIGlzIHN0aWxsIHBvaW50aW5nIHRvIHRoZSBwYXJlbnQmIzM5O3Mgc3RhY2ssIGl0IGVuZHMgdXAgZnJlZWluZyB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLiBUaGVuIHRoZSBwYXJlbnQga2VlcHMgcnVubmluZyB1c2luZyBtZW1vcnkgd2hpY2ggaXMgbm93IGZyZWUgYW5kIGhhcyBiZWVuIGZyZWVkLiBUaGlzIGNyZWF0ZXMgYSB1c2UtYWZ0ZXItZnJlZSwgb3IgYSBkb3VibGUgZnJlZS4gS0FTQU4gd2lsbCBjYXRjaCBpdCBiZWNhdXNlIGl0JiMzOTtzIGRlc2lnbmVkIGZvciB0aGlzIHNvcnQgb2YgbWVtb3J5IGNvcnJ1cHRpb24uCgpJIHdpbGwgdGhlcmVmb3JlIG1hcmsgdGhpcyBhcyBuZWVkaW5nIEtBU0FOIGFuZCBub3QgS01TQU4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIxIDEyOjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCYjMzk7cyBgdGFza19zdHJ1Y3RgIHRvIHRoZSBjaGlsZCwgaW5jbHVkaW5nIHRoZSBgcmV0X3N0YWNrYCBwb2ludGVyIHVzZWQgYnkgZnRyYWNlLiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGBjb3B5X3Byb2Nlc3MoKWAgKGUuZy4sIGluIGBjb3B5X2V4ZWNfc3RhdGUoKWApIGJlZm9yZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYCBpcyBjYWxsZWQsIHRoZSBlcnJvciBoYW5kbGluZyBwYXRoIChgYmFkX2ZvcmtfZnJlZWApIHdpbGwgY2FsbCBgZnJlZV90YXNrKClgLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgLiBTaW5jZSB0aGUgY2hpbGQmIzM5O3MgYHJldF9zdGFja2Agc3RpbGwgcG9pbnRzIHRvIHRoZSBwYXJlbnQmIzM5O3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLiBUaGUgcGFyZW50IHRhc2sgd2lsbCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgZnJlZWQgYHJldF9zdGFja2AsIHJlc3VsdGluZyBpbiBhIHVzZS1hZnRlci1mcmVlLCBhbmQgaXQgd2lsbCBiZSBkb3VibGUtZnJlZWQgd2hlbiB0aGUgcGFyZW50IGV2ZW50dWFsbHkgZXhpdHMuXG5cblRoaXMgaXMgYSBjbGFzc2ljIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgdnVsbmVyYWJpbGl0eS4gS0FTQU4gaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGRldGVjdCB1c2UtYWZ0ZXItZnJlZSBhbmQgZG91YmxlIGZyZWUgYnVncywgYW5kIHdpbGwgcmVsaWFibHkgY2F0Y2ggdGhpcyBpc3N1ZS4gVGhlcmUgaXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UsIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgb3IgaW5mb3JtYXRpb24gbGVhayBpbnZvbHZlZCBpbiB0aGlzIGJ1Zywgc28gYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb3ZlcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgZWFybGllciBpbiBgY29weV9wcm9jZXNzKClgIHRvIHByZXZlbnQgYSB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIGJ1Zy4gV2hlbiBhIG5ldyB0YXNrIGlzIGNyZWF0ZWQsIGBkdXBfdGFza19zdHJ1Y3QoKWAgY29waWVzIHRoZSBwYXJlbnQmIzM5O3MgYHRhc2tfc3RydWN0YCB0byB0aGUgY2hpbGQsIGluY2x1ZGluZyB0aGUgYHJldF9zdGFja2AgcG9pbnRlciB1c2VkIGJ5IGZ0cmFjZS4gSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBgY29weV9wcm9jZXNzKClgIChlLmcuLCBpbiBgY29weV9leGVjX3N0YXRlKClgKSBiZWZvcmUgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKWAgaXMgY2FsbGVkLCB0aGUgZXJyb3IgaGFuZGxpbmcgcGF0aCAoYGJhZF9mb3JrX2ZyZWVgKSB3aWxsIGNhbGwgYGZyZWVfdGFzaygpYCwgd2hpY2ggaW4gdHVybiBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYC4gU2luY2UgdGhlIGNoaWxkJiMzOTtzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50JiMzOTtzIGByZXRfc3RhY2tgLCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYCB3aWxsIGVycm9uZW91c2x5IGZyZWUgdGhlIHBhcmVudCYjMzk7cyBgcmV0X3N0YWNrYC4gVGhlIHBhcmVudCB0YXNrIHdpbGwgdGhlbiBjb250aW51ZSB0byB1c2UgdGhlIGZyZWVkIGByZXRfc3RhY2tgLCByZXN1bHRpbmcgaW4gYSB1c2UtYWZ0ZXItZnJlZSwgYW5kIGl0IHdpbGwgYmUgZG91YmxlLWZyZWVkIHdoZW4gdGhlIHBhcmVudCBldmVudHVhbGx5IGV4aXRzLlxuXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NDoxOS42MTE3MzE2NjNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTg2MDg2MTYxMjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRlVOQ1RJT05fVFJBQ0VSXCIsXG4gICAgXCJGVU5DVElPTl9HUkFQSF9UUkFDRVJcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb3ZlcyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgZWFybGllciBpbiBgY29weV9wcm9jZXNzKClgIHRvIHByZXZlbnQgYSB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIGJ1Zy4gV2hlbiBhIG5ldyB0YXNrIGlzIGNyZWF0ZWQsIGBkdXBfdGFza19zdHJ1Y3QoKWAgY29waWVzIHRoZSBwYXJlbnQncyBgdGFza19zdHJ1Y3RgIHRvIHRoZSBjaGlsZCwgaW5jbHVkaW5nIHRoZSBgcmV0X3N0YWNrYCBwb2ludGVyIHVzZWQgYnkgZnRyYWNlLiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGBjb3B5X3Byb2Nlc3MoKWAgKGUuZy4sIGluIGBjb3B5X2V4ZWNfc3RhdGUoKWApIGJlZm9yZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYCBpcyBjYWxsZWQsIHRoZSBlcnJvciBoYW5kbGluZyBwYXRoIChgYmFkX2ZvcmtfZnJlZWApIHdpbGwgY2FsbCBgZnJlZV90YXNrKClgLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgLiBTaW5jZSB0aGUgY2hpbGQncyBgcmV0X3N0YWNrYCBzdGlsbCBwb2ludHMgdG8gdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgLCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzaygpYCB3aWxsIGVycm9uZW91c2x5IGZyZWUgdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgLiBUaGUgcGFyZW50IHRhc2sgd2lsbCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgZnJlZWQgYHJldF9zdGFja2AsIHJlc3VsdGluZyBpbiBhIHVzZS1hZnRlci1mcmVlLCBhbmQgaXQgd2lsbCBiZSBkb3VibGUtZnJlZWQgd2hlbiB0aGUgcGFyZW50IGV2ZW50dWFsbHkgZXhpdHMuXFxuXFxuVGhpcyBpcyBhIGNsYXNzaWMgdXNlLWFmdGVyLWZyZWUgLyBkb3VibGUgZnJlZSB2dWxuZXJhYmlsaXR5LiBLQVNBTiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGV0ZWN0IHVzZS1hZnRlci1mcmVlIGFuZCBkb3VibGUgZnJlZSBidWdzLCBhbmQgd2lsbCByZWxpYWJseSBjYXRjaCB0aGlzIGlzc3VlLiBUaGVyZSBpcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSwgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBvciBpbmZvcm1hdGlvbiBsZWFrIGludm9sdmVkIGluIHRoaXMgYnVnLCBzbyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBvZiBjb3B5X3Byb2Nlc3MoKSBieSBtb3ZpbmcgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpIGVhcmxpZXIuIFRoZSBidWcgaXMgdHJpZ2dlcmVkIHdoZW4gY29weV9wcm9jZXNzKCkgZmFpbHMgKGUuZy4sIGluIGNvcHlfZXhlY19zdGF0ZSgpKSBhbmQgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBGdXp6aW5nIHRoaXMgcmVxdWlyZXMgZW5hYmxpbmcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSIGFuZCBGVU5DVElPTl9UUkFDRVIgdG8gZW5zdXJlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIGVycm9yIHBhdGhzIGFyZSBwcm9wZXJseSB0ZXN0ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjE5LjYxMTczNzc0M1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDA5Njg4NjU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZTJmM2UyNDEzY2QwZDA1NGMzNTAyY2Y3YzFiMTRiYWNkMmE5NGVmZVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIEF1ZyAyMSAxMjo1NDoxOCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuY1xcbmluZGV4IDFlNjg0MDRiZDc3M2UuLmNlYzgyYTY0YTA3Y2QgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2ZvcmsuY1xcbisrKyBiL2tlcm5lbC9mb3JrLmNcXG5AQCAtMjEzOSw2ICsyMTM5LDcgQEAgX19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcyhcXG4gXFx0cCA9IGR1cF90YXNrX3N0cnVjdChjdXJyZW50LCBub2RlKTtcXG4gXFx0aWYgKCFwKVxcbiBcXHRcXHRnb3RvIGZvcmtfb3V0O1xcbitcXHRmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO1xcbiBcXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xcbiBcXHRpZiAocmV0dmFsKVxcbiBcXHRcXHRnb3RvIGJhZF9mb3JrX2ZyZWU7XFxuQEAgLTIxNjUsOCArMjE2Niw2IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXFxuIFxcdCAqL1xcbiBcXHRwLVxcdTAwM2VjbGVhcl9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgXFx1MDAyNiBDTE9ORV9DSElMRF9DTEVBUlRJRCkgPyBhcmdzLVxcdTAwM2VjaGlsZF90aWQgOiBOVUxMO1xcbiBcXG4tXFx0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcXG4tXFxuIFxcdHJ0X211dGV4X2luaXRfdGFzayhwKTtcXG4gXFx0cmF3X3NwaW5fbG9ja19pbml0KFxcdTAwMjZwLVxcdTAwM2VibG9ja2VkX2xvY2spO1xcbiBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6MjAuMDIyMTEyMzkxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6OTk4MzcwNzU5ODEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRlVOQ1RJT05fVFJBQ0VSXCIsXG4gICAgXCJGVU5DVElPTl9HUkFQSF9UUkFDRVJcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSB1c2UtYWZ0ZXItZnJlZSBidWcgaW4gdGhlIGVycm9yIHBhdGggb2YgY29weV9wcm9jZXNzKCkgYnkgbW92aW5nIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKSBlYXJsaWVyLiBUaGUgYnVnIGlzIHRyaWdnZXJlZCB3aGVuIGNvcHlfcHJvY2VzcygpIGZhaWxzIChlLmcuLCBpbiBjb3B5X2V4ZWNfc3RhdGUoKSkgYW5kIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZC4gRnV6emluZyB0aGlzIHJlcXVpcmVzIGVuYWJsaW5nIEZVTkNUSU9OX0dSQVBIX1RSQUNFUiBhbmQgRlVOQ1RJT05fVFJBQ0VSIHRvIGVuc3VyZSB0aGUgbmV3IGluaXRpYWxpemF0aW9uIG9yZGVyIGFuZCBlcnJvciBwYXRocyBhcmUgcHJvcGVybHkgdGVzdGVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBlMmYzZTI0MTNjZDBkMDU0YzM1MDJjZjdjMWIxNGJhY2QyYTk0ZWZlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgMjEgMTI6NTQ6MTggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuY1xuaW5kZXggMWU2ODQwNGJkNzczZS4uY2VjODJhNjRhMDdjZCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9mb3JrLmNcbisrKyBiL2tlcm5lbC9mb3JrLmNcbkBAIC0yMTM5LDYgKzIxMzksNyBAQCBfX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxuIFx0cCA9IGR1cF90YXNrX3N0cnVjdChjdXJyZW50LCBub2RlKTtcbiBcdGlmICghcClcbiBcdFx0Z290byBmb3JrX291dDtcbitcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG4gXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xuIFx0aWYgKHJldHZhbClcbiBcdFx0Z290byBiYWRfZm9ya19mcmVlO1xuQEAgLTIxNjUsOCArMjE2Niw2IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXG4gXHQgKi9cbiBcdHAtXHUwMDNlY2xlYXJfY2hpbGRfdGlkID0gKGNsb25lX2ZsYWdzIFx1MDAyNiBDTE9ORV9DSElMRF9DTEVBUlRJRCkgPyBhcmdzLVx1MDAzZWNoaWxkX3RpZCA6IE5VTEw7XG4gXG4tXHRmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO1xuLVxuIFx0cnRfbXV0ZXhfaW5pdF90YXNrKHApO1xuIFx0cmF3X3NwaW5fbG9ja19pbml0KFx1MDAyNnAtXHUwMDNlYmxvY2tlZF9sb2NrKTtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjIwLjAyMjExNDM0WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTA4MDg4NzE3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBGb3JrIE9wdGltaXphdGlvbiBpbiBLZXJuZWwvZm9yay5jKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCB0aGF0IHNlZW1zIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCB5b3Uga25vdyBob3cgaXQgZ29lcyDigJMgZXZlbiBzbWFsbCBjaGFuZ2VzIGNhbiBiZSBzaWduaWZpY2FudC4gSXQncyBpbiBga2VybmVsL2ZvcmsuY2AsIGFuZCB0aGUga2V5IGhlcmUgaXMgdGhlIHJlbG9jYXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7YC4gVGhleSd2ZSBtb3ZlZCBpdCAqaW5zaWRlKiBgY29weV9wcm9jZXNzKClgLCB3aGljaCBpcyBhIGxpdHRsZSB1bnVzdWFsLiBJdCB3YXMgb3JpZ2luYWxseSBwb3NpdGlvbmVkICphZnRlciogdGhlIGFzc2lnbm1lbnQgdG8gYHAtXHUwMDNlY2xlYXJfY2hpbGRfdGlkYCwgYW5kIG5vdyBpdCdzIGhhcHBlbmluZyByaWdodCBhZnRlciB0aGUgYGR1cF90YXNrX3N0cnVjdChjdXJyZW50LCBub2RlKTtgIGNhbGwuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgaXMgbGlrZWx5IGEgc3VidGxlIGJ1ZyBmaXguIFBlcmhhcHMgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHdhcyBiZWluZyBjYWxsZWQgdG9vIGxhdGUgaW4gdGhlIHByb2Nlc3MsIG9yIG1heWJlIHRoZXJlIHdhcyBhIG1pc3NlZCBleGVjdXRpb24gcGF0aCB0aGF0IHdhcyBpbmFkdmVydGVudGx5IGJ5cGFzc2luZyBpdC4gVGhlIGZhY3QgdGhhdCB0aGUgY2hhbmdlIGlzIHNvIHRpZ2h0bHkgZm9jdXNlZCBzdWdnZXN0cyB0aGV5J3JlIHRyeWluZyB0byBhZGRyZXNzIGEgc3BlY2lmaWMsIGNvbnRhaW5lZCBpc3N1ZS4gSXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlcmUgd2FzIHNvbWUgZXJyb3IgaGFuZGxpbmcgbG9naWMgdGhhdCBjb3VsZCBza2lwIHRoZSBjYWxsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcy5cblxuQmVmb3JlIEkganVtcCB0byBhbnkgZGVmaW5pdGl2ZSBjb25jbHVzaW9ucywgSSBuZWVkIHRvIGRpZyBpbnRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBpdHNlbGYuIFRoYXQncyB0aGUgcmVhbCBrZXkgdG8gdW5kZXJzdGFuZGluZyAqd2h5KiB0aGlzIHNoaWZ0IHdhcyBuZWVkZWQgYW5kIHdoYXQgcG90ZW50aWFsIGltcGFjdCBpdCBoYXMgb24gdGhlIHN5c3RlbSdzIGJlaGF2aW9yLiBUaW1lIHRvIGRlbHZlIGludG8gdGhlIGZ1bmN0aW9uJ3MgaW1wbGVtZW50YXRpb24gYW5kIHVuZGVyc3RhbmQgaXRzIGludGVyYWN0aW9ucyB3aXRoaW4gdGhlIGJyb2FkZXIgdHJhY2luZyBmcmFtZXdvcmsuIFRoaXMgbWlub3IgY2hhbmdlIGhhcyBwaXF1ZWQgbXkgaW50ZXJlc3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNzIsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTgsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NDoyNS4xMDMwMDQ2MzlaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc3MDM5NDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZnRyYWNlX2dyYXBoX2luaXRfdGFza1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvZm9yay5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9mb3JrLmM9MjAxOD1fX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxcbi0tXFxua2VybmVsL2ZvcmsuYy0yMTQxLVxcdFxcdGdvdG8gZm9ya19vdXQ7XFxua2VybmVsL2ZvcmsuYzoyMTQyOlxcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XFxua2VybmVsL2ZvcmsuYy0yMTQzLVxcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjI1LjE1MDcxMzMxOFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMwNjk3NDQ0MjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIGludG8gZnRyYWNlX2dyYXBoX2luaXRfdGFzayoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gc29tZXRoaW5nIHJlbGF0ZWQgdG8gZnRyYWNlJ3MgZ3JhcGggdHJhY2luZyBpbml0aWFsaXphdGlvbi4gVGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBkZWZpbml0aW9uIG9mIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYC4gSSBuZWVkIGEgc29saWQgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGdyYXBoIHRyYWNlciBpcyBzZXQgdXAgZm9yIGEgbmV3bHkgY3JlYXRlZCB0YXNrLiBJIHN1c3BlY3QgaXQnbGwgaW52b2x2ZSBzZXR0aW5nIHVwIHBlci10YXNrIGRhdGEgc3RydWN0dXJlcywgY29uZmlndXJpbmcgdGhlIHRyYWNlIGJ1ZmZlciwgYW5kIGxpa2VseSBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIGdsb2JhbCBncmFwaCB0cmFjZXIgc3RhdGUuIEknbGwgcHJvYmFibHkgZmluZCBzb21lIGludGVyZXN0aW5nIGludGVyYWN0aW9ucyB3aXRoIHRoZSBzY2hlZHVsZXIgaGVyZSB0b28sIHBvc3NpYmx5IGhvb2tzIGludG8gdGFzayBjcmVhdGlvbiBvciBjb250ZXh0IHN3aXRjaGVzLiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzIVxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjQxLCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6MjguMjIwNDYwMTQxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NTc4NjQwODUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZnRyYWNlX2dyYXBoX2luaXRfdGFza1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzQyPWV4dGVybiB0cmFjZV9mdW5jX2dyYXBoX2VudF90IGZ0cmFjZV9ncmFwaF9lbnRyeTtcXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNDMtXFxuaW5jbHVkZS9saW51eC9mdHJhY2UuaDoxMzQ0OmV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNDUtZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzU2PXN0YXRpYyBpbmxpbmUgdm9pZCB1bnBhdXNlX2dyYXBoX3RyYWNpbmcodm9pZClcXG4tLVxcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM2My1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNjQ6c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNjUtc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cXG4tLVxcbmtlcm5lbC9mb3JrLmM9MjAxOD1fX2xhdGVudF9lbnRyb3B5IHN0cnVjdCB0YXNrX3N0cnVjdCAqY29weV9wcm9jZXNzKFxcbi0tXFxua2VybmVsL2ZvcmsuYy0yMTQxLVxcdFxcdGdvdG8gZm9ya19vdXQ7XFxua2VybmVsL2ZvcmsuYzoyMTQyOlxcdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XFxua2VybmVsL2ZvcmsuYy0yMTQzLVxcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XFxuLS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM9MTEzMT12b2lkIGZ0cmFjZV9ncmFwaF9pbml0X2lkbGVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGludCBjcHUpXFxuLS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE1OS0vKiBBbGxvY2F0ZSBhIHJldHVybiBzdGFjayBmb3IgbmV3bHkgY3JlYXRlZCB0YXNrICovXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jOjExNjA6dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE2MS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjI5Ljk3ODMzMDcxNloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzOTg0MTQwNTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2sqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Ag4oCTIGEgcHJldHR5IHNwZWNpZmljIGZ1bmN0aW9uIG5hbWUuIEJhc2VkIG9uIGNvbnRleHQsIGl0J3MgbGlrZWx5IGludm9sdmVkIHdpdGggaW5pdGlhbGl6aW5nIHNvbWV0aGluZyByZWxhdGVkIHRvIGZ1bmN0aW9uIHRyYWNpbmcsIHNwZWNpZmljYWxseSB0aGUgZ3JhcGggdHJhY2VyLiBNeSBndXQgZmVlbGluZyBpcyBpdCdzIGhhbmRsaW5nIHRoZSBzZXR1cCBmb3IgYSBuZXcgdGFzayBvciBwcm9jZXNzLiBOb3csIHdoZXJlIGlzIHRoaXMgZnVuY3Rpb24gZGVmaW5lZD8gQWgsIGl0J3MgaW4gYGtlcm5lbC90cmFjZS9mZ3JhcGguY2AuIFRpbWUgdG8gZGlnIGludG8gdGhhdCBmaWxlIGFuZCBzZWUgZXhhY3RseSBob3cgaXQgd29ya3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBpbml0aWFsaXphdGlvbiBlbnRhaWxzLCB3aGF0IGRhdGEgc3RydWN0dXJlcyBpdCBtYW5pcHVsYXRlcywgYW5kIHdoYXQgaW1wbGljYXRpb25zIGl0IGhhcyBmb3IgdGhlIG92ZXJhbGwgdHJhY2luZyBtZWNoYW5pc20uIExldCdzIHNlZSB3aGF0IHdlIGNhbiBmaW5kIVxuXG5cbiIsIklucHV0VG9rZW5zIjozMjk1LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6MzMuMzc2NzQ2ODM4WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIwMTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC90cmFjZS9mZ3JhcGguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTU5LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTU5OlxcdC8qIEFsbG9jYXRlIGEgcmV0dXJuIHN0YWNrIGZvciBuZXdseSBjcmVhdGVkIHRhc2sgKi9cXG4xMTYwOlxcdHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxuMTE2MTpcXHR7XFxuMTE2MjpcXHRcXHQvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHVzZSB0aGUgcGFyZW50IHJldF9zdGFjayAqL1xcbjExNjM6XFx0XFx0dC1cXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtcXG4xMTY0OlxcdFxcdHQtXFx1MDAzZWN1cnJfcmV0X3N0YWNrID0gMDtcXG4xMTY1OlxcdFxcdHQtXFx1MDAzZWN1cnJfcmV0X2RlcHRoID0gLTE7XFxuMTE2NjpcXHRcXG4xMTY3OlxcdFxcdGlmIChmdHJhY2VfZ3JhcGhfYWN0aXZlKSB7XFxuMTE2ODpcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2s7XFxuMTE2OTpcXHRcXG4xMTcwOlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxcbjExNzE6XFx0XFx0XFx0XFx0cmV0dXJuO1xcbjExNzI6XFx0XFxuMTE3MzpcXHRcXHRcXHRyZXRfc3RhY2sgPSBrbWVtX2NhY2hlX2FsbG9jKGZncmFwaF9zdGFja19jYWNoZXAsIEdGUF9LRVJORUwpO1xcbjExNzQ6XFx0XFx0XFx0aWYgKCFyZXRfc3RhY2spXFxuMTE3NTpcXHRcXHRcXHRcXHRyZXR1cm47XFxuMTE3NjpcXHRcXHRcXHRncmFwaF9pbml0X3Rhc2sodCwgcmV0X3N0YWNrKTtcXG4xMTc3OlxcdFxcdH1cXG4xMTc4OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6MzMuMzc2ODY4NDI5WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTk2MDM1OTEwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIG1vdmluZyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgdG8gYSBzbGlnaHRseSBlYXJsaWVyIHBvaW50LCBzcGVjaWZpY2FsbHkgcmlnaHQgYWZ0ZXIgYHAgPSBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7YC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhpcyBpcyBhIGRlZmVuc2l2ZSBtb3ZlLiBJdCdzIGFsbW9zdCBjZXJ0YWlubHkgdG8gZW5zdXJlIHRoYXQgYHQtXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtgIGlzIHNldCAqYmVmb3JlKiBhbnkgcG90ZW50aWFsIGVycm9yIGNvbmRpdGlvbnMgdGhhdCBtaWdodCBjYXVzZSB0aGUgc3lzdGVtIHRvIGNhbGwgYGZyZWVfdGFzayhwKWAgb3IgYSBzaW1pbGFyIGZ1bmN0aW9uLiBJZiB0aGF0IHdhc24ndCBkb25lLCB0aGVyZSdzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHdlJ2QgdHJ5IHRvIGZyZWUgdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgIGJ5IGFjY2lkZW50IGR1cmluZyBhbiBlcnJvciBwYXRoLCBiZWNhdXNlIGBkdXBfdGFza19zdHJ1Y3RgIGNvcGllcyB0aGF0LlxuXG5Ib2xkIG9uLCAqcmlnaHQqLCBgZHVwX3Rhc2tfc3RydWN0YCBkb2VzIGEgZnVsbCBjb3B5IG9mIHRoZSBlbnRpcmUgYHRhc2tfc3RydWN0YC4gVGhhdCBtZWFucyBpZiB0aGUgcGFyZW50IHRhc2sgaGFzIGByZXRfc3RhY2tgIGFsbG9jYXRlZCwgdGhlIGNoaWxkIHRhc2sgd2lsbCBpbml0aWFsbHkgcG9pbnQgdG8gKnRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbiouIFNvLCBpZiBhbiBlcnJvciBoYXBwZW5zICpiZWZvcmUqIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBydW5zLCBmb3IgaW5zdGFuY2UsIGluIGBjb3B5X2V4ZWNfc3RhdGVgLCB0aGUgY2hpbGQgdGFzayBjb3VsZCBnZXQgZnJlZWQuIEFuZCBpZiBpdCBkb2VzLCBpdHMgYHJldF9zdGFja2AgcG9pbnRlciAod2hpY2ggaXMgYWN0dWFsbHkgdGhlIHBhcmVudCdzISkgY291bGQgYmUgZnJlZWQgb3IgY29ycnVwdGVkLCB3aGljaCB3b3VsZCBiZSBkaXNhc3Ryb3VzLlxuXG5XYWl0IGEgc2Vjb25kLi4uIGlzbid0IGBmcmVlX3Rhc2tgIHN1cHBvc2VkIHRvIGNhbGwgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2sodClgPyBJZiB0aGF0J3MgdGhlIGNhc2UsIHRoZW4gdGhpcyBjaGFuZ2UgbWlnaHQgbm90IGV2ZW4gYmUgbmVjZXNzYXJ5LiBMZXQgbWUgcXVpY2tseSBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIGFuZCBzZWUgaWYgaXQgZGVhbHMgd2l0aCB0aGlzIHNjZW5hcmlvLlxuXG5cbiIsIklucHV0VG9rZW5zIjozODM0LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjI3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6NDMuMzM3MjI5NzM2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzA1ODE1Nzk3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvZnRyYWNlLmg9MTM0ND1leHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCk7XFxuaW5jbHVkZS9saW51eC9mdHJhY2UuaDoxMzQ1OmV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNDYtZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oPTEzNjQ9c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNjU6c3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH1cXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oLTEzNjYtc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X2lkbGVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGludCBjcHUpIHsgfVxcbi0tXFxua2VybmVsL2ZvcmsuYz01MzM9dm9pZCBmcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXFxuLS1cXG5rZXJuZWwvZm9yay5jLTU1NS1cXHRydF9tdXRleF9kZWJ1Z190YXNrX2ZyZWUodHNrKTtcXG5rZXJuZWwvZm9yay5jOjU1NjpcXHRmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHRzayk7XFxua2VybmVsL2ZvcmsuYy01NTctXFx0YXJjaF9yZWxlYXNlX3Rhc2tfc3RydWN0KHRzayk7XFxuLS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM9MTE2MD12b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxcbi0tXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNzktXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jOjExODA6dm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE4MS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU0OjQ1LjA0MzA1MDk1M1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzU3MjE4NDMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkncmUgbXkgb3duOlxuXG4qKkFuYWx5emluZyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AqKlxuXG5BbHJpZ2h0LCBsZXQncyB0YWtlIGEgbG9vayBhdCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AuIE15IGluaXRpYWwgdGhvdWdodCBpcywgd2hhdCBzcGVjaWZpY2FsbHkgZG9lcyB0aGlzIGZ1bmN0aW9uIHJlcHJlc2VudCB3aXRoaW4gdGhlIGZ0cmFjZSBmcmFtZXdvcms/IEl0J3MgY2xlYXJseSB0aWVkIHRvIHRhc2sgZXhpdCBldmVudHMsIGJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTXkgaW1tZWRpYXRlIHF1ZXN0aW9ucyBhcmU6IGhvdyBkb2VzIGl0IGZpdCBpbnRvIHRoZSBicm9hZGVyIHRyYWNpbmcgcGljdHVyZT8gSXMgdGhpcyBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgY2xlYW51cCwgYm9va2tlZXBpbmcsIGRhdGEgYWdncmVnYXRpb24sIG9yIHBlcmhhcHMgc29tZSBraW5kIG9mIG5vdGlmaWNhdGlvbiByZWxhdGVkIHRvIHRoZSB0ZXJtaW5hdGlvbiBvZiBhIHRyYWNlZCB0YXNrPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgSSBuZWVkIHRvIGNvbnNpZGVyPyBLbm93aW5nIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGtlcm5lbCdzIHRyYWNpbmcgZGVzaWduLCBJJ20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgd2hlcmUgdGhpcyBmdW5jdGlvbiBzaXRzIGluIHRoZSBleGVjdXRpb24gcGF0aCB3aGVuIGEgcHJvY2VzcyBleGl0cyB3aGlsZSBiZWluZyB0cmFjZWQuIEkgd29uZGVyIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgdGhpczsgaXMgaXQgb25seSBkdXJpbmcgYSBcIm5vcm1hbFwiIGV4aXQgb3IgYWxzbyBmb3IgYWJub3JtYWwgdGVybWluYXRpb25zIGxpa2Ugc2lnbmFscz8gVGhlIGludGVycGxheSB3aXRoIG90aGVyIGZ0cmFjZSBncmFwaCBmdW5jdGlvbnMgaXMga2V5IGhlcmUuIEknbGwgbmVlZCB0byByZW1lbWJlciB0byBjaGVjayBmb3IgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBsb2NraW5nIG1lY2hhbmlzbXMgdGhhdCBwcm90ZWN0IHNoYXJlZCBkYXRhIHN0cnVjdHVyZXMuIFRoaXMgb25lIGlzIGdvaW5nIHRvIGJlIGltcG9ydGFudCBpbiB0ZXJtcyBvZiBob3cgdGhlIHRyYWNlZCB0YXNrIGV4aXRzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGVmaW5pdGVseSBwcm92aWRlIGluc2lnaHQgaW50byB0cmFjZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODYzLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6NDguODAwMjcxNzI2WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk5MjAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC90cmFjZS9mZ3JhcGguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTgwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTgwOlxcdHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxuMTE4MTpcXHR7XFxuMTE4MjpcXHRcXHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2sgPSB0LVxcdTAwM2VyZXRfc3RhY2s7XFxuMTE4MzpcXHRcXG4xMTg0OlxcdFxcdHQtXFx1MDAzZXJldF9zdGFjayA9IE5VTEw7XFxuMTE4NTpcXHRcXHQvKiBOVUxMIG11c3QgYmVjb21lIHZpc2libGUgdG8gSVJRcyBiZWZvcmUgd2UgZnJlZSBpdDogKi9cXG4xMTg2OlxcdFxcdGJhcnJpZXIoKTtcXG4xMTg3OlxcdFxcbjExODg6XFx0XFx0aWYgKHJldF9zdGFjaykge1xcbjExODk6XFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRSghZmdyYXBoX3N0YWNrX2NhY2hlcCkpXFxuMTE5MDpcXHRcXHRcXHRcXHRyZXR1cm47XFxuMTE5MTpcXHRcXHRcXHRrbWVtX2NhY2hlX2ZyZWUoZmdyYXBoX3N0YWNrX2NhY2hlcCwgcmV0X3N0YWNrKTtcXG4xMTkyOlxcdFxcdH1cXG4xMTkzOlxcdH1cXG4xMTk0OlxcdFxcbjExOTU6XFx0I2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRVxcbjExOTY6XFx0c3RhdGljIGludCBmZ3JhcGhfcGlkX2Z1bmMoc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnQgKnRyYWNlLFxcbjExOTc6XFx0XFx0XFx0XFx0ICAgc3RydWN0IGZncmFwaF9vcHMgKmdvcHMsXFxuMTE5ODpcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgZnRyYWNlX3JlZ3MgKmZyZWdzKVxcbjExOTk6XFx0e1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NDo0OC44MDAzNzIyNDZaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTg1MzUxNDM1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLZXJuZWwgQnVnIEZpeDogV29ydGggRnV6emluZz8qKlxuXG5Pa2F5LCBzbyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AgKmRvZXMqIGZyZWUgYHQtXHUwMDNlcmV0X3N0YWNrYC4gVGhhdCdzIHRoZSBzdGFydGluZyBwb2ludC4gQW5kIGlmIGBjb3B5X3Byb2Nlc3NgIGZhaWxzICpiZWZvcmUqIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBnZXRzIGNhbGxlZCwgYGZyZWVfdGFzayhwKWAga2lja3MgaW4uIFNpbmNlIGBwYCBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgY3VycmVudCB0YXNrLCBpdHMgYHJldF9zdGFja2Agd2lsbCBwb2ludCB0byB0aGUgc2FtZSBtZW1vcnkgYXMgdGhlIHBhcmVudCB0YXNrLiBOb3csIGhlcmUncyB0aGUga2lja2VyOiBgZnJlZV90YXNrKHApYCBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhwKWAsIGFuZCAqdGhhdCogZnJlZXMgdGhlICpwYXJlbnQncyogYHJldF9zdGFja2AhIENsYXNzaWMgdXNlLWFmdGVyLWZyZWUuXG5cblRoZSBmaXggbW92ZXMgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socClgIHRvIGhhcHBlbiBpbW1lZGlhdGVseSBhZnRlciBgZHVwX3Rhc2tfc3RydWN0YCB0byBhdm9pZCB0aGlzLiBTZWVtcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLCBmaXhpbmcgYSBjb25kaXRpb24gd2hlcmUgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkICphbmQqIGBjb3B5X3Byb2Nlc3NgIGZhaWxzIGVhcmx5LlxuXG5TbywgaXMgdGhpcyB3b3J0aCBmdXp6aW5nPyBUaGF0J3MgdGhlIHF1ZXN0aW9uLiBUaGUgY29kZSBjaGFuZ2UgaXRzZWxmIGlzIG1pbmltYWw7IGp1c3QgbW92aW5nIGEgZnVuY3Rpb24gY2FsbCBhcm91bmQuIEl0ICpmaXhlcyogYSBidWcuIERvZXMgaXQgaW50cm9kdWNlIG5ldyBsb2dpYyB0aGF0IG1pZ2h0IGJlIHZ1bG5lcmFibGU/IEkgZG9uJ3QgdGhpbmsgc28uIEl0J3MganVzdCBpbml0aWFsaXphdGlvbiBtb3ZlZCBlYXJsaWVyLlxuXG5IbW0sIGJ1dCBpZiBpdCdzIGEgYnVnIGZpeCwgZG8gdGhlIGluc3RydWN0aW9ucyBhcHBseT8gVGhleSBzYXkgXCJSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zLi4uIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMuLi4gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cy4uLiBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2guLi4gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2guLi4gRHJpdmVyIC5yZW1vdmUuLi5cIiBEb2Vzbid0IGV4cGxpY2l0bHkgc2F5IHRvIHJldHVybiBmYWxzZSBmb3Igc2ltcGxlIGJ1ZyBmaXhlcywgYnV0IHRoZSBwcm9tcHQgZW1waGFzaXplcyBmdW5jdGlvbmFsIGNoYW5nZXMuXG5cblRoaXMgKmRvZXMqIG1vZGlmeSBgY29weV9wcm9jZXNzYCBpbiBga2VybmVsL2ZvcmsuY2AuIFRoYXQncyBjb3JlIGtlcm5lbCBsb2dpYywgYW5kIGl0ICppcyogcmVhY2hhYmxlLiBCdXQgdGhlIGNoYW5nZSBpcyBqdXN0IGFuIG9yZGVyIGNoYW5nZS4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBpbnN0cnVjdGlvbnMgd2FudCBtZSB0byB2ZXJpZnkgaXQncyBleGVjdXRhYmxlLlxuXG5Pa2F5LCBpZiBJICpkbyogcmV0dXJuIHRydWUgZm9yIGBXb3J0aEZ1enppbmdgLCB3aGF0IGRvIEkgcHV0IGluIGBGb2N1c1N5bWJvbHNgPyBUaGUgcHJvbXB0IHdhcm5zIGFnYWluc3QgaG90LXBhdGggZnVuY3Rpb25zLiBgY29weV9wcm9jZXNzYCBpcyBkZWZpbml0ZWx5IGhvdC1wYXRoLiBJcyB0aGVyZSBhIGxlc3MgY29tbW9uIGZ1bmN0aW9uIHRvIGZvY3VzIG9uPyBNYXliZSBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2A/IEJ1dCB0aGF0J3Mgc3RpbGwgY2FsbGVkIGZyb20gYGNvcHlfcHJvY2Vzc2AsIHdoaWNoIGlzIGhvdC1wYXRoLlxuXG5XYWl0IGEgc2Vjb25kLCB0aGUgYnVnICpvbmx5KiB0cmlnZ2VycyB3aGVuIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgaXMgZW5hYmxlZC4gVGhhdCdzIGEga2V5IGRldGFpbCEgU28gdGhlIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGNvbmZpZyBpcyBhIHByZXJlcXVpc2l0ZS4gTGV0IG1lIGNoZWNrIHRoZSBLY29uZmlnIGZvciBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgdG8gY29uZmlybSB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDg0LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTg0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTQ6NTguNjUzODg5MTI1WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTY5NjA5MjkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC90cmFjZS9LY29uZmlnPTIzNT1jb25maWcgRlVOQ1RJT05fVFJBQ0VSXFxuLS1cXG5rZXJuZWwvdHJhY2UvS2NvbmZpZy0yNTMtXFxua2VybmVsL3RyYWNlL0tjb25maWc6MjU0OmNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcXG5rZXJuZWwvdHJhY2UvS2NvbmZpZy0yNTUtXFx0Ym9vbCBcXFwiS2VybmVsIEZ1bmN0aW9uIEdyYXBoIFRyYWNlclxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6MDAuMjIzNTAzMzM2WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0NzUyMDE4MjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgcmV2aWV3aW5nIHRoZSBLY29uZmlnIGZvciBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYDpcblxuKipBbmFseXppbmcgdGhlIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIEtjb25maWcqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhlIEtjb25maWcgZm9yIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29uZmlndXJhdGlvbiBvcHRpb25zLCBkZXBlbmRlbmNpZXMsIGFuZCBpbXBsaWNhdGlvbnMuIEknbSBsb29raW5nIGZvciB0aGUgY29yZSBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgaXRzIGJlaGF2aW9yLCBhbnkgY29uZGl0aW9uYWwgbG9naWMsIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggb3RoZXIgdHJhY2luZyBtZWNoYW5pc21zLiBTcGVjaWZpY2FsbHksIEknbSB0cnlpbmcgdG8gZGV0ZXJtaW5lOiBXaGF0IGFyZSB0aGUgYmFzZSByZXF1aXJlbWVudHMgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZT8gRG9lcyBpdCBkZXBlbmQgb24gc3BlY2lmaWMgY29tcGlsZXIgdmVyc2lvbnMgb3Iga2VybmVsIGZlYXR1cmVzPyBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRpZWQgdG8gcGFydGljdWxhciBjb25maWd1cmF0aW9ucywgZXNwZWNpYWxseSBpbiBoaWdoLWxvYWQgc2NlbmFyaW9zPyBJJ2xsIGFsc28gYmUgc2VhcmNoaW5nIGZvciByZWxhdGlvbnNoaXBzIHRvIHRoZSBgZnRyYWNlYCBpbmZyYXN0cnVjdHVyZSBhbmQgYW55IGNvbmZsaWN0cyB3aXRoIG90aGVyIHRyYWNpbmcgZmVhdHVyZXMuIEl0J3MgY3J1Y2lhbCB0byBpZGVudGlmeSB0aGUgcG90ZW50aWFsIGltcGFjdCBvbiBzeXN0ZW0gb3ZlcmhlYWQuIExldCdzIHNlZSBob3cgd2VsbCBkZWZpbmVkIHRoZSBkZXBlbmRlbmNpZXMgYXJlLCBhbmQgaWYgdGhlIGhlbHAgdGV4dCBpcyB1c2VmdWwgb3Igd2hldGhlciBpdCBpcyB2YWd1ZS4gSSBhbSBnb2luZyB0byBtYWtlIGEganVkZ2VtZW50IGNhbGwgaWYgaXQgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZCBmb3IgbXkgcHJvamVjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6Njc2MSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjAzLjY5ODcwODQyN1oiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjU4MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3RyYWNlL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMjU0LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjU0OlxcdGNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcXG4gMjU1OlxcdFxcdGJvb2wgXFxcIktlcm5lbCBGdW5jdGlvbiBHcmFwaCBUcmFjZXJcXFwiXFxuIDI1NjpcXHRcXHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXFxuIDI1NzpcXHRcXHRkZXBlbmRzIG9uIEZVTkNUSU9OX1RSQUNFUlxcbiAyNTg6XFx0XFx0ZGVwZW5kcyBvbiAhWDg2XzMyIHx8ICFDQ19PUFRJTUlaRV9GT1JfU0laRVxcbiAyNTk6XFx0XFx0ZGVmYXVsdCB5XFxuIDI2MDpcXHRcXHRoZWxwXFxuIDI2MTpcXHRcXHQgIEVuYWJsZSB0aGUga2VybmVsIHRvIHRyYWNlIGEgZnVuY3Rpb24gYXQgYm90aCBpdHMgcmV0dXJuXFxuIDI2MjpcXHRcXHQgIGFuZCBpdHMgZW50cnkuXFxuIDI2MzpcXHRcXHQgIEl0cyBmaXJzdCBwdXJwb3NlIGlzIHRvIHRyYWNlIHRoZSBkdXJhdGlvbiBvZiBmdW5jdGlvbnMgYW5kXFxuIDI2NDpcXHRcXHQgIGRyYXcgYSBjYWxsIGdyYXBoIGZvciBlYWNoIHRocmVhZCB3aXRoIHNvbWUgaW5mb3JtYXRpb24gbGlrZVxcbiAyNjU6XFx0XFx0ICB0aGUgcmV0dXJuIHZhbHVlLiBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUgY3VycmVudCByZXR1cm5cXG4gMjY2OlxcdFxcdCAgYWRkcmVzcyBvbiB0aGUgY3VycmVudCB0YXNrIHN0cnVjdHVyZSBpbnRvIGEgc3RhY2sgb2YgY2FsbHMuXFxuIDI2NzpcXHRcXG4gMjY4OlxcdGNvbmZpZyBGVU5DVElPTl9HUkFQSF9SRVRWQUxcXG4gMjY5OlxcdFxcdGJvb2wgXFxcIktlcm5lbCBGdW5jdGlvbiBHcmFwaCBSZXR1cm4gVmFsdWVcXFwiXFxuIDI3MDpcXHRcXHRkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlJFR1NcXG4gMjcxOlxcdFxcdGRlcGVuZHMgb24gRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXFxuIDI3MjpcXHRcXHRkZWZhdWx0IG5cXG4gMjczOlxcdFxcdGhlbHBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6MDMuNjk4ODM2Mjk3WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgxMTEyOTQyMTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyB0aGUgYGNvcHlfcHJvY2VzcygpYCBDaGFuZ2UqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBjb25maWdzLCBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYCBhbmQgYEZVTkNUSU9OX1RSQUNFUmAuIFRoZSBjaGFuZ2UgaXMgaW4gYGNvcHlfcHJvY2VzcygpYCwgc3BlY2lmaWNhbGx5IHdoZXJlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBpcyBjYWxsZWQuIE15IGluaXRpYWwgZ3V0IGZlZWxpbmcgaXMsIFwiSXMgdGhpcyBldmVuIHdvcnRoIGZ1enppbmc/XCIgVGhlIG1vZGlmaWNhdGlvbiBpcyB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYCwgd2hpY2ggZ2V0cyBleGVjdXRlZCBvbiBldmVyeSBgZm9yaygpYCBhbmQgYGNsb25lKClgLiBFc3NlbnRpYWxseSwgaWYgd2UgZnV6eiB0aGlzLCB3ZSdyZSByZWFsbHkganVzdCBmdXp6aW5nIGBmb3JrKClgIGl0c2VsZiwgYnV0IHdpdGggYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgYWN0aXZlLiBBbmQgd2UgYWxyZWFkeSBmdXp6IGBmb3JrKClgIHByZXR0eSBoZWF2aWx5LCByaWdodD9cblxuVGhlIGNvcmUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiBJcyB0aGVyZSBhIG1vcmUgdGFyZ2V0ZWQgZnVuY3Rpb24gb3IgYXJlYSB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYCB0aGF0J3Mgc3BlY2lmaWNhbGx5IHdvcnRoIGZvY3VzaW5nIG9uPyBUaGUgdHJpZ2dlciBmb3IgdGhpcyBidWcgaXMgcmVsYXRlZCB0byBhbiBlYXJseSBmYWlsdXJlIHdpdGhpbiBgY29weV9wcm9jZXNzKClgLiBTbywgdGhlIG1vcmUgaW50ZXJlc3RpbmcgYXZlbnVlIGlzOiB3aGF0IGNhbiBjYXVzZSBgY29weV9wcm9jZXNzKClgIHRvIGZhaWwgZWFybHk/IExldCdzIHpvb20gaW4gb24gdGhhdCBzZWN0aW9uIG9mIHRoZSBjb2RlIGJldHdlZW4gYGR1cF90YXNrX3N0cnVjdGAgYW5kIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBvZiBgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyBpbiB0aG9zZSBsaW5lcyB0aGF0IGNvdWxkIGxlYWQgdG8gYW4gZWFybHkgZXhpdCBhbmQgaG93IGl0IG1pZ2h0IGludGVyYWN0IHdpdGggdGhlIHRyYWNlci5cblxuXG4iLCJJbnB1dFRva2VucyI6NzM1NSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjExLjgxMDEzMzM3M1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTI3NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2ZvcmsuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMTM5LFxuICBcIkxpbmVDb3VudFwiOiAzMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMTM5OlxcdFxcdHAgPSBkdXBfdGFza19zdHJ1Y3QoY3VycmVudCwgbm9kZSk7XFxuMjE0MDpcXHRcXHRpZiAoIXApXFxuMjE0MTpcXHRcXHRcXHRnb3RvIGZvcmtfb3V0O1xcbjIxNDI6XFx0XFx0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcXG4yMTQzOlxcdFxcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XFxuMjE0NDpcXHRcXHRpZiAocmV0dmFsKVxcbjIxNDU6XFx0XFx0XFx0Z290byBiYWRfZm9ya19mcmVlO1xcbjIxNDY6XFx0XFx0cC1cXHUwMDNlZmxhZ3MgXFx1MDAyNj0gflBGX0tUSFJFQUQ7XFxuMjE0NzpcXHRcXHRpZiAoYXJncy1cXHUwMDNla3RocmVhZClcXG4yMTQ4OlxcdFxcdFxcdHAtXFx1MDAzZWZsYWdzIHw9IFBGX0tUSFJFQUQ7XFxuMjE0OTpcXHRcXHRpZiAoYXJncy1cXHUwMDNldXNlcl93b3JrZXIpIHtcXG4yMTUwOlxcdFxcdFxcdC8qXFxuMjE1MTpcXHRcXHRcXHQgKiBNYXJrIHVzIGEgdXNlciB3b3JrZXIsIGFuZCBibG9jayBhbnkgc2lnbmFsIHRoYXQgaXNuJ3RcXG4yMTUyOlxcdFxcdFxcdCAqIGZhdGFsIG9yIFNUT1BcXG4yMTUzOlxcdFxcdFxcdCAqL1xcbjIxNTQ6XFx0XFx0XFx0cC1cXHUwMDNlZmxhZ3MgfD0gUEZfVVNFUl9XT1JLRVI7XFxuMjE1NTpcXHRcXHRcXHRzaWdpbml0c2V0aW52KFxcdTAwMjZwLVxcdTAwM2VibG9ja2VkLCBzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHU1RPUCkpO1xcbjIxNTY6XFx0XFx0fVxcbjIxNTc6XFx0XFx0aWYgKGFyZ3MtXFx1MDAzZWlvX3RocmVhZClcXG4yMTU4OlxcdFxcdFxcdHAtXFx1MDAzZWZsYWdzIHw9IFBGX0lPX1dPUktFUjtcXG4yMTU5OlxcdFxcbjIxNjA6XFx0XFx0aWYgKGFyZ3MtXFx1MDAzZW5hbWUpXFxuMjE2MTpcXHRcXHRcXHRzdHJzY3B5X3BhZChwLVxcdTAwM2Vjb21tLCBhcmdzLVxcdTAwM2VuYW1lLCBzaXplb2YocC1cXHUwMDNlY29tbSkpO1xcbjIxNjI6XFx0XFxuMjE2MzpcXHRcXHRwLVxcdTAwM2VzZXRfY2hpbGRfdGlkID0gKGNsb25lX2ZsYWdzIFxcdTAwMjYgQ0xPTkVfQ0hJTERfU0VUVElEKSA/IGFyZ3MtXFx1MDAzZWNoaWxkX3RpZCA6IE5VTEw7XFxuMjE2NDpcXHRcXHQvKlxcbjIxNjU6XFx0XFx0ICogVElEIGlzIGNsZWFyZWQgaW4gbW1fcmVsZWFzZSgpIHdoZW4gdGhlIHRhc2sgZXhpdHNcXG4yMTY2OlxcdFxcdCAqL1xcbjIxNjc6XFx0XFx0cC1cXHUwMDNlY2xlYXJfY2hpbGRfdGlkID0gKGNsb25lX2ZsYWdzIFxcdTAwMjYgQ0xPTkVfQ0hJTERfQ0xFQVJUSUQpID8gYXJncy1cXHUwMDNlY2hpbGRfdGlkIDogTlVMTDtcXG4yMTY4OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NToxMS44MTAyODg3MzNaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzk3MTY4NzYwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3NpbmcgYXMgYW4gZXhwZXJ0OlxuXG4qKkFuYWx5emluZyB0aGUgUG90ZW50aWFsIElzc3VlIGluIFRhc2sgQ2xvbmluZyoqXG5cblJpZ2h0LCBzbyBJJ20gbG9va2luZyBhdCB0aGUgYGR1cF90YXNrX3N0cnVjdGAgYW5kIHRoZSBvbGQgbG9jYXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIOKAkyBpbnRlcmVzdGluZy4gSXQncyBhbG1vc3QgYWx3YXlzIGEgZ29vZCBleGVyY2lzZSB0byByZXZpc2l0IHdoZXJlIGEgZnVuY3Rpb24gb25jZSBsaXZlZCwgYW5kIHdoeSBpdCBtb3ZlZC4gVGhlIGNyaXRpY2FsIHBvaW50IG9mIGNvbmNlcm4sIHRoZSBwb3RlbnRpYWwgZmFpbHVyZSBwb2ludCBpZiBzb21ldGhpbmcgYnJlYWtzIGJldHdlZW4gdGhlc2UgdHdvLCBzZWVtcyB0byBiZSBgY29weV9leGVjX3N0YXRlKGNsb25lX2ZsYWdzLCBwKWAuIFRoYXQgbG9va3MgbGlrZSB0aGUgY3VscHJpdC4gSSBuZWVkIHRvIHRha2UgYSBjbG9zZXIgbG9vayBhdCB3aGF0IGBjb3B5X2V4ZWNfc3RhdGVgIGlzIGRvaW5nLiBUaGlzIGhhcyBhbGwgdGhlIGhhbGxtYXJrcyBvZiBhIHBvdGVudGlhbCBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGlmIG5vdCBkb25lIGNvcnJlY3RseSwgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgaW50ZXJhY3Rpb25zIHdpdGggYGNsb25lX2ZsYWdzYC4gSXQgY291bGQgYmUgcmVsYXRlZCB0byBzb21lIG9mIHRoZSBpc3N1ZXMgSSd2ZSBiZWVuIHNlZWluZyB3aXRoIHByb2Nlc3MgY3JlYXRpb24gYW5kIHRyYWNpbmcuIFRpbWUgdG8gZGl2ZSBpbnRvIHRoZSBjb2RlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjgzNDAsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjE1Ljc4MTk3OTA0NloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTMyMzM4MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29weV9leGVjX3N0YXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9mb3JrLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2ZvcmsuYz0xNTc0PXN0YXRpYyBpbnQgY29weV9tbSh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbi0tXFxua2VybmVsL2ZvcmsuYy0xNjEwLVxcbmtlcm5lbC9mb3JrLmM6MTYxMTpzdGF0aWMgaW50IGNvcHlfZXhlY19zdGF0ZSh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbmtlcm5lbC9mb3JrLmMtMTYxMi17XFxuLS1cXG5rZXJuZWwvZm9yay5jPTIwMTg9X19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcyhcXG4tLVxcbmtlcm5lbC9mb3JrLmMtMjE0Mi1cXHRmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApO1xcbmtlcm5lbC9mb3JrLmM6MjE0MzpcXHRyZXR2YWwgPSBjb3B5X2V4ZWNfc3RhdGUoY2xvbmVfZmxhZ3MsIHApO1xcbmtlcm5lbC9mb3JrLmMtMjE0NC1cXHRpZiAocmV0dmFsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NToxNS44MzUyMTkwNjVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDY1NDMyNjEzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJ20gZGVlcGx5IGZhbWlsaWFyIHdpdGggY29kZSBleGVjdXRpb24gYW5kIHByb2dyYW0gc3RhdGVzOlxuXG4qKkFuYWx5emluZyBgY29weV9leGVjX3N0YXRlYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gYGNvcHlfZXhlY19zdGF0ZWAuIFRoYXQgZnVuY3Rpb24gbmFtZSBpdHNlbGYgaXMgcHJldHR5IHRlbGxpbmcuIEl0IGltcGxpZXMgd2UncmUgZGVhbGluZyB3aXRoIGNyZWF0aW5nIGEgc25hcHNob3QsIGEgZHVwbGljYXRlLCBvZiB0aGUgcnVubmluZyBleGVjdXRpb24gZW52aXJvbm1lbnQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgKndoYXQqIGl0J3MgY29weWluZy4gSXMgaXQgdGhlIGVudGlyZSBwcm9jZXNzIG1lbW9yeSBzcGFjZT8gSnVzdCB0aGUgcmVnaXN0ZXIgdmFsdWVzPyBUaGUgcHJvZ3JhbSBjb3VudGVyPyBUaGUgc3RhY2s/IFRoZSBoZWFwPyBUaGUgb3BlbiBmaWxlIGRlc2NyaXB0b3JzP1xuXG5UaGUgaW1wbGljYXRpb25zIGFyZSBodWdlLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHRoZSBcInN0YXRlLlwiIEEgZnVsbCBtZW1vcnkgY29weSBpcyByZXNvdXJjZS1pbnRlbnNpdmUgYnV0IG9mZmVycyBhIHZlcnkgcHJlY2lzZSBzbmFwc2hvdC4gU2VsZWN0aXZlIGNvcHlpbmcgaXMgbW9yZSBlZmZpY2llbnQgYnV0IHJpc2tzIGxvc2luZyBjcml0aWNhbCBpbmZvcm1hdGlvbi4gSSdsbCBuZWVkIHRvIGxvb2sgYXQgdGhlIGltcGxlbWVudGF0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlIHRyYWRlLW9mZnMuXG5cbkknbSB0aGlua2luZyBhYm91dCB0aGUgc2NlbmFyaW9zIHdoZXJlIHlvdSBtaWdodCB1c2Ugc3VjaCBhIGZ1bmN0aW9uLiBEZWJ1Z2dpbmcgaXMgb2J2aW91cyDigJMgc2F2aW5nIGEgc3RhdGUgdG8gc3RlcCB0aHJvdWdoIGxhdGVyLiBCdXQgdGhlcmUgYXJlIG90aGVyczogcHJvY2VzcyBtaWdyYXRpb24sIGNoZWNrcG9pbnRpbmcgZm9yIGZhdWx0IHRvbGVyYW5jZSwgZXZlbiBzb21ldGhpbmcgbGlrZSBpbXBsZW1lbnRpbmcgYSB2aXJ0dWFsIG1hY2hpbmUuIEVhY2ggaGFzIGl0cyBvd24gY29uc3RyYWludHMgYW5kIGRlbWFuZHMgZm9yIHdoYXQgbmVlZHMgdG8gYmUgY29waWVkLlxuXG5JIHdhbnQgdG8ga25vdyBpZiBpdCdzIGEgZGVlcCBjb3B5IG9yIGEgc2hhbGxvdyBjb3B5LiBJZiBpdCdzIHRoZSBsYXR0ZXIsIHRoZW4gbW9kaWZpY2F0aW9ucyB0byB0aGUgY29waWVkIHN0YXRlIHdvdWxkIGFsc28gYWZmZWN0IHRoZSBvcmlnaW5hbCBleGVjdXRpb24gc3RhdGUsIHdoaWNoIHdvdWxkIGRlZmVhdCB0aGUgcHVycG9zZS4gVGhlIGZ1bmN0aW9uIHdvdWxkIGxpa2VseSBiZSBtb3JlIGNvbXBsZXggaWYgaXQgbmVlZHMgdG8gcHJlc2VydmUgYSBjbGVhbiBzZXBhcmF0aW9uLlxuXG5BbHNvLCBpcyBpdCB0aHJlYWQtc2FmZT8gSWYgdGhlIG9yaWdpbmFsIHN0YXRlIGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBjb3B5IHByb2Nlc3MsIHRoZXJl4oCZcyBhIHJpc2sgb2YgaW50cm9kdWNpbmcgaW5jb25zaXN0ZW5jaWVzLiBUaGF0J3MgYSBjcml0aWNhbCBjb25zaWRlcmF0aW9uLCBlc3BlY2lhbGx5IGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudC5cbkknbSByZWFkeSB0byBleGFtaW5lIHRoZSBjb2RlLiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg4MjQsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NToyMC40ODk1NDg1MDlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyNzQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9mb3JrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTYxMSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTYxMTpcXHRzdGF0aWMgaW50IGNvcHlfZXhlY19zdGF0ZSh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbjE2MTI6XFx0e1xcbjE2MTM6XFx0XFx0c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqZXhlY19zdGF0ZTtcXG4xNjE0OlxcdFxcbjE2MTU6XFx0XFx0LyogQ0xPTkVfVk0gc2libGluZ3MgcmVmY291bnQtc2hhcmUgdGhlIHBhcmVudCdzIGV4ZWNfc3RhdGUuICovXFxuMTYxNjpcXHRcXHRpZiAoY2xvbmVfZmxhZ3MgXFx1MDAyNiBDTE9ORV9WTSkge1xcbjE2MTc6XFx0XFx0XFx0ZXhlY19zdGF0ZSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoY3VycmVudC1cXHUwMDNlZXhlY19zdGF0ZSwgdHJ1ZSk7XFxuMTYxODpcXHRcXHRcXHRyZWZjb3VudF9pbmMoXFx1MDAyNmV4ZWNfc3RhdGUtXFx1MDAzZWNvdW50KTtcXG4xNjE5OlxcdFxcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcih0c2stXFx1MDAzZWV4ZWNfc3RhdGUsIGV4ZWNfc3RhdGUpO1xcbjE2MjA6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMTYyMTpcXHRcXHR9XFxuMTYyMjpcXHRcXG4xNjIzOlxcdFxcdC8qIEV2ZXJ5b25lIGVsc2UgaW5oZXJpdHMgYSBmcmVzaCBjb3B5LiAqL1xcbjE2MjQ6XFx0XFx0cmV0dXJuIHRhc2tfZXhlY19zdGF0ZV9jb3B5KHRzayk7XFxuMTYyNTpcXHR9XFxuMTYyNjpcXHRcXG4xNjI3OlxcdHN0YXRpYyBpbnQgY29weV9mcyh1NjQgY2xvbmVfZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBib29sIHVtaClcXG4xNjI4OlxcdHtcXG4xNjI5OlxcdFxcdHN0cnVjdCBmc19zdHJ1Y3QgKmZzO1xcbjE2MzA6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjIwLjQ4OTcwMjkwOVoiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MzExMzYzMDMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gYHRhc2tfZXhlY19zdGF0ZV9jb3B5YDpcblxuKipNeSBFeGFtaW5hdGlvbiBvZiBgdGFza19leGVjX3N0YXRlX2NvcHlgKipcblxuQWxyaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgYHRhc2tfZXhlY19zdGF0ZV9jb3B5YC4gSW1tZWRpYXRlbHksIG15IGV4cGVydCBicmFpbiBraWNrcyBpbiwgY29uc2lkZXJpbmcgd2hhdCBpdCAqc2hvdWxkKiBkby4gR2l2ZW4gdGhlIG5hbWUsIGl0J3MgY2xlYXIgdGhpcyBpcyBhYm91dCBjb3B5aW5nLCBzcGVjaWZpY2FsbHkgdGhlIGV4ZWN1dGlvbiBzdGF0ZSBvZiBhIHRhc2suIFRoZSBpbXBvcnRhbnQgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiAqd2h5KiBjb3B5IGl0PyBJcyB0aGlzIGZvciBjb250ZXh0IHN3aXRjaGluZywgY2hlY2twb2ludGluZywgcGVyaGFwcyB0aHJlYWQgY3JlYXRpb24/IE9yIG1heWJlIGVycm9yIGhhbmRsaW5nIHdoZXJlIHlvdSBuZWVkIHRvIHByZXNlcnZlIGEgc25hcHNob3Q/IFVuZGVyc3RhbmRpbmcgdGhlIHVzZSBjYXNlIHdpbGwgaW5mb3JtIHRoZSBudWFuY2VzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi5cblxuSSBzdGFydCBydW5uaW5nIHRocm91Z2ggdGhlIGNvbW1vbiBlbGVtZW50czogSXQgbGlrZWx5IG5lZWRzIHRvIGhhbmRsZSB0aGUgcHJvZ3JhbSBjb3VudGVyIChQQyksIHN0YWNrIHBvaW50ZXIsIHJlZ2lzdGVyIHZhbHVlcywgYW5kIGFueSBvdGhlciByZWxldmFudCBoYXJkd2FyZSBzdGF0ZSB0aGF0IGRlZmluZXMgdGhlIHRhc2sncyBleGVjdXRpb24gZW52aXJvbm1lbnQuIEknbGwgbmVlZCB0byBjb25zaWRlciB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZTsgYSBzaW1wbGUgUklTQyBtYWNoaW5lIHdpbGwgaGF2ZSBhIGRyYXN0aWNhbGx5IGRpZmZlcmVudCBzdGF0ZSBzaXplIHRoYW4gYSBjb21wbGV4IHg4NiBwcm9jZXNzb3Igd2l0aCBTSU1EIHJlZ2lzdGVycyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdHMuXG5cblRoZSBjb3B5IGl0c2VsZiAtIGhvdyBpcyBpdCBkb25lPyBJcyB0aGlzIGEgZGVlcCBjb3B5LCBhIHNoYWxsb3cgY29weSwgb3Igc29tZXRoaW5nIG1vcmUgbnVhbmNlZD8gTWVtb3J5IG1hbmFnZW1lbnQgYmVjb21lcyBhIGNlbnRyYWwgY29uc2lkZXJhdGlvbiBoZXJlLCBlc3BlY2lhbGx5IGlmIHRoZSB0YXNrIGludm9sdmVzIHBvaW50ZXJzIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkuIEEgc2hhbGxvdyBjb3B5LCBjb3B5aW5nIGp1c3QgdGhlIHBvaW50ZXIgdmFsdWVzLCBpcyBlZmZpY2llbnQsIGJ1dCBpdCBhbHNvIGNyZWF0ZXMgc2hhcmluZyBhbmQgcG90ZW50aWFsIGRhdGEgY29ycnVwdGlvbiBpc3N1ZXMuIEEgZGVlcCBjb3B5IHJlc29sdmVzIHRoYXQsIGJ1dCBkZW1hbmRzIGNhcmVmdWwgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGFuZCBkYW5nbGluZyBwb2ludGVycy4gV2UgbmVlZCB0byBiZSB3YXJ5IG9mIHRoYXQgbWVtb3J5IGNvc3QsIHBhcnRpY3VsYXJseSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggZnJlcXVlbnQgY29udGV4dCBzd2l0Y2hlcyBvciBtYXNzaXZlIGFtb3VudHMgb2YgZXhlY3V0aW9uIHN0YXRlLlxuXG5GaW5hbGx5LCBJJ2xsIHNjcnV0aW5pemUgdGhlIGVycm9yIGhhbmRsaW5nLiBXaGF0IGhhcHBlbnMgaWYgdGhlIGNvcHkgZmFpbHM/IFdoYXQgYXJlIHRoZSBmYWlsdXJlIG1vZGVzIChlLmcuLCBpbnN1ZmZpY2llbnQgbWVtb3J5LCBpbnZhbGlkIHN0YXRlKT8gSG93IHJvYnVzdCBpcyB0aGUgZnVuY3Rpb24gaW4gdGhlIGZhY2Ugb2YgdGhlc2UgcG90ZW50aWFsIHByb2JsZW1zPyBEb2VzIGl0IHJldHVybiBhbiBlcnJvciBjb2RlIG9yIHRocm93IGFuIGV4Y2VwdGlvbj8gSG93IGlzIHRoYXQgZXJyb3IgcHJvcGFnYXRlZCBhbmQgbWFuYWdlZD8gVGhlIGVycm9yIGhhbmRsaW5nIGlzIGNyaXRpY2FsIGluIHRoaXMgY29udGV4dDsgYSBwb29ybHkgaGFuZGxlZCBmYWlsdXJlIGNvdWxkIGRlc3RhYmlsaXplIHRoZSBlbnRpcmUgc3lzdGVtLiBJJ2xsIG5lZWQgdG8gYXNzZXNzIHRoZSBmdW5jdGlvbidzIGFzc3VtcHRpb25zIGFib3V0IHRoZSBzb3VyY2UgdGFzayBzdGF0ZSDigJMgaXMgaXQgdmFsaWQsIGlzIGl0IGxvY2tlZCwgb3IgZG9lcyBpdCBvcGVyYXRlIGFzc3VtaW5nIGEgY29vcGVyYXRpdmUgb3IgcHJlZW10aXZlIHRocmVhZGluZyBtb2RlbD9cblxuXG4iLCJJbnB1dFRva2VucyI6OTU1OCwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6MjUuODAxMDY5NDMxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDIyNTgzMDg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRhc2tfZXhlY19zdGF0ZV9jb3B5XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaD0yND1zdHJ1Y3QgdGFza19leGVjX3N0YXRlICp0YXNrX2V4ZWNfc3RhdGVfcmVwbGFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcXG5pbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaC0yNS1cXHRcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgdGFza19leGVjX3N0YXRlICpleGVjX3N0YXRlKTtcXG5pbmNsdWRlL2xpbnV4L3NjaGVkL2V4ZWNfc3RhdGUuaDoyNjppbnQgdGFza19leGVjX3N0YXRlX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spO1xcbmluY2x1ZGUvbGludXgvc2NoZWQvZXhlY19zdGF0ZS5oLTI3LXZvaWQgX19pbml0IGV4ZWNfc3RhdGVfaW5pdCh2b2lkKTtcXG4tLVxcbmtlcm5lbC9leGVjX3N0YXRlLmM9NTI9c3RydWN0IHRhc2tfZXhlY19zdGF0ZSAqdGFza19leGVjX3N0YXRlX3JlcGxhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuLS1cXG5rZXJuZWwvZXhlY19zdGF0ZS5jLTcwLSAqL1xcbmtlcm5lbC9leGVjX3N0YXRlLmM6NzE6aW50IHRhc2tfZXhlY19zdGF0ZV9jb3B5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbmtlcm5lbC9leGVjX3N0YXRlLmMtNzIte1xcbi0tXFxua2VybmVsL2ZvcmsuYz0xNjExPXN0YXRpYyBpbnQgY29weV9leGVjX3N0YXRlKHU2NCBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXFxuLS1cXG5rZXJuZWwvZm9yay5jLTE2MjMtXFx0LyogRXZlcnlvbmUgZWxzZSBpbmhlcml0cyBhIGZyZXNoIGNvcHkuICovXFxua2VybmVsL2ZvcmsuYzoxNjI0OlxcdHJldHVybiB0YXNrX2V4ZWNfc3RhdGVfY29weSh0c2spO1xcbmtlcm5lbC9mb3JrLmMtMTYyNS19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjI3LjgyMzY1ODIzOFoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTc5Njg2NTQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQW5hbHl6aW5nIGB0YXNrX2V4ZWNfc3RhdGVfY29weWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgdGFza19leGVjX3N0YXRlX2NvcHlgIGZ1bmN0aW9uLiBNeSBmaXJzdCB0aG91Z2h0IGlzOiB3aGF0IGFyZSB3ZSB0cnlpbmcgdG8gYWNoaWV2ZSBoZXJlPyBHaXZlbiB0aGUgbmFtZSwgSSdtIGltbWVkaWF0ZWx5IGV4cGVjdGluZyBpdCB0byBkZWFsIHdpdGggYSBjcnVjaWFsIHByb2Nlc3Mg4oCTIGxpa2VseSBjb3B5aW5nIHRoZSBleGVjdXRpb24gc3RhdGUgb2YgYSB0YXNrLiBUaGUgc3BlY2lmaWNzIHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE9TIGFuZCB0aGUgcnVudGltZSdzIGFyY2hpdGVjdHVyZSwgYnV0IHRoZSBnZW5lcmFsIGNvbmNlcHQgaXMgY2xlYXI6IGl04oCZcyBhYm91dCBjYXB0dXJpbmcgYSBzbmFwc2hvdCBvZiBhIHRhc2sncyBjdXJyZW50IGNvbnRleHQuIEkgbmVlZCB0byB1bmRlcnN0YW5kICpob3cqIGl0J3MgaW1wbGVtZW50ZWQuIElzIGl0IGEgZGVlcCBjb3B5IG9yIHNoYWxsb3c/IEFyZSB3ZSB0YWxraW5nIGFib3V0IHJlZ2lzdGVycywgc3RhY2sgcG9pbnRlcnMsIG1lbW9yeSBtYXBzLCBtYXliZSBldmVuIHByb2Nlc3NvciBmbGFncz8gVGhlIGRldmlsIGlzIGluIHRoZSBkZXRhaWxzLCBhbmQgdGhvc2UgZGV0YWlscyBhcmUgd2hhdOKAmWxsIHRlbGwgbWUgaWYgaXTigJlzIGVmZmljaWVudCwgc2FmZSwgYW5kIGhhbmRsZXMgYWxsIGVkZ2UgY2FzZXMuIEknbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2UgbXV0ZXhlcyBvciBhdG9taWMgb3BlcmF0aW9ucywgYW5kIGhvdyBpdCBoYW5kbGVzIGNvbmN1cnJlbmN5LiBJJ2xsIG5lZWQgdG8ga25vdyB3aGV0aGVyIGNvbnRleHQgc3dpdGNoZXMgYXJlIGludm9sdmVkIGFuZCBob3cgaXQgZG9lcyBzby4gSSB3YW50IHRvIGxvb2sgZm9yIHBvdGVudGlhbCBhcmVhcyBvZiBjb25jZXJuIG9yIHJhY2UgY29uZGl0aW9ucy4gQSBmdW5jdGlvbiBsaWtlIHRoaXMgaXMgaW5jcmVkaWJseSBmdW5kYW1lbnRhbCwgYW5kIGlmIGl0J3MgZmxhd2VkLCBpdCBjYW4gaW50cm9kdWNlIHNlcmlvdXMgYnVncyBhdCBhbnkgcG9pbnQuIExldCdzIHNlZSBob3cgdGhpcyBpcyBpbXBsZW1lbnRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAzODcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTozMS44MDMzNDgzNzNaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODMzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2V4ZWNfc3RhdGUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA3MSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA3MTpcXHRpbnQgdGFza19leGVjX3N0YXRlX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXFxuICA3MjpcXHR7XFxuICA3MzpcXHRcXHRzdHJ1Y3QgdGFza19leGVjX3N0YXRlICpzcmMsICpkc3Q7XFxuICA3NDpcXHRcXG4gIDc1OlxcdFxcdHNyYyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoY3VycmVudC1cXHUwMDNlZXhlY19zdGF0ZSwgdHJ1ZSk7XFxuICA3NjpcXHRcXHRkc3QgPSBhbGxvY190YXNrX2V4ZWNfc3RhdGUoc3JjLVxcdTAwM2V1c2VyX25zKTtcXG4gIDc3OlxcdFxcdGlmICghZHN0KVxcbiAgNzg6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuICA3OTpcXHRcXHRkc3QtXFx1MDAzZWR1bXBhYmxlID0gUkVBRF9PTkNFKHNyYy1cXHUwMDNlZHVtcGFibGUpO1xcbiAgODA6XFx0XFx0cmN1X2Fzc2lnbl9wb2ludGVyKHRzay1cXHUwMDNlZXhlY19zdGF0ZSwgZHN0KTtcXG4gIDgxOlxcdFxcdHJldHVybiAwO1xcbiAgODI6XFx0fVxcbiAgODM6XFx0XFxuICA4NDpcXHQvKlxcbiAgODU6XFx0ICogU3RvcmUgVEFTS19EVU1QQUJMRV8qIG9uIGN1cnJlbnQtXFx1MDAzZWV4ZWNfc3RhdGUuICBBbGwgY2FsbGVyc1xcbiAgODY6XFx0ICogKGNvbW1pdF9jcmVkcywgYmVnaW5fbmV3X2V4ZWMsIHByY3RsKFBSX1NFVF9EVU1QQUJMRSkpIGFjdCBvbiB0aGVcXG4gIDg3OlxcdCAqIHJ1bm5pbmcgdGFzaywgd2hpY2ggZ3VhcmFudGVlcyAtXFx1MDAzZWV4ZWNfc3RhdGUgaXMgYWxsb2NhdGVkIGFuZCBjYW5ub3RcXG4gIDg4OlxcdCAqIGJlIHJlcGxhY2VkIHVuZGVyIHVzLlxcbiAgODk6XFx0ICovXFxuICA5MDpcXHR2b2lkIHRhc2tfZXhlY19zdGF0ZV9zZXRfZHVtcGFibGUoZW51bSB0YXNrX2R1bXBhYmxlIHZhbHVlKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTozMS44MDM0MzM4OTNaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTE0OTEzMzg4NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBEZWNpc2lvbiBmb3IgYSBTcGVjaWZpYyBCdWcgRml4KipcblxuT2theSwgc28gdGhpcyBwYXRjaCBhZGRyZXNzZXMgYSBwb3RlbnRpYWwgYC1FTk9NRU1gIGZhaWx1cmUgaW4gYHRhc2tfZXhlY19zdGF0ZV9jb3B5YCB0aGF0IGNhbiBvY2N1ciB3aGVuIGBhbGxvY190YXNrX2V4ZWNfc3RhdGVgIGZhaWxzIGR1cmluZyBgZm9yaygpYCB3aXRob3V0IGBDTE9ORV9WTWAsIHNwZWNpZmljYWxseSB3aGVuIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgIGlzIGVuYWJsZWQuIEl0J3MgYSB2ZXJ5IHRhcmdldGVkIGJ1ZyBmaXguXG5cbk15IGZpcnN0IHRob3VnaHQgaXMsIFwiRG9lcyB0aGlzIGludHJvZHVjZSBuZXcgZnVuY3Rpb25hbCBsb2dpYyB0aGF0IGRlbWFuZHMgZnV6emluZz9cIiBObywgaXQncyBqdXN0IGEgcmVmYWN0b3JpbmcsIG1vdmluZyBpbml0aWFsaXphdGlvbiBlYXJsaWVyIHRvIGF2b2lkIGEgdXNlLWFmdGVyLWZyZWUuIEl0J3Mgbm90IGFkZGluZyBmZWF0dXJlcy5cblxuQnV0IHRoZW4gSSByZW1lbWJlciB0aGUgcHJvbXB0OiBpZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIEkgbmVlZCB0byBjb25zaWRlciBmdXp6aW5nLCBldmVuIGZvciBhIGJ1ZyBmaXguIEFuZCB0aGlzICpkb2VzKiBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMuIFRoZSBwcm9tcHQgYWxzbyB0ZWxscyBtZSBpZiBJIGZsYWcgaXQgZm9yIGZ1enppbmcgSSBuZWVkIHRvIHByb3ZpZGUgYEVuYWJsZUNvbmZpZ3NgIGFuZCBgRm9jdXNTeW1ib2xzYC5cblxuSSBuZWVkIHRvIHByb3ZpZGUgYEVuYWJsZUNvbmZpZ3M6IFtcIkZVTkNUSU9OX0dSQVBIX1RSQUNFUlwiXWAsIHRoYXQncyBlYXN5LiBCdXQgYEZvY3VzU3ltYm9sc2AgaXMgYSBwcm9ibGVtLiBUaGUgb25seSBmdW5jdGlvbiBtb2RpZmllZCBpcyBgY29weV9wcm9jZXNzYC4gVGhlIHByb21wdCBzcGVjaWZpY2FsbHkgdGVsbHMgbWUgKm5vdCogdG8gbGlzdCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyBsaWtlIGBjb3B5X3Byb2Nlc3NgIHRvIGF2b2lkIHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuIElzIHRoZXJlIGFub3RoZXIgZnVuY3Rpb24gdG8gdXNlPyBObywgdGhlcmUgaXMgbm90LlxuXG5UaGUgcHJvbXB0IHNheXMgSSAqbXVzdCogZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zLiBXYWl0LCBpZiB0aGVyZSBhcmUgbm8gc3BlY2lmaWMgZnVuY3Rpb25zLCBpdCdzIG9rIHRvIGxlYXZlIGBGb2N1c1N5bWJvbHNgIGVtcHR5ISBUaGUgcHJvbXB0IG1ha2VzIHRoZSBgRm9jdXNTeW1ib2xzYCBvcHRpb25hbCwgaWYgbm8gc3BlY2lmaWMgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUuXG5cbk5vdyBJIGFtIGFza2luZyBteXNlbGYsIGlzIHRoaXMgKnJlYWxseSogd29ydGggZnV6emluZz8gSXQncyBqdXN0IG1vdmluZyBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgdXAgYnkgYSBmZXcgbGluZXMuIEhvd2V2ZXIsIHRoaXMgaXMgZml4aW5nIGEgcmVhbCB1c2UtYWZ0ZXItZnJlZSBpc3N1ZSByZWxhdGVkIHRvIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBkdXJpbmcgYGNvcHlfcHJvY2Vzc2AuIEZhdWx0IGluamVjdGlvbiBvbiBgYWxsb2NfdGFza19leGVjX3N0YXRlYCBpcyBuZWVkZWQgdG8gdHJpZ2dlciB0aGlzIGJ1Zywgd2hpY2ggU3l6a2FsbGVyIGNhbiBkby5cblxuU28sIGZ1enppbmcgY291bGQgY29uZmlybSB0aGUgZml4J3MgY29ycmVjdG5lc3MgYW5kIHJ1bGUgb3V0IHJlZ3Jlc3Npb25zLiBDcnVjaWFsbHksIEkgaGF2ZSB0byBlbnN1cmUgdGhlIGVhcmx5IGNhbGwgdG8gYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGRvZXNuJ3QgKml0c2VsZiogaW50cm9kdWNlIHByb2JsZW1zLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIGZ1bmN0aW9uLCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgYWdhaW4uIEdpdmVuIGl0IGFsbG9jYXRlcyBtZW1vcnksIHRoZXJlIGlzIGEgcmlzay4gT2theSwgeWVzLCB0aGVyZSBpcyBtZW1vcnkgYWxsb2NhdGVkIGluIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCwgc28gaXQncyBhIGdvb2QgaWRlYSB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIHNpZGUgZWZmZWN0cyB3aGVuIGl0J3MgY2FsbGVkIGVhcmx5LlxuXG5VbHRpbWF0ZWx5LCBJJ20gbGVhbmluZyB0b3dhcmRzIGBXb3J0aEZ1enppbmc9dHJ1ZWAuIEl0J3MgYSBzbWFsbCBjaGFuZ2UsIGJ1dCBpdCBhZGRyZXNzZXMgYSByZWFsIGJ1ZyBpbiBhIGNyaXRpY2FsIHBhdGggd2l0aCBtZW1vcnkgYWxsb2NhdGlvbiwgYW5kIGZhdWx0IGluamVjdGlvbiBpcyBwb3NzaWJsZS4gV2UganVzdCBuZWVkIHRvIGNvbmZpcm0gdGhhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgaXRzZWxmIGlzIHNhZmUgdG8gY2FsbCBlYXJsaWVyLiBJIGFtIGdvaW5nIHdpdGg6XG5cbmBgYGpzb25cbntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZSxcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcIkZVTkNUSU9OX0dSQVBIX1RSQUNFUlwiXVxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXVxufVxuYGBgXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMDQ2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzE0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NDMuMjk0Nzc3MjEzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2Nzc0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvdHJhY2UvZmdyYXBoLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTE2MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTE2MDpcXHR2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxcbjExNjE6XFx0e1xcbjExNjI6XFx0XFx0LyogTWFrZSBzdXJlIHdlIGRvIG5vdCB1c2UgdGhlIHBhcmVudCByZXRfc3RhY2sgKi9cXG4xMTYzOlxcdFxcdHQtXFx1MDAzZXJldF9zdGFjayA9IE5VTEw7XFxuMTE2NDpcXHRcXHR0LVxcdTAwM2VjdXJyX3JldF9zdGFjayA9IDA7XFxuMTE2NTpcXHRcXHR0LVxcdTAwM2VjdXJyX3JldF9kZXB0aCA9IC0xO1xcbjExNjY6XFx0XFxuMTE2NzpcXHRcXHRpZiAoZnRyYWNlX2dyYXBoX2FjdGl2ZSkge1xcbjExNjg6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyAqcmV0X3N0YWNrO1xcbjExNjk6XFx0XFxuMTE3MDpcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKCFmZ3JhcGhfc3RhY2tfY2FjaGVwKSlcXG4xMTcxOlxcdFxcdFxcdFxcdHJldHVybjtcXG4xMTcyOlxcdFxcbjExNzM6XFx0XFx0XFx0cmV0X3N0YWNrID0ga21lbV9jYWNoZV9hbGxvYyhmZ3JhcGhfc3RhY2tfY2FjaGVwLCBHRlBfS0VSTkVMKTtcXG4xMTc0OlxcdFxcdFxcdGlmICghcmV0X3N0YWNrKVxcbjExNzU6XFx0XFx0XFx0XFx0cmV0dXJuO1xcbjExNzY6XFx0XFx0XFx0Z3JhcGhfaW5pdF90YXNrKHQsIHJldF9zdGFjayk7XFxuMTE3NzpcXHRcXHR9XFxuMTE3ODpcXHR9XFxuMTE3OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NDMuMjk0OTQ2ODEzWiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY3MjI1OTYzMzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBBbmFseXNpczogYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGFuZCBQcm9jZXNzIENyZWF0aW9uKipcblxuT2theSwgc28gYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIG9ubHkgYWxsb2NhdGVzIG1lbW9yeSB3aGVuIGBmdHJhY2VfZ3JhcGhfYWN0aXZlYCBpcyB0cnVlLiBJZiBtZW1vcnkgaXMgYWxsb2NhdGVkIGFuZCB0aGVuIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgY2xlYW51cCBpcyBoYW5kbGVkIGNvcnJlY3RseTogYGZyZWVfdGFza2AgaXMgY2FsbGVkLCB3aGljaCBpbiB0dXJuIGNhbGxzIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCB0byBmcmVlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiBTZWVtcyBzb2xpZCBmcm9tIGEgbWVtb3J5IG1hbmFnZW1lbnQgcGVyc3BlY3RpdmUuIEkndmUgZG91YmxlLWNoZWNrZWQsIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgbW9kaWZpY2F0aW9ucyB0byBvdGhlciBmdW5jdGlvbnMgdGhhdCBJIG5lZWQgdG8gd29ycnkgYWJvdXQuXG5cbkknbSBsZWFuaW5nIHRvd2FyZHMgc2V0dGluZyBgV29ydGhGdXp6aW5nPXRydWVgIGhlcmUuIFRoZSBsb2dpYyB0b3VjaGVzIGNvcmUga2VybmVsIGNvbXBvbmVudHMg4oCTIHNwZWNpZmljYWxseSwgcHJvY2VzcyBjcmVhdGlvbiDigJMgYW5kIGl0IG9ubHkgYmVjb21lcyBhY3RpdmUgdW5kZXIgYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uLCBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYCwgc28gaXQgd2FycmFudHMgY2xvc2VyIGludmVzdGlnYXRpb24uXG5cbldhaXQuLi4gYGNvcHlfcHJvY2Vzc2AuLi4gdGhhdCdzIGEgaG90LXBhdGggZnVuY3Rpb24sIGlzbid0IGl0PyBSaWdodC4gV2UgZ2VuZXJhbGx5IGF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgaW4gYEZvY3VzU3ltYm9sc2AgdG8gcHJldmVudCBza2V3aW5nIHRlc3QgZGlzdHJpYnV0aW9ucy4gVGhlcmVmb3JlLCBJICp3aWxsIG5vdCogaW5jbHVkZSBgY29weV9wcm9jZXNzYCBpbiBgRm9jdXNTeW1ib2xzYC4gYEZvY3VzU3ltYm9sc2Agd2lsbCBzdGF5IGVtcHR5LlxuXG5UaGUgYEVuYWJsZUNvbmZpZ3NgIHNob3VsZCBiZSBzZXQgdG8gYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAsIG9mIGNvdXJzZS4gTGV0J3MgbWFrZSBzdXJlIHRoYXQgYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgZG9lc24ndCBkZXBlbmQgb24gYW55dGhpbmcgdGhhdCBtaWdodCBub3QgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiBJdCBsb29rcyBsaWtlIGl0IGRlcGVuZHMgb24gYEhBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYCAoYXJjaGl0ZWN0dXJlIHN1cHBvcnQpLCBgRlVOQ1RJT05fVFJBQ0VSYCwgYW5kIGFsc28gYCFYODZfMzIgfHwgIUNDX09QVElNSVpFX0ZPUl9TSVpFYC4gT2theSwgdGhlIHJlcXVpcmVkIGNvbmZpZ3MgYXJlIGBGVU5DVElPTl9UUkFDRVJgIGFuZCBgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI3NDQsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTo1MC4wMTc1NDY3MzFaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3MTk4MzA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBGVU5DVElPTl9UUkFDRVJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL3RyYWNlL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL3RyYWNlL0tjb25maWc9MjI2PWNvbmZpZyBCT09UVElNRV9UUkFDSU5HXFxuLS1cXG5rZXJuZWwvdHJhY2UvS2NvbmZpZy0yMzQtXFxua2VybmVsL3RyYWNlL0tjb25maWc6MjM1OmNvbmZpZyBGVU5DVElPTl9UUkFDRVJcXG5rZXJuZWwvdHJhY2UvS2NvbmZpZy0yMzYtXFx0Ym9vbCBcXFwiS2VybmVsIEZ1bmN0aW9uIFRyYWNlclxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NTAuMDk0NzUxNDA5WiIsIlNlcSI6MzEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0MTc4OTk0MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyB0aGUgc3VtbWFyeSwgYXNzdW1pbmcgSSdtIGFuIGV4cGVydDpcblxuKipEaXZpbmcgaW50byB0aGUgYEZVTkNUSU9OX1RSQUNFUmAgS2NvbmZpZyoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJ20gZ29pbmcgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGBGVU5DVElPTl9UUkFDRVJgIEtjb25maWcuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBjb25maWd1cmVkLCB3aGF0IGRlcGVuZGVuY2llcyBpdCBoYXMsIGFuZCB3aGF0IHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zIGFyZSBmb3IgdGhlIGtlcm5lbCBidWlsZCBhbmQgcnVudGltZS4gSSdsbCBuZWVkIHRvIGFzc2VzcyBpdHMgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLCBwb3dlciBjb25zdW1wdGlvbiwgYW5kIG92ZXJhbGwgc3lzdGVtIGZvb3RwcmludCwgb2YgY291cnNlLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOiB3aGF0IG90aGVyIHRyYWNpbmcgZmVhdHVyZXMgZG9lcyBpdCBkZXBlbmQgb24/IEFyZSB0aGVyZSBhbnkgb3B0aW9ucyB0byB0dW5lIGl0cyBiZWhhdmlvcj8gSXMgdGhlcmUgZG9jdW1lbnRhdGlvbiB0aGF0IHByb3Blcmx5IGV4cGxhaW5zIHRoZSB0cmFkZS1vZmZzIG9mIGVuYWJsaW5nIGl0PyBJIG5lZWQgdG8gYW5hbHl6ZSB0aGlzIEtjb25maWcgY29uZmlndXJhdGlvbiB0aG9yb3VnaGx5IHRvIGFzc2VzcyB3aGF0IGl0IG1lYW5zIGZvciB0aGUga2VybmVsIGluIHRoZSBjb250ZXh0IG9mIG91ciBwcm9qZWN0LiBUaW1lIHRvIGRpZyBpbiFcblxuXG4iLCJJbnB1dFRva2VucyI6MTM1NDksIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTo1My41MTI2NTQwMjFaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA2MjkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC90cmFjZS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIzNSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDIzNTpcXHRjb25maWcgRlVOQ1RJT05fVFJBQ0VSXFxuIDIzNjpcXHRcXHRib29sIFxcXCJLZXJuZWwgRnVuY3Rpb24gVHJhY2VyXFxcIlxcbiAyMzc6XFx0XFx0ZGVwZW5kcyBvbiBIQVZFX0ZVTkNUSU9OX1RSQUNFUlxcbiAyMzg6XFx0XFx0c2VsZWN0IEtBTExTWU1TXFxuIDIzOTpcXHRcXHRzZWxlY3QgR0VORVJJQ19UUkFDRVJcXG4gMjQwOlxcdFxcdHNlbGVjdCBDT05URVhUX1NXSVRDSF9UUkFDRVJcXG4gMjQxOlxcdFxcdHNlbGVjdCBHTE9CXFxuIDI0MjpcXHRcXHRzZWxlY3QgTkVFRF9UQVNLU19SQ1VcXG4gMjQzOlxcdFxcdHNlbGVjdCBUQVNLU19SVURFX1JDVVxcbiAyNDQ6XFx0XFx0aGVscFxcbiAyNDU6XFx0XFx0ICBFbmFibGUgdGhlIGtlcm5lbCB0byB0cmFjZSBldmVyeSBrZXJuZWwgZnVuY3Rpb24uIFRoaXMgaXMgZG9uZVxcbiAyNDY6XFx0XFx0ICBieSB1c2luZyBhIGNvbXBpbGVyIGZlYXR1cmUgdG8gaW5zZXJ0IGEgc21hbGwsIDUtYnl0ZSBOby1PcGVyYXRpb25cXG4gMjQ3OlxcdFxcdCAgaW5zdHJ1Y3Rpb24gYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSBrZXJuZWwgZnVuY3Rpb24sIHdoaWNoIE5PUFxcbiAyNDg6XFx0XFx0ICBzZXF1ZW5jZSBpcyB0aGVuIGR5bmFtaWNhbGx5IHBhdGNoZWQgaW50byBhIHRyYWNlciBjYWxsIHdoZW5cXG4gMjQ5OlxcdFxcdCAgdHJhY2luZyBpcyBlbmFibGVkIGJ5IHRoZSBhZG1pbmlzdHJhdG9yLiBJZiBpdCdzIHJ1bnRpbWUgZGlzYWJsZWRcXG4gMjUwOlxcdFxcdCAgKHRoZSBib290dXAgZGVmYXVsdCksIHRoZW4gdGhlIG92ZXJoZWFkIG9mIHRoZSBpbnN0cnVjdGlvbnMgaXMgdmVyeVxcbiAyNTE6XFx0XFx0ICBzbWFsbCBhbmQgbm90IG1lYXN1cmFibGUgZXZlbiBpbiBtaWNyby1iZW5jaG1hcmtzIChhdCBsZWFzdCBvblxcbiAyNTI6XFx0XFx0ICB4ODYsIGJ1dCBtYXkgaGF2ZSBpbXBhY3Qgb24gb3RoZXIgYXJjaGl0ZWN0dXJlcykuXFxuIDI1MzpcXHRcXG4gMjU0OlxcdGNvbmZpZyBGVU5DVElPTl9HUkFQSF9UUkFDRVJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NTMuNTEyNzYyMzMxWiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYyNzAwNDA5MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQ29uZmlndXJhdGlvbiBBZGp1c3RtZW50cyBmb3IgQ29tcHJlaGVuc2l2ZSBUZXN0aW5nKipcblxuT2theSwgc28gSSd2ZSBnb3QgdGhlIGZpeCBmb3IgdGhhdCBuYXN0eSB1c2UtYWZ0ZXItZnJlZSBidWcgaW4gYGNvcHlfcHJvY2VzcygpYCwgc3BlY2lmaWNhbGx5IGluIHRoZSBlcnJvciBwYXRoLiBUaGUgcGF0Y2ggbW92ZXMgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soKWAgZWFybGllciB0byBhZGRyZXNzIHRoZSBpc3N1ZS4gVGhpcyBidWcgbGlrZXMgdG8gcmVhciBpdHMgaGVhZCB3aGVuIGBjb3B5X3Byb2Nlc3MoKWAgZmFpbHMg4oCTIHRoaW5rIGBjb3B5X2V4ZWNfc3RhdGUoKWAgZmFpbGluZyDigJMgKmFuZCogZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBUaGF0J3MgdGhlIGtleS5cblxuVGhlcmVmb3JlLCBmb3IgZWZmZWN0aXZlIGZ1enppbmcgb2YgdGhpcywgSSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBwcmVjaXNlbHkuIE15IHBsYW4gaXM6IEknbGwgZW5hYmxlIGJvdGggYEZVTkNUSU9OX1RSQUNFUmAgYW5kIGBGVU5DVElPTl9HUkFQSF9UUkFDRVJgLiBTbyBJJ20gc2V0dGluZyBgRW5hYmxlQ29uZmlnc2AgdG8gYFtcIkZVTkNUSU9OX1RSQUNFUlwiLCBcIkZVTkNUSU9OX0dSQVBIX1RSQUNFUlwiXWAuXG5cbkkgYWxzbyBkb24ndCBuZWVkIGFueSBzcGVjaWZpYyBmb2N1cyBzeW1ib2xzLCBzbyBgRm9jdXNTeW1ib2xzYCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QsIGBbXWAuXG5cbkFuZCwgb2YgY291cnNlLCBJIGRlZmluaXRlbHkgd2FudCB0byBmdXp6IHRoaXMgY29kZSBwYXRoIHRvIHZlcmlmeSB0aGUgZml4LCBzbyBgV29ydGhGdXp6aW5nYCB3aWxsIGJlIHNldCB0byBgdHJ1ZWAuXG5cblRoZSByZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOiBCeSBlbmFibGluZyAqYm90aCogYEZVTkNUSU9OX0dSQVBIX1RSQUNFUmAgYW5kIGBGVU5DVElPTl9UUkFDRVJgLCBJIGVuc3VyZSB0aGF0IHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIHRoZSBlcnJvciBwYXRocyB3aXRoaW4gYGNvcHlfcHJvY2VzcygpYCBhcmUgdGhvcm91Z2hseSB0ZXN0ZWQuIFRoaXMgY29uZmlndXJhdGlvbiBtYXhpbWl6ZXMgbXkgY2hhbmNlcyBvZiBoaXR0aW5nIHRoZSBidWcgaWYgaXQncyBzdGlsbCBsdXJraW5nLCBvciwgbW9yZSBwb3NpdGl2ZWx5LCB2YWxpZGF0ZXMgdGhhdCBteSBmaXggaXMgaW5kZWVkIGVmZmVjdGl2ZSBpbiBhbGwgdGhlIHJlbGV2YW50IHNjZW5hcmlvcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQxMTYsIk91dHB1dFRva2VucyI6MTQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NTkuNzgyODA3NjQ0WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzYzNzY0OTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkZVTkNUSU9OX1RSQUNFUlwiLFxuICAgIFwiRlVOQ1RJT05fR1JBUEhfVFJBQ0VSXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgdXNlLWFmdGVyLWZyZWUgYnVnIGluIHRoZSBlcnJvciBwYXRoIG9mIGNvcHlfcHJvY2VzcygpIGJ5IG1vdmluZyBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKCkgZWFybGllci4gVGhlIGJ1ZyBpcyB0cmlnZ2VyZWQgd2hlbiBjb3B5X3Byb2Nlc3MoKSBmYWlscyAoZS5nLiwgaW4gY29weV9leGVjX3N0YXRlKCkpIGFuZCBmdW5jdGlvbiBncmFwaCB0cmFjaW5nIGlzIGVuYWJsZWQuIEZ1enppbmcgdGhpcyByZXF1aXJlcyBlbmFibGluZyBGVU5DVElPTl9HUkFQSF9UUkFDRVIgYW5kIEZVTkNUSU9OX1RSQUNFUiB0byBlbnN1cmUgdGhlIG5ldyBpbml0aWFsaXphdGlvbiBvcmRlciBhbmQgZXJyb3IgcGF0aHMgYXJlIHByb3Blcmx5IHRlc3RlZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGVU5DVElPTl9UUkFDRVJcIixcbiAgICBcIkZVTkNUSU9OX0dSQVBIX1RSQUNFUlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIHVzZS1hZnRlci1mcmVlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBvZiBjb3B5X3Byb2Nlc3MoKSBieSBtb3ZpbmcgZnRyYWNlX2dyYXBoX2luaXRfdGFzaygpIGVhcmxpZXIuIFRoZSBidWcgaXMgdHJpZ2dlcmVkIHdoZW4gY29weV9wcm9jZXNzKCkgZmFpbHMgKGUuZy4sIGluIGNvcHlfZXhlY19zdGF0ZSgpKSBhbmQgZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkLiBGdXp6aW5nIHRoaXMgcmVxdWlyZXMgZW5hYmxpbmcgRlVOQ1RJT05fR1JBUEhfVFJBQ0VSIGFuZCBGVU5DVElPTl9UUkFDRVIgdG8gZW5zdXJlIHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gb3JkZXIgYW5kIGVycm9yIHBhdGhzIGFyZSBwcm9wZXJseSB0ZXN0ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU1OjU5Ljg1OTE5MjgwMloiLCJTZXEiOjM1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTgzNjExNDM2NDYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NTo1OS44NTk3NzQ3MzJaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NTgzNjA1NTY2NDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCdzIGB0YXNrX3N0cnVjdGAgdG8gdGhlIGNoaWxkLCBpbmNsdWRpbmcgdGhlIGByZXRfc3RhY2tgIHBvaW50ZXIgdXNlZCBieSBmdHJhY2UuIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYGNvcHlfcHJvY2VzcygpYCAoZS5nLiwgaW4gYGNvcHlfZXhlY19zdGF0ZSgpYCkgYmVmb3JlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKClgIGlzIGNhbGxlZCwgdGhlIGVycm9yIGhhbmRsaW5nIHBhdGggKGBiYWRfZm9ya19mcmVlYCkgd2lsbCBjYWxsIGBmcmVlX3Rhc2soKWAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soKWAuIFNpbmNlIHRoZSBjaGlsZCdzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AuIFRoZSBwYXJlbnQgdGFzayB3aWxsIHRoZW4gY29udGludWUgdG8gdXNlIHRoZSBmcmVlZCBgcmV0X3N0YWNrYCwgcmVzdWx0aW5nIGluIGEgdXNlLWFmdGVyLWZyZWUsIGFuZCBpdCB3aWxsIGJlIGRvdWJsZS1mcmVlZCB3aGVuIHRoZSBwYXJlbnQgZXZlbnR1YWxseSBleGl0cy5cXG5cXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGUyZjNlMjQxM2NkMGQwNTRjMzUwMmNmN2MxYjE0YmFjZDJhOTRlZmVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyAyMSAxMjo1NDoxOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jXG5pbmRleCAxZTY4NDA0YmQ3NzNlLi5jZWM4MmE2NGEwN2NkIDEwMDY0NFxuLS0tIGEva2VybmVsL2ZvcmsuY1xuKysrIGIva2VybmVsL2ZvcmsuY1xuQEAgLTIxMzksNiArMjEzOSw3IEBAIF9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXG4gXHRwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpO1xuIFx0aWYgKCFwKVxuIFx0XHRnb3RvIGZvcmtfb3V0O1xuK1x0ZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTtcbiBcdHJldHZhbCA9IGNvcHlfZXhlY19zdGF0ZShjbG9uZV9mbGFncywgcCk7XG4gXHRpZiAocmV0dmFsKVxuIFx0XHRnb3RvIGJhZF9mb3JrX2ZyZWU7XG5AQCAtMjE2NSw4ICsyMTY2LDYgQEAgX19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcyhcbiBcdCAqL1xuIFx0cC1cdTAwM2VjbGVhcl9jaGlsZF90aWQgPSAoY2xvbmVfZmxhZ3MgXHUwMDI2IENMT05FX0NISUxEX0NMRUFSVElEKSA/IGFyZ3MtXHUwMDNlY2hpbGRfdGlkIDogTlVMTDtcbiBcbi1cdGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2socCk7XG4tXG4gXHRydF9tdXRleF9pbml0X3Rhc2socCk7XG4gXHRyYXdfc3Bpbl9sb2NrX2luaXQoXHUwMDI2cC1cdTAwM2VibG9ja2VkX2xvY2spO1xuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTU6NTkuODU5Nzc1NjEyWiIsIlNlcSI6MzcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYwNzk4ODA5NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBGb3JrIFBhdGNoOiBGdHJhY2UgSW5pdGlhbGl6YXRpb24gYW5kIEVycm9yIEhhbmRsaW5nKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyBtb3ZpbmcgdGhlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBjYWxsIHdpdGhpbiBgY29weV9wcm9jZXNzKClgIGluIGBrZXJuZWwvZm9yay5jYC4gU3BlY2lmaWNhbGx5LCBpdCdzIHNoaWZ0aW5nIGl0ICpiZWZvcmUqIHRoZSBgY29weV9leGVjX3N0YXRlKGNsb25lX2ZsYWdzLCBwKWAgY2FsbCBhbmQgKmFmdGVyKiB0aGUgYHAtXHUwMDNlY2xlYXJfY2hpbGRfdGlkID0gLi4uYCBhc3NpZ25tZW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhpcyBjaGFuZ2UgaXMgYmVpbmcgcHJvcG9zZWQuIExldCdzIGRpZyBpbnRvIHRoaXMuXG5cblJpZ2h0LCBsb29raW5nIGF0IHRoZSBkaWZmLCBpdCdzIGEgc3RyYWlnaHRmb3J3YXJkIGNvZGUgbW92ZW1lbnQuIE5vdywgbXkgaW5pdGlhbCB0aG91Z2h0IGlzLCB3aGF0J3MgdGhlIGRlcGVuZGVuY3kgaGVyZT8gSXMgdGhlcmUgYSByZWFzb24gaXQgbmVlZHMgdG8gYmUgKmJlZm9yZSogb3IgKmFmdGVyKiBjZXJ0YWluIG9wZXJhdGlvbnM/IFRoZSBrZXkgaXMgdGhhdCBgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKWAgaW5pdGlhbGl6ZXMgc29tZSBmaWVsZHMgaW4gdGhlIG5ldyB0YXNrIHN0cnVjdHVyZSBgcGAuIElmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgY29kZSBqdW1wcyB0byBgYmFkX2ZvcmtfZnJlZWAuICpUaGF0KiBmdW5jdGlvbiBmcmVlcyBgcGAuIFxuXG5TbyBoZXJlJ3MgdGhlIGNydWNpYWwgcXVlc3Rpb246IGRvZXMgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHBlcmZvcm0gYW55IGFsbG9jYXRpb25zLCBvciBkb2VzIGl0IGp1c3QgaW5pdGlhbGl6ZSBmaWVsZHM/IElmIGl0IGFsbG9jYXRlcywgYW5kIGl0J3MgY2FsbGVkICpiZWZvcmUqIGBjb3B5X2V4ZWNfc3RhdGVgIHdoaWNoIGZhaWxzLCB3ZSdyZSBsZWFraW5nIG1lbW9yeSBpbiB0aGUgZmFpbHVyZSBjYXNlIHVubGVzcyBgYmFkX2ZvcmtfZnJlZWAgaGFuZGxlcyBpdC4gSWYgaXQgZG9lc24ndCBhbGxvY2F0ZSwgdGhlbiB0aGlzIG1vdmVtZW50IGlzIGxpa2VseSBmaW5lLCBtYXliZSBhbiBvcHRpbWl6YXRpb24sIG9yIG1heWJlIGl0IGp1c3QgbWFrZXMgdGhpbmdzIGNsZWFyZXIuIEknbSBnb2luZyB0byBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIHRvIGNvbmZpcm0gaXRzIGJlaGF2aW9yLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgYmVpbmcgaW5pdGlhbGl6ZWQgYW5kIGhvdyB0aGlzIGNoYW5nZSBhZmZlY3RzIHJlc291cmNlIG1hbmFnZW1lbnQgaW4gdGhlIGZhaWx1cmUgcGF0aC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA2OSwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM5OCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjA1LjkzOTY2MDMzWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTI2OTQyNjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl52b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL3RyYWNlL2ZncmFwaC5jPTExMzE9dm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KVxcbi0tXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNTktLyogQWxsb2NhdGUgYSByZXR1cm4gc3RhY2sgZm9yIG5ld2x5IGNyZWF0ZWQgdGFzayAqL1xcbmtlcm5lbC90cmFjZS9mZ3JhcGguYzoxMTYwOnZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxua2VybmVsL3RyYWNlL2ZncmFwaC5jLTExNjEte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjowNy44NjY2MDkwNFoiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODg2NjE3Mjg5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCoqXG5cbk9rYXksIGxldCdzIHN0YXJ0IGRpZ2dpbmcgaW50byBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AuIFRoaXMgaXMgd2hlcmUgdGhlIGNvcmUgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBmdW5jdGlvbiBncmFwaCB0cmFjZXIgaGFwcGVucyB3aGVuIGEgbmV3IHRhc2sgaXMgYm9ybiwgcmlnaHQ/IEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgdHJhY2luZyBpbmZyYXN0cnVjdHVyZSBpcyB3aXJlZCBpbnRvIHRoZSB0YXNrJ3MgZXhlY3V0aW9uIGNvbnRleHQuIEknbSBhc3N1bWluZyBpdCdzIGhhbmRsaW5nIHRoZSBzZXR1cCBvZiBwZXItdGFzayBkYXRhIHN0cnVjdHVyZXMsIGhvb2tpbmcgaW50byBzY2hlZHVsaW5nIGV2ZW50cywgYW5kIG1heWJlIGV2ZW4gZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSB0cmFjaW5nIGJhc2VkIG9uIGdsb2JhbCBzZXR0aW5ncyBvciB0YXNrLXNwZWNpZmljIGNyaXRlcmlhLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYGZ0cmFjZV9vcHNgIHN0cnVjdHVyZSwgaG93IGl0IGxpbmtzIHRvIHRoZSB0YXNrJ3MgYHRhc2tfc3RydWN0YCwgYW5kIGFueSBwb3RlbnRpYWwgb3ZlcmhlYWQgaW50cm9kdWNlZCBhdCB0YXNrIGNyZWF0aW9uLiBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gYW55IHN5bmNocm9uaXphdGlvbiBtZWNoYW5pc21zIHVzZWQgdG8gcHJvdGVjdCB0aGUgdHJhY2luZyBkYXRhIGFuZCBob3cgaXQgZGVhbHMgd2l0aCByYWNlcyBiZXR3ZWVuIHRhc2sgY3JlYXRpb24gYW5kIHRyYWNpbmcgb3BlcmF0aW9ucy4gTGV0J3Mgc2VlIGhvdyB0aGV5IGRlYWwgd2l0aCB0aGUgcHJlZW1wdGlvbiBhbmQgaXJxIHNpdHVhdGlvbnMuIEknbSBleHBlY3Rpbmcgc29tZSBjbGV2ZXIgdHJpY2tzIHRvIGtlZXAgaXQgZWZmaWNpZW50LiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5NzQsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjoxMS43NTMyMzAyNjlaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc5NTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC90cmFjZS9mZ3JhcGguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTU5LFxuICBcIkxpbmVDb3VudFwiOiAzMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMTU5OlxcdC8qIEFsbG9jYXRlIGEgcmV0dXJuIHN0YWNrIGZvciBuZXdseSBjcmVhdGVkIHRhc2sgKi9cXG4xMTYwOlxcdHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxuMTE2MTpcXHR7XFxuMTE2MjpcXHRcXHQvKiBNYWtlIHN1cmUgd2UgZG8gbm90IHVzZSB0aGUgcGFyZW50IHJldF9zdGFjayAqL1xcbjExNjM6XFx0XFx0dC1cXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtcXG4xMTY0OlxcdFxcdHQtXFx1MDAzZWN1cnJfcmV0X3N0YWNrID0gMDtcXG4xMTY1OlxcdFxcdHQtXFx1MDAzZWN1cnJfcmV0X2RlcHRoID0gLTE7XFxuMTE2NjpcXHRcXG4xMTY3OlxcdFxcdGlmIChmdHJhY2VfZ3JhcGhfYWN0aXZlKSB7XFxuMTE2ODpcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpyZXRfc3RhY2s7XFxuMTE2OTpcXHRcXG4xMTcwOlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoIWZncmFwaF9zdGFja19jYWNoZXApKVxcbjExNzE6XFx0XFx0XFx0XFx0cmV0dXJuO1xcbjExNzI6XFx0XFxuMTE3MzpcXHRcXHRcXHRyZXRfc3RhY2sgPSBrbWVtX2NhY2hlX2FsbG9jKGZncmFwaF9zdGFja19jYWNoZXAsIEdGUF9LRVJORUwpO1xcbjExNzQ6XFx0XFx0XFx0aWYgKCFyZXRfc3RhY2spXFxuMTE3NTpcXHRcXHRcXHRcXHRyZXR1cm47XFxuMTE3NjpcXHRcXHRcXHRncmFwaF9pbml0X3Rhc2sodCwgcmV0X3N0YWNrKTtcXG4xMTc3OlxcdFxcdH1cXG4xMTc4OlxcdH1cXG4xMTc5OlxcdFxcbjExODA6XFx0dm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcXG4xMTgxOlxcdHtcXG4xMTgyOlxcdFxcdHVuc2lnbmVkIGxvbmcgKnJldF9zdGFjayA9IHQtXFx1MDAzZXJldF9zdGFjaztcXG4xMTgzOlxcdFxcbjExODQ6XFx0XFx0dC1cXHUwMDNlcmV0X3N0YWNrID0gTlVMTDtcXG4xMTg1OlxcdFxcdC8qIE5VTEwgbXVzdCBiZWNvbWUgdmlzaWJsZSB0byBJUlFzIGJlZm9yZSB3ZSBmcmVlIGl0OiAqL1xcbjExODY6XFx0XFx0YmFycmllcigpO1xcbjExODc6XFx0XFxuMTE4ODpcXHRcXHRpZiAocmV0X3N0YWNrKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjExLjc1MzQxMTkxOVoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzUxOTEyNDM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgVGFzayBJbml0aWFsaXphdGlvbiBmb3IgRnVuY3Rpb24gVHJhY2luZyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYC4gSXQncyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBpdCBhbGxvY2F0ZXMgdGhlIGByZXRfc3RhY2tgLCBidXQgb25seSB3aGVuIGBmdHJhY2VfZ3JhcGhfYWN0aXZlYCBpcyBzZXQsIHdoaWNoIG1ha2VzIHNlbnNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBOb3csIEkgc2VlIHRoaXMgYGNvcHlfZXhlY19zdGF0ZWAgY2FsbC4gSWYgdGhhdCBmYWlscywgaXQganVtcHMgZGlyZWN0bHkgdG8gYGJhZF9mb3JrX2ZyZWVgLiBUaGF0J3MgYSBwb3RlbnRpYWwgYXJlYSBmb3IgZmFpbHVyZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhhdCBgYmFkX2ZvcmtfZnJlZWAgcGF0aCBiZXR0ZXIsIGVzcGVjaWFsbHkgZ2l2ZW4gaG93IGNyaXRpY2FsIGZvcmsgb3BlcmF0aW9ucyBhcmUuIFRpbWUgdG8gaGVhZCBvdmVyIHRvIGBrZXJuZWwvZm9yay5jYCBhbmQgZGlnIGludG8gYGJhZF9mb3JrX2ZyZWVgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHJlc291cmNlcyBhcmUgYmVpbmcgZnJlZWQgYW5kIGlmIGFueSBjbGVhbnVwIG1pZ2h0IGJlIG1pc3Npbmcgb3IgaW5zdWZmaWNpZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjozNjk5LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjoxNS4xMDUzMjY2ODVaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MTg2Nzc3NjMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYmFkX2ZvcmtfZnJlZTpcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2ZvcmsuYz0yMDE4PV9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXFxuLS1cXG5rZXJuZWwvZm9yay5jLTI2NDEtXFx0ZXhpdF9jcmVkcyhwKTtcXG5rZXJuZWwvZm9yay5jOjI2NDI6YmFkX2ZvcmtfZnJlZTpcXG5rZXJuZWwvZm9yay5jLTI2NDMtXFx0V1JJVEVfT05DRShwLVxcdTAwM2VfX3N0YXRlLCBUQVNLX0RFQUQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjoxNi42MjQwMTEwMjhaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDM4NzUyNjEzMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIGBiYWRfZm9ya19mcmVlYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGtlcm5lbCdzIGZvcmsgaW1wbGVtZW50YXRpb24uIEknbSBnb2luZyB0byBqdW1wIGludG8gYGtlcm5lbC9mb3JrLmNgIGFuZCBzcGVjaWZpY2FsbHkgZm9jdXMgb24gdGhlIGBiYWRfZm9ya19mcmVlYCBmdW5jdGlvbi4gSSdtIGFzc3VtaW5nLCBnaXZlbiB0aGUgbmFtZSwgdGhpcyBpcyB3aGVyZSB3ZSdyZSBoYW5kbGluZyBzb21lIGtpbmQgb2YgY2xlYW51cCBvciBlcnJvciBzY2VuYXJpbyByZWxhdGVkIHRvIHRoZSBgZm9ya2Agc3lzdGVtIGNhbGwuIFByb2JhYmx5IGRlYWxpbmcgd2l0aCBmcmVlaW5nIHJlc291cmNlcyB0aGF0IHdlcmUgcGFydGlhbGx5IGFsbG9jYXRlZCBkdXJpbmcgYSBmYWlsZWQgZm9yayBhdHRlbXB0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZvcmsgbG9naWMuIEknbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2U6IHdoYXQgcmVzb3VyY2VzIGFyZSBmcmVlZCwgdW5kZXIgd2hhdCBjb25kaXRpb25zIGlzIGl0IGNhbGxlZCwgYW5kIGhvdyBpdCBlbnN1cmVzIHRoZSBzeXN0ZW0gcmVtYWlucyBjb25zaXN0ZW50IGFmdGVyIGEgZm9yayBmYWlsdXJlLiBJcyBpdCBmcmVlaW5nIG1lbW9yeSwgY2xlYW5pbmcgdXAgdGFzayBzdHJ1Y3R1cmVzLCBvciByZWxlYXNpbmcgb3RoZXIga2VybmVsIHJlc291cmNlcz8gVGltZSB0byByZWFkIHRoZSBjb2RlIGNhcmVmdWxseSBhbmQgdW5kZXJzdGFuZCB0aGUgc3BlY2lmaWMgY29udGV4dCBvZiB0aGlzIGZ1bmN0aW9uLiBJJ2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgbGlrZSB0YXNrIHN0cnVjdHVyZXMsIG1tIHN0cnVjdHVyZXMsIGFuZCBhbnkgb3RoZXIgcmVsZXZhbnQga2VybmVsIGRhdGEuIExldCdzIHNlZSBpZiB0aGlzIHNoZWRzIGxpZ2h0IG9uIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIHJlc291cmNlIGxlYWtzIHdpdGhpbiB0aGUgZm9yayBpbXBsZW1lbnRhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDA2MSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjIxLjAxMTUzOTM2WiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNzU4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvZm9yay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI2NDAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjI2NDA6XFx0XFx0ZXhpdF9jcmVkX25hbWVzcGFjZXMocCk7XFxuMjY0MTpcXHRcXHRleGl0X2NyZWRzKHApO1xcbjI2NDI6XFx0YmFkX2ZvcmtfZnJlZTpcXG4yNjQzOlxcdFxcdFdSSVRFX09OQ0UocC1cXHUwMDNlX19zdGF0ZSwgVEFTS19ERUFEKTtcXG4yNjQ0OlxcdFxcdGV4aXRfdGFza19zdGFja19hY2NvdW50KHApO1xcbjI2NDU6XFx0XFx0cHV0X3Rhc2tfc3RhY2socCk7XFxuMjY0NjpcXHRcXHRkZWxheWVkX2ZyZWVfdGFzayhwKTtcXG4yNjQ3OlxcdGZvcmtfb3V0OlxcbjI2NDg6XFx0XFx0c3Bpbl9sb2NrX2lycShcXHUwMDI2Y3VycmVudC1cXHUwMDNlc2lnaGFuZC1cXHUwMDNlc2lnbG9jayk7XFxuMjY0OTpcXHRcXHRobGlzdF9kZWxfaW5pdChcXHUwMDI2ZGVsYXllZC5ub2RlKTtcXG4yNjUwOlxcdFxcdHNwaW5fdW5sb2NrX2lycShcXHUwMDI2Y3VycmVudC1cXHUwMDNlc2lnaGFuZC1cXHUwMDNlc2lnbG9jayk7XFxuMjY1MTpcXHRcXHRyZXR1cm4gRVJSX1BUUihyZXR2YWwpO1xcbjI2NTI6XFx0fVxcbjI2NTM6XFx0XFxuMjY1NDpcXHRzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9pZGxlX3BpZHMoc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKVxcbjI2NTU6XFx0e1xcbjI2NTY6XFx0XFx0ZW51bSBwaWRfdHlwZSB0eXBlO1xcbjI2NTc6XFx0XFxuMjY1ODpcXHRcXHRmb3IgKHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcXHUwMDNjIFBJRFRZUEVfTUFYOyArK3R5cGUpIHtcXG4yNjU5OlxcdFxcdFxcdElOSVRfSExJU1RfTk9ERShcXHUwMDI2aWRsZS1cXHUwMDNlcGlkX2xpbmtzW3R5cGVdKTsgLyogbm90IHJlYWxseSBuZWVkZWQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTY6MjEuMDExNjgwMjlaIiwiU2VxIjo0NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA2MjE0NjIxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBzdW1tYXJpemVkIGZyb20gbXkgcGVyc3BlY3RpdmUgYXMgc29tZW9uZSBmYW1pbGlhciB3aXRoIGtlcm5lbCBpbnRlcm5hbHM6XG5cbioqS2VybmVsIFRhc2sgU3RydWN0IExpZmVjeWNsZSBBbmFseXNpcyoqXG5cbkFscmlnaHQsIGhhbmcgb24gYSBzZWNvbmQuIEknbSBmb2N1c2luZyBvbiB0YXNrIGNsZWFudXAsIGFuZCB0aGlzIGBkZWxheWVkX2ZyZWVfdGFza2AgZnVuY3Rpb27igKYgdGhhdCdzIHRoZSBvbmUgdGhhdCBhY3R1YWxseSAqZnJlZXMqIHRoZSB0YXNrIHN0cnVjdCwgcmlnaHQ/IFRoZSBrZXkgaGVyZSBpcyB0byBkZXRlcm1pbmUgKmV4YWN0bHkqIHdoZW4gYW5kIGhvdyBhIHRhc2sgc3RydWN0dXJlIGlzIGRlYWxsb2NhdGVkLCBhbmQgdGhpcyBgZGVsYXllZF9mcmVlX3Rhc2tgIGlzIHRoZSBsaWtlbHkgY3VscHJpdC5cblxuTXkgbmV4dCBzdGVwLCBhbmQgaXTigJlzIGEgY3JpdGljYWwgb25lLCBpcyB0byBjb25maXJtIHdoZXRoZXIgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIGlzIGNhbGxlZCAqYmVmb3JlKiB0aGF0IHN0cnVjdCBpcyBmcmVlZC4gVW5kZXJzdGFuZGluZyB0aGUgdGltaW5nIG9mIHRoZSB0cmFjaW5nLXJlbGF0ZWQgY2xlYW51cCBpbiByZWxhdGlvbiB0byB0aGUgbWFpbiBtZW1vcnkgZGVhbGxvY2F0aW9uIGlzIGNydWNpYWwgZm9yIGF2b2lkaW5nIGFueSByYWNlIGNvbmRpdGlvbnMgb3IgZGFuZ2xpbmcgcG9pbnRlciBpc3N1ZXMuIFRoaXMgaXMgYSB2ZXJ5IGNvbW1vbiBpc3N1ZSBpbiBrZXJuZWwgdHJhY2luZy5cblxuVG8gbmFpbCB0aGlzIGRvd24sIEkgbmVlZCB0byBkaXZlIGludG8gdGhlIGNvZGUuIEVpdGhlciBgZGVsYXllZF9mcmVlX3Rhc2tgIGl0c2VsZiwgb3IgYGZyZWVfdGFza2AsIGlmIGBkZWxheWVkX2ZyZWVfdGFza2AgaXMganVzdCBhIHdyYXBwZXIsIHdpbGwgYmUgdGhlIG5leHQgcGxhY2UgdG8gbG9vayB0byB1bmRlcnN0YW5kIHRoZSBleGFjdCBzZXF1ZW5jaW5nIG9mIHRoZXNlIG9wZXJhdGlvbnMuIFRoaXMgaXMgd2hlcmUgSSdsbCBmaW5kIG15IGFuc3dlcnMgYW5kIGNvbmZpcm0gdGhlIHRpbWluZyBvZiB0aGUgRnRyYWNlIGluc3RydW1lbnRhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDY5MywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTY6MjUuMDczODI5NTUzWiIsIlNlcSI6NDYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTg3MjkyNTcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9mdHJhY2UuaD0xMzQ0PWV4dGVybiB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KTtcXG5pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oOjEzNDU6ZXh0ZXJuIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpO1xcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM0Ni1leHRlcm4gdm9pZCBmdHJhY2VfZ3JhcGhfaW5pdF9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgY3B1KTtcXG4tLVxcbmluY2x1ZGUvbGludXgvZnRyYWNlLmg9MTM2ND1zdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgfVxcbmluY2x1ZGUvbGludXgvZnRyYWNlLmg6MTM2NTpzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgfVxcbmluY2x1ZGUvbGludXgvZnRyYWNlLmgtMTM2Ni1zdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNwdSkgeyB9XFxuLS1cXG5rZXJuZWwvZm9yay5jPTUzMz12b2lkIGZyZWVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG4tLVxcbmtlcm5lbC9mb3JrLmMtNTU1LVxcdHJ0X211dGV4X2RlYnVnX3Rhc2tfZnJlZSh0c2spO1xcbmtlcm5lbC9mb3JrLmM6NTU2OlxcdGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2sodHNrKTtcXG5rZXJuZWwvZm9yay5jLTU1Ny1cXHRhcmNoX3JlbGVhc2VfdGFza19zdHJ1Y3QodHNrKTtcXG4tLVxcbmtlcm5lbC90cmFjZS9mZ3JhcGguYz0xMTYwPXZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXFxuLS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmMtMTE3OS1cXG5rZXJuZWwvdHJhY2UvZmdyYXBoLmM6MTE4MDp2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KVxcbmtlcm5lbC90cmFjZS9mZ3JhcGguYy0xMTgxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjFUMTI6NTY6MjYuNjYxMTMwODg0WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU2Nzk3NDkwOTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQSBQb3RlbnRpYWwgTWVtb3J5IENvcnJ1cHRpb24gSXNzdWUgaW4gVGFzayBGb3JraW5nIHdpdGggRnRyYWNlKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgaG93IHRhc2sgc3RydWN0dXJlcyBhcmUgaGFuZGxlZCBkdXJpbmcgYSBmb3JrLCBzcGVjaWZpY2FsbHkgd2l0aCBmdHJhY2UgZW5hYmxlZC4gSSBzZWUgdGhhdCBgZnJlZV90YXNrYCBjYWxscyBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AsIHdoaWNoIGlzIGV4cGVjdGVkLiBOb3csIGlmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzLCB0aGUgYGJhZF9mb3JrX2ZyZWVgIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCwgbGVhZGluZyB0byBhIGRlbGF5ZWQgZnJlZSBvZiB0aGUgdGFzaywgdWx0aW1hdGVseSBjYWxsaW5nIGBmcmVlX3Rhc2tgIGFuZCB0aGVuIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrYCwgYXMgZXhwZWN0ZWQuXG5cbkJ1dCB3YWl0LCB0aGlzIHNtZWxscyBmaXNoeS4gV2hhdCBpZiBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agd2FzIGFjdHVhbGx5IGNhbGxlZCAqYWZ0ZXIqIGBjb3B5X2V4ZWNfc3RhdGVgIHdpdGhpbiBhIGZvcmsgc2VxdWVuY2UsIGFuZCAqdGhlbiogdGhlIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzPyBJbiB0aGlzIHNjZW5hcmlvLCBgYmFkX2ZvcmtfZnJlZWAgd291bGQgc3RpbGwgY2FsbCBgZnRyYWNlX2dyYXBoX2V4aXRfdGFza2AsIGRlc3BpdGUgYGNvcHlfZXhlY19zdGF0ZWAgZmFpbGluZy5cblxuQSBsaWdodGJ1bGIganVzdCB3ZW50IG9mZiEgVGhlIGZ1bmN0aW9uIGBwID0gZHVwX3Rhc2tfc3RydWN0KGN1cnJlbnQsIG5vZGUpO2AgaXMgY2FsbGVkLiBJdCBjb3BpZXMgdGhlIGVudGlyZSB0YXNrIHN0cnVjdHVyZSBmcm9tIHRoZSBwYXJlbnQsIGluY2x1ZGluZyB0aGUgYHAtXHUwMDNlcmV0X3N0YWNrYC4gTm93IGlmIGBjb3B5X2V4ZWNfc3RhdGVgIGZhaWxzIGFuZCBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2Agd2FzIG5ldmVyIGNhbGxlZCwgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIHdvdWxkIGZyZWUgdGhlICpwYXJlbnQncyogYHJldF9zdGFja2AhIFRoaXMgaXMgZGVmaW5pdGVseSBhIG1lbW9yeSBjb3JydXB0aW9uIHZ1bG5lcmFiaWxpdHkgd2FpdGluZyB0byBoYXBwZW4uIEkgbmVlZCB0byBkaXZlIGludG8gYGR1cF90YXNrX3N0cnVjdGAgcmlnaHQgYXdheSB0byBjb25maXJtIG15IHN1c3BpY2lvbnMgYW5kIHNlZSBob3cgdGhpcyBpcyBoYW5kbGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDQ4LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjMyLjM0MDg4Mzc0NloiLCJTZXEiOjQ4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTI4NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2ZvcmsuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDgwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMDgwOlxcdH1cXG4xMDgxOlxcdFxcbjEwODI6XFx0c3RhdGljIHZvaWQgbW1hcF9pbml0X2xvY2soc3RydWN0IG1tX3N0cnVjdCAqbW0pXFxuMTA4MzpcXHR7XFxuMTA4NDpcXHRcXHRpbml0X3J3c2VtKFxcdTAwMjZtbS1cXHUwMDNlbW1hcF9sb2NrKTtcXG4xMDg1OlxcdFxcdG1tX2xvY2tfc2VxY291bnRfaW5pdChtbSk7XFxuMTA4NjpcXHQjaWZkZWYgQ09ORklHX1BFUl9WTUFfTE9DS1xcbjEwODc6XFx0XFx0cmN1d2FpdF9pbml0KFxcdTAwMjZtbS1cXHUwMDNldm1hX3dyaXRlcl93YWl0KTtcXG4xMDg4OlxcdCNlbmRpZlxcbjEwODk6XFx0fVxcbjEwOTA6XFx0XFxuMTA5MTpcXHRzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqbW1faW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKVxcbjEwOTI6XFx0e1xcbjEwOTM6XFx0XFx0bXRfaW5pdF9mbGFncyhcXHUwMDI2bW0tXFx1MDAzZW1tX210LCBNTV9NVF9GTEFHUyk7XFxuMTA5NDpcXHRcXHRtdF9zZXRfZXh0ZXJuYWxfbG9jayhcXHUwMDI2bW0tXFx1MDAzZW1tX210LCBcXHUwMDI2bW0tXFx1MDAzZW1tYXBfbG9jayk7XFxuMTA5NTpcXHRcXHRhdG9taWNfc2V0KFxcdTAwMjZtbS1cXHUwMDNlbW1fdXNlcnMsIDEpO1xcbjEwOTY6XFx0XFx0YXRvbWljX3NldChcXHUwMDI2bW0tXFx1MDAzZW1tX2NvdW50LCAxKTtcXG4xMDk3OlxcdFxcdHNlcWNvdW50X2luaXQoXFx1MDAyNm1tLVxcdTAwM2V3cml0ZV9wcm90ZWN0X3NlcSk7XFxuMTA5ODpcXHRcXHRtbWFwX2luaXRfbG9jayhtbSk7XFxuMTA5OTpcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2bW0tXFx1MDAzZW1tbGlzdCk7XFxuMTEwMDpcXHRcXHRtbV9wZ3RhYmxlc19ieXRlc19pbml0KG1tKTtcXG4xMTAxOlxcdFxcdG1tLVxcdTAwM2VtYXBfY291bnQgPSAwO1xcbjExMDI6XFx0XFx0bW0tXFx1MDAzZWxvY2tlZF92bSA9IDA7XFxuMTEwMzpcXHRcXHRhdG9taWM2NF9zZXQoXFx1MDAyNm1tLVxcdTAwM2VwaW5uZWRfdm0sIDApO1xcbjExMDQ6XFx0XFx0bWVtc2V0KFxcdTAwMjZtbS1cXHUwMDNlcnNzX3N0YXQsIDAsIHNpemVvZihtbS1cXHUwMDNlcnNzX3N0YXQpKTtcXG4xMTA1OlxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZtbS1cXHUwMDNlcGFnZV90YWJsZV9sb2NrKTtcXG4xMTA2OlxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZtbS1cXHUwMDNlYXJnX2xvY2spO1xcbjExMDc6XFx0XFx0bW1faW5pdF9jcHVtYXNrKG1tKTtcXG4xMTA4OlxcdFxcdG1tX2luaXRfYWlvKG1tKTtcXG4xMTA5OlxcdFxcdG1tX2luaXRfb3duZXIobW0sIHApO1xcbjExMTA6XFx0XFx0bW1fcGFzaWRfaW5pdChtbSk7XFxuMTExMTpcXHRcXHRSQ1VfSU5JVF9QT0lOVEVSKG1tLVxcdTAwM2VleGVfZmlsZSwgTlVMTCk7XFxuMTExMjpcXHRcXHRtbXVfbm90aWZpZXJfc3Vic2NyaXB0aW9uc19pbml0KG1tKTtcXG4xMTEzOlxcdFxcdGluaXRfdGxiX2ZsdXNoX3BlbmRpbmcobW0pO1xcbjExMTQ6XFx0I2lmIGRlZmluZWQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSBcXHUwMDI2XFx1MDAyNiAhZGVmaW5lZChDT05GSUdfU1BMSVRfUE1EX1BUTE9DS1MpXFxuMTExNTpcXHRcXHRtbS1cXHUwMDNlcG1kX2h1Z2VfcHRlID0gTlVMTDtcXG4xMTE2OlxcdCNlbmRpZlxcbjExMTc6XFx0XFx0bW1faW5pdF91cHJvYmVzX3N0YXRlKG1tKTtcXG4xMTE4OlxcdFxcdGh1Z2V0bGJfY291bnRfaW5pdChtbSk7XFxuMTExOTpcXHRcXHRmdXRleF9tbV9pbml0KG1tKTtcXG4xMTIwOlxcdFxcbjExMjE6XFx0XFx0bW1fZmxhZ3NfY2xlYXJfYWxsKG1tKTtcXG4xMTIyOlxcdFxcdGlmIChjdXJyZW50LVxcdTAwM2VtbSkge1xcbjExMjM6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBmbGFncyA9IF9fbW1fZmxhZ3NfZ2V0X3dvcmQoY3VycmVudC1cXHUwMDNlbW0pO1xcbjExMjQ6XFx0XFxuMTEyNTpcXHRcXHRcXHRfX21tX2ZsYWdzX292ZXJ3cml0ZV93b3JkKG1tLCBtbWZfaW5pdF9sZWdhY3lfZmxhZ3MoZmxhZ3MpKTtcXG4xMTI2OlxcdFxcdFxcdG1tLVxcdTAwM2VkZWZfZmxhZ3MgPSBjdXJyZW50LVxcdTAwM2VtbS1cXHUwMDNlZGVmX2ZsYWdzIFxcdTAwMjYgVk1fSU5JVF9ERUZfTUFTSztcXG4xMTI3OlxcdFxcdH0gZWxzZSB7XFxuMTEyODpcXHRcXHRcXHRfX21tX2ZsYWdzX292ZXJ3cml0ZV93b3JkKG1tLCBjb3JlZHVtcF9maWx0ZXIpO1xcbjExMjk6XFx0XFx0XFx0bW0tXFx1MDAzZWRlZl9mbGFncyA9IDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjMyLjM0MTA3ODU4NloiLCJTZXEiOjQ5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzgxMDU3MDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQ2hlY2tpbmcgYGR1cF90YXNrX3N0cnVjdGAqKlxuXG5SaWdodCwgbGV0IG1lIGp1c3QgcGF1c2UgYW5kIG1ha2UgYSBxdWljayBtZW50YWwgbm90ZSDigJMgSSBuZWVkIHRvIGNpcmNsZSBiYWNrIGFuZCBzcGVjaWZpY2FsbHkgZXhhbWluZSBgZHVwX3Rhc2tfc3RydWN0YC4gR2l2ZW4gdGhlIGNvbnRleHQgb2Ygd2hhdCBJJ20gd29ya2luZyBvbiwgSSBzdXNwZWN0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgbnVhbmNlZCBiZWhhdmlvciB0aGVyZSB0aGF0IGNvdWxkIGltcGFjdCB0aGUgb3ZlcmFsbCBkZXNpZ24uIEknbSB0aGlua2luZyBhYm91dCBwb3RlbnRpYWwgaW1wbGljYXRpb25zIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50IG9yIHBlcmhhcHMgaG93IHdlJ3JlIGhhbmRsaW5nIHRocmVhZCBjcmVhdGlvbi4gSXTigJlzIGFsd2F5cyB3b3J0aCBhIHF1aWNrIGNoZWNrLCBlc3BlY2lhbGx5IHdpdGggc29tZXRoaW5nIHRoYXQgZGVhbHMgZGlyZWN0bHkgd2l0aCB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZSBmb3IgcHJvY2Vzc2VzLiBOZWVkIHRvIHNlZSBob3cgdGhhdCBmdW5jdGlvbuKAmXMgaW50ZXJuYWwgd29ya2luZ3MgbWlnaHQgYmUgYWZmZWN0ZWQgYnkgY3VycmVudCBjaGFuZ2VzLCBhbmQsIG9mIGNvdXJzZSwgaG93IGFueSBtb2RpZmljYXRpb25zIGNvdWxkIGluZmx1ZW5jZSBwZXJmb3JtYW5jZS4gVGltZSB0byBkaWcgaW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY5NDEsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIxVDEyOjU2OjM1LjcyMjEzOTExWiIsIlNlcSI6NTAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjMzMzU3MDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0IFxcXFwqZHVwX3Rhc2tfc3RydWN0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9mb3JrLmM9OTA3PXZvaWQgc2V0X3Rhc2tfc3RhY2tfZW5kX21hZ2ljKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbi0tXFxua2VybmVsL2ZvcmsuYy05MTQtXFxua2VybmVsL2ZvcmsuYzo5MTU6c3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqZHVwX3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqb3JpZywgaW50IG5vZGUpXFxua2VybmVsL2ZvcmsuYy05MTYte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1NjozOC4zNTU1MDI0OThaIiwiU2VxIjo1MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzExMjU4OTcwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJ20gZGVlcCBpbiB0aGUgd2VlZHMgb2Yga2VybmVsLWxldmVsIGNvZGU6XG5cbioqRGl2aW5nIGludG8gYGR1cF90YXNrX3N0cnVjdGAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGNyYWNrIG9wZW4gdGhlIGBkdXBfdGFza19zdHJ1Y3RgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGlzIHdvcmtzLiBJIGtub3cgaXQncyBmdW5kYW1lbnRhbCB0byBwcm9jZXNzIGNyZWF0aW9uIHdpdGhpbiB0aGUga2VybmVsLCBzbyB0aGlzIG5lZWRzIG15IGZ1bGwgYXR0ZW50aW9uLiBMZXQncyBzZWUgaG93IGl0J3MgaW1wbGVtZW50ZWQgYW5kIGFsbCB0aGUgcmVsZXZhbnQgZGF0YSBzdHJ1Y3R1cmVzIGl0IHRvdWNoZXMuIEknbSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVnaWVzIGFuZCBob3cgcmVzb3VyY2VzIGFyZSBjb3BpZWQgKG9yIHNoYXJlZCwgbW9yZSBsaWtlbHkpLiBJdCdzIGNydWNpYWwgdG8gZ3Jhc3AgdGhlIHN1YnRsZXRpZXMgaGVyZSDigJMgZW5zdXJpbmcgYSBjbGVhbiBzZXBhcmF0aW9uIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZCBwcm9jZXNzZXMgd2hpbGUgYWxzbyBvcHRpbWl6aW5nIGZvciBwZXJmb3JtYW5jZSBpcyBhIGRlbGljYXRlIGJhbGFuY2luZyBhY3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcyNDcsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1Njo0MS40NjgwOTQ4ODFaIiwiU2VxIjo1MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYwMzgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9mb3JrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTE1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgOTE1OlxcdHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmR1cF90YXNrX3N0cnVjdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9yaWcsIGludCBub2RlKVxcbiA5MTY6XFx0e1xcbiA5MTc6XFx0XFx0c3RydWN0IHRhc2tfc3RydWN0ICp0c2s7XFxuIDkxODpcXHRcXHRpbnQgZXJyO1xcbiA5MTk6XFx0XFxuIDkyMDpcXHRcXHRpZiAobm9kZSA9PSBOVU1BX05PX05PREUpXFxuIDkyMTpcXHRcXHRcXHRub2RlID0gdHNrX2ZvcmtfZ2V0X25vZGUob3JpZyk7XFxuIDkyMjpcXHRcXHR0c2sgPSBhbGxvY190YXNrX3N0cnVjdF9ub2RlKG5vZGUpO1xcbiA5MjM6XFx0XFx0aWYgKCF0c2spXFxuIDkyNDpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gOTI1OlxcdFxcbiA5MjY6XFx0XFx0ZXJyID0gYXJjaF9kdXBfdGFza19zdHJ1Y3QodHNrLCBvcmlnKTtcXG4gOTI3OlxcdFxcdGlmIChlcnIpXFxuIDkyODpcXHRcXHRcXHRnb3RvIGZyZWVfdHNrO1xcbiA5Mjk6XFx0XFxuIDkzMDpcXHRcXHRlcnIgPSBhbGxvY190aHJlYWRfc3RhY2tfbm9kZSh0c2ssIG5vZGUpO1xcbiA5MzE6XFx0XFx0aWYgKGVycilcXG4gOTMyOlxcdFxcdFxcdGdvdG8gZnJlZV90c2s7XFxuIDkzMzpcXHRcXG4gOTM0OlxcdCNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTS1xcbiA5MzU6XFx0XFx0cmVmY291bnRfc2V0KFxcdTAwMjZ0c2stXFx1MDAzZXN0YWNrX3JlZmNvdW50LCAxKTtcXG4gOTM2OlxcdCNlbmRpZlxcbiA5Mzc6XFx0XFx0YWNjb3VudF9rZXJuZWxfc3RhY2sodHNrLCAxKTtcXG4gOTM4OlxcdFxcbiA5Mzk6XFx0XFx0ZXJyID0gc21wX3Rhc2tfaXBpX21hc2tfYWxsb2ModHNrKTtcXG4gOTQwOlxcdFxcdGlmIChlcnIpXFxuIDk0MTpcXHRcXHRcXHRnb3RvIGZyZWVfc3RhY2s7XFxuIDk0MjpcXHRcXG4gOTQzOlxcdFxcdGVyciA9IHNjc19wcmVwYXJlKHRzaywgbm9kZSk7XFxuIDk0NDpcXHRcXHRpZiAoZXJyKVxcbiA5NDU6XFx0XFx0XFx0Z290byBmcmVlX2lwaV9tYXNrO1xcbiA5NDY6XFx0XFxuIDk0NzpcXHQjaWZkZWYgQ09ORklHX1NFQ0NPTVBcXG4gOTQ4OlxcdFxcdC8qXFxuIDk0OTpcXHRcXHQgKiBXZSBtdXN0IGhhbmRsZSBzZXR0aW5nIHVwIHNlY2NvbXAgZmlsdGVycyBvbmNlIHdlJ3JlIHVuZGVyXFxuIDk1MDpcXHRcXHQgKiB0aGUgc2lnaGFuZCBsb2NrIGluIGNhc2Ugb3JpZyBoYXMgY2hhbmdlZCBiZXR3ZWVuIG5vdyBhbmRcXG4gOTUxOlxcdFxcdCAqIHRoZW4uIFVudGlsIHRoZW4sIGZpbHRlciBtdXN0IGJlIE5VTEwgdG8gYXZvaWQgbWVzc2luZyB1cFxcbiA5NTI6XFx0XFx0ICogdGhlIHVzYWdlIGNvdW50cyBvbiB0aGUgZXJyb3IgcGF0aCBjYWxsaW5nIGZyZWVfdGFzay5cXG4gOTUzOlxcdFxcdCAqL1xcbiA5NTQ6XFx0XFx0dHNrLVxcdTAwM2VzZWNjb21wLmZpbHRlciA9IE5VTEw7XFxuIDk1NTpcXHQjZW5kaWZcXG4gOTU2OlxcdFxcbiA5NTc6XFx0XFx0UkNVX0lOSVRfUE9JTlRFUih0c2stXFx1MDAzZWV4ZWNfc3RhdGUsIE5VTEwpO1xcbiA5NTg6XFx0XFxuIDk1OTpcXHRcXHRzZXR1cF90aHJlYWRfc3RhY2sodHNrLCBvcmlnKTtcXG4gOTYwOlxcdFxcdGNsZWFyX3VzZXJfcmV0dXJuX25vdGlmaWVyKHRzayk7XFxuIDk2MTpcXHRcXHRjbGVhcl90c2tfbmVlZF9yZXNjaGVkKHRzayk7XFxuIDk2MjpcXHRcXHRzZXRfdGFza19zdGFja19lbmRfbWFnaWModHNrKTtcXG4gOTYzOlxcdFxcdGNsZWFyX3N5c2NhbGxfd29ya19zeXNjYWxsX3VzZXJfZGlzcGF0Y2godHNrKTtcXG4gOTY0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1Njo0MS40NjgyNTg1NDFaIiwiU2VxIjo1MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTY3NTIwNDU2NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFVzZS1BZnRlci1GcmVlL0RvdWJsZSBGcmVlIGluIFRhc2sgQ3JlYXRpb24gd2l0aCBmdHJhY2UqKlxuXG5Pa2F5LCBzbyBoZXJlJ3MgdGhlIGRlYWwuIGBhcmNoX2R1cF90YXNrX3N0cnVjdGAgZG9lcyBhIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIHBhcmVudCdzIGB0YXNrX3N0cnVjdGAgdG8gdGhlIGNoaWxkLiBUaGF0IG1lYW5zIHRoZSBgcmV0X3N0YWNrYCBwb2ludGVyLCB1c2VkIGJ5IGZ0cmFjZSwgZ2V0cyBjb3BpZWQgdG9vLiBUaGF0IG1ha2VzIHNlbnNlLCBidXQgaXQgY2FuIGxlYWQgdG8gYSByZWFsbHkgbmFzdHkgYnVnLlxuXG5MZXQncyBzYXkgYGNvcHlfZXhlY19zdGF0ZWAgb3Igc29tZXRoaW5nIGVsc2UgZmFpbHMgZHVyaW5nIHRoZSB0YXNrIGNyZWF0aW9uLiBJZiB0aGF0IGhhcHBlbnMsIGBiYWRfZm9ya19mcmVlYCBnZXRzIGNhbGxlZCwgd2hpY2ggdWx0aW1hdGVseSBsZWFkcyB0byBgZnJlZV90YXNrYCwgYW5kIHRoZW4gYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgLiBIZXJlJ3MgdGhlIGtpY2tlcjogaWYgYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgICpoYXNuJ3QqIGJlZW4gY2FsbGVkIHlldCwgdGhlIGNoaWxkJ3MgYHJldF9zdGFja2Agc3RpbGwgcG9pbnRzIHRvIHRoZSAqcGFyZW50J3MqIGByZXRfc3RhY2tgIVxuXG5TbywgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2tgIGlzIGdvaW5nIHRvIGZyZWUgdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgISBUaGF0J3MgYSBkb3VibGUgZnJlZSB3YWl0aW5nIHRvIGhhcHBlbiwgb3IgYSB1c2UtYWZ0ZXItZnJlZSBmb3IgdGhlIHBhcmVudC4gVGhlIHBhcmVudCwgd2hpY2ggaXMgc3RpbGwgcnVubmluZywgaGFwcGlseSBjaHVncyBhbG9uZywgdXNpbmcgbWVtb3J5IHRoYXQgaGFzIGp1c3QgYmVlbiAqZnJlZWQqLiAgQ2xhc3NpYyBVQUYvZG91YmxlIGZyZWUuXG5cbk5vdywgaXMgdGhpcyBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZT8gIE5vLiBLTVNBTiBpc24ndCB0aGUgdG9vbCBoZXJlLiBUaGlzIGlzIGEgY2xlYXIgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWUuIEtBU0FOIGlzIHRoZSB3YXkgdG8gZ28uIEl0IHdpbGwgY2F0Y2ggdGhlIHBhcmVudCB1c2luZyB0aGUgZnJlZWQgbWVtb3J5IG9yIHRoZSBzZWNvbmQgYXR0ZW1wdCB0byBmcmVlIGl0LlxuXG5UaGUgcHJvcG9zZWQgcGF0Y2ggaXMgc21hcnQuIEl0J3MgbW92aW5nIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrYCBlYXJsaWVyIGluIHRoZSBwcm9jZXNzLiBOb3cgdGhlIGNoaWxkJ3MgYHJldF9zdGFja2AgZ2V0cyBzZXQgdG8gYE5VTExgIChhbmQgcG90ZW50aWFsbHkgYWxsb2NhdGVkIGEgbmV3IG9uZSkgYmVmb3JlIGFueSBlcnJvciBwYXRocy4gVGhhdCBmaXhlcyB0aGUgYnVnLiBgZnRyYWNlX2dyYXBoX2luaXRfdGFza2AgZXhwbGljaXRseSBzZXRzIGB0LVx1MDAzZXJldF9zdGFjayA9IE5VTExgLlxuXG5BbHJpZ2h0LCBsZXQgbWUgc29saWRpZnkgdGhpcyByZWFzb25pbmcuIFRoZSBwYXRjaCBhZGRyZXNzZXMgYSBVQUYvZG91YmxlIGZyZWUuIFdoZW4gYSBuZXcgdGFzayBpcyBjcmVhdGVkLCBgZHVwX3Rhc2tfc3RydWN0YCBkdXBsaWNhdGVzIHRoZSBwYXJlbnQncyBgdGFza19zdHJ1Y3RgLCBpbmNsdWRpbmcgZnRyYWNlJ3MgYHJldF9zdGFja2AgcG9pbnRlci4gSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgKmJlZm9yZSogYGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2tgIGlzIHJ1biwgdGhlIGVycm9yIHBhdGggZnJlZXMgdGhlIGNoaWxkLCBidXQgc2luY2UgYHJldF9zdGFja2AgaXMgc3RpbGwgcG9pbnRpbmcgdG8gdGhlIHBhcmVudCdzIHN0YWNrLCBpdCBlbmRzIHVwIGZyZWVpbmcgdGhlIHBhcmVudCdzIGByZXRfc3RhY2tgLiBUaGVuIHRoZSBwYXJlbnQga2VlcHMgcnVubmluZyB1c2luZyBtZW1vcnkgd2hpY2ggaXMgbm93IGZyZWUgYW5kIGhhcyBiZWVuIGZyZWVkLiBUaGlzIGNyZWF0ZXMgYSB1c2UtYWZ0ZXItZnJlZSwgb3IgYSBkb3VibGUgZnJlZS4gS0FTQU4gd2lsbCBjYXRjaCBpdCBiZWNhdXNlIGl0J3MgZGVzaWduZWQgZm9yIHRoaXMgc29ydCBvZiBtZW1vcnkgY29ycnVwdGlvbi5cblxuSSB3aWxsIHRoZXJlZm9yZSBtYXJrIHRoaXMgYXMgbmVlZGluZyBLQVNBTiBhbmQgbm90IEtNU0FOLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MTcwLCJPdXRwdXRUb2tlbnMiOjMyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExNTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMVQxMjo1Njo1OC4yMjAzMDc4NDhaIiwiU2VxIjo1NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTUzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCdzIGB0YXNrX3N0cnVjdGAgdG8gdGhlIGNoaWxkLCBpbmNsdWRpbmcgdGhlIGByZXRfc3RhY2tgIHBvaW50ZXIgdXNlZCBieSBmdHJhY2UuIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYGNvcHlfcHJvY2VzcygpYCAoZS5nLiwgaW4gYGNvcHlfZXhlY19zdGF0ZSgpYCkgYmVmb3JlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKClgIGlzIGNhbGxlZCwgdGhlIGVycm9yIGhhbmRsaW5nIHBhdGggKGBiYWRfZm9ya19mcmVlYCkgd2lsbCBjYWxsIGBmcmVlX3Rhc2soKWAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soKWAuIFNpbmNlIHRoZSBjaGlsZCdzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AuIFRoZSBwYXJlbnQgdGFzayB3aWxsIHRoZW4gY29udGludWUgdG8gdXNlIHRoZSBmcmVlZCBgcmV0X3N0YWNrYCwgcmVzdWx0aW5nIGluIGEgdXNlLWFmdGVyLWZyZWUsIGFuZCBpdCB3aWxsIGJlIGRvdWJsZS1mcmVlZCB3aGVuIHRoZSBwYXJlbnQgZXZlbnR1YWxseSBleGl0cy5cXG5cXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApYCBlYXJsaWVyIGluIGBjb3B5X3Byb2Nlc3MoKWAgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIC8gZG91YmxlIGZyZWUgYnVnLiBXaGVuIGEgbmV3IHRhc2sgaXMgY3JlYXRlZCwgYGR1cF90YXNrX3N0cnVjdCgpYCBjb3BpZXMgdGhlIHBhcmVudCdzIGB0YXNrX3N0cnVjdGAgdG8gdGhlIGNoaWxkLCBpbmNsdWRpbmcgdGhlIGByZXRfc3RhY2tgIHBvaW50ZXIgdXNlZCBieSBmdHJhY2UuIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYGNvcHlfcHJvY2VzcygpYCAoZS5nLiwgaW4gYGNvcHlfZXhlY19zdGF0ZSgpYCkgYmVmb3JlIGBmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKClgIGlzIGNhbGxlZCwgdGhlIGVycm9yIGhhbmRsaW5nIHBhdGggKGBiYWRfZm9ya19mcmVlYCkgd2lsbCBjYWxsIGBmcmVlX3Rhc2soKWAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soKWAuIFNpbmNlIHRoZSBjaGlsZCdzIGByZXRfc3RhY2tgIHN0aWxsIHBvaW50cyB0byB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AsIGBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKClgIHdpbGwgZXJyb25lb3VzbHkgZnJlZSB0aGUgcGFyZW50J3MgYHJldF9zdGFja2AuIFRoZSBwYXJlbnQgdGFzayB3aWxsIHRoZW4gY29udGludWUgdG8gdXNlIHRoZSBmcmVlZCBgcmV0X3N0YWNrYCwgcmVzdWx0aW5nIGluIGEgdXNlLWFmdGVyLWZyZWUsIGFuZCBpdCB3aWxsIGJlIGRvdWJsZS1mcmVlZCB3aGVuIHRoZSBwYXJlbnQgZXZlbnR1YWxseSBleGl0cy5cXG5cXG5UaGlzIGlzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSAvIGRvdWJsZSBmcmVlIHZ1bG5lcmFiaWxpdHkuIEtBU0FOIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZXRlY3QgdXNlLWFmdGVyLWZyZWUgYW5kIGRvdWJsZSBmcmVlIGJ1Z3MsIGFuZCB3aWxsIHJlbGlhYmx5IGNhdGNoIHRoaXMgaXNzdWUuIFRoZXJlIGlzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGluZm9ybWF0aW9uIGxlYWsgaW52b2x2ZWQgaW4gdGhpcyBidWcsIHNvIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowmdrx9[1] Phase: Succeeded StartedAt: 2026-08-21 12:57:09 +0000 UTC FinishedAt: 2026-08-21 12:57:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-21 12:57:09 +0000 UTC FinishedAt: 2026-08-21 12:57:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2] Phase: Succeeded StartedAt: 2026-08-21 12:57:09 +0000 UTC FinishedAt: 2026-08-21 16:46:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-21 12:57:09 +0000 UTC FinishedAt: 2026-08-21 16:46:30 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-21 12:57:09 +0000 UTC FinishedAt: 2026-08-21 12:57:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-21 12:57:09 +0000 UTC FinishedAt: 2026-08-21 12:57:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflowmdrx9/series-workflowmdrx9-convert-artifact-2904261478/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-21 12:57:19 +0000 UTC FinishedAt: 2026-08-21 13:14:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-21 12:57:19 +0000 UTC FinishedAt: 2026-08-21 13:14:47 +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:*932634e2-bb9a-4572-8c08-e802a1c90572,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-workflowmdrx9/series-workflowmdrx9-convert-artifact-2904261478/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": "7dd39cf2-2533-493d-aecd-48400412f215", "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-workflowmdrx9/series-workflowmdrx9-build-action-2233213692/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-21 12:57:19 +0000 UTC FinishedAt: 2026-08-21 13:14:37 +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:*932634e2-bb9a-4572-8c08-e802a1c90572,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-workflowmdrx9/series-workflowmdrx9-convert-artifact-2904261478/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": "7dd39cf2-2533-493d-aecd-48400412f215", "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-workflowmdrx9/series-workflowmdrx9-build-action-2233213692/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-21 13:14:47 +0000 UTC FinishedAt: 2026-08-21 13:14:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-21 13:14:47 +0000 UTC FinishedAt: 2026-08-21 13:14:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-21 13:14:47 +0000 UTC FinishedAt: 2026-08-21 13:14:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-21 13:14:47 +0000 UTC FinishedAt: 2026-08-21 13:14:52 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflowmdrx9/series-workflowmdrx9-convert-artifact-2692999609/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-21 13:14:57 +0000 UTC FinishedAt: 2026-08-21 13:17:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-21 13:14:57 +0000 UTC FinishedAt: 2026-08-21 13:17:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7dd39cf2-2533-493d-aecd-48400412f215,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-workflowmdrx9/series-workflowmdrx9-build-action-2233213692/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-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-21 13:17:19 +0000 UTC FinishedAt: 2026-08-21 13:17:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-21 13:17:19 +0000 UTC FinishedAt: 2026-08-21 13:17:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-21 13:17:19 +0000 UTC FinishedAt: 2026-08-21 13:39:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-21 13:17:19 +0000 UTC FinishedAt: 2026-08-21 13:39:11 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*932634e2-bb9a-4572-8c08-e802a1c90572,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-workflowmdrx9/series-workflowmdrx9-convert-artifact-2692999609/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": "6773290d-ae80-4252-8b3f-9e19c788f622", "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-workflowmdrx9/series-workflowmdrx9-build-action-1698677397/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-21 13:17:19 +0000 UTC FinishedAt: 2026-08-21 13:38:44 +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:*932634e2-bb9a-4572-8c08-e802a1c90572,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-workflowmdrx9/series-workflowmdrx9-convert-artifact-2692999609/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": "6773290d-ae80-4252-8b3f-9e19c788f622", "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-workflowmdrx9/series-workflowmdrx9-build-action-1698677397/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-21 13:39:11 +0000 UTC FinishedAt: 2026-08-21 13:39:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-21 13:39:11 +0000 UTC FinishedAt: 2026-08-21 13:39:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-21 13:39:11 +0000 UTC FinishedAt: 2026-08-21 13:41:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-21 13:39:11 +0000 UTC FinishedAt: 2026-08-21 13:41:09 +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:*6773290d-ae80-4252-8b3f-9e19c788f622,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-workflowmdrx9/series-workflowmdrx9-build-action-1698677397/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-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-21 13:41:19 +0000 UTC FinishedAt: 2026-08-21 16:46:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-21 13:41:19 +0000 UTC FinishedAt: 2026-08-21 16:46:30 +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-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},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:*7dd39cf2-2533-493d-aecd-48400412f215,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6773290d-ae80-4252-8b3f-9e19c788f622,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-workflowmdrx9/series-workflowmdrx9-build-action-2233213692/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-workflowmdrx9/series-workflowmdrx9-build-action-1698677397/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-21 13:41:19 +0000 UTC FinishedAt: 2026-08-21 13:41:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-21 13:41:19 +0000 UTC FinishedAt: 2026-08-21 13:41:24 +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-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},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-workflowmdrx9/series-workflowmdrx9-convert-artifact-418275630/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-21 13:41:19 +0000 UTC FinishedAt: 2026-08-21 13:41:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-21 13:41:19 +0000 UTC FinishedAt: 2026-08-21 13:41:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-21 13:41:19 +0000 UTC FinishedAt: 2026-08-21 13:41:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-21 13:41:29 +0000 UTC FinishedAt: 2026-08-21 16:46:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmdrx9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":[],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"55ab7e14222e5f0b0fd9f7711ca391d2924b35e3","config_name":"upstream-apparmor-kasan.config","enable_configs":["FUNCTION_TRACER","FUNCTION_GRAPH_TRACER"],"series_id":"3596507b-cc8d-4da1-aa5b-42ea601545d2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-21 13:41:29 +0000 UTC FinishedAt: 2026-08-21 16:46:20 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7dd39cf2-2533-493d-aecd-48400412f215,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6773290d-ae80-4252-8b3f-9e19c788f622,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-workflowmdrx9/series-workflowmdrx9-build-action-2233213692/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-workflowmdrx9/series-workflowmdrx9-build-action-1698677397/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-workflowmdrx9/series-workflowmdrx9-convert-artifact-418275630/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,}