Name: series-workflow62hb9 Phase: Succeeded StartedAt: 2026-08-15 10:50:16 +0000 UTC FinishedAt: 2026-08-15 14:43:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[0] Phase: Succeeded StartedAt: 2026-08-15 10:50:16 +0000 UTC FinishedAt: 2026-08-15 10:53:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[0].run-triage Phase: Succeeded StartedAt: 2026-08-15 10:50:16 +0000 UTC FinishedAt: 2026-08-15 10:53:24 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "62cc90241548d5570ee68e01aaba6506964e9811", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "USERFAULTFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "62cc90241548d5570ee68e01aaba6506964e9811", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "USERFAULTFD" ], "series_id": "c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "userfaultfd_ioctl" ], "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+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1VTRVJGQVVMVEZEJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dXNlcmZhdWx0ZmRfaW9jdGwmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiBgbW92ZV9wYWdlcygpYCB3aGVyZSB0aGUgYGVycmAgdmFyaWFibGUgd2FzIG5vdCByZXNldCB0byAwIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGBtb3ZlX3BhZ2VzX3B0ZXMoKWAuIElmIGBlcnJgIHdhcyBwcmV2aW91c2x5IHNldCB0byBgLUVBR0FJTmAgKGUuZy4sIGZyb20gYSBwcmlvciBmYWlsZWQgYG1vdmVfcGFnZXNfaHVnZV9wbWQoKWAgYXR0ZW1wdCB0aGF0IHRyaWdnZXJlZCBhIGBjb250aW51ZWApLCBpdCB3b3VsZCByZW1haW4gYC1FQUdBSU5gLiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBsb29wIHRvIGluY29ycmVjdGx5IHNraXAgYWR2YW5jaW5nIHRoZSBgc3JjX2FkZHJgIGFuZCBgZHN0X2FkZHJgIHBvaW50ZXJzIGFuZCBgY29udGludWVgIGFnYWluLCBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJldHVybnMuXG5cblRoaXMgaXMgYSBjb250cm9sIGZsb3cgYW5kIGVycm9yIGhhbmRsaW5nIGJ1Zy4gSXQgZG9lcyBub3QgaW52b2x2ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRpbmcgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgaW5jbHVkaW5nIEtBU0FOIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3RvcnMsIGlzIHN1ZmZpY2llbnQgdG8gY2F0Y2ggc3VjaCBoYW5ncyBvciBsb2dpYyBlcnJvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgYnVnIGluIHRoZSBVRkZESU9fTU9WRSBpb2N0bCBoYW5kbGVyIHdoZXJlIGEgcHJldmlvdXNseSBzZXQgZXJyb3IgY29kZSAobGlrZSAtRUFHQUlOKSB3YXMgbm90IGNsZWFyZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhZ2UgbW92ZSwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBhbiBpbmZpbml0ZSBsb29wIG9yIGluY29ycmVjdCBlcnJvciByZXBvcnRpbmcuIFRoaXMgaXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgN2ZhNGVmNWFiMjFjMTZmYTg5YmI1NjBmZTgxMjViODBjMTQxYTU5YlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDE1IDEwOjUxOjM1IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jXG5pbmRleCBjM2FkZWRhYWY3ZDU0Li41OTVlN2UyMzJmOTAxIDEwMDY0NFxuLS0tIGEvbW0vdXNlcmZhdWx0ZmQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vdXNlcmZhdWx0ZmQuY1xuQEAgLTIwNjksMTAgJiM0MzsyMDY5LDEyIEBAIHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcbiBcdFx0XHRyZXQgPSBtb3ZlX3BhZ2VzX3B0ZXMobW0sIGRzdF9wbWQsIHNyY19wbWQsXG4gXHRcdFx0XHRcdCAgICAgIGRzdF92bWEsIHNyY192bWEsIGRzdF9hZGRyLFxuIFx0XHRcdFx0XHQgICAgICBzcmNfYWRkciwgc3JjX2VuZCAtIHNyY19hZGRyLCBtb2RlKTtcbi1cdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4gXHRcdFx0XHRlcnIgPSByZXQ7XG4tXHRcdFx0ZWxzZVxuJiM0MztcdFx0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRcdGVyciA9IDA7XG4gXHRcdFx0XHRzdGVwX3NpemUgPSByZXQ7XG4mIzQzO1x0XHRcdH1cbiBcdFx0fVxuIFxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1c2VyZmF1bHRmZF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDdmYTRlZjVhYjIxYzE2ZmE4OWJiNTYwZmU4MTI1YjgwYzE0MWE1OWIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAxNSAxMDo1MTozNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jCmluZGV4IGMzYWRlZGFhZjdkNTQuLjU5NWU3ZTIzMmY5MDEgMTAwNjQ0Ci0tLSBhL21tL3VzZXJmYXVsdGZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vdXNlcmZhdWx0ZmQuYwpAQCAtMjA2OSwxMCAmIzQzOzIwNjksMTIgQEAgc3RhdGljIHNzaXplX3QgbW92ZV9wYWdlcyhzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgZHN0X3N0YXJ0LAogCQkJcmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLAogCQkJCQkgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkciwKIAkJCQkJICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7Ci0JCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlpZiAocmV0ICZsdDsgMCkgewogCQkJCWVyciA9IHJldDsKLQkJCWVsc2UKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQllcnIgPSAwOwogCQkJCXN0ZXBfc2l6ZSA9IHJldDsKJiM0MzsJCQl9CiAJCX0KIAogCQljb25kX3Jlc2NoZWQoKTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAyOQoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDExNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBVc2VyZmF1bHRmZCBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG1tL3VzZXJmYXVsdGZkLmNgLiBJbW1lZGlhdGVseSwgSSBzZWUgYSBzaW1wbGUsIGFsbW9zdCB0cml2aWFsLCBjb2RlIGNoYW5nZS4gVGhleSYjMzk7dmUgd3JhcHBlZCB0aGUgYGlmIChyZXQgJmx0OyAwKWAgYmxvY2sgd2l0aCBjdXJseSBicmFjZXMgYW5kLCBpbXBvcnRhbnRseSwgYWRkZWQgYGVyciA9IDA7YCB3aXRoaW4gdGhlIGBlbHNlYCBibG9jay4gTXkgaW5pdGlhbCByZWFjdGlvbiBpcywgJiMzNDtXaHk/JiMzNDsgSXQgbG9va3MgbGlrZSB0aGV5JiMzOTtyZSBleHBsaWNpdGx5IHNldHRpbmcgdGhlIGBlcnJgIHZhcmlhYmxlIHRvIHplcm8gaWYgdGhlIGByZXRgIGZyb20gc29tZSBmdW5jdGlvbiBjYWxsIGlzbiYjMzk7dCBhbiBlcnJvci4gVGhpcyBkZWZpbml0ZWx5IHJlcXVpcmVzIGEgY2xvc2VyIGxvb2suIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYHJldGAgcmVwcmVzZW50cyBhbmQgd2hhdCBgbW92ZV9wYWdlc2AgaXMgZG9pbmcgaW4gdGhpcyBjb250ZXh0IHRvIGZpZ3VyZSBvdXQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZS4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBgbW92ZV9wYWdlc2AgZnVuY3Rpb24gaW4gYG1tL3VzZXJmYXVsdGZkLmNgIGFuZCBzZWUgaWYgdGhlIGNvbnRleHQgY2xhcmlmaWVzIHRoZSByZWFzb25pbmcgYmVoaW5kIHplcm9pbmcgb3V0IHRoZSBgZXJyYCB2YWx1ZS4gSXQgc2VlbXMgb2RkIHRoYXQgdGhlIGVycm9yIHZhcmlhYmxlIGlzIGJlaW5nIGFzc2lnbmVkIDAgaW4gYSBub24tZXJyb3IgY29uZGl0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21vdmVfcGFnZXMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3VzZXJmYXVsdGZkLmM9MTM4Mj1zdGF0aWMgaW50IG1vdmVfemVyb3BhZ2VfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMTQxNC0gKi9cbm1tL3VzZXJmYXVsdGZkLmM6MTQxNTpzdGF0aWMgbG9uZyBtb3ZlX3BhZ2VzX3B0ZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpkc3RfcG1kLCBwbWRfdCAqc3JjX3BtZCxcbm1tL3VzZXJmYXVsdGZkLmMtMTQxNi1cdFx0XHQgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3Rfdm1hLFxuLS1cbm1tL3VzZXJmYXVsdGZkLmM9MTg1OT1zdGF0aWMgdm9pZCB1ZmZkX21vdmVfdW5sb2NrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0X3ZtYSxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE4NjctLyoqXG5tbS91c2VyZmF1bHRmZC5jOjE4Njg6ICogbW92ZV9wYWdlcyAtIG1vdmUgYXJiaXRyYXJ5IGFub255bW91cyBwYWdlcyBvZiBhbiBleGlzdGluZyB2bWFcbm1tL3VzZXJmYXVsdGZkLmMtMTg2OS0gKiBAY3R4OiBwb2ludGVyIHRvIHRoZSB1c2VyZmF1bHRmZCBjb250ZXh0XG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xODc2LSAqXG5tbS91c2VyZmF1bHRmZC5jOjE4Nzc6ICogbW92ZV9wYWdlcygpIHJlbWFwcyBhcmJpdHJhcnkgYW5vbnltb3VzIHBhZ2VzIGF0b21pY2FsbHkgaW4gemVyb1xubW0vdXNlcmZhdWx0ZmQuYy0xODc4LSAqIGNvcHkuIEl0IG9ubHkgd29ya3Mgb24gbm9uIHNoYXJlZCBhbm9ueW1vdXMgcGFnZXMgYmVjYXVzZSB0aG9zZSBjYW5cbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE4ODgtICogc3RvcmFnZSBvciBhbnkgb3RoZXIgSS9PIGRldmljZSAoTUFEVl9ET05URk9SSyBpbiB0aGUgc291cmNlIHZtYVxubW0vdXNlcmZhdWx0ZmQuYzoxODg5OiAqIGF2b2lkcyBtb3ZlX3BhZ2VzKCkgdG8gZmFpbCB3aXRoIC1FQlVTWSBpZiB0aGUgcHJvY2VzcyBmb3JrcyBiZWZvcmVcbm1tL3VzZXJmYXVsdGZkLmM6MTg5MDogKiBtb3ZlX3BhZ2VzKCkgaXMgY2FsbGVkKSwgdGhlbiBpdCB3aWxsIGNhbGwgbW92ZV9wYWdlcygpIHRvIG1hcCB0aGVcbm1tL3VzZXJmYXVsdGZkLmMtMTg5MS0gKiBwYWdlIGluIHRoZSBmYXVsdGluZyBhZGRyZXNzIGluIHRoZSBkZXN0aW5hdGlvbiB2bWEuXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xOTA1LSAqIHRoZSBkZXN0aW5hdGlvbiB2aXJ0dWFsIG1lbW9yeSByYW5nZSBpcyBub3QgYSB3aG9sZSB1bm1hcHBlZCBob2xlLFxubW0vdXNlcmZhdWx0ZmQuYzoxOTA2OiAqIG1vdmVfcGFnZXMoKSB3aWxsIGZhaWwgcmVzcGVjdGl2ZWx5IHdpdGggLUVOT0VOVCBvciAtRUVYSVNULiBUaGlzXG5tbS91c2VyZmF1bHRmZC5jLTE5MDctICogcHJvdmlkZXMgYSB2ZXJ5IHN0cmljdCBiZWhhdmlvciB0byBhdm9pZCBhbnkgY2hhbmNlIG9mIG1lbW9yeVxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMTkxMC0gKiB0aW1lIGZvciBhbnkgZ2l2ZW4gZmF1bHRpbmcgYWRkcmVzcy4gVGhpcyBtZWFucyB0aGF0IGlmIHR3byB0aHJlYWRzXG5tbS91c2VyZmF1bHRmZC5jOjE5MTE6ICogdHJ5IHRvIGJvdGggY2FsbCBtb3ZlX3BhZ2VzKCkgb24gdGhlIHNhbWUgZGVzdGluYXRpb24gYWRkcmVzcyBhdCB0aGVcbm1tL3VzZXJmYXVsdGZkLmMtMTkxMi0gKiBzYW1lIHRpbWUsIHRoZSBzZWNvbmQgdGhyZWFkIHdpbGwgZ2V0IGFuIGV4cGxpY2l0IGVycm9yIGZyb20gdGhpc1xuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMTkyMC0gKiBhbiBhbW91bnQgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5IG1vdmVkLiBJZiB0aGUgcmV0dmFsIHJlcG9ydHMgYVxubW0vdXNlcmZhdWx0ZmQuYzoxOTIxOiAqIFwmIzM0O3Nob3J0XCYjMzQ7IHJlbWFwLCB0aGUgbW92ZV9wYWdlcygpIGNvbW1hbmQgc2hvdWxkIGJlIHJlcGVhdGVkIGJ5XG5tbS91c2VyZmF1bHRmZC5jLTE5MjItICogdXNlcmxhbmQgd2l0aCBzcmMmIzQzO3JldHZhbCwgZHN0JiM0MztyZXZhbCwgbGVuLXJldHZhbCBpZiBpdCB3YW50cyB0byBrbm93XG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xOTMzLSAqL1xubW0vdXNlcmZhdWx0ZmQuYzoxOTM0OnN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcbm1tL3VzZXJmYXVsdGZkLmMtMTkzNS1cdFx0ICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBfX3U2NCBtb2RlKVxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMjAxNC1cdFx0ICogYmUgc3RyaWN0LiBJZiBkc3RfcG1kIGNoYW5nZXMgaW50byBUUEggYWZ0ZXIgdGhpcyBjaGVjaywgdGhlXG5tbS91c2VyZmF1bHRmZC5jOjIwMTU6XHRcdCAqIG1vdmVfcGFnZXNfaHVnZV9wbWQoKSB3aWxsIGRldGVjdCB0aGUgY2hhbmdlIGFuZCByZXRyeVxubW0vdXNlcmZhdWx0ZmQuYzoyMDE2Olx0XHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXG5tbS91c2VyZmF1bHRmZC5jLTIwMTctXHRcdCAqL1xuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMjA0MS1cdFx0XHRcdHNwbGl0X2h1Z2VfcG1kKHNyY192bWEsIHNyY19wbWQsIHNyY19hZGRyKTtcbm1tL3VzZXJmYXVsdGZkLmM6MjA0MjpcdFx0XHRcdC8qIFRoZSBmb2xpbyB3aWxsIGJlIHNwbGl0IGJ5IG1vdmVfcGFnZXNfcHRlKCkgKi9cbm1tL3VzZXJmYXVsdGZkLmMtMjA0My1cdFx0XHRcdGNvbnRpbnVlO1xuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMjA0NS1cbm1tL3VzZXJmYXVsdGZkLmM6MjA0NjpcdFx0XHRlcnIgPSBtb3ZlX3BhZ2VzX2h1Z2VfcG1kKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxubW0vdXNlcmZhdWx0ZmQuYy0yMDQ3LVx0XHRcdFx0XHRcdCAgZHN0X3BtZHZhbCwgZHN0X3ZtYSwgc3JjX3ZtYSxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTIwNjgtXG5tbS91c2VyZmF1bHRmZC5jOjIwNjk6XHRcdFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxubW0vdXNlcmZhdWx0ZmQuYy0yMDcwLVx0XHRcdFx0XHQgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkcixcbi0tXG5tbS91c2VyZmF1bHRmZC5jPTQyMTY9c3RhdGljIGludCB1c2VyZmF1bHRmZF9tb3ZlKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTQyNTUtXHRpZiAobW1nZXRfbm90X3plcm8obW0pKSB7XG5tbS91c2VyZmF1bHRmZC5jOjQyNTY6XHRcdHJldCA9IG1vdmVfcGFnZXMoY3R4LCB1ZmZkaW9fbW92ZS5kc3QsIHVmZmRpb19tb3ZlLnNyYyxcbm1tL3VzZXJmYXVsdGZkLmMtNDI1Ny1cdFx0XHRcdCB1ZmZkaW9fbW92ZS5sZW4sIHVmZmRpb19tb3ZlLm1vZGUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM2ODgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYG1vdmVfcGFnZXNgIGluIGBtbS91c2VyZmF1bHRmZC5jYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG1vdmVfcGFnZXNgIGlzIGhhbmRsaW5nIHRoaW5ncyBpbiB0aGUgY29udGV4dCBvZiB1c2VyZmF1bHRmZC4gVGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbCBmb3IgaG93IHdlIG1hbmFnZSBwYWdlIG1pZ3JhdGlvbiBhbmQgdHJhbnNmZXIsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdXNlci1zcGFjZSBtZW1vcnkgYWNjZXNzIGZhdWx0cy4gSSB3YW50IHRvIHNlZSBob3cgdGhlIGtlcm5lbCBvcmNoZXN0cmF0ZXMgdGhpcyB3aG9sZSBkYW5jZSBiZXR3ZWVuIHVzZXIgc3BhY2UgYW5kIGtlcm5lbCBzcGFjZS4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGludGVyZXN0ZWQgaW4gdGhlIGludGVycGxheSBiZXR3ZWVuIGB1c2VyZmF1bHRmZGAgYW5kIHRoZSBwYWdlIG1pZ3JhdGlvbiBtYWNoaW5lcnkuIEhvdyBkb2VzIGl0IGtub3cgd2hlcmUgcGFnZXMgYXJlLCBhbmQgaG93IGRvZXMgaXQgZGlyZWN0IHRoZW0gd2hlcmUgdGhleSBuZWVkIHRvIGdvPyBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIGEgZGVsaWNhdGUgYmFsYW5jaW5nIGFjdCBoZXJlLCBlbnN1cmluZyBkYXRhIGludGVncml0eSB3aGlsZSBtaW5pbWl6aW5nIHRoZSBwZXJmb3JtYW5jZSBoaXQgb2YgcGFnZSBmYXVsdHMuIExldCYjMzk7cyBzZWUgaG93IHRoZXkgZG8gaXQuIEkmIzM5O20gbG9va2luZyBmb3IgdGhlIGtleSBsb2NraW5nIHByaW1pdGl2ZXMsIGVycm9yIGhhbmRsaW5nIHBhdGhzLCBhbmQgdGhlIG92ZXJhbGwgbG9naWMgZmxvdy4gVGhpcyBjb3VsZCBnaXZlIG1lIHNvbWUgZ3JlYXQgaW5zaWdodHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTkzNCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkzNDpcdHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcbjE5MzU6XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBfX3U2NCBtb2RlKVxuMTkzNjpcdHtcbjE5Mzc6XHRcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3R4LVx1MDAzZW1tO1xuMTkzODpcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICpzcmNfdm1hLCAqZHN0X3ZtYTtcbjE5Mzk6XHRcdHVuc2lnbmVkIGxvbmcgc3JjX2FkZHIsIGRzdF9hZGRyLCBzcmNfZW5kO1xuMTk0MDpcdFx0cG1kX3QgKnNyY19wbWQsICpkc3RfcG1kO1xuMTk0MTpcdFx0bG9uZyBlcnIgPSAtRUlOVkFMO1xuMTk0MjpcdFx0c3NpemVfdCBtb3ZlZCA9IDA7XG4xOTQzOlx0XG4xOTQ0Olx0XHQvKiBTYW5pdGl6ZSB0aGUgY29tbWFuZCBwYXJhbWV0ZXJzLiAqL1xuMTk0NTpcdFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCBcdTAwMjYgflBBR0VfTUFTSyk7XG4xOTQ2Olx0XHRWTV9XQVJOX09OX09OQ0UoZHN0X3N0YXJ0IFx1MDAyNiB+UEFHRV9NQVNLKTtcbjE5NDc6XHRcdFZNX1dBUk5fT05fT05DRShsZW4gXHUwMDI2IH5QQUdFX01BU0spO1xuMTk0ODpcdFxuMTk0OTpcdFx0LyogRG9lcyB0aGUgYWRkcmVzcyByYW5nZSB3cmFwLCBvciBpcyB0aGUgc3BhbiB6ZXJvLXNpemVkPyAqL1xuMTk1MDpcdFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCAmIzQzOyBsZW4gXHUwMDNjIHNyY19zdGFydCk7XG4xOTUxOlx0XHRWTV9XQVJOX09OX09OQ0UoZHN0X3N0YXJ0ICYjNDM7IGxlbiBcdTAwM2MgZHN0X3N0YXJ0KTtcbjE5NTI6XHRcbjE5NTM6XHRcdGVyciA9IHVmZmRfbW92ZV9sb2NrKG1tLCBkc3Rfc3RhcnQsIHNyY19zdGFydCwgXHUwMDI2ZHN0X3ZtYSwgXHUwMDI2c3JjX3ZtYSk7XG4xOTU0Olx0XHRpZiAoZXJyKVxuMTk1NTpcdFx0XHRnb3RvIG91dDtcbjE5NTY6XHRcbjE5NTc6XHRcdC8qIFJlLWNoZWNrIGFmdGVyIHRha2luZyBtYXBfY2hhbmdpbmdfbG9jayAqL1xuMTk1ODpcdFx0ZXJyID0gLUVBR0FJTjtcbjE5NTk6XHRcdGRvd25fcmVhZChcdTAwMjZjdHgtXHUwMDNlbWFwX2NoYW5naW5nX2xvY2spO1xuMTk2MDpcdFx0aWYgKGxpa2VseShhdG9taWNfcmVhZChcdTAwMjZjdHgtXHUwMDNlbW1hcF9jaGFuZ2luZykpKVxuMTk2MTpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4xOTYyOlx0XHQvKlxuMTk2MzpcdFx0ICogTWFrZSBzdXJlIHRoZSB2bWEgaXMgbm90IHNoYXJlZCwgdGhhdCB0aGUgc3JjIGFuZCBkc3QgcmVtYXBcbjE5NjQ6XHRcdCAqIHJhbmdlcyBhcmUgYm90aCB2YWxpZCBhbmQgZnVsbHkgd2l0aGluIGEgc2luZ2xlIGV4aXN0aW5nXG4xOTY1Olx0XHQgKiB2bWEuXG4xOTY2Olx0XHQgKi9cbjE5Njc6XHRcdGVyciA9IC1FSU5WQUw7XG4xOTY4Olx0XHRpZiAoc3JjX3ZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fU0hBUkVEKVxuMTk2OTpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4xOTcwOlx0XHRpZiAoc3JjX3N0YXJ0ICYjNDM7IGxlbiBcdTAwM2Ugc3JjX3ZtYS1cdTAwM2V2bV9lbmQpXG4xOTcxOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbjE5NzI6XHRcbjE5NzM6XHRcdGlmIChkc3Rfdm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9TSEFSRUQpXG4xOTc0Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbjE5NzU6XHRcdGlmIChkc3Rfc3RhcnQgJiM0MzsgbGVuIFx1MDAzZSBkc3Rfdm1hLVx1MDAzZXZtX2VuZClcbjE5NzY6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTk3NzpcdFxuMTk3ODpcdFx0ZXJyID0gdmFsaWRhdGVfbW92ZV9hcmVhcyhjdHgsIHNyY192bWEsIGRzdF92bWEpO1xuMTk3OTpcdFx0aWYgKGVycilcbjE5ODA6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTk4MTpcdFxuMTk4MjpcdFx0Zm9yIChzcmNfYWRkciA9IHNyY19zdGFydCwgZHN0X2FkZHIgPSBkc3Rfc3RhcnQsIHNyY19lbmQgPSBzcmNfc3RhcnQgJiM0MzsgbGVuO1xuMTk4MzpcdFx0ICAgICBzcmNfYWRkciBcdTAwM2Mgc3JjX2VuZDspIHtcbjE5ODQ6XHRcdFx0c3BpbmxvY2tfdCAqcHRsO1xuMTk4NTpcdFx0XHRwbWRfdCBkc3RfcG1kdmFsO1xuMTk4NjpcdFx0XHR1bnNpZ25lZCBsb25nIHN0ZXBfc2l6ZTtcbjE5ODc6XHRcbjE5ODg6XHRcdFx0LypcbjE5ODk6XHRcdFx0ICogQmVsb3cgd29ya3MgYmVjYXVzZSBhbm9ueW1vdXMgYXJlYSB3b3VsZCBub3QgaGF2ZSBhXG4xOTkwOlx0XHRcdCAqIHRyYW5zcGFyZW50IGh1Z2UgUFVELiBJZiBmaWxlLWJhY2tlZCBzdXBwb3J0IGlzIGFkZGVkLFxuMTk5MTpcdFx0XHQgKiB0aGF0IGNhc2Ugd291bGQgbmVlZCB0byBiZSBoYW5kbGVkIGhlcmUuXG4xOTkyOlx0XHRcdCAqL1xuMTk5MzpcdFx0XHRzcmNfcG1kID0gbW1fZmluZF9wbWQobW0sIHNyY19hZGRyKTtcbjE5OTQ6XHRcdFx0aWYgKHVubGlrZWx5KCFzcmNfcG1kKSkge1xuMTk5NTpcdFx0XHRcdGlmICghKG1vZGUgXHUwMDI2IFVGRkRJT19NT1ZFX01PREVfQUxMT1dfU1JDX0hPTEVTKSkge1xuMTk5NjpcdFx0XHRcdFx0ZXJyID0gLUVOT0VOVDtcbjE5OTc6XHRcdFx0XHRcdGJyZWFrO1xuMTk5ODpcdFx0XHRcdH1cbjE5OTk6XHRcdFx0XHRzcmNfcG1kID0gbW1fYWxsb2NfcG1kKG1tLCBzcmNfYWRkcik7XG4yMDAwOlx0XHRcdFx0aWYgKHVubGlrZWx5KCFzcmNfcG1kKSkge1xuMjAwMTpcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbjIwMDI6XHRcdFx0XHRcdGJyZWFrO1xuMjAwMzpcdFx0XHRcdH1cbjIwMDQ6XHRcdFx0fVxuMjAwNTpcdFx0XHRkc3RfcG1kID0gbW1fYWxsb2NfcG1kKG1tLCBkc3RfYWRkcik7XG4yMDA2Olx0XHRcdGlmICh1bmxpa2VseSghZHN0X3BtZCkpIHtcbjIwMDc6XHRcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMjAwODpcdFx0XHRcdGJyZWFrO1xuMjAwOTpcdFx0XHR9XG4yMDEwOlx0XG4yMDExOlx0XHRcdGRzdF9wbWR2YWwgPSBwbWRwX2dldF9sb2NrbGVzcyhkc3RfcG1kKTtcbjIwMTI6XHRcdFx0LypcbjIwMTM6XHRcdFx0ICogSWYgdGhlIGRzdF9wbWQgaXMgbWFwcGVkIGFzIFRIUCBkb24mIzM5O3Qgb3ZlcnJpZGUgaXQgYW5kIGp1c3RcbjIwMTQ6XHRcdFx0ICogYmUgc3RyaWN0LiBJZiBkc3RfcG1kIGNoYW5nZXMgaW50byBUUEggYWZ0ZXIgdGhpcyBjaGVjaywgdGhlXG4yMDE1Olx0XHRcdCAqIG1vdmVfcGFnZXNfaHVnZV9wbWQoKSB3aWxsIGRldGVjdCB0aGUgY2hhbmdlIGFuZCByZXRyeVxuMjAxNjpcdFx0XHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXG4yMDE3Olx0XHRcdCAqL1xuMjAxODpcdFx0XHRpZiAodW5saWtlbHkocG1kX3RyYW5zX2h1Z2UoZHN0X3BtZHZhbCkpKSB7XG4yMDE5Olx0XHRcdFx0ZXJyID0gLUVFWElTVDtcbjIwMjA6XHRcdFx0XHRicmVhaztcbjIwMjE6XHRcdFx0fVxuMjAyMjpcdFxuMjAyMzpcdFx0XHRwdGwgPSBwbWRfdHJhbnNfaHVnZV9sb2NrKHNyY19wbWQsIHNyY192bWEpO1xuMjAyNDpcdFx0XHRpZiAocHRsKSB7XG4yMDI1Olx0XHRcdFx0LyogQ2hlY2sgaWYgd2UgY2FuIG1vdmUgdGhlIHBtZCB3aXRob3V0IHNwbGl0dGluZyBpdC4gKi9cbjIwMjY6XHRcdFx0XHRpZiAobW92ZV9zcGxpdHNfaHVnZV9wbWQoZHN0X2FkZHIsIHNyY19hZGRyLCBzcmNfc3RhcnQgJiM0MzsgbGVuKSB8fFxuMjAyNzpcdFx0XHRcdCAgICAhcG1kX25vbmUoZHN0X3BtZHZhbCkpIHtcbjIwMjg6XHRcdFx0XHRcdC8qIENhbiBiZSBhIG1pZ3JhdGlvbiBlbnRyeSAqL1xuMjAyOTpcdFx0XHRcdFx0aWYgKHBtZF9wcmVzZW50KCpzcmNfcG1kKSkge1xuMjAzMDpcdFx0XHRcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcG1kX2ZvbGlvKCpzcmNfcG1kKTtcbjIwMzE6XHRcbjIwMzI6XHRcdFx0XHRcdFx0aWYgKCFpc19odWdlX3plcm9fZm9saW8oZm9saW8pIFx1MDAyNlx1MDAyNlxuMjAzMzpcdFx0XHRcdFx0XHQgICAgIVBhZ2VBbm9uRXhjbHVzaXZlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTYyOQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqRGl2aW5nIERlZXBlciBpbnRvIGBtb3ZlX3BhZ2VzYCoqCgpBbHJpZ2h0LCBJJiMzOTt2ZSBnb3QgdGhlIGluaXRpYWwgb3ZlcnZpZXcgb2YgYG1vdmVfcGFnZXNgIGluIG15IGhlYWQuIE5vdywgdGhlIHJlYWwgd29yayBiZWdpbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBudWFuY2VzLCB0aGUgZWRnZSBjYXNlcywgdGhlIHBvdGVudGlhbCBib3R0bGVuZWNrcy4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBtZWF0IG9mIHRoZSBjb2RlLiBNeSBwcmltYXJ5IGZvY3VzIGlzIGxpa2VseSBvbiBob3cgaXQgaGFuZGxlcyBtZW1vcnkgbWFuYWdlbWVudCwgZXNwZWNpYWxseSBpZiB0aGlzIGlzIHJlbGF0ZWQgdG8gYSBwYWdpbmcgc3lzdGVtLCBvciBzb21lIGZvcm0gb2YgdmlydHVhbCBtZW1vcnkuIEkmIzM5O20gbG9va2luZyBmb3Igd2hlcmUgcGFnZSB0YWJsZXMgYXJlIHVwZGF0ZWQsIHdoZXJlIHBoeXNpY2FsIGZyYW1lcyBtaWdodCBiZSBhbGxvY2F0ZWQgb3IgZGVhbGxvY2F0ZWQsIGFuZCBob3cgY29oZXJlbmN5IGlzIG1haW50YWluZWQsIGlmIHRoaXMgb3BlcmF0aW9uIGlzIGhhcHBlbmluZyBjb25jdXJyZW50bHkuIElzIGl0IHRocmVhZC1zYWZlPyBEb2VzIGl0IGVtcGxveSBsb2NrcywgYW5kIGlmIHNvLCBob3cgZ3JhbnVsYXIgYXJlIHRoZXk/IEFueSBkZWFkbG9ja3M/IEFsc28sIHdoYXQgaGFwcGVucyBpbiBhIHNpdHVhdGlvbiBvZiBhbiBvdXQtb2YtbWVtb3J5IGVycm9yLgoKSSB3YW50IHRvIHNlZSB0aGUgZGV0YWlscyBvbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGl0IG1hbmlwdWxhdGVzLiBIb3cgYXJlIHRoZSBwYWdlcyBvcmdhbml6ZWQgYmVmb3JlIHRoZSBtb3ZlPyBJcyBpdCBhIGxpbmtlZCBsaXN0LCBhIGhhc2ggdGFibGUsIGEgdHJlZSBzdHJ1Y3R1cmUsIG9yIHNvbWV0aGluZyBlbHNlPyBVbmRlcnN0YW5kaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcyBpcyBrZXkgdG8gb3B0aW1pemluZyB0aGUgYWxnb3JpdGhtLiBJJiMzOTtsbCBiZSB3YXRjaGluZyBob3cgaXQgaGFuZGxlcyBleGNlcHRpb25zLCBlcnJvciByZWNvdmVyeSwgYW5kIHRoZSBvdmVyYWxsIHJlbGlhYmlsaXR5IG9mIHRoZSBmdW5jdGlvbi4gSXMgaXQgYXRvbWljPyBJJiMzOTttIGFudGljaXBhdGluZyB0aGF0IEkmIzM5O2xsIGJlIG1lbnRhbGx5IG1hcHBpbmcgdGhlIGZ1bmN0aW9uJiMzOTtzIGxvZ2ljIHRvIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIGNhcGFiaWxpdGllcywgcGVyaGFwcyBpbmNsdWRpbmcgdGhlIENQVSYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCB1bml0IGFuZCBhbnkgcmVsZXZhbnQgY2FjaGUgY29uZmlndXJhdGlvbnMuIFVuZGVyc3RhbmRpbmcgdGhlc2UgaW50ZXJhY3Rpb25zIGlzIGNyaXRpY2FsLCBhcyBpdCBoYXMgYSBtYXNzaXZlIHBlcmZvcm1hbmNlIGltcGFjdC4gRmluYWxseSwgSSB3aWxsIGJlIHRoaW5raW5nIG9mIHdheXMgdG8gcmVmYWN0b3IgdGhpcyBmdW5jdGlvbiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLCBtYWludGFpbmFiaWxpdHksIGFuZCByZWFkYWJpbGl0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3VzZXJmYXVsdGZkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMDM0LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMDM0Olx0XHRcdFx0XHRcdFx0c3Bpbl91bmxvY2socHRsKTtcbjIwMzU6XHRcdFx0XHRcdFx0XHRlcnIgPSAtRUJVU1k7XG4yMDM2Olx0XHRcdFx0XHRcdFx0YnJlYWs7XG4yMDM3Olx0XHRcdFx0XHRcdH1cbjIwMzg6XHRcdFx0XHRcdH1cbjIwMzk6XHRcbjIwNDA6XHRcdFx0XHRcdHNwaW5fdW5sb2NrKHB0bCk7XG4yMDQxOlx0XHRcdFx0XHRzcGxpdF9odWdlX3BtZChzcmNfdm1hLCBzcmNfcG1kLCBzcmNfYWRkcik7XG4yMDQyOlx0XHRcdFx0XHQvKiBUaGUgZm9saW8gd2lsbCBiZSBzcGxpdCBieSBtb3ZlX3BhZ2VzX3B0ZSgpICovXG4yMDQzOlx0XHRcdFx0XHRjb250aW51ZTtcbjIwNDQ6XHRcdFx0XHR9XG4yMDQ1Olx0XG4yMDQ2Olx0XHRcdFx0ZXJyID0gbW92ZV9wYWdlc19odWdlX3BtZChtbSwgZHN0X3BtZCwgc3JjX3BtZCxcbjIwNDc6XHRcdFx0XHRcdFx0XHQgIGRzdF9wbWR2YWwsIGRzdF92bWEsIHNyY192bWEsXG4yMDQ4Olx0XHRcdFx0XHRcdFx0ICBkc3RfYWRkciwgc3JjX2FkZHIpO1xuMjA0OTpcdFx0XHRcdHN0ZXBfc2l6ZSA9IEhQQUdFX1BNRF9TSVpFO1xuMjA1MDpcdFx0XHR9IGVsc2Uge1xuMjA1MTpcdFx0XHRcdGxvbmcgcmV0O1xuMjA1MjpcdFxuMjA1MzpcdFx0XHRcdGlmIChwbWRfbm9uZSgqc3JjX3BtZCkpIHtcbjIwNTQ6XHRcdFx0XHRcdGlmICghKG1vZGUgXHUwMDI2IFVGRkRJT19NT1ZFX01PREVfQUxMT1dfU1JDX0hPTEVTKSkge1xuMjA1NTpcdFx0XHRcdFx0XHRlcnIgPSAtRU5PRU5UO1xuMjA1NjpcdFx0XHRcdFx0XHRicmVhaztcbjIwNTc6XHRcdFx0XHRcdH1cbjIwNTg6XHRcdFx0XHRcdGlmICh1bmxpa2VseShfX3B0ZV9hbGxvYyhtbSwgc3JjX3BtZCkpKSB7XG4yMDU5Olx0XHRcdFx0XHRcdGVyciA9IC1FTk9NRU07XG4yMDYwOlx0XHRcdFx0XHRcdGJyZWFrO1xuMjA2MTpcdFx0XHRcdFx0fVxuMjA2MjpcdFx0XHRcdH1cbjIwNjM6XHRcbjIwNjQ6XHRcdFx0XHRpZiAodW5saWtlbHkocHRlX2FsbG9jKG1tLCBkc3RfcG1kKSkpIHtcbjIwNjU6XHRcdFx0XHRcdGVyciA9IC1FTk9NRU07XG4yMDY2Olx0XHRcdFx0XHRicmVhaztcbjIwNjc6XHRcdFx0XHR9XG4yMDY4Olx0XG4yMDY5Olx0XHRcdFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxuMjA3MDpcdFx0XHRcdFx0XHQgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkcixcbjIwNzE6XHRcdFx0XHRcdFx0ICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7XG4yMDcyOlx0XHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuMjA3MzpcdFx0XHRcdFx0ZXJyID0gcmV0O1xuMjA3NDpcdFx0XHRcdH0gZWxzZSB7XG4yMDc1Olx0XHRcdFx0XHRlcnIgPSAwO1xuMjA3NjpcdFx0XHRcdFx0c3RlcF9zaXplID0gcmV0O1xuMjA3NzpcdFx0XHRcdH1cbjIwNzg6XHRcdFx0fVxuMjA3OTpcdFxuMjA4MDpcdFx0XHRjb25kX3Jlc2NoZWQoKTtcbjIwODE6XHRcbjIwODI6XHRcdFx0aWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7XG4yMDgzOlx0XHRcdFx0LyogRG8gbm90IG92ZXJyaWRlIGFuIGVycm9yICovXG4yMDg0Olx0XHRcdFx0aWYgKCFlcnIgfHwgZXJyID09IC1FQUdBSU4pXG4yMDg1Olx0XHRcdFx0XHRlcnIgPSAtRUlOVFI7XG4yMDg2Olx0XHRcdFx0YnJlYWs7XG4yMDg3Olx0XHRcdH1cbjIwODg6XHRcbjIwODk6XHRcdFx0aWYgKGVycikge1xuMjA5MDpcdFx0XHRcdGlmIChlcnIgPT0gLUVBR0FJTilcbjIwOTE6XHRcdFx0XHRcdGNvbnRpbnVlO1xuMjA5MjpcdFx0XHRcdGJyZWFrO1xuMjA5MzpcdFx0XHR9XG4yMDk0Olx0XG4yMDk1Olx0XHRcdC8qIFByb2NlZWQgdG8gdGhlIG5leHQgcGFnZSAqL1xuMjA5NjpcdFx0XHRkc3RfYWRkciAmIzQzOz0gc3RlcF9zaXplO1xuMjA5NzpcdFx0XHRzcmNfYWRkciAmIzQzOz0gc3RlcF9zaXplO1xuMjA5ODpcdFx0XHRtb3ZlZCAmIzQzOz0gc3RlcF9zaXplO1xuMjA5OTpcdFx0fVxuMjEwMDpcdFxuMjEwMTpcdG91dF91bmxvY2s6XG4yMTAyOlx0XHR1cF9yZWFkKFx1MDAyNmN0eC1cdTAwM2VtYXBfY2hhbmdpbmdfbG9jayk7XG4yMTAzOlx0XHR1ZmZkX21vdmVfdW5sb2NrKGRzdF92bWEsIHNyY192bWEpO1xuMjEwNDpcdG91dDpcbjIxMDU6XHRcdFZNX1dBUk5fT05fT05DRShtb3ZlZCBcdTAwM2MgMCk7XG4yMTA2Olx0XHRWTV9XQVJOX09OX09OQ0UoZXJyIFx1MDAzZSAwKTtcbjIxMDc6XHRcdFZNX1dBUk5fT05fT05DRSghbW92ZWQgXHUwMDI2XHUwMDI2ICFlcnIpO1xuMjEwODpcdFx0cmV0dXJuIG1vdmVkID8gbW92ZWQgOiBlcnI7XG4yMTA5Olx0fVxuMjExMDpcdFxuMjExMTpcdHN0YXRpYyBib29sIHZtYV9jYW5fdXNlcmZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuMjExMjpcdFx0XHQgICAgICAgYm9vbCB3cF9hc3luYylcbjIxMTM6XHR7XG4yMTE0Olx0XHRjb25zdCBzdHJ1Y3Qgdm1fdWZmZF9vcHMgKm9wcyA9IHZtYV91ZmZkX29wcyh2bWEpO1xuMjExNTpcdFxuMjExNjpcdFx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgKFZNX0RST1BQQUJMRSB8IFZNX1NIQURPV19TVEFDSykpXG4yMTE3Olx0XHRcdHJldHVybiBmYWxzZTtcbjIxMTg6XHRcbjIxMTk6XHRcdGlmICghaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkgXHUwMDI2XHUwMDI2ICh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX1NQRUNJQUwpKVxuMjEyMDpcdFx0XHRyZXR1cm4gZmFsc2U7XG4yMTIxOlx0XG4yMTIyOlx0XHR2bV9mbGFncyBcdTAwMjY9IF9fVk1fVUZGRF9GTEFHUztcbjIxMjM6XHRcbjIxMjQ6XHRcdC8qXG4yMTI1Olx0XHQgKiBJZiBXUCBpcyB0aGUgb25seSBtb2RlIGVuYWJsZWQgYW5kIGNvbnRleHQgaXMgd3AgYXN5bmMsIGFsbG93IGFueVxuMjEyNjpcdFx0ICogbWVtb3J5IHR5cGUuXG4yMTI3Olx0XHQgKi9cbjIxMjg6XHRcdGlmICh3cF9hc3luYyBcdTAwMjZcdTAwMjYgKHZtX2ZsYWdzID09IFZNX1VGRkRfV1ApKVxuMjEyOTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbjIxMzA6XHRcbjIxMzE6XHRcdC8qIEZvciBhbnkgb3RoZXIgbW9kZSByZWplY3QgVk1BcyB0aGF0IGRvbiYjMzk7dCBpbXBsZW1lbnQgdm1fdWZmZF9vcHMgKi9cbjIxMzI6XHRcdGlmICghb3BzKVxuMjEzMzpcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzQyMQoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDc0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBTdWJ0bGUgQnVnIGluIGBtb3ZlX3BhZ2VzYCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG1vdmVfcGFnZXNgLCBhbmQgbXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdGhhdCBpdCYjMzk7cyBhZGRyZXNzaW5nIGEgcHJldHR5IG5hc3R5IGJ1Zy4gSXQgc2VlbXMgdGhhdCB0aGUgYGVycmAgdmFyaWFibGUsIHdoaWNoIGlzIHVzZWQgdG8gdHJhY2sgZXJyb3JzIGR1cmluZyB0aGUgcGFnZSBtaWdyYXRpb24gcHJvY2Vzcywgd2FzbiYjMzk7dCBiZWluZyBwcm9wZXJseSByZXNldCBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgbW92ZV9wYWdlc19wdGVzYC4gVGhpcyBtZWFucyB0aGF0IGlmIGBtb3ZlX3BhZ2VzX3B0ZXNgIHdvcmtlZCwgYnV0IGEgcHJldmlvdXMgb3BlcmF0aW9uIGluIHRoZSBsb29wIGhhZCBzZXQgYGVycmAgdG8gc29tZXRoaW5nIGxpa2UgYC1FSU5WQUxgIG9yIGAtRUFHQUlOYCwgdGhhdCBuZWdhdGl2ZSBlcnJvciBjb2RlIHdvdWxkIGluY29ycmVjdGx5IHBlcnNpc3QuCgpMZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBJbml0aWFsbHksIGBlcnJgIGlzIHNldCB0byBgLUVJTlZBTGAuIFRoZW4gYHZhbGlkYXRlX21vdmVfYXJlYXNgIGNhbiByZXNldCBpdC4gSW5zaWRlIHRoZSBtYWluIGxvb3AsIGlmIGFuIGVycm9yIGhhcHBlbnMgaW4gYSBmdW5jdGlvbiBsaWtlIGB2YWxpZGF0ZV9tb3ZlX2FyZWFzYCB0aGF0IGlzbiYjMzk7dCBmYXRhbCwgaXQgc2V0cyBgZXJyYCAoZm9yIGV4YW1wbGUsIHRvIGAtRUFHQUlOYCkgYW5kIHBvdGVudGlhbGx5IGNvbnRpbnVlcyBvciBicmVha3MgYmFzZWQgb24gdGhlIGVycm9yLiBJIGhhdmUgdG8gdGhpbmsgdGhyb3VnaCB0aGlzIGNhcmVmdWxseS4gQWgsIEkgc2VlIHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBUaGUgbG9vcCBpdHNlbGYgZG9lc24mIzM5O3QgcmVzZXQgYGVycmAgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGl0ZXJhdGlvbi4gU28sIGlmIGBtb3ZlX3BhZ2VzX3B0ZXNgIHN1Y2NlZWRzIG9uIGFuIGl0ZXJhdGlvbiwgYnV0IGBlcnJgIGhhZCBiZWVuIHNldCB0bywgc2F5LCBgLUVBR0FJTmAgaW4gdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiwgdGhlbiB0aGUgZnVuY3Rpb24gd291bGQgdXNlIHRoYXQgb2xkIGVycm9yIGNvZGUuIFNwZWNpZmljYWxseSwgaWYgYGVycmAgaXMgYC1FQUdBSU5gLCB0aGVuIHdlIGhpdCBgY29udGludWVgIGFuZCBhdm9pZCBpbmNyZW1lbnRpbmcgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuCgpPa2F5LCBzbyB0aGUgYGVyciA9PSAtRUFHQUlOYCBjaGVjayAqY29udGludWVzKiB0aGUgbG9vcCB3aXRob3V0IHVwZGF0aW5nIGBkc3RfYWRkcmAgb3IgYHNyY19hZGRyYCwgbWVhbmluZyBpdCYjMzk7cyBnb2luZyB0byByZXRyeSB0aGUgKnNhbWUqIG1lbW9yeSByZWdpb24gb3ZlciBhbmQgb3ZlciBhZ2FpbiwgaWYgYSB0ZW1wb3JhcnkgZXJyb3IgaXMgZW5jb3VudGVyZWQuIFRoaXMgaXMgYmFkOyB0aGlzIHdpbGwgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLCBvciBhdCBsZWFzdCBhIHZlcnkgbG9uZyB0aW1lb3V0ISBUaGF0JiMzOTtzIGEgZGVmaW5pdGUgZnVuY3Rpb25hbCBidWcuCgpOb3csIHRoZSBpbXBvcnRhbnQgcGFydDogaXMgdGhpcyBidWcgYWN0dWFsbHkgcmVhY2hhYmxlPyBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgYG1vdmVfcGFnZXNgIGlzIGNhbGxlZCBieSBgdXNlcmZhdWx0ZmRfbW92ZWAsIHdoaWNoIGl0c2VsZiBpcyB0aGUgaGFuZGxlciBmb3IgdGhlIGBVRkZESU9fTU9WRWAgaW9jdGwuIFNpbmNlIHRoYXQmIzM5O3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIHRoaXMgaXMgYWJzb2x1dGVseSBhIHJlYWNoYWJsZSBidWcsIGFuZCBwb3RlbnRpYWxseSBleHBsb2l0YWJsZS4gSXQmIzM5O3MgZGVmaW5pdGVseSBzb21ldGhpbmcgSSB3YW50IHRvIGZ1enogYW5kIHRlc3QgdGhvcm91Z2hseS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBgVVNFUkZBVUxURkRgIGlzIGVuYWJsZWQgdG8gdHJpZ2dlciB0aGlzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVVNFUkZBVUxURkQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz0xMzg0PWNvbmZpZyBIQVZFX0FSQ0hfVVNFUkZBVUxURkRfTUlOT1Jcbi0tXG5tbS9LY29uZmlnLTEzODgtXG5tbS9LY29uZmlnOjEzODk6bWVudWNvbmZpZyBVU0VSRkFVTFRGRFxubW0vS2NvbmZpZy0xMzkwLVx0Ym9vbCBcJiMzNDtFbmFibGUgdXNlcmZhdWx0ZmQoKSBzeXN0ZW0gY2FsbFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NzgyCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKktlcm5lbCBDb25maWd1cmF0aW9uIEh1bnRpbmc6IFVTRVJGQVVMVEZEKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGluLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGBVU0VSRkFVTFRGRGAgZnVuY3Rpb25hbGl0eSB3aXRoaW4gdGhlIGtlcm5lbC4gVGhlIG9idmlvdXMgc3RhcnRpbmcgcG9pbnQgZm9yIGFueSBjb25maWd1cmF0aW9uIG9wdGlvbiBsaWtlIHRoaXMgaXMgdGhlIGBtbS9LY29uZmlnYCBmaWxlLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWdzIGFyZSBkZWZpbmVkLCBhbmQgYFVTRVJGQVVMVEZEYCBpcywgYXQgaXRzIGNvcmUsIGEgbWVtb3J5IG1hbmFnZW1lbnQgZmVhdHVyZSwgYWxiZWl0IGEgZmFpcmx5IGludm9sdmVkIG9uZS4gU28sIHRoZSBmaXJzdCB0aGluZyBJJiMzOTttIGdvaW5nIHRvIGRvIGlzIHB1bGwgdXAgdGhhdCBmaWxlIGFuZCBnZXQgYSBkaXJlY3QgbG9vayBhdCB0aGUgYXNzb2NpYXRlZCBvcHRpb25zLCBkZXBlbmRlbmNpZXMsIGFuZCBoZWxwIHRleHQuIEkgd2FudCB0byBxdWlja2x5IGdhdWdlOgoKKiAgIFdoYXQgYXJlIHRoZSBjb3JlIGRlcGVuZGVuY2llcz8gQW55IHJlcXVpcmVkIGhhcmR3YXJlIGZlYXR1cmVzLCBvdGhlciBjb25maWdzLCBvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29uc2lkZXJhdGlvbnMgdGhhdCBpbW1lZGlhdGVseSBwb3Agb3V0PwoqICAgSXMgaXQgYSBtb2R1bGFyIG9yIGJ1aWx0LWluIG9wdGlvbj8gVGhpcyB3aWxsIGFmZmVjdCBob3cgaXQmIzM5O3MgZW5hYmxlZCBhbmQgdXRpbGl6ZWQgaW4gZGlmZmVyZW50IHNjZW5hcmlvcy4KKiAgIFdoYXQmIzM5O3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGBVU0VSRkFVTFRGRGAgYW5kIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZlYXR1cmVzIGxpa2UgYEhXUE9JU09OYCBvciBOVU1BIHNldHRpbmdzPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgY29uZmxpY3RzIG9yIGludGVycGxheT8KKiAgIEVzc2VudGlhbGx5LCB3aGF0JiMzOTtzIHRoZSBsYW5kc2NhcGUgaGVyZSBpbiB0ZXJtcyBvZiBob3cgSSYjMzk7ZCBleHBlY3QgaXQgdG8gYmUgdXNlZCBhbmQgYW55IHR5cGljYWwgcGl0ZmFsbHMgb3IgZ290Y2hhcz8KCkxldCYjMzk7cyBzZWUgd2hhdCBgbW0vS2NvbmZpZ2AgdGVsbHMgbWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEzODksCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTM4OTpcdG1lbnVjb25maWcgVVNFUkZBVUxURkRcbjEzOTA6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIHVzZXJmYXVsdGZkKCkgc3lzdGVtIGNhbGxcJiMzNDtcbjEzOTE6XHRcdGRlcGVuZHMgb24gTU1VXG4xMzkyOlx0XHRoZWxwXG4xMzkzOlx0XHQgIEVuYWJsZSB0aGUgdXNlcmZhdWx0ZmQoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBpbnRlcmNlcHQgYW5kXG4xMzk0Olx0XHQgIGhhbmRsZSBwYWdlIGZhdWx0cyBpbiB1c2VybGFuZC5cbjEzOTU6XHRcbjEzOTY6XHRpZiBVU0VSRkFVTFRGRFxuMTM5NzpcdGNvbmZpZyBQVEVfTUFSS0VSX1VGRkRfV1BcbjEzOTg6XHRcdGJvb2wgXCYjMzQ7VXNlcmZhdWx0ZmQgd3JpdGUgcHJvdGVjdGlvbiBzdXBwb3J0IGZvciBzaG1lbS9odWdldGxiZnNcJiMzNDtcbjEzOTk6XHRcdGRlZmF1bHQgeVxuMTQwMDpcdFx0ZGVwZW5kcyBvbiBIQVZFX0FSQ0hfVVNFUkZBVUxURkRfV1BcbjE0MDE6XHRcbjE0MDI6XHRcdGhlbHBcbjE0MDM6XHRcdCAgQWxsb3dzIHRvIGNyZWF0ZSBtYXJrZXIgUFRFcyBmb3IgdXNlcmZhdWx0ZmQgd3JpdGUgcHJvdGVjdGlvblxuMTQwNDpcdFx0ICBwdXJwb3Nlcy4gIEl0IGlzIHJlcXVpcmVkIHRvIGVuYWJsZSB1c2VyZmF1bHRmZCB3cml0ZSBwcm90ZWN0aW9uIG9uXG4xNDA1Olx0XHQgIGZpbGUtYmFja2VkIG1lbW9yeSB0eXBlcyBsaWtlIHNobWVtIGFuZCBodWdldGxiZnMuXG4xNDA2Olx0ZW5kaWYgIyBVU0VSRkFVTFRGRFxuMTQwNzpcdFxuMTQwODpcdCMgbXVsdGktZ2VuIExSVSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0MTkKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA3MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIGBVU0VSRkFVTFRGRGAgSW1wbGVtZW50YXRpb24qKgoKQWxyaWdodCwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBVU0VSRkFVTFRGRGAg4oCTIHRoYXQmIzM5O3MgdGhlIGNvbmZpZyBpbiBwbGF5IGhlcmUuIE15IGdvYWwgaXMgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBpcyB3b3JraW5nLiBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUga2V5IHN5bWJvbHMsIHNwZWNpZmljYWxseSBgdXNlcmZhdWx0ZmRfbW92ZWAsIGBtb3ZlX3BhZ2VzYCwgYW5kIGBtb3ZlX3BhZ2VzX3B0ZXNgLiBIbW0sIGEgcXVpY2sgY2hlY2suLi5yaWdodCwgYG1vdmVfcGFnZXNgIGFuZCBgdXNlcmZhdWx0ZmRfbW92ZWAgYXJlIGJvdGggc3RhdGljLiBHb29kIHRvIGtub3csIGhlbHBzIG1lIG5hcnJvdyBkb3duIHRoZSBzY29wZSBvZiB0aGluZ3MuIE5vdyB0aGUgY3JpdGljYWwgcXVlc3Rpb246IHdoZXJlIGlzIGB1c2VyZmF1bHRmZF9tb3ZlYCBhY3R1YWxseSBiZWluZyAqY2FsbGVkKj8gVGhhdCYjMzk7cyB3aGVyZSB0aGUgcmVhbCBhY3Rpb24gd2lsbCBiZS4gVGltZSB0byB0cmFjZSB0aG9zZSBjYWxscyBhbmQgc2VlIHdoYXQmIzM5O3Mgd2hhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dXNlcmZhdWx0ZmRfbW92ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL3VzZXJmYXVsdGZkLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vdXNlcmZhdWx0ZmQuYz00MjA3PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVmZmRfY3R4X2ZlYXR1cmVzKF9fdTY0IHVzZXJfZmVhdHVyZXMpXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy00MjE1LVxubW0vdXNlcmZhdWx0ZmQuYzo0MjE2OnN0YXRpYyBpbnQgdXNlcmZhdWx0ZmRfbW92ZShzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsXG5tbS91c2VyZmF1bHRmZC5jLTQyMTctXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbm1tL3VzZXJmYXVsdGZkLmM9NDM1MD1zdGF0aWMgbG9uZyB1c2VyZmF1bHRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLFxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtNDM3OC1cdGNhc2UgVUZGRElPX01PVkU6XG5tbS91c2VyZmF1bHRmZC5jOjQzNzk6XHRcdHJldCA9IHVzZXJmYXVsdGZkX21vdmUoY3R4LCBhcmcpO1xubW0vdXNlcmZhdWx0ZmQuYy00MzgwLVx0XHRicmVhaztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTkwOQoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuYWx5emluZyB0aGF0IGNvZGU6CgoqKkFuYWx5emluZyB0aGUgRW50cnkgUG9pbnQqKgoKT2theSwgZmlyc3QgdGhpbmdzIGZpcnN0LiBUaGUgYHVzZXJmYXVsdGZkX2lvY3RsYCBmdW5jdGlvbiBpcyB0aGUgcG9pbnQgb2YgZW50cnkgaGVyZS4gVGhhdCYjMzk7cyB0aGUgZ2F0ZWtlZXBlciwgdGhlIGZ1bmN0aW9uIHRoYXQmIzM5O3MgYmVpbmcgY2FsbGVkIHdoZW4gc29tZW9uZSB3YW50cyB0byBpbnRlcmFjdCB3aXRoIHVzZXJmYXVsdGZkIHVzaW5nIGFuIGlvY3RsIGNhbGwuIE5vdywgbGV0JiMzOTtzIGp1c3QgbWFrZSBzdXJlIHRoYXQgd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgdGhlIGNvcnJlY3Qgc3lzY2FsbC4gSXMgYHN5c191c2VyZmF1bHRmZGAgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHN5c3RlbSBjYWxsIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGg/IFRoYXQmIzM5O3Mgd2hhdCBJIG5lZWQgdG8gdmVyaWZ5IG5leHQuIFVuZGVyc3RhbmRpbmcgdGhhdCBjb25uZWN0aW9uIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBjb250cm9sIGZsb3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1NZU0NBTExfREVGSU5FLip1c2VyZmF1bHRmZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jPTQ0ODM9c3RhdGljIGlubGluZSBib29sIHVzZXJmYXVsdGZkX3N5c2NhbGxfYWxsb3dlZChpbnQgZmxhZ3MpXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy00NDk5LVxubW0vdXNlcmZhdWx0ZmQuYzo0NTAwOlNZU0NBTExfREVGSU5FMSh1c2VyZmF1bHRmZCwgaW50LCBmbGFncylcbm1tL3VzZXJmYXVsdGZkLmMtNDUwMS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMTk5CgkJCQkJCQlvdXRwdXQ6IDk4CgkJCQkJCQl0aG91Z2h0czogNTA5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBgdXNlcmZhdWx0ZmRgIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0byBmb2N1cyBvbiB0aGUgZW50cnkgcG9pbnRzLCBzbyBgc3lzX3VzZXJmYXVsdGZkYCBhbmQgYHVzZXJmYXVsdGZkX2lvY3RsYCBjYW1lIHRvIG1pbmQuIEhvd2V2ZXIsIGBzeXNfdXNlcmZhdWx0ZmRgIGlzIGp1c3QgdGhlIHN5c2NhbGwuIFRoZSByZWFsIG1lYXQgb2YgdGhlIGJ1ZyBsaWVzIGRlZXBlciwgd2l0aGluIGBtb3ZlX3BhZ2VzYCwgd2hpY2ggaXMgcmVhY2hlZCB2aWEgdGhlIGNhbGwgY2hhaW4gYHVzZXJmYXVsdGZkX2lvY3RsYCAtJmd0OyBgdXNlcmZhdWx0ZmRfbW92ZWAgLSZndDsgYG1vdmVfcGFnZXNgLiBTaW5jZSBgdXNlcmZhdWx0ZmRfaW9jdGxgIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSBmb3IgaW9jdGxzLCBJJiMzOTttIGNvbWZvcnRhYmxlIG1ha2luZyBpdCBhIGBGb2N1c1N5bWJvbGAuCgpJIGJyaWVmbHkgY29uc2lkZXJlZCBpZiBgdXNlcmZhdWx0ZmRfbW92ZWAgbWlnaHQgYmUgaW5saW5lZCwgYnV0IGl0JiMzOTtzIGRlZmluZWQgYXMgYHN0YXRpYyBpbnQgdXNlcmZhdWx0ZmRfbW92ZWAsIHNvIGl0JiMzOTtzIHN0YXRpY2FsbHkgbGlua2VkLiBJIGNoZWNrZWQgdG8gbWFrZSBzdXJlIGl0JiMzOTtzIG5vdCBpbmxpbmUsIHNpbmNlIGl0JiMzOTtzIGEgc2l6YWJsZSBmdW5jdGlvbiwgYW5kIEkmIzM5O20gcHJldHR5IGNlcnRhaW4gdGhhdCBgdXNlcmZhdWx0ZmRfaW9jdGxgIGlzbiYjMzk7dCBpbmxpbmVkLiBJdCYjMzk7cyBiZXN0IHRvIGJlIHRob3JvdWdoLgoKQ2hlY2tpbmcgdGhlIGNvbmZpZyBvcHRpb25zLCB0aGUgcHJpbWFyeSByZWxldmFudCBvbmUgaXMgYFVTRVJGQVVMVEZEYC4KCk5vdywgbGV0JiMzOTtzIHJldmlldyB0aGUgcGF0Y2ggaXRzZWxmOgoKYGBgYwoJCQlyZXQgPSBtb3ZlX3BhZ2VzX3B0ZXMobW0sIGRzdF9wbWQsIHNyY19wbWQsCgkJCQkJICAgICAgZHN0X3ZtYSwgc3JjX3ZtYSwgZHN0X2FkZHIsCgkJCQkJICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7Ci0JCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlpZiAocmV0ICZsdDsgMCkgewogCQkJCWVyciA9IHJldDsKLQkJCWVsc2UKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQllcnIgPSAwOwogCQkJCXN0ZXBfc2l6ZSA9IHJldDsKJiM0MzsJCQl9CmBgYAoKVGhpcyBpcyBhIGZ1bmN0aW9uYWwgYnVnIGZpeCwgcmlnaHQ/IFRoZSBvcmlnaW5hbCBjb2RlIGhhZCBhIGZsYXcgd2hlcmUsIGlmIGBlcnJgIHdhcyBzZXQgdG8gc29tZXRoaW5nIG5vbi16ZXJvIChsaWtlIGAtRUFHQUlOYCBmcm9tIGEgcHJldmlvdXMgaXRlcmF0aW9uIG9yIHNpZ25hbCkgYW5kIGBtb3ZlX3BhZ2VzX3B0ZXNgIHRoZW4gKnN1Y2NlZWRlZCosIHRoZSBjb2RlICp3b3VsZG4mIzM5O3QqIGNsZWFyIGBlcnJgLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIGhhbmRsaW5nLiBUaGUgcGF0Y2ggY29ycmVjdHMgdGhpcyBieSBzZXR0aW5nIGBlcnIgPSAwYCBpZiBgbW92ZV9wYWdlc19wdGVzYCBzdWNjZWVkcy4KCkJhc2VkIG9uIHRoaXMsIEkmIzM5O20gc2V0dGluZzoKCiogICBgV29ydGhGdXp6aW5nOiB0cnVlYCAtIGJlY2F1c2UgaXQgaXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBpdCBmaXhlcyBhIGtleSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eS4KKiAgIGBGb2N1c1N5bWJvbHM6IFsmIzM0O3VzZXJmYXVsdGZkX2lvY3RsJiMzNDtdYCAtIGJlY2F1c2UgYHVzZXJmYXVsdGZkX2lvY3RsYCBpcyB0aGUgZW50cnkgcG9pbnQuCiogICBgRW5hYmxlQ29uZmlnczogWyYjMzQ7VVNFUkZBVUxURkQmIzM0O11gIC0gYmVjYXVzZSB0aGF0JiMzOTtzIHRoZSBuZWNlc3NhcnkgY29uZmlnIG9wdGlvbi4KKiAgIGBSZWFzb25pbmc6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgYnVnIGluIHRoZSBVRkZESU9fTU9WRSBpb2N0bCBoYW5kbGVyIHdoZXJlIGEgcHJldmlvdXNseSBzZXQgZXJyb3IgY29kZSAobGlrZSAtRUFHQUlOKSB3YXMgbm90IGNsZWFyZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhZ2UgbW92ZSwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBhbiBpbmZpbml0ZSBsb29wIG9yIGluY29ycmVjdCBlcnJvciByZXBvcnRpbmcuIFRoaXMgaXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLiYjMzQ7YAoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1c2VyZmF1bHRmZF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1c2VyZmF1bHRmZF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiBgbW92ZV9wYWdlcygpYCB3aGVyZSB0aGUgYGVycmAgdmFyaWFibGUgd2FzIG5vdCByZXNldCB0byAwIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGBtb3ZlX3BhZ2VzX3B0ZXMoKWAuIElmIGBlcnJgIHdhcyBwcmV2aW91c2x5IHNldCB0byBgLUVBR0FJTmAgKGUuZy4sIGZyb20gYSBwcmlvciBmYWlsZWQgYG1vdmVfcGFnZXNfaHVnZV9wbWQoKWAgYXR0ZW1wdCB0aGF0IHRyaWdnZXJlZCBhIGBjb250aW51ZWApLCBpdCB3b3VsZCByZW1haW4gYC1FQUdBSU5gLiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBsb29wIHRvIGluY29ycmVjdGx5IHNraXAgYWR2YW5jaW5nIHRoZSBgc3JjX2FkZHJgIGFuZCBgZHN0X2FkZHJgIHBvaW50ZXJzIGFuZCBgY29udGludWVgIGFnYWluLCBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJldHVybnMuXG5cblRoaXMgaXMgYSBjb250cm9sIGZsb3cgYW5kIGVycm9yIGhhbmRsaW5nIGJ1Zy4gSXQgZG9lcyBub3QgaW52b2x2ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRpbmcgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgaW5jbHVkaW5nIEtBU0FOIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3RvcnMsIGlzIHN1ZmZpY2llbnQgdG8gY2F0Y2ggc3VjaCBoYW5ncyBvciBsb2dpYyBlcnJvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDdmYTRlZjVhYjIxYzE2ZmE4OWJiNTYwZmU4MTI1YjgwYzE0MWE1OWIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAxNSAxMDo1MTozNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jCmluZGV4IGMzYWRlZGFhZjdkNTQuLjU5NWU3ZTIzMmY5MDEgMTAwNjQ0Ci0tLSBhL21tL3VzZXJmYXVsdGZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vdXNlcmZhdWx0ZmQuYwpAQCAtMjA2OSwxMCAmIzQzOzIwNjksMTIgQEAgc3RhdGljIHNzaXplX3QgbW92ZV9wYWdlcyhzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgZHN0X3N0YXJ0LAogCQkJcmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLAogCQkJCQkgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkciwKIAkJCQkJICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7Ci0JCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlpZiAocmV0ICZsdDsgMCkgewogCQkJCWVyciA9IHJldDsKLQkJCWVsc2UKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQllcnIgPSAwOwogCQkJCXN0ZXBfc2l6ZSA9IHJldDsKJiM0MzsJCQl9CiAJCX0KIAogCQljb25kX3Jlc2NoZWQoKTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMjYKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgVXNlcmZhdWx0ZmQgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBtbS91c2VyZmF1bHRmZC5jYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGEgbW9kaWZpY2F0aW9uIHRvIHRoZSBgbW92ZV9wYWdlc2AgZnVuY3Rpb24uIFRoZSBjb2RlIHNuaXBwZXQgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDsgaXQmIzM5O3MgYSBjb25kaXRpb25hbCBjaGFuZ2UgZGVhbGluZyB3aXRoIHRoZSByZXR1cm4gdmFsdWUsIGByZXRgLCBmcm9tIGEgZnVuY3Rpb24gY2FsbC4gSXQgc2VlbXMgbGlrZSB0aGUgb3JpZ2luYWwgY29kZSBzZXQgYGVycmAgdG8gdGhlIHZhbHVlIG9mIGByZXRgIHdoZW4gYHJldGAgd2FzIG5lZ2F0aXZlLCBpbmRpY2F0aW5nIGFuIGVycm9yLiBUaGUgcGF0Y2ggd3JhcHMgdGhpcyBpbiBhIGNvbmRpdGlvbmFsLCBhbmQgYWRkcyBgZXJyID0gMGAgd2hlbiBgcmV0ICZndDs9IDBgLCBhbmQgYHN0ZXBfc2l6ZSA9IHJldGAuIFRoYXQgbWFrZXMgaXQgY2xlYXIgdGhhdCBhIG5vbi1uZWdhdGl2ZSByZXR1cm4gbm93IGluZGljYXRlcyBzdWNjZXNzLgoKVG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbiwgSSBuZWVkIHRvIHNlZSB0aGUgc3Vycm91bmRpbmcgY29udGV4dC4gV2hhdCBleGFjdGx5IGlzIGBtb3ZlX3BhZ2VzYCBkb2luZyBpbiB0aGlzIHBhcnQgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbT8gV2hhdCBhcmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgYHJldGAsIGFuZCB3aGF0IGlzIGBlcnJgIHVzZWQgZm9yPyBJcyB0aGlzIGEgc3RhbmRhcmQgc3VjY2Vzcy9lcnJvciByZXR1cm4gbW9kZWwsIG9yIGlzIHRoZXJlIHNvbWV0aGluZyBzcGVjaWZpYyB0byB1c2VyZmF1bHRmZCBoYXBwZW5pbmcgaGVyZT8KCkkmIzM5O2xsIHVzZSBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gcXVpY2tseSBmaW5kIHRoZSBgbW92ZV9wYWdlc2AgZnVuY3Rpb24gZGVmaW5pdGlvbiBhbmQgaXRzIHVzYWdlIHdpdGhpbiBgbW0vdXNlcmZhdWx0ZmQuY2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGluZm9ybWF0aW9uIEkgbmVlZCB0byBwcm9wZXJseSBhbmFseXplIHRoaXMgcGF0Y2ggYW5kIGl0cyBpbXBsaWNhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21vdmVfcGFnZXNcXCgmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3VzZXJmYXVsdGZkLmM9MTg1OT1zdGF0aWMgdm9pZCB1ZmZkX21vdmVfdW5sb2NrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0X3ZtYSxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE4NzYtICpcbm1tL3VzZXJmYXVsdGZkLmM6MTg3NzogKiBtb3ZlX3BhZ2VzKCkgcmVtYXBzIGFyYml0cmFyeSBhbm9ueW1vdXMgcGFnZXMgYXRvbWljYWxseSBpbiB6ZXJvXG5tbS91c2VyZmF1bHRmZC5jLTE4NzgtICogY29weS4gSXQgb25seSB3b3JrcyBvbiBub24gc2hhcmVkIGFub255bW91cyBwYWdlcyBiZWNhdXNlIHRob3NlIGNhblxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMTg4OC0gKiBzdG9yYWdlIG9yIGFueSBvdGhlciBJL08gZGV2aWNlIChNQURWX0RPTlRGT1JLIGluIHRoZSBzb3VyY2Ugdm1hXG5tbS91c2VyZmF1bHRmZC5jOjE4ODk6ICogYXZvaWRzIG1vdmVfcGFnZXMoKSB0byBmYWlsIHdpdGggLUVCVVNZIGlmIHRoZSBwcm9jZXNzIGZvcmtzIGJlZm9yZVxubW0vdXNlcmZhdWx0ZmQuYzoxODkwOiAqIG1vdmVfcGFnZXMoKSBpcyBjYWxsZWQpLCB0aGVuIGl0IHdpbGwgY2FsbCBtb3ZlX3BhZ2VzKCkgdG8gbWFwIHRoZVxubW0vdXNlcmZhdWx0ZmQuYy0xODkxLSAqIHBhZ2UgaW4gdGhlIGZhdWx0aW5nIGFkZHJlc3MgaW4gdGhlIGRlc3RpbmF0aW9uIHZtYS5cbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE5MDUtICogdGhlIGRlc3RpbmF0aW9uIHZpcnR1YWwgbWVtb3J5IHJhbmdlIGlzIG5vdCBhIHdob2xlIHVubWFwcGVkIGhvbGUsXG5tbS91c2VyZmF1bHRmZC5jOjE5MDY6ICogbW92ZV9wYWdlcygpIHdpbGwgZmFpbCByZXNwZWN0aXZlbHkgd2l0aCAtRU5PRU5UIG9yIC1FRVhJU1QuIFRoaXNcbm1tL3VzZXJmYXVsdGZkLmMtMTkwNy0gKiBwcm92aWRlcyBhIHZlcnkgc3RyaWN0IGJlaGF2aW9yIHRvIGF2b2lkIGFueSBjaGFuY2Ugb2YgbWVtb3J5XG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xOTEwLSAqIHRpbWUgZm9yIGFueSBnaXZlbiBmYXVsdGluZyBhZGRyZXNzLiBUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIHRocmVhZHNcbm1tL3VzZXJmYXVsdGZkLmM6MTkxMTogKiB0cnkgdG8gYm90aCBjYWxsIG1vdmVfcGFnZXMoKSBvbiB0aGUgc2FtZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGF0IHRoZVxubW0vdXNlcmZhdWx0ZmQuYy0xOTEyLSAqIHNhbWUgdGltZSwgdGhlIHNlY29uZCB0aHJlYWQgd2lsbCBnZXQgYW4gZXhwbGljaXQgZXJyb3IgZnJvbSB0aGlzXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xOTIwLSAqIGFuIGFtb3VudCBvZiBieXRlcyBzdWNjZXNzZnVsbHkgbW92ZWQuIElmIHRoZSByZXR2YWwgcmVwb3J0cyBhXG5tbS91c2VyZmF1bHRmZC5jOjE5MjE6ICogXCYjMzQ7c2hvcnRcJiMzNDsgcmVtYXAsIHRoZSBtb3ZlX3BhZ2VzKCkgY29tbWFuZCBzaG91bGQgYmUgcmVwZWF0ZWQgYnlcbm1tL3VzZXJmYXVsdGZkLmMtMTkyMi0gKiB1c2VybGFuZCB3aXRoIHNyYyYjNDM7cmV0dmFsLCBkc3QmIzQzO3JldmFsLCBsZW4tcmV0dmFsIGlmIGl0IHdhbnRzIHRvIGtub3dcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE5MzMtICovXG5tbS91c2VyZmF1bHRmZC5jOjE5MzQ6c3RhdGljIHNzaXplX3QgbW92ZV9wYWdlcyhzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgZHN0X3N0YXJ0LFxubW0vdXNlcmZhdWx0ZmQuYy0xOTM1LVx0XHQgICB1bnNpZ25lZCBsb25nIHNyY19zdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sIF9fdTY0IG1vZGUpXG4tLVxubW0vdXNlcmZhdWx0ZmQuYz00MjE2PXN0YXRpYyBpbnQgdXNlcmZhdWx0ZmRfbW92ZShzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy00MjU1LVx0aWYgKG1tZ2V0X25vdF96ZXJvKG1tKSkge1xubW0vdXNlcmZhdWx0ZmQuYzo0MjU2Olx0XHRyZXQgPSBtb3ZlX3BhZ2VzKGN0eCwgdWZmZGlvX21vdmUuZHN0LCB1ZmZkaW9fbW92ZS5zcmMsXG5tbS91c2VyZmF1bHRmZC5jLTQyNTctXHRcdFx0XHQgdWZmZGlvX21vdmUubGVuLCB1ZmZkaW9fbW92ZS5tb2RlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzIxNgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgbW92ZV9wYWdlc2AgaW4gYG1tL3VzZXJmYXVsdGZkLmNgKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgbW92ZV9wYWdlc2AgaXMgaGFuZGxpbmcgdGhpbmdzIGluIHRoZSBjb250ZXh0IG9mIHVzZXJmYXVsdGZkLiBUaGlzIGZ1bmN0aW9uIGlzIGNyaXRpY2FsIGZvciBob3cgd2UgbWFuYWdlIHBhZ2UgbWlncmF0aW9uIGFuZCB0cmFuc2ZlciwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCB1c2VyLXNwYWNlIG1lbW9yeSBhY2Nlc3MgZmF1bHRzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUga2VybmVsIG9yY2hlc3RyYXRlcyB0aGlzIHdob2xlIGRhbmNlIGJldHdlZW4gdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gaW50ZXJlc3RlZCBpbiB0aGUgaW50ZXJwbGF5IGJldHdlZW4gYHVzZXJmYXVsdGZkYCBhbmQgdGhlIHBhZ2UgbWlncmF0aW9uIG1hY2hpbmVyeS4gSG93IGRvZXMgaXQga25vdyB3aGVyZSBwYWdlcyBhcmUsIGFuZCBob3cgZG9lcyBpdCBkaXJlY3QgdGhlbSB3aGVyZSB0aGV5IG5lZWQgdG8gZ28/IEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgYSBkZWxpY2F0ZSBiYWxhbmNpbmcgYWN0IGhlcmUsIGVuc3VyaW5nIGRhdGEgaW50ZWdyaXR5IHdoaWxlIG1pbmltaXppbmcgdGhlIHBlcmZvcm1hbmNlIGhpdCBvZiBwYWdlIGZhdWx0cy4gTGV0JiMzOTtzIHNlZSBob3cgdGhleSBkbyBpdC4gSSYjMzk7bSBsb29raW5nIGZvciB0aGUga2V5IGxvY2tpbmcgcHJpbWl0aXZlcywgZXJyb3IgaGFuZGxpbmcgcGF0aHMsIGFuZCB0aGUgb3ZlcmFsbCBsb2dpYyBmbG93LiBUaGlzIGNvdWxkIGdpdmUgbWUgc29tZSBncmVhdCBpbnNpZ2h0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTkzNCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkzNDpcdHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcbjE5MzU6XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBfX3U2NCBtb2RlKVxuMTkzNjpcdHtcbjE5Mzc6XHRcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3R4LVx1MDAzZW1tO1xuMTkzODpcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICpzcmNfdm1hLCAqZHN0X3ZtYTtcbjE5Mzk6XHRcdHVuc2lnbmVkIGxvbmcgc3JjX2FkZHIsIGRzdF9hZGRyLCBzcmNfZW5kO1xuMTk0MDpcdFx0cG1kX3QgKnNyY19wbWQsICpkc3RfcG1kO1xuMTk0MTpcdFx0bG9uZyBlcnIgPSAtRUlOVkFMO1xuMTk0MjpcdFx0c3NpemVfdCBtb3ZlZCA9IDA7XG4xOTQzOlx0XG4xOTQ0Olx0XHQvKiBTYW5pdGl6ZSB0aGUgY29tbWFuZCBwYXJhbWV0ZXJzLiAqL1xuMTk0NTpcdFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCBcdTAwMjYgflBBR0VfTUFTSyk7XG4xOTQ2Olx0XHRWTV9XQVJOX09OX09OQ0UoZHN0X3N0YXJ0IFx1MDAyNiB+UEFHRV9NQVNLKTtcbjE5NDc6XHRcdFZNX1dBUk5fT05fT05DRShsZW4gXHUwMDI2IH5QQUdFX01BU0spO1xuMTk0ODpcdFxuMTk0OTpcdFx0LyogRG9lcyB0aGUgYWRkcmVzcyByYW5nZSB3cmFwLCBvciBpcyB0aGUgc3BhbiB6ZXJvLXNpemVkPyAqL1xuMTk1MDpcdFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCAmIzQzOyBsZW4gXHUwMDNjIHNyY19zdGFydCk7XG4xOTUxOlx0XHRWTV9XQVJOX09OX09OQ0UoZHN0X3N0YXJ0ICYjNDM7IGxlbiBcdTAwM2MgZHN0X3N0YXJ0KTtcbjE5NTI6XHRcbjE5NTM6XHRcdGVyciA9IHVmZmRfbW92ZV9sb2NrKG1tLCBkc3Rfc3RhcnQsIHNyY19zdGFydCwgXHUwMDI2ZHN0X3ZtYSwgXHUwMDI2c3JjX3ZtYSk7XG4xOTU0Olx0XHRpZiAoZXJyKVxuMTk1NTpcdFx0XHRnb3RvIG91dDtcbjE5NTY6XHRcbjE5NTc6XHRcdC8qIFJlLWNoZWNrIGFmdGVyIHRha2luZyBtYXBfY2hhbmdpbmdfbG9jayAqL1xuMTk1ODpcdFx0ZXJyID0gLUVBR0FJTjtcbjE5NTk6XHRcdGRvd25fcmVhZChcdTAwMjZjdHgtXHUwMDNlbWFwX2NoYW5naW5nX2xvY2spO1xuMTk2MDpcdFx0aWYgKGxpa2VseShhdG9taWNfcmVhZChcdTAwMjZjdHgtXHUwMDNlbW1hcF9jaGFuZ2luZykpKVxuMTk2MTpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4xOTYyOlx0XHQvKlxuMTk2MzpcdFx0ICogTWFrZSBzdXJlIHRoZSB2bWEgaXMgbm90IHNoYXJlZCwgdGhhdCB0aGUgc3JjIGFuZCBkc3QgcmVtYXBcbjE5NjQ6XHRcdCAqIHJhbmdlcyBhcmUgYm90aCB2YWxpZCBhbmQgZnVsbHkgd2l0aGluIGEgc2luZ2xlIGV4aXN0aW5nXG4xOTY1Olx0XHQgKiB2bWEuXG4xOTY2Olx0XHQgKi9cbjE5Njc6XHRcdGVyciA9IC1FSU5WQUw7XG4xOTY4Olx0XHRpZiAoc3JjX3ZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fU0hBUkVEKVxuMTk2OTpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4xOTcwOlx0XHRpZiAoc3JjX3N0YXJ0ICYjNDM7IGxlbiBcdTAwM2Ugc3JjX3ZtYS1cdTAwM2V2bV9lbmQpXG4xOTcxOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbjE5NzI6XHRcbjE5NzM6XHRcdGlmIChkc3Rfdm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9TSEFSRUQpXG4xOTc0Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbjE5NzU6XHRcdGlmIChkc3Rfc3RhcnQgJiM0MzsgbGVuIFx1MDAzZSBkc3Rfdm1hLVx1MDAzZXZtX2VuZClcbjE5NzY6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTk3NzpcdFxuMTk3ODpcdFx0ZXJyID0gdmFsaWRhdGVfbW92ZV9hcmVhcyhjdHgsIHNyY192bWEsIGRzdF92bWEpO1xuMTk3OTpcdFx0aWYgKGVycilcbjE5ODA6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTk4MTpcdFxuMTk4MjpcdFx0Zm9yIChzcmNfYWRkciA9IHNyY19zdGFydCwgZHN0X2FkZHIgPSBkc3Rfc3RhcnQsIHNyY19lbmQgPSBzcmNfc3RhcnQgJiM0MzsgbGVuO1xuMTk4MzpcdFx0ICAgICBzcmNfYWRkciBcdTAwM2Mgc3JjX2VuZDspIHtcbjE5ODQ6XHRcdFx0c3BpbmxvY2tfdCAqcHRsO1xuMTk4NTpcdFx0XHRwbWRfdCBkc3RfcG1kdmFsO1xuMTk4NjpcdFx0XHR1bnNpZ25lZCBsb25nIHN0ZXBfc2l6ZTtcbjE5ODc6XHRcbjE5ODg6XHRcdFx0LypcbjE5ODk6XHRcdFx0ICogQmVsb3cgd29ya3MgYmVjYXVzZSBhbm9ueW1vdXMgYXJlYSB3b3VsZCBub3QgaGF2ZSBhXG4xOTkwOlx0XHRcdCAqIHRyYW5zcGFyZW50IGh1Z2UgUFVELiBJZiBmaWxlLWJhY2tlZCBzdXBwb3J0IGlzIGFkZGVkLFxuMTk5MTpcdFx0XHQgKiB0aGF0IGNhc2Ugd291bGQgbmVlZCB0byBiZSBoYW5kbGVkIGhlcmUuXG4xOTkyOlx0XHRcdCAqL1xuMTk5MzpcdFx0XHRzcmNfcG1kID0gbW1fZmluZF9wbWQobW0sIHNyY19hZGRyKTtcbjE5OTQ6XHRcdFx0aWYgKHVubGlrZWx5KCFzcmNfcG1kKSkge1xuMTk5NTpcdFx0XHRcdGlmICghKG1vZGUgXHUwMDI2IFVGRkRJT19NT1ZFX01PREVfQUxMT1dfU1JDX0hPTEVTKSkge1xuMTk5NjpcdFx0XHRcdFx0ZXJyID0gLUVOT0VOVDtcbjE5OTc6XHRcdFx0XHRcdGJyZWFrO1xuMTk5ODpcdFx0XHRcdH1cbjE5OTk6XHRcdFx0XHRzcmNfcG1kID0gbW1fYWxsb2NfcG1kKG1tLCBzcmNfYWRkcik7XG4yMDAwOlx0XHRcdFx0aWYgKHVubGlrZWx5KCFzcmNfcG1kKSkge1xuMjAwMTpcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbjIwMDI6XHRcdFx0XHRcdGJyZWFrO1xuMjAwMzpcdFx0XHRcdH1cbjIwMDQ6XHRcdFx0fVxuMjAwNTpcdFx0XHRkc3RfcG1kID0gbW1fYWxsb2NfcG1kKG1tLCBkc3RfYWRkcik7XG4yMDA2Olx0XHRcdGlmICh1bmxpa2VseSghZHN0X3BtZCkpIHtcbjIwMDc6XHRcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMjAwODpcdFx0XHRcdGJyZWFrO1xuMjAwOTpcdFx0XHR9XG4yMDEwOlx0XG4yMDExOlx0XHRcdGRzdF9wbWR2YWwgPSBwbWRwX2dldF9sb2NrbGVzcyhkc3RfcG1kKTtcbjIwMTI6XHRcdFx0LypcbjIwMTM6XHRcdFx0ICogSWYgdGhlIGRzdF9wbWQgaXMgbWFwcGVkIGFzIFRIUCBkb24mIzM5O3Qgb3ZlcnJpZGUgaXQgYW5kIGp1c3RcbjIwMTQ6XHRcdFx0ICogYmUgc3RyaWN0LiBJZiBkc3RfcG1kIGNoYW5nZXMgaW50byBUUEggYWZ0ZXIgdGhpcyBjaGVjaywgdGhlXG4yMDE1Olx0XHRcdCAqIG1vdmVfcGFnZXNfaHVnZV9wbWQoKSB3aWxsIGRldGVjdCB0aGUgY2hhbmdlIGFuZCByZXRyeVxuMjAxNjpcdFx0XHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXG4yMDE3Olx0XHRcdCAqL1xuMjAxODpcdFx0XHRpZiAodW5saWtlbHkocG1kX3RyYW5zX2h1Z2UoZHN0X3BtZHZhbCkpKSB7XG4yMDE5Olx0XHRcdFx0ZXJyID0gLUVFWElTVDtcbjIwMjA6XHRcdFx0XHRicmVhaztcbjIwMjE6XHRcdFx0fVxuMjAyMjpcdFxuMjAyMzpcdFx0XHRwdGwgPSBwbWRfdHJhbnNfaHVnZV9sb2NrKHNyY19wbWQsIHNyY192bWEpO1xuMjAyNDpcdFx0XHRpZiAocHRsKSB7XG4yMDI1Olx0XHRcdFx0LyogQ2hlY2sgaWYgd2UgY2FuIG1vdmUgdGhlIHBtZCB3aXRob3V0IHNwbGl0dGluZyBpdC4gKi9cbjIwMjY6XHRcdFx0XHRpZiAobW92ZV9zcGxpdHNfaHVnZV9wbWQoZHN0X2FkZHIsIHNyY19hZGRyLCBzcmNfc3RhcnQgJiM0MzsgbGVuKSB8fFxuMjAyNzpcdFx0XHRcdCAgICAhcG1kX25vbmUoZHN0X3BtZHZhbCkpIHtcbjIwMjg6XHRcdFx0XHRcdC8qIENhbiBiZSBhIG1pZ3JhdGlvbiBlbnRyeSAqL1xuMjAyOTpcdFx0XHRcdFx0aWYgKHBtZF9wcmVzZW50KCpzcmNfcG1kKSkge1xuMjAzMDpcdFx0XHRcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcG1kX2ZvbGlvKCpzcmNfcG1kKTtcbjIwMzE6XHRcbjIwMzI6XHRcdFx0XHRcdFx0aWYgKCFpc19odWdlX3plcm9fZm9saW8oZm9saW8pIFx1MDAyNlx1MDAyNlxuMjAzMzpcdFx0XHRcdFx0XHQgICAgIVBhZ2VBbm9uRXhjbHVzaXZlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUxNTcKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkRpdmluZyBEZWVwZXIgaW50byBgbW92ZV9wYWdlc2AqKgoKQWxyaWdodCwgSSYjMzk7dmUgZ290IHRoZSBpbml0aWFsIG92ZXJ2aWV3IG9mIGBtb3ZlX3BhZ2VzYCBpbiBteSBoZWFkLiBOb3csIHRoZSByZWFsIHdvcmsgYmVnaW5zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbnVhbmNlcywgdGhlIGVkZ2UgY2FzZXMsIHRoZSBwb3RlbnRpYWwgYm90dGxlbmVja3MuIExldCYjMzk7cyBkaWcgaW50byB0aGUgbWVhdCBvZiB0aGUgY29kZS4gTXkgcHJpbWFyeSBmb2N1cyBpcyBsaWtlbHkgb24gaG93IGl0IGhhbmRsZXMgbWVtb3J5IG1hbmFnZW1lbnQsIGVzcGVjaWFsbHkgaWYgdGhpcyBpcyByZWxhdGVkIHRvIGEgcGFnaW5nIHN5c3RlbSwgb3Igc29tZSBmb3JtIG9mIHZpcnR1YWwgbWVtb3J5LiBJJiMzOTttIGxvb2tpbmcgZm9yIHdoZXJlIHBhZ2UgdGFibGVzIGFyZSB1cGRhdGVkLCB3aGVyZSBwaHlzaWNhbCBmcmFtZXMgbWlnaHQgYmUgYWxsb2NhdGVkIG9yIGRlYWxsb2NhdGVkLCBhbmQgaG93IGNvaGVyZW5jeSBpcyBtYWludGFpbmVkLCBpZiB0aGlzIG9wZXJhdGlvbiBpcyBoYXBwZW5pbmcgY29uY3VycmVudGx5LiBJcyBpdCB0aHJlYWQtc2FmZT8gRG9lcyBpdCBlbXBsb3kgbG9ja3MsIGFuZCBpZiBzbywgaG93IGdyYW51bGFyIGFyZSB0aGV5PyBBbnkgZGVhZGxvY2tzPyBBbHNvLCB3aGF0IGhhcHBlbnMgaW4gYSBzaXR1YXRpb24gb2YgYW4gb3V0LW9mLW1lbW9yeSBlcnJvci4KCkkgd2FudCB0byBzZWUgdGhlIGRldGFpbHMgb24gdGhlIGRhdGEgc3RydWN0dXJlcyBpdCBtYW5pcHVsYXRlcy4gSG93IGFyZSB0aGUgcGFnZXMgb3JnYW5pemVkIGJlZm9yZSB0aGUgbW92ZT8gSXMgaXQgYSBsaW5rZWQgbGlzdCwgYSBoYXNoIHRhYmxlLCBhIHRyZWUgc3RydWN0dXJlLCBvciBzb21ldGhpbmcgZWxzZT8gVW5kZXJzdGFuZGluZyB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZXMgaXMga2V5IHRvIG9wdGltaXppbmcgdGhlIGFsZ29yaXRobS4gSSYjMzk7bGwgYmUgd2F0Y2hpbmcgaG93IGl0IGhhbmRsZXMgZXhjZXB0aW9ucywgZXJyb3IgcmVjb3ZlcnksIGFuZCB0aGUgb3ZlcmFsbCByZWxpYWJpbGl0eSBvZiB0aGUgZnVuY3Rpb24uIElzIGl0IGF0b21pYz8gSSYjMzk7bSBhbnRpY2lwYXRpbmcgdGhhdCBJJiMzOTtsbCBiZSBtZW50YWxseSBtYXBwaW5nIHRoZSBmdW5jdGlvbiYjMzk7cyBsb2dpYyB0byB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBjYXBhYmlsaXRpZXMsIHBlcmhhcHMgaW5jbHVkaW5nIHRoZSBDUFUmIzM5O3MgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdCBhbmQgYW55IHJlbGV2YW50IGNhY2hlIGNvbmZpZ3VyYXRpb25zLiBVbmRlcnN0YW5kaW5nIHRoZXNlIGludGVyYWN0aW9ucyBpcyBjcml0aWNhbCwgYXMgaXQgaGFzIGEgbWFzc2l2ZSBwZXJmb3JtYW5jZSBpbXBhY3QuIEZpbmFsbHksIEkgd2lsbCBiZSB0aGlua2luZyBvZiB3YXlzIHRvIHJlZmFjdG9yIHRoaXMgZnVuY3Rpb24gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgbWFpbnRhaW5hYmlsaXR5LCBhbmQgcmVhZGFiaWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vdXNlcmZhdWx0ZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIwMzQsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIwMzQ6XHRcdFx0XHRcdFx0XHRzcGluX3VubG9jayhwdGwpO1xuMjAzNTpcdFx0XHRcdFx0XHRcdGVyciA9IC1FQlVTWTtcbjIwMzY6XHRcdFx0XHRcdFx0XHRicmVhaztcbjIwMzc6XHRcdFx0XHRcdFx0fVxuMjAzODpcdFx0XHRcdFx0fVxuMjAzOTpcdFxuMjA0MDpcdFx0XHRcdFx0c3Bpbl91bmxvY2socHRsKTtcbjIwNDE6XHRcdFx0XHRcdHNwbGl0X2h1Z2VfcG1kKHNyY192bWEsIHNyY19wbWQsIHNyY19hZGRyKTtcbjIwNDI6XHRcdFx0XHRcdC8qIFRoZSBmb2xpbyB3aWxsIGJlIHNwbGl0IGJ5IG1vdmVfcGFnZXNfcHRlKCkgKi9cbjIwNDM6XHRcdFx0XHRcdGNvbnRpbnVlO1xuMjA0NDpcdFx0XHRcdH1cbjIwNDU6XHRcbjIwNDY6XHRcdFx0XHRlcnIgPSBtb3ZlX3BhZ2VzX2h1Z2VfcG1kKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxuMjA0NzpcdFx0XHRcdFx0XHRcdCAgZHN0X3BtZHZhbCwgZHN0X3ZtYSwgc3JjX3ZtYSxcbjIwNDg6XHRcdFx0XHRcdFx0XHQgIGRzdF9hZGRyLCBzcmNfYWRkcik7XG4yMDQ5Olx0XHRcdFx0c3RlcF9zaXplID0gSFBBR0VfUE1EX1NJWkU7XG4yMDUwOlx0XHRcdH0gZWxzZSB7XG4yMDUxOlx0XHRcdFx0bG9uZyByZXQ7XG4yMDUyOlx0XG4yMDUzOlx0XHRcdFx0aWYgKHBtZF9ub25lKCpzcmNfcG1kKSkge1xuMjA1NDpcdFx0XHRcdFx0aWYgKCEobW9kZSBcdTAwMjYgVUZGRElPX01PVkVfTU9ERV9BTExPV19TUkNfSE9MRVMpKSB7XG4yMDU1Olx0XHRcdFx0XHRcdGVyciA9IC1FTk9FTlQ7XG4yMDU2Olx0XHRcdFx0XHRcdGJyZWFrO1xuMjA1NzpcdFx0XHRcdFx0fVxuMjA1ODpcdFx0XHRcdFx0aWYgKHVubGlrZWx5KF9fcHRlX2FsbG9jKG1tLCBzcmNfcG1kKSkpIHtcbjIwNTk6XHRcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbjIwNjA6XHRcdFx0XHRcdFx0YnJlYWs7XG4yMDYxOlx0XHRcdFx0XHR9XG4yMDYyOlx0XHRcdFx0fVxuMjA2MzpcdFxuMjA2NDpcdFx0XHRcdGlmICh1bmxpa2VseShwdGVfYWxsb2MobW0sIGRzdF9wbWQpKSkge1xuMjA2NTpcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbjIwNjY6XHRcdFx0XHRcdGJyZWFrO1xuMjA2NzpcdFx0XHRcdH1cbjIwNjg6XHRcbjIwNjk6XHRcdFx0XHRyZXQgPSBtb3ZlX3BhZ2VzX3B0ZXMobW0sIGRzdF9wbWQsIHNyY19wbWQsXG4yMDcwOlx0XHRcdFx0XHRcdCAgICAgIGRzdF92bWEsIHNyY192bWEsIGRzdF9hZGRyLFxuMjA3MTpcdFx0XHRcdFx0XHQgICAgICBzcmNfYWRkciwgc3JjX2VuZCAtIHNyY19hZGRyLCBtb2RlKTtcbjIwNzI6XHRcdFx0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4yMDczOlx0XHRcdFx0XHRlcnIgPSByZXQ7XG4yMDc0Olx0XHRcdFx0fSBlbHNlIHtcbjIwNzU6XHRcdFx0XHRcdGVyciA9IDA7XG4yMDc2Olx0XHRcdFx0XHRzdGVwX3NpemUgPSByZXQ7XG4yMDc3Olx0XHRcdFx0fVxuMjA3ODpcdFx0XHR9XG4yMDc5Olx0XG4yMDgwOlx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuMjA4MTpcdFxuMjA4MjpcdFx0XHRpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHtcbjIwODM6XHRcdFx0XHQvKiBEbyBub3Qgb3ZlcnJpZGUgYW4gZXJyb3IgKi9cbjIwODQ6XHRcdFx0XHRpZiAoIWVyciB8fCBlcnIgPT0gLUVBR0FJTilcbjIwODU6XHRcdFx0XHRcdGVyciA9IC1FSU5UUjtcbjIwODY6XHRcdFx0XHRicmVhaztcbjIwODc6XHRcdFx0fVxuMjA4ODpcdFxuMjA4OTpcdFx0XHRpZiAoZXJyKSB7XG4yMDkwOlx0XHRcdFx0aWYgKGVyciA9PSAtRUFHQUlOKVxuMjA5MTpcdFx0XHRcdFx0Y29udGludWU7XG4yMDkyOlx0XHRcdFx0YnJlYWs7XG4yMDkzOlx0XHRcdH1cbjIwOTQ6XHRcbjIwOTU6XHRcdFx0LyogUHJvY2VlZCB0byB0aGUgbmV4dCBwYWdlICovXG4yMDk2Olx0XHRcdGRzdF9hZGRyICYjNDM7PSBzdGVwX3NpemU7XG4yMDk3Olx0XHRcdHNyY19hZGRyICYjNDM7PSBzdGVwX3NpemU7XG4yMDk4Olx0XHRcdG1vdmVkICYjNDM7PSBzdGVwX3NpemU7XG4yMDk5Olx0XHR9XG4yMTAwOlx0XG4yMTAxOlx0b3V0X3VubG9jazpcbjIxMDI6XHRcdHVwX3JlYWQoXHUwMDI2Y3R4LVx1MDAzZW1hcF9jaGFuZ2luZ19sb2NrKTtcbjIxMDM6XHRcdHVmZmRfbW92ZV91bmxvY2soZHN0X3ZtYSwgc3JjX3ZtYSk7XG4yMTA0Olx0b3V0OlxuMjEwNTpcdFx0Vk1fV0FSTl9PTl9PTkNFKG1vdmVkIFx1MDAzYyAwKTtcbjIxMDY6XHRcdFZNX1dBUk5fT05fT05DRShlcnIgXHUwMDNlIDApO1xuMjEwNzpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFtb3ZlZCBcdTAwMjZcdTAwMjYgIWVycik7XG4yMTA4Olx0XHRyZXR1cm4gbW92ZWQgPyBtb3ZlZCA6IGVycjtcbjIxMDk6XHR9XG4yMTEwOlx0XG4yMTExOlx0c3RhdGljIGJvb2wgdm1hX2Nhbl91c2VyZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXG4yMTEyOlx0XHRcdCAgICAgICBib29sIHdwX2FzeW5jKVxuMjExMzpcdHtcbjIxMTQ6XHRcdGNvbnN0IHN0cnVjdCB2bV91ZmZkX29wcyAqb3BzID0gdm1hX3VmZmRfb3BzKHZtYSk7XG4yMTE1Olx0XG4yMTE2Olx0XHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiAoVk1fRFJPUFBBQkxFIHwgVk1fU0hBRE9XX1NUQUNLKSlcbjIxMTc6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMjExODpcdFxuMjExOTpcdFx0aWYgKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSBcdTAwMjZcdTAwMjYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fU1BFQ0lBTCkpXG4yMTIwOlx0XHRcdHJldHVybiBmYWxzZTtcbjIxMjE6XHRcbjIxMjI6XHRcdHZtX2ZsYWdzIFx1MDAyNj0gX19WTV9VRkZEX0ZMQUdTO1xuMjEyMzpcdFxuMjEyNDpcdFx0LypcbjIxMjU6XHRcdCAqIElmIFdQIGlzIHRoZSBvbmx5IG1vZGUgZW5hYmxlZCBhbmQgY29udGV4dCBpcyB3cCBhc3luYywgYWxsb3cgYW55XG4yMTI2Olx0XHQgKiBtZW1vcnkgdHlwZS5cbjIxMjc6XHRcdCAqL1xuMjEyODpcdFx0aWYgKHdwX2FzeW5jIFx1MDAyNlx1MDAyNiAodm1fZmxhZ3MgPT0gVk1fVUZGRF9XUCkpXG4yMTI5Olx0XHRcdHJldHVybiB0cnVlO1xuMjEzMDpcdFxuMjEzMTpcdFx0LyogRm9yIGFueSBvdGhlciBtb2RlIHJlamVjdCBWTUFzIHRoYXQgZG9uJiMzOTt0IGltcGxlbWVudCB2bV91ZmZkX29wcyAqL1xuMjEzMjpcdFx0aWYgKCFvcHMpXG4yMTMzOlx0XHRcdHJldHVybiBmYWxzZTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjk0OQoJCQkJCQkJb3V0cHV0OiAyMTkKCQkJCQkJCXRob3VnaHRzOiAxODAzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBgbW92ZV9wYWdlc2AgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiB0cmFjaW5nIHRocm91Z2ggdGhpcyBwYXRjaCBhbmQgaXRzIGltcGxpY2F0aW9ucy4gVGhlIGNvcmUgaXNzdWUgaXMgdGhhdCBgZXJyYCBpc24mIzM5O3QgYmVpbmcgcmVzZXQgcHJvcGVybHkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBtb3ZlX3BhZ2VzX3B0ZXNgIGNhbGwuIFRoaXMgY3JlYXRlcyBhIGNvbnRyb2wgZmxvdyBwcm9ibGVtLCBhbmQgaXQmIzM5O3MgbWFraW5nIG1lIHdvbmRlciBpZiBLTVNBTiBpcyBuZWNlc3NhcnkgZm9yIGRldGVjdGluZyBpdC4KCkxldCYjMzk7cyBicmVhayBpdCBkb3duLiBCZWZvcmUgdGhlIGxvb3AsIGBlcnJgIGlzIGluaXRpYWxpemVkIHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYHZhbGlkYXRlX21vdmVfYXJlYXNgLiBJbnNpZGUgdGhlIGxvb3AsIGBlcnJgIGNhbiBiZSBzZXQgdG8gYC1FQUdBSU5gIGlmIGBtb3ZlX3BhZ2VzX2h1Z2VfcG1kYCBmYWlscy4gVGhlIHByb2JsZW1hdGljIHBhcnQgaXMgd2hhdCBoYXBwZW5zIG5leHQuIElmIGBlcnJgICppcyogYC1FQUdBSU5gLCB0aGUgY29kZSAqY29udGludWVzKiB0byB0aGUgbmV4dCBpdGVyYXRpb24uIE5vdywgaWYgdGhlIGNvZGUgc3VjY2Vzc2Z1bGx5IGNhbGxzIGBtb3ZlX3BhZ2VzX3B0ZXNgIGluIHRoYXQgbmV4dCBpdGVyYXRpb24gYW5kIGdldHMgYSBwb3NpdGl2ZSByZXR1cm4gdmFsdWUsIHRoZSBgZXJyYCB2YXJpYWJsZSBpcyAqc3RpbGwqIGAtRUFHQUlOYC4KClRoZSBwcm9ibGVtIGlzIHRoZSBgaWYgKGVycikgeyBpZiAoZXJyID09IC1FQUdBSU4pIGNvbnRpbnVlOyBicmVhazsgfWAgbGluZS4gU2luY2UgYGVycmAgc3RheXMgYC1FQUdBSU5gLCB0aGUgY29kZSBlbnRlcnMgYW4gaW5maW5pdGUgbG9vcC4gSXQgd2lsbCBjb250aW51ZSwgc2tpcCBhZHZhbmNpbmcgdGhlIGFkZHJlc3NlcywgYW5kIHJlLWF0dGVtcHQgdG8gbW92ZSB0aGUgc2FtZSBwYWdlLCB3aGljaCBjb3VsZCBsZWFkIHRvIGFuIGluY29ycmVjdCBlcnJvciBjb2RlIGJlaW5nIHJldHVybmVkIG9yIHRoZSBsb29wIGJlaW5nIHRlcm1pbmF0ZWQgYmVjYXVzZSBzdWJzZXF1ZW50IGF0dGVtcHRzIHRvIG1vdmUgdGhlIHNhbWUgcGFnZSB3aWxsIG1vc3QgbGlrZWx5IGZhaWwuIFRoaXMgbG9vcCB3aWxsIG5vdCB0ZXJtaW5hdGUuCgpUaGUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiBpcyB0aGlzIGEgS01TQU4gaXNzdWU/IExldCYjMzk7cyBjaGVjayBhZ2FpbnN0IHRoZSBLTVNBTiBydWxlcy4gTm8sIHRoaXMgaXNuJiMzOTt0IGFib3V0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGV4cG9zZWQgdG8gdXNlcnNwYWNlLCBvciBjb25kaXRpb25hbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoaXMgaXMgYSBsb2dpYyBidWc6IGEgY29udHJvbCBmbG93IGVycm9yLiBgcmV0YCBhbmQgYGVycmAgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyBpbnZvbHZlZC4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIEtBU0FOLCBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0aW9uIHdpbGwgZmxhZyB0aGUgaW5maW5pdGUgbG9vcC4gVGhpcyBpc24mIzM5O3QgYSBjYXNlIHdoZXJlIEtNU0FOIG9mZmVycyBhbnkgdW5pcXVlIGFkdmFudGFnZS4gVGhlIHBhdGNoIG1vZGlmaWVzIGNvbmRpdGlvbmFsIGxvZ2ljLCBidXQgbm90IGluIGEgd2F5IHRoYXQgY3JlYXRlcyB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZS4gSSYjMzk7bSBjb25maWRlbnQgaW4gc2F5aW5nIHRoYXQgS01TQU4gaXMgbm90IG5lY2Vzc2FyeSBoZXJlLiBUaGlzIGlzIGEgcHVyZSBsb2dpYyBlcnJvciwgYW5kIEtBU0FOIHdpbGwgY2F0Y2ggdGhlIGluZmluaXRlIGxvb3Agb3Igb3RoZXIgbG9naWMgZXJyb3JzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiBgbW92ZV9wYWdlcygpYCB3aGVyZSB0aGUgYGVycmAgdmFyaWFibGUgd2FzIG5vdCByZXNldCB0byAwIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGBtb3ZlX3BhZ2VzX3B0ZXMoKWAuIElmIGBlcnJgIHdhcyBwcmV2aW91c2x5IHNldCB0byBgLUVBR0FJTmAgKGUuZy4sIGZyb20gYSBwcmlvciBmYWlsZWQgYG1vdmVfcGFnZXNfaHVnZV9wbWQoKWAgYXR0ZW1wdCB0aGF0IHRyaWdnZXJlZCBhIGBjb250aW51ZWApLCBpdCB3b3VsZCByZW1haW4gYC1FQUdBSU5gLiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBsb29wIHRvIGluY29ycmVjdGx5IHNraXAgYWR2YW5jaW5nIHRoZSBgc3JjX2FkZHJgIGFuZCBgZHN0X2FkZHJgIHBvaW50ZXJzIGFuZCBgY29udGludWVgIGFnYWluLCBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJldHVybnMuXG5cblRoaXMgaXMgYSBjb250cm9sIGZsb3cgYW5kIGVycm9yIGhhbmRsaW5nIGJ1Zy4gSXQgZG9lcyBub3QgaW52b2x2ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRpbmcgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgaW5jbHVkaW5nIEtBU0FOIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3RvcnMsIGlzIHN1ZmZpY2llbnQgdG8gY2F0Y2ggc3VjaCBoYW5ncyBvciBsb2dpYyBlcnJvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiBgbW92ZV9wYWdlcygpYCB3aGVyZSB0aGUgYGVycmAgdmFyaWFibGUgd2FzIG5vdCByZXNldCB0byAwIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGBtb3ZlX3BhZ2VzX3B0ZXMoKWAuIElmIGBlcnJgIHdhcyBwcmV2aW91c2x5IHNldCB0byBgLUVBR0FJTmAgKGUuZy4sIGZyb20gYSBwcmlvciBmYWlsZWQgYG1vdmVfcGFnZXNfaHVnZV9wbWQoKWAgYXR0ZW1wdCB0aGF0IHRyaWdnZXJlZCBhIGBjb250aW51ZWApLCBpdCB3b3VsZCByZW1haW4gYC1FQUdBSU5gLiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBsb29wIHRvIGluY29ycmVjdGx5IHNraXAgYWR2YW5jaW5nIHRoZSBgc3JjX2FkZHJgIGFuZCBgZHN0X2FkZHJgIHBvaW50ZXJzIGFuZCBgY29udGludWVgIGFnYWluLCBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJldHVybnMuXG5cblRoaXMgaXMgYSBjb250cm9sIGZsb3cgYW5kIGVycm9yIGhhbmRsaW5nIGJ1Zy4gSXQgZG9lcyBub3QgaW52b2x2ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRpbmcgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgaW5jbHVkaW5nIEtBU0FOIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3RvcnMsIGlzIHN1ZmZpY2llbnQgdG8gY2F0Y2ggc3VjaCBoYW5ncyBvciBsb2dpYyBlcnJvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjM3LjMyNjIwMTE2NFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcwNzY1MzkzMDc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidXNlcmZhdWx0ZmRfaW9jdGxcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIGBtb3ZlX3BhZ2VzKClgIHdoZXJlIHRoZSBgZXJyYCB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVfcGFnZXNfcHRlcygpYC4gSWYgYGVycmAgd2FzIHByZXZpb3VzbHkgc2V0IHRvIGAtRUFHQUlOYCAoZS5nLiwgZnJvbSBhIHByaW9yIGZhaWxlZCBgbW92ZV9wYWdlc19odWdlX3BtZCgpYCBhdHRlbXB0IHRoYXQgdHJpZ2dlcmVkIGEgYGNvbnRpbnVlYCksIGl0IHdvdWxkIHJlbWFpbiBgLUVBR0FJTmAuIFRoaXMgd291bGQgY2F1c2UgdGhlIGxvb3AgdG8gaW5jb3JyZWN0bHkgc2tpcCBhZHZhbmNpbmcgdGhlIGBzcmNfYWRkcmAgYW5kIGBkc3RfYWRkcmAgcG9pbnRlcnMgYW5kIGBjb250aW51ZWAgYWdhaW4sIGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmV0dXJucy5cXG5cXG5UaGlzIGlzIGEgY29udHJvbCBmbG93IGFuZCBlcnJvciBoYW5kbGluZyBidWcuIEl0IGRvZXMgbm90IGludm9sdmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkaW5nIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTiBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0b3JzLCBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIHN1Y2ggaGFuZ3Mgb3IgbG9naWMgZXJyb3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgYnVnIGluIHRoZSBVRkZESU9fTU9WRSBpb2N0bCBoYW5kbGVyIHdoZXJlIGEgcHJldmlvdXNseSBzZXQgZXJyb3IgY29kZSAobGlrZSAtRUFHQUlOKSB3YXMgbm90IGNsZWFyZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhZ2UgbW92ZSwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBhbiBpbmZpbml0ZSBsb29wIG9yIGluY29ycmVjdCBlcnJvciByZXBvcnRpbmcuIFRoaXMgaXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTozNy4zMjYyMDY5ODRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyODY0NTg1MzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3ZmE0ZWY1YWIyMWMxNmZhODliYjU2MGZlODEyNWI4MGMxNDFhNTliXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgQXVnIDE1IDEwOjUxOjM1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jXFxuaW5kZXggYzNhZGVkYWFmN2Q1NC4uNTk1ZTdlMjMyZjkwMSAxMDA2NDRcXG4tLS0gYS9tbS91c2VyZmF1bHRmZC5jXFxuKysrIGIvbW0vdXNlcmZhdWx0ZmQuY1xcbkBAIC0yMDY5LDEwICsyMDY5LDEyIEBAIHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG4gXFx0XFx0XFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkcixcXG4gXFx0XFx0XFx0XFx0XFx0ICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7XFxuLVxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMCkge1xcbiBcXHRcXHRcXHRcXHRlcnIgPSByZXQ7XFxuLVxcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0XFx0ZXJyID0gMDtcXG4gXFx0XFx0XFx0XFx0c3RlcF9zaXplID0gcmV0O1xcbitcXHRcXHRcXHR9XFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTozOC42MTMzNDY3MVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjQxMzQ4NDMzNTY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidXNlcmZhdWx0ZmRfaW9jdGxcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgN2ZhNGVmNWFiMjFjMTZmYTg5YmI1NjBmZTgxMjViODBjMTQxYTU5YlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDE1IDEwOjUxOjM1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vdXNlcmZhdWx0ZmQuYyBiL21tL3VzZXJmYXVsdGZkLmNcbmluZGV4IGMzYWRlZGFhZjdkNTQuLjU5NWU3ZTIzMmY5MDEgMTAwNjQ0XG4tLS0gYS9tbS91c2VyZmF1bHRmZC5jXG4rKysgYi9tbS91c2VyZmF1bHRmZC5jXG5AQCAtMjA2OSwxMCArMjA2OSwxMiBAQCBzdGF0aWMgc3NpemVfdCBtb3ZlX3BhZ2VzKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBkc3Rfc3RhcnQsXG4gXHRcdFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxuIFx0XHRcdFx0XHQgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkcixcbiBcdFx0XHRcdFx0ICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7XG4tXHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4gXHRcdFx0XHRlcnIgPSByZXQ7XG4tXHRcdFx0ZWxzZVxuK1x0XHRcdH0gZWxzZSB7XG4rXHRcdFx0XHRlcnIgPSAwO1xuIFx0XHRcdFx0c3RlcF9zaXplID0gcmV0O1xuK1x0XHRcdH1cbiBcdFx0fVxuIFxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjM4LjYxMzM0ODI1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM2MzM5ODM0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBVc2VyZmF1bHRmZCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBtbS91c2VyZmF1bHRmZC5jYC4gSW1tZWRpYXRlbHksIEkgc2VlIGEgc2ltcGxlLCBhbG1vc3QgdHJpdmlhbCwgY29kZSBjaGFuZ2UuIFRoZXkndmUgd3JhcHBlZCB0aGUgYGlmIChyZXQgXHUwMDNjIDApYCBibG9jayB3aXRoIGN1cmx5IGJyYWNlcyBhbmQsIGltcG9ydGFudGx5LCBhZGRlZCBgZXJyID0gMDtgIHdpdGhpbiB0aGUgYGVsc2VgIGJsb2NrLiBNeSBpbml0aWFsIHJlYWN0aW9uIGlzLCBcIldoeT9cIiBJdCBsb29rcyBsaWtlIHRoZXkncmUgZXhwbGljaXRseSBzZXR0aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB0byB6ZXJvIGlmIHRoZSBgcmV0YCBmcm9tIHNvbWUgZnVuY3Rpb24gY2FsbCBpc24ndCBhbiBlcnJvci4gVGhpcyBkZWZpbml0ZWx5IHJlcXVpcmVzIGEgY2xvc2VyIGxvb2suIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYHJldGAgcmVwcmVzZW50cyBhbmQgd2hhdCBgbW92ZV9wYWdlc2AgaXMgZG9pbmcgaW4gdGhpcyBjb250ZXh0IHRvIGZpZ3VyZSBvdXQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZS4gTGV0J3MgZGlnIGludG8gdGhlIGBtb3ZlX3BhZ2VzYCBmdW5jdGlvbiBpbiBgbW0vdXNlcmZhdWx0ZmQuY2AgYW5kIHNlZSBpZiB0aGUgY29udGV4dCBjbGFyaWZpZXMgdGhlIHJlYXNvbmluZyBiZWhpbmQgemVyb2luZyBvdXQgdGhlIGBlcnJgIHZhbHVlLiBJdCBzZWVtcyBvZGQgdGhhdCB0aGUgZXJyb3IgdmFyaWFibGUgaXMgYmVpbmcgYXNzaWduZWQgMCBpbiBhIG5vbi1lcnJvciBjb25kaXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMjksIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTo0MS45NzY3NDg0OTRaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUyNjgwNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibW92ZV9wYWdlc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS91c2VyZmF1bHRmZC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL3VzZXJmYXVsdGZkLmM9MTM4Mj1zdGF0aWMgaW50IG1vdmVfemVyb3BhZ2VfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xNDE0LSAqL1xcbm1tL3VzZXJmYXVsdGZkLmM6MTQxNTpzdGF0aWMgbG9uZyBtb3ZlX3BhZ2VzX3B0ZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpkc3RfcG1kLCBwbWRfdCAqc3JjX3BtZCxcXG5tbS91c2VyZmF1bHRmZC5jLTE0MTYtXFx0XFx0XFx0ICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0X3ZtYSxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmM9MTg1OT1zdGF0aWMgdm9pZCB1ZmZkX21vdmVfdW5sb2NrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0X3ZtYSxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMTg2Ny0vKipcXG5tbS91c2VyZmF1bHRmZC5jOjE4Njg6ICogbW92ZV9wYWdlcyAtIG1vdmUgYXJiaXRyYXJ5IGFub255bW91cyBwYWdlcyBvZiBhbiBleGlzdGluZyB2bWFcXG5tbS91c2VyZmF1bHRmZC5jLTE4NjktICogQGN0eDogcG9pbnRlciB0byB0aGUgdXNlcmZhdWx0ZmQgY29udGV4dFxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xODc2LSAqXFxubW0vdXNlcmZhdWx0ZmQuYzoxODc3OiAqIG1vdmVfcGFnZXMoKSByZW1hcHMgYXJiaXRyYXJ5IGFub255bW91cyBwYWdlcyBhdG9taWNhbGx5IGluIHplcm9cXG5tbS91c2VyZmF1bHRmZC5jLTE4NzgtICogY29weS4gSXQgb25seSB3b3JrcyBvbiBub24gc2hhcmVkIGFub255bW91cyBwYWdlcyBiZWNhdXNlIHRob3NlIGNhblxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xODg4LSAqIHN0b3JhZ2Ugb3IgYW55IG90aGVyIEkvTyBkZXZpY2UgKE1BRFZfRE9OVEZPUksgaW4gdGhlIHNvdXJjZSB2bWFcXG5tbS91c2VyZmF1bHRmZC5jOjE4ODk6ICogYXZvaWRzIG1vdmVfcGFnZXMoKSB0byBmYWlsIHdpdGggLUVCVVNZIGlmIHRoZSBwcm9jZXNzIGZvcmtzIGJlZm9yZVxcbm1tL3VzZXJmYXVsdGZkLmM6MTg5MDogKiBtb3ZlX3BhZ2VzKCkgaXMgY2FsbGVkKSwgdGhlbiBpdCB3aWxsIGNhbGwgbW92ZV9wYWdlcygpIHRvIG1hcCB0aGVcXG5tbS91c2VyZmF1bHRmZC5jLTE4OTEtICogcGFnZSBpbiB0aGUgZmF1bHRpbmcgYWRkcmVzcyBpbiB0aGUgZGVzdGluYXRpb24gdm1hLlxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTA1LSAqIHRoZSBkZXN0aW5hdGlvbiB2aXJ0dWFsIG1lbW9yeSByYW5nZSBpcyBub3QgYSB3aG9sZSB1bm1hcHBlZCBob2xlLFxcbm1tL3VzZXJmYXVsdGZkLmM6MTkwNjogKiBtb3ZlX3BhZ2VzKCkgd2lsbCBmYWlsIHJlc3BlY3RpdmVseSB3aXRoIC1FTk9FTlQgb3IgLUVFWElTVC4gVGhpc1xcbm1tL3VzZXJmYXVsdGZkLmMtMTkwNy0gKiBwcm92aWRlcyBhIHZlcnkgc3RyaWN0IGJlaGF2aW9yIHRvIGF2b2lkIGFueSBjaGFuY2Ugb2YgbWVtb3J5XFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE5MTAtICogdGltZSBmb3IgYW55IGdpdmVuIGZhdWx0aW5nIGFkZHJlc3MuIFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gdGhyZWFkc1xcbm1tL3VzZXJmYXVsdGZkLmM6MTkxMTogKiB0cnkgdG8gYm90aCBjYWxsIG1vdmVfcGFnZXMoKSBvbiB0aGUgc2FtZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGF0IHRoZVxcbm1tL3VzZXJmYXVsdGZkLmMtMTkxMi0gKiBzYW1lIHRpbWUsIHRoZSBzZWNvbmQgdGhyZWFkIHdpbGwgZ2V0IGFuIGV4cGxpY2l0IGVycm9yIGZyb20gdGhpc1xcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTIwLSAqIGFuIGFtb3VudCBvZiBieXRlcyBzdWNjZXNzZnVsbHkgbW92ZWQuIElmIHRoZSByZXR2YWwgcmVwb3J0cyBhXFxubW0vdXNlcmZhdWx0ZmQuYzoxOTIxOiAqIFxcXCJzaG9ydFxcXCIgcmVtYXAsIHRoZSBtb3ZlX3BhZ2VzKCkgY29tbWFuZCBzaG91bGQgYmUgcmVwZWF0ZWQgYnlcXG5tbS91c2VyZmF1bHRmZC5jLTE5MjItICogdXNlcmxhbmQgd2l0aCBzcmMrcmV0dmFsLCBkc3QrcmV2YWwsIGxlbi1yZXR2YWwgaWYgaXQgd2FudHMgdG8ga25vd1xcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTMzLSAqL1xcbm1tL3VzZXJmYXVsdGZkLmM6MTkzNDpzdGF0aWMgc3NpemVfdCBtb3ZlX3BhZ2VzKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBkc3Rfc3RhcnQsXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTM1LVxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JjX3N0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgX191NjQgbW9kZSlcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMjAxNC1cXHRcXHQgKiBiZSBzdHJpY3QuIElmIGRzdF9wbWQgY2hhbmdlcyBpbnRvIFRQSCBhZnRlciB0aGlzIGNoZWNrLCB0aGVcXG5tbS91c2VyZmF1bHRmZC5jOjIwMTU6XFx0XFx0ICogbW92ZV9wYWdlc19odWdlX3BtZCgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIHJldHJ5XFxubW0vdXNlcmZhdWx0ZmQuYzoyMDE2OlxcdFxcdCAqIHdoaWxlIG1vdmVfcGFnZXNfcHRlKCkgd2lsbCBkZXRlY3QgdGhlIGNoYW5nZSBhbmQgZmFpbC5cXG5tbS91c2VyZmF1bHRmZC5jLTIwMTctXFx0XFx0ICovXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTIwNDEtXFx0XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWQoc3JjX3ZtYSwgc3JjX3BtZCwgc3JjX2FkZHIpO1xcbm1tL3VzZXJmYXVsdGZkLmM6MjA0MjpcXHRcXHRcXHRcXHQvKiBUaGUgZm9saW8gd2lsbCBiZSBzcGxpdCBieSBtb3ZlX3BhZ2VzX3B0ZSgpICovXFxubW0vdXNlcmZhdWx0ZmQuYy0yMDQzLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0yMDQ1LVxcbm1tL3VzZXJmYXVsdGZkLmM6MjA0NjpcXHRcXHRcXHRlcnIgPSBtb3ZlX3BhZ2VzX2h1Z2VfcG1kKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxcbm1tL3VzZXJmYXVsdGZkLmMtMjA0Ny1cXHRcXHRcXHRcXHRcXHRcXHQgIGRzdF9wbWR2YWwsIGRzdF92bWEsIHNyY192bWEsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTIwNjgtXFxubW0vdXNlcmZhdWx0ZmQuYzoyMDY5OlxcdFxcdFxcdHJldCA9IG1vdmVfcGFnZXNfcHRlcyhtbSwgZHN0X3BtZCwgc3JjX3BtZCxcXG5tbS91c2VyZmF1bHRmZC5jLTIwNzAtXFx0XFx0XFx0XFx0XFx0ICAgICAgZHN0X3ZtYSwgc3JjX3ZtYSwgZHN0X2FkZHIsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jPTQyMTY9c3RhdGljIGludCB1c2VyZmF1bHRmZF9tb3ZlKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtNDI1NS1cXHRpZiAobW1nZXRfbm90X3plcm8obW0pKSB7XFxubW0vdXNlcmZhdWx0ZmQuYzo0MjU2OlxcdFxcdHJldCA9IG1vdmVfcGFnZXMoY3R4LCB1ZmZkaW9fbW92ZS5kc3QsIHVmZmRpb19tb3ZlLnNyYyxcXG5tbS91c2VyZmF1bHRmZC5jLTQyNTctXFx0XFx0XFx0XFx0IHVmZmRpb19tb3ZlLmxlbiwgdWZmZGlvX21vdmUubW9kZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjQyLjAyMjAyMTU5M1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0MzIyMDMyNzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGBtb3ZlX3BhZ2VzYCBpbiBgbW0vdXNlcmZhdWx0ZmQuY2AqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG1vdmVfcGFnZXNgIGlzIGhhbmRsaW5nIHRoaW5ncyBpbiB0aGUgY29udGV4dCBvZiB1c2VyZmF1bHRmZC4gVGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbCBmb3IgaG93IHdlIG1hbmFnZSBwYWdlIG1pZ3JhdGlvbiBhbmQgdHJhbnNmZXIsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdXNlci1zcGFjZSBtZW1vcnkgYWNjZXNzIGZhdWx0cy4gSSB3YW50IHRvIHNlZSBob3cgdGhlIGtlcm5lbCBvcmNoZXN0cmF0ZXMgdGhpcyB3aG9sZSBkYW5jZSBiZXR3ZWVuIHVzZXIgc3BhY2UgYW5kIGtlcm5lbCBzcGFjZS4gU3BlY2lmaWNhbGx5LCBJJ20gaW50ZXJlc3RlZCBpbiB0aGUgaW50ZXJwbGF5IGJldHdlZW4gYHVzZXJmYXVsdGZkYCBhbmQgdGhlIHBhZ2UgbWlncmF0aW9uIG1hY2hpbmVyeS4gSG93IGRvZXMgaXQga25vdyB3aGVyZSBwYWdlcyBhcmUsIGFuZCBob3cgZG9lcyBpdCBkaXJlY3QgdGhlbSB3aGVyZSB0aGV5IG5lZWQgdG8gZ28/IEknbSBleHBlY3RpbmcgdG8gZmluZCBhIGRlbGljYXRlIGJhbGFuY2luZyBhY3QgaGVyZSwgZW5zdXJpbmcgZGF0YSBpbnRlZ3JpdHkgd2hpbGUgbWluaW1pemluZyB0aGUgcGVyZm9ybWFuY2UgaGl0IG9mIHBhZ2UgZmF1bHRzLiBMZXQncyBzZWUgaG93IHRoZXkgZG8gaXQuIEknbSBsb29raW5nIGZvciB0aGUga2V5IGxvY2tpbmcgcHJpbWl0aXZlcywgZXJyb3IgaGFuZGxpbmcgcGF0aHMsIGFuZCB0aGUgb3ZlcmFsbCBsb2dpYyBmbG93LiBUaGlzIGNvdWxkIGdpdmUgbWUgc29tZSBncmVhdCBpbnNpZ2h0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzY4OCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjQ1LjQ1NDIyNzU3NloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMDMwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS91c2VyZmF1bHRmZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MzQsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTM0OlxcdHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG4xOTM1OlxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JjX3N0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgX191NjQgbW9kZSlcXG4xOTM2OlxcdHtcXG4xOTM3OlxcdFxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3R4LVxcdTAwM2VtbTtcXG4xOTM4OlxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSwgKmRzdF92bWE7XFxuMTkzOTpcXHRcXHR1bnNpZ25lZCBsb25nIHNyY19hZGRyLCBkc3RfYWRkciwgc3JjX2VuZDtcXG4xOTQwOlxcdFxcdHBtZF90ICpzcmNfcG1kLCAqZHN0X3BtZDtcXG4xOTQxOlxcdFxcdGxvbmcgZXJyID0gLUVJTlZBTDtcXG4xOTQyOlxcdFxcdHNzaXplX3QgbW92ZWQgPSAwO1xcbjE5NDM6XFx0XFxuMTk0NDpcXHRcXHQvKiBTYW5pdGl6ZSB0aGUgY29tbWFuZCBwYXJhbWV0ZXJzLiAqL1xcbjE5NDU6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDY6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGRzdF9zdGFydCBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDc6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDg6XFx0XFxuMTk0OTpcXHRcXHQvKiBEb2VzIHRoZSBhZGRyZXNzIHJhbmdlIHdyYXAsIG9yIGlzIHRoZSBzcGFuIHplcm8tc2l6ZWQ/ICovXFxuMTk1MDpcXHRcXHRWTV9XQVJOX09OX09OQ0Uoc3JjX3N0YXJ0ICsgbGVuIFxcdTAwM2Mgc3JjX3N0YXJ0KTtcXG4xOTUxOlxcdFxcdFZNX1dBUk5fT05fT05DRShkc3Rfc3RhcnQgKyBsZW4gXFx1MDAzYyBkc3Rfc3RhcnQpO1xcbjE5NTI6XFx0XFxuMTk1MzpcXHRcXHRlcnIgPSB1ZmZkX21vdmVfbG9jayhtbSwgZHN0X3N0YXJ0LCBzcmNfc3RhcnQsIFxcdTAwMjZkc3Rfdm1hLCBcXHUwMDI2c3JjX3ZtYSk7XFxuMTk1NDpcXHRcXHRpZiAoZXJyKVxcbjE5NTU6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk1NjpcXHRcXG4xOTU3OlxcdFxcdC8qIFJlLWNoZWNrIGFmdGVyIHRha2luZyBtYXBfY2hhbmdpbmdfbG9jayAqL1xcbjE5NTg6XFx0XFx0ZXJyID0gLUVBR0FJTjtcXG4xOTU5OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2Y3R4LVxcdTAwM2VtYXBfY2hhbmdpbmdfbG9jayk7XFxuMTk2MDpcXHRcXHRpZiAobGlrZWx5KGF0b21pY19yZWFkKFxcdTAwMjZjdHgtXFx1MDAzZW1tYXBfY2hhbmdpbmcpKSlcXG4xOTYxOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTYyOlxcdFxcdC8qXFxuMTk2MzpcXHRcXHQgKiBNYWtlIHN1cmUgdGhlIHZtYSBpcyBub3Qgc2hhcmVkLCB0aGF0IHRoZSBzcmMgYW5kIGRzdCByZW1hcFxcbjE5NjQ6XFx0XFx0ICogcmFuZ2VzIGFyZSBib3RoIHZhbGlkIGFuZCBmdWxseSB3aXRoaW4gYSBzaW5nbGUgZXhpc3RpbmdcXG4xOTY1OlxcdFxcdCAqIHZtYS5cXG4xOTY2OlxcdFxcdCAqL1xcbjE5Njc6XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4xOTY4OlxcdFxcdGlmIChzcmNfdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NIQVJFRClcXG4xOTY5OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTcwOlxcdFxcdGlmIChzcmNfc3RhcnQgKyBsZW4gXFx1MDAzZSBzcmNfdm1hLVxcdTAwM2V2bV9lbmQpXFxuMTk3MTpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk3MjpcXHRcXG4xOTczOlxcdFxcdGlmIChkc3Rfdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NIQVJFRClcXG4xOTc0OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTc1OlxcdFxcdGlmIChkc3Rfc3RhcnQgKyBsZW4gXFx1MDAzZSBkc3Rfdm1hLVxcdTAwM2V2bV9lbmQpXFxuMTk3NjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdFxcdGVyciA9IHZhbGlkYXRlX21vdmVfYXJlYXMoY3R4LCBzcmNfdm1hLCBkc3Rfdm1hKTtcXG4xOTc5OlxcdFxcdGlmIChlcnIpXFxuMTk4MDpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk4MTpcXHRcXG4xOTgyOlxcdFxcdGZvciAoc3JjX2FkZHIgPSBzcmNfc3RhcnQsIGRzdF9hZGRyID0gZHN0X3N0YXJ0LCBzcmNfZW5kID0gc3JjX3N0YXJ0ICsgbGVuO1xcbjE5ODM6XFx0XFx0ICAgICBzcmNfYWRkciBcXHUwMDNjIHNyY19lbmQ7KSB7XFxuMTk4NDpcXHRcXHRcXHRzcGlubG9ja190ICpwdGw7XFxuMTk4NTpcXHRcXHRcXHRwbWRfdCBkc3RfcG1kdmFsO1xcbjE5ODY6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzdGVwX3NpemU7XFxuMTk4NzpcXHRcXG4xOTg4OlxcdFxcdFxcdC8qXFxuMTk4OTpcXHRcXHRcXHQgKiBCZWxvdyB3b3JrcyBiZWNhdXNlIGFub255bW91cyBhcmVhIHdvdWxkIG5vdCBoYXZlIGFcXG4xOTkwOlxcdFxcdFxcdCAqIHRyYW5zcGFyZW50IGh1Z2UgUFVELiBJZiBmaWxlLWJhY2tlZCBzdXBwb3J0IGlzIGFkZGVkLFxcbjE5OTE6XFx0XFx0XFx0ICogdGhhdCBjYXNlIHdvdWxkIG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlLlxcbjE5OTI6XFx0XFx0XFx0ICovXFxuMTk5MzpcXHRcXHRcXHRzcmNfcG1kID0gbW1fZmluZF9wbWQobW0sIHNyY19hZGRyKTtcXG4xOTk0OlxcdFxcdFxcdGlmICh1bmxpa2VseSghc3JjX3BtZCkpIHtcXG4xOTk1OlxcdFxcdFxcdFxcdGlmICghKG1vZGUgXFx1MDAyNiBVRkZESU9fTU9WRV9NT0RFX0FMTE9XX1NSQ19IT0xFUykpIHtcXG4xOTk2OlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9FTlQ7XFxuMTk5NzpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4xOTk4OlxcdFxcdFxcdFxcdH1cXG4xOTk5OlxcdFxcdFxcdFxcdHNyY19wbWQgPSBtbV9hbGxvY19wbWQobW0sIHNyY19hZGRyKTtcXG4yMDAwOlxcdFxcdFxcdFxcdGlmICh1bmxpa2VseSghc3JjX3BtZCkpIHtcXG4yMDAxOlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjAwMjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4yMDAzOlxcdFxcdFxcdFxcdH1cXG4yMDA0OlxcdFxcdFxcdH1cXG4yMDA1OlxcdFxcdFxcdGRzdF9wbWQgPSBtbV9hbGxvY19wbWQobW0sIGRzdF9hZGRyKTtcXG4yMDA2OlxcdFxcdFxcdGlmICh1bmxpa2VseSghZHN0X3BtZCkpIHtcXG4yMDA3OlxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjAwODpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDA5OlxcdFxcdFxcdH1cXG4yMDEwOlxcdFxcbjIwMTE6XFx0XFx0XFx0ZHN0X3BtZHZhbCA9IHBtZHBfZ2V0X2xvY2tsZXNzKGRzdF9wbWQpO1xcbjIwMTI6XFx0XFx0XFx0LypcXG4yMDEzOlxcdFxcdFxcdCAqIElmIHRoZSBkc3RfcG1kIGlzIG1hcHBlZCBhcyBUSFAgZG9uJ3Qgb3ZlcnJpZGUgaXQgYW5kIGp1c3RcXG4yMDE0OlxcdFxcdFxcdCAqIGJlIHN0cmljdC4gSWYgZHN0X3BtZCBjaGFuZ2VzIGludG8gVFBIIGFmdGVyIHRoaXMgY2hlY2ssIHRoZVxcbjIwMTU6XFx0XFx0XFx0ICogbW92ZV9wYWdlc19odWdlX3BtZCgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIHJldHJ5XFxuMjAxNjpcXHRcXHRcXHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXFxuMjAxNzpcXHRcXHRcXHQgKi9cXG4yMDE4OlxcdFxcdFxcdGlmICh1bmxpa2VseShwbWRfdHJhbnNfaHVnZShkc3RfcG1kdmFsKSkpIHtcXG4yMDE5OlxcdFxcdFxcdFxcdGVyciA9IC1FRVhJU1Q7XFxuMjAyMDpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDIxOlxcdFxcdFxcdH1cXG4yMDIyOlxcdFxcbjIwMjM6XFx0XFx0XFx0cHRsID0gcG1kX3RyYW5zX2h1Z2VfbG9jayhzcmNfcG1kLCBzcmNfdm1hKTtcXG4yMDI0OlxcdFxcdFxcdGlmIChwdGwpIHtcXG4yMDI1OlxcdFxcdFxcdFxcdC8qIENoZWNrIGlmIHdlIGNhbiBtb3ZlIHRoZSBwbWQgd2l0aG91dCBzcGxpdHRpbmcgaXQuICovXFxuMjAyNjpcXHRcXHRcXHRcXHRpZiAobW92ZV9zcGxpdHNfaHVnZV9wbWQoZHN0X2FkZHIsIHNyY19hZGRyLCBzcmNfc3RhcnQgKyBsZW4pIHx8XFxuMjAyNzpcXHRcXHRcXHRcXHQgICAgIXBtZF9ub25lKGRzdF9wbWR2YWwpKSB7XFxuMjAyODpcXHRcXHRcXHRcXHRcXHQvKiBDYW4gYmUgYSBtaWdyYXRpb24gZW50cnkgKi9cXG4yMDI5OlxcdFxcdFxcdFxcdFxcdGlmIChwbWRfcHJlc2VudCgqc3JjX3BtZCkpIHtcXG4yMDMwOlxcdFxcdFxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwbWRfZm9saW8oKnNyY19wbWQpO1xcbjIwMzE6XFx0XFxuMjAzMjpcXHRcXHRcXHRcXHRcXHRcXHRpZiAoIWlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykgXFx1MDAyNlxcdTAwMjZcXG4yMDMzOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAhUGFnZUFub25FeGNsdXNpdmUoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTo0NS40NTQ0NjAxOTZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTUwMDUyNjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byBgbW92ZV9wYWdlc2AqKlxuXG5BbHJpZ2h0LCBJJ3ZlIGdvdCB0aGUgaW5pdGlhbCBvdmVydmlldyBvZiBgbW92ZV9wYWdlc2AgaW4gbXkgaGVhZC4gTm93LCB0aGUgcmVhbCB3b3JrIGJlZ2lucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIG51YW5jZXMsIHRoZSBlZGdlIGNhc2VzLCB0aGUgcG90ZW50aWFsIGJvdHRsZW5lY2tzLiBMZXQncyBkaWcgaW50byB0aGUgbWVhdCBvZiB0aGUgY29kZS4gTXkgcHJpbWFyeSBmb2N1cyBpcyBsaWtlbHkgb24gaG93IGl0IGhhbmRsZXMgbWVtb3J5IG1hbmFnZW1lbnQsIGVzcGVjaWFsbHkgaWYgdGhpcyBpcyByZWxhdGVkIHRvIGEgcGFnaW5nIHN5c3RlbSwgb3Igc29tZSBmb3JtIG9mIHZpcnR1YWwgbWVtb3J5LiBJJ20gbG9va2luZyBmb3Igd2hlcmUgcGFnZSB0YWJsZXMgYXJlIHVwZGF0ZWQsIHdoZXJlIHBoeXNpY2FsIGZyYW1lcyBtaWdodCBiZSBhbGxvY2F0ZWQgb3IgZGVhbGxvY2F0ZWQsIGFuZCBob3cgY29oZXJlbmN5IGlzIG1haW50YWluZWQsIGlmIHRoaXMgb3BlcmF0aW9uIGlzIGhhcHBlbmluZyBjb25jdXJyZW50bHkuIElzIGl0IHRocmVhZC1zYWZlPyBEb2VzIGl0IGVtcGxveSBsb2NrcywgYW5kIGlmIHNvLCBob3cgZ3JhbnVsYXIgYXJlIHRoZXk/IEFueSBkZWFkbG9ja3M/IEFsc28sIHdoYXQgaGFwcGVucyBpbiBhIHNpdHVhdGlvbiBvZiBhbiBvdXQtb2YtbWVtb3J5IGVycm9yLlxuXG5JIHdhbnQgdG8gc2VlIHRoZSBkZXRhaWxzIG9uIHRoZSBkYXRhIHN0cnVjdHVyZXMgaXQgbWFuaXB1bGF0ZXMuIEhvdyBhcmUgdGhlIHBhZ2VzIG9yZ2FuaXplZCBiZWZvcmUgdGhlIG1vdmU/IElzIGl0IGEgbGlua2VkIGxpc3QsIGEgaGFzaCB0YWJsZSwgYSB0cmVlIHN0cnVjdHVyZSwgb3Igc29tZXRoaW5nIGVsc2U/IFVuZGVyc3RhbmRpbmcgdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmVzIGlzIGtleSB0byBvcHRpbWl6aW5nIHRoZSBhbGdvcml0aG0uIEknbGwgYmUgd2F0Y2hpbmcgaG93IGl0IGhhbmRsZXMgZXhjZXB0aW9ucywgZXJyb3IgcmVjb3ZlcnksIGFuZCB0aGUgb3ZlcmFsbCByZWxpYWJpbGl0eSBvZiB0aGUgZnVuY3Rpb24uIElzIGl0IGF0b21pYz8gSSdtIGFudGljaXBhdGluZyB0aGF0IEknbGwgYmUgbWVudGFsbHkgbWFwcGluZyB0aGUgZnVuY3Rpb24ncyBsb2dpYyB0byB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBjYXBhYmlsaXRpZXMsIHBlcmhhcHMgaW5jbHVkaW5nIHRoZSBDUFUncyBtZW1vcnkgbWFuYWdlbWVudCB1bml0IGFuZCBhbnkgcmVsZXZhbnQgY2FjaGUgY29uZmlndXJhdGlvbnMuIFVuZGVyc3RhbmRpbmcgdGhlc2UgaW50ZXJhY3Rpb25zIGlzIGNyaXRpY2FsLCBhcyBpdCBoYXMgYSBtYXNzaXZlIHBlcmZvcm1hbmNlIGltcGFjdC4gRmluYWxseSwgSSB3aWxsIGJlIHRoaW5raW5nIG9mIHdheXMgdG8gcmVmYWN0b3IgdGhpcyBmdW5jdGlvbiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLCBtYWludGFpbmFiaWxpdHksIGFuZCByZWFkYWJpbGl0eS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTYyOSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTE6NDkuNDA0NTE2NDc0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkwMzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3VzZXJmYXVsdGZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjAzNCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIwMzQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0c3Bpbl91bmxvY2socHRsKTtcXG4yMDM1OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGVyciA9IC1FQlVTWTtcXG4yMDM2OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwMzc6XFx0XFx0XFx0XFx0XFx0XFx0fVxcbjIwMzg6XFx0XFx0XFx0XFx0XFx0fVxcbjIwMzk6XFx0XFxuMjA0MDpcXHRcXHRcXHRcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbjIwNDE6XFx0XFx0XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWQoc3JjX3ZtYSwgc3JjX3BtZCwgc3JjX2FkZHIpO1xcbjIwNDI6XFx0XFx0XFx0XFx0XFx0LyogVGhlIGZvbGlvIHdpbGwgYmUgc3BsaXQgYnkgbW92ZV9wYWdlc19wdGUoKSAqL1xcbjIwNDM6XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjA0NDpcXHRcXHRcXHRcXHR9XFxuMjA0NTpcXHRcXG4yMDQ2OlxcdFxcdFxcdFxcdGVyciA9IG1vdmVfcGFnZXNfaHVnZV9wbWQobW0sIGRzdF9wbWQsIHNyY19wbWQsXFxuMjA0NzpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGRzdF9wbWR2YWwsIGRzdF92bWEsIHNyY192bWEsXFxuMjA0ODpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGRzdF9hZGRyLCBzcmNfYWRkcik7XFxuMjA0OTpcXHRcXHRcXHRcXHRzdGVwX3NpemUgPSBIUEFHRV9QTURfU0laRTtcXG4yMDUwOlxcdFxcdFxcdH0gZWxzZSB7XFxuMjA1MTpcXHRcXHRcXHRcXHRsb25nIHJldDtcXG4yMDUyOlxcdFxcbjIwNTM6XFx0XFx0XFx0XFx0aWYgKHBtZF9ub25lKCpzcmNfcG1kKSkge1xcbjIwNTQ6XFx0XFx0XFx0XFx0XFx0aWYgKCEobW9kZSBcXHUwMDI2IFVGRkRJT19NT1ZFX01PREVfQUxMT1dfU1JDX0hPTEVTKSkge1xcbjIwNTU6XFx0XFx0XFx0XFx0XFx0XFx0ZXJyID0gLUVOT0VOVDtcXG4yMDU2OlxcdFxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwNTc6XFx0XFx0XFx0XFx0XFx0fVxcbjIwNTg6XFx0XFx0XFx0XFx0XFx0aWYgKHVubGlrZWx5KF9fcHRlX2FsbG9jKG1tLCBzcmNfcG1kKSkpIHtcXG4yMDU5OlxcdFxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjA2MDpcXHRcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4yMDYxOlxcdFxcdFxcdFxcdFxcdH1cXG4yMDYyOlxcdFxcdFxcdFxcdH1cXG4yMDYzOlxcdFxcbjIwNjQ6XFx0XFx0XFx0XFx0aWYgKHVubGlrZWx5KHB0ZV9hbGxvYyhtbSwgZHN0X3BtZCkpKSB7XFxuMjA2NTpcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbjIwNjY6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjA2NzpcXHRcXHRcXHRcXHR9XFxuMjA2ODpcXHRcXG4yMDY5OlxcdFxcdFxcdFxcdHJldCA9IG1vdmVfcGFnZXNfcHRlcyhtbSwgZHN0X3BtZCwgc3JjX3BtZCxcXG4yMDcwOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIGRzdF92bWEsIHNyY192bWEsIGRzdF9hZGRyLFxcbjIwNzE6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7XFxuMjA3MjpcXHRcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMCkge1xcbjIwNzM6XFx0XFx0XFx0XFx0XFx0ZXJyID0gcmV0O1xcbjIwNzQ6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4yMDc1OlxcdFxcdFxcdFxcdFxcdGVyciA9IDA7XFxuMjA3NjpcXHRcXHRcXHRcXHRcXHRzdGVwX3NpemUgPSByZXQ7XFxuMjA3NzpcXHRcXHRcXHRcXHR9XFxuMjA3ODpcXHRcXHRcXHR9XFxuMjA3OTpcXHRcXG4yMDgwOlxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbjIwODE6XFx0XFxuMjA4MjpcXHRcXHRcXHRpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHtcXG4yMDgzOlxcdFxcdFxcdFxcdC8qIERvIG5vdCBvdmVycmlkZSBhbiBlcnJvciAqL1xcbjIwODQ6XFx0XFx0XFx0XFx0aWYgKCFlcnIgfHwgZXJyID09IC1FQUdBSU4pXFxuMjA4NTpcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRUlOVFI7XFxuMjA4NjpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDg3OlxcdFxcdFxcdH1cXG4yMDg4OlxcdFxcbjIwODk6XFx0XFx0XFx0aWYgKGVycikge1xcbjIwOTA6XFx0XFx0XFx0XFx0aWYgKGVyciA9PSAtRUFHQUlOKVxcbjIwOTE6XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjA5MjpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDkzOlxcdFxcdFxcdH1cXG4yMDk0OlxcdFxcbjIwOTU6XFx0XFx0XFx0LyogUHJvY2VlZCB0byB0aGUgbmV4dCBwYWdlICovXFxuMjA5NjpcXHRcXHRcXHRkc3RfYWRkciArPSBzdGVwX3NpemU7XFxuMjA5NzpcXHRcXHRcXHRzcmNfYWRkciArPSBzdGVwX3NpemU7XFxuMjA5ODpcXHRcXHRcXHRtb3ZlZCArPSBzdGVwX3NpemU7XFxuMjA5OTpcXHRcXHR9XFxuMjEwMDpcXHRcXG4yMTAxOlxcdG91dF91bmxvY2s6XFxuMjEwMjpcXHRcXHR1cF9yZWFkKFxcdTAwMjZjdHgtXFx1MDAzZW1hcF9jaGFuZ2luZ19sb2NrKTtcXG4yMTAzOlxcdFxcdHVmZmRfbW92ZV91bmxvY2soZHN0X3ZtYSwgc3JjX3ZtYSk7XFxuMjEwNDpcXHRvdXQ6XFxuMjEwNTpcXHRcXHRWTV9XQVJOX09OX09OQ0UobW92ZWQgXFx1MDAzYyAwKTtcXG4yMTA2OlxcdFxcdFZNX1dBUk5fT05fT05DRShlcnIgXFx1MDAzZSAwKTtcXG4yMTA3OlxcdFxcdFZNX1dBUk5fT05fT05DRSghbW92ZWQgXFx1MDAyNlxcdTAwMjYgIWVycik7XFxuMjEwODpcXHRcXHRyZXR1cm4gbW92ZWQgPyBtb3ZlZCA6IGVycjtcXG4yMTA5OlxcdH1cXG4yMTEwOlxcdFxcbjIxMTE6XFx0c3RhdGljIGJvb2wgdm1hX2Nhbl91c2VyZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXFxuMjExMjpcXHRcXHRcXHQgICAgICAgYm9vbCB3cF9hc3luYylcXG4yMTEzOlxcdHtcXG4yMTE0OlxcdFxcdGNvbnN0IHN0cnVjdCB2bV91ZmZkX29wcyAqb3BzID0gdm1hX3VmZmRfb3BzKHZtYSk7XFxuMjExNTpcXHRcXG4yMTE2OlxcdFxcdGlmICh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgKFZNX0RST1BQQUJMRSB8IFZNX1NIQURPV19TVEFDSykpXFxuMjExNzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuMjExODpcXHRcXG4yMTE5OlxcdFxcdGlmICghaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkgXFx1MDAyNlxcdTAwMjYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9TUEVDSUFMKSlcXG4yMTIwOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4yMTIxOlxcdFxcbjIxMjI6XFx0XFx0dm1fZmxhZ3MgXFx1MDAyNj0gX19WTV9VRkZEX0ZMQUdTO1xcbjIxMjM6XFx0XFxuMjEyNDpcXHRcXHQvKlxcbjIxMjU6XFx0XFx0ICogSWYgV1AgaXMgdGhlIG9ubHkgbW9kZSBlbmFibGVkIGFuZCBjb250ZXh0IGlzIHdwIGFzeW5jLCBhbGxvdyBhbnlcXG4yMTI2OlxcdFxcdCAqIG1lbW9yeSB0eXBlLlxcbjIxMjc6XFx0XFx0ICovXFxuMjEyODpcXHRcXHRpZiAod3BfYXN5bmMgXFx1MDAyNlxcdTAwMjYgKHZtX2ZsYWdzID09IFZNX1VGRkRfV1ApKVxcbjIxMjk6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuMjEzMDpcXHRcXG4yMTMxOlxcdFxcdC8qIEZvciBhbnkgb3RoZXIgbW9kZSByZWplY3QgVk1BcyB0aGF0IGRvbid0IGltcGxlbWVudCB2bV91ZmZkX29wcyAqL1xcbjIxMzI6XFx0XFx0aWYgKCFvcHMpXFxuMjEzMzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjQ5LjQwNDcwOTY4NFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkyMzY3MTg3NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgU3VidGxlIEJ1ZyBpbiBgbW92ZV9wYWdlc2AqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciBgbW92ZV9wYWdlc2AsIGFuZCBteSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0aGF0IGl0J3MgYWRkcmVzc2luZyBhIHByZXR0eSBuYXN0eSBidWcuIEl0IHNlZW1zIHRoYXQgdGhlIGBlcnJgIHZhcmlhYmxlLCB3aGljaCBpcyB1c2VkIHRvIHRyYWNrIGVycm9ycyBkdXJpbmcgdGhlIHBhZ2UgbWlncmF0aW9uIHByb2Nlc3MsIHdhc24ndCBiZWluZyBwcm9wZXJseSByZXNldCBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgbW92ZV9wYWdlc19wdGVzYC4gVGhpcyBtZWFucyB0aGF0IGlmIGBtb3ZlX3BhZ2VzX3B0ZXNgIHdvcmtlZCwgYnV0IGEgcHJldmlvdXMgb3BlcmF0aW9uIGluIHRoZSBsb29wIGhhZCBzZXQgYGVycmAgdG8gc29tZXRoaW5nIGxpa2UgYC1FSU5WQUxgIG9yIGAtRUFHQUlOYCwgdGhhdCBuZWdhdGl2ZSBlcnJvciBjb2RlIHdvdWxkIGluY29ycmVjdGx5IHBlcnNpc3QuXG5cbkxldCBtZSBicmVhayB0aGlzIGRvd24uIEluaXRpYWxseSwgYGVycmAgaXMgc2V0IHRvIGAtRUlOVkFMYC4gVGhlbiBgdmFsaWRhdGVfbW92ZV9hcmVhc2AgY2FuIHJlc2V0IGl0LiBJbnNpZGUgdGhlIG1haW4gbG9vcCwgaWYgYW4gZXJyb3IgaGFwcGVucyBpbiBhIGZ1bmN0aW9uIGxpa2UgYHZhbGlkYXRlX21vdmVfYXJlYXNgIHRoYXQgaXNuJ3QgZmF0YWwsIGl0IHNldHMgYGVycmAgKGZvciBleGFtcGxlLCB0byBgLUVBR0FJTmApIGFuZCBwb3RlbnRpYWxseSBjb250aW51ZXMgb3IgYnJlYWtzIGJhc2VkIG9uIHRoZSBlcnJvci4gSSBoYXZlIHRvIHRoaW5rIHRocm91Z2ggdGhpcyBjYXJlZnVsbHkuIEFoLCBJIHNlZSB3aGF0J3MgaGFwcGVuaW5nLiBUaGUgbG9vcCBpdHNlbGYgZG9lc24ndCByZXNldCBgZXJyYCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggaXRlcmF0aW9uLiBTbywgaWYgYG1vdmVfcGFnZXNfcHRlc2Agc3VjY2VlZHMgb24gYW4gaXRlcmF0aW9uLCBidXQgYGVycmAgaGFkIGJlZW4gc2V0IHRvLCBzYXksIGAtRUFHQUlOYCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLCB0aGVuIHRoZSBmdW5jdGlvbiB3b3VsZCB1c2UgdGhhdCBvbGQgZXJyb3IgY29kZS4gU3BlY2lmaWNhbGx5LCBpZiBgZXJyYCBpcyBgLUVBR0FJTmAsIHRoZW4gd2UgaGl0IGBjb250aW51ZWAgYW5kIGF2b2lkIGluY3JlbWVudGluZyB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3Nlcy5cblxuT2theSwgc28gdGhlIGBlcnIgPT0gLUVBR0FJTmAgY2hlY2sgKmNvbnRpbnVlcyogdGhlIGxvb3Agd2l0aG91dCB1cGRhdGluZyBgZHN0X2FkZHJgIG9yIGBzcmNfYWRkcmAsIG1lYW5pbmcgaXQncyBnb2luZyB0byByZXRyeSB0aGUgKnNhbWUqIG1lbW9yeSByZWdpb24gb3ZlciBhbmQgb3ZlciBhZ2FpbiwgaWYgYSB0ZW1wb3JhcnkgZXJyb3IgaXMgZW5jb3VudGVyZWQuIFRoaXMgaXMgYmFkOyB0aGlzIHdpbGwgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLCBvciBhdCBsZWFzdCBhIHZlcnkgbG9uZyB0aW1lb3V0ISBUaGF0J3MgYSBkZWZpbml0ZSBmdW5jdGlvbmFsIGJ1Zy5cblxuTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IGlzIHRoaXMgYnVnIGFjdHVhbGx5IHJlYWNoYWJsZT8gVGhlIGdvb2QgbmV3cyBpcyB0aGF0IGBtb3ZlX3BhZ2VzYCBpcyBjYWxsZWQgYnkgYHVzZXJmYXVsdGZkX21vdmVgLCB3aGljaCBpdHNlbGYgaXMgdGhlIGhhbmRsZXIgZm9yIHRoZSBgVUZGRElPX01PVkVgIGlvY3RsLiBTaW5jZSB0aGF0J3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIHRoaXMgaXMgYWJzb2x1dGVseSBhIHJlYWNoYWJsZSBidWcsIGFuZCBwb3RlbnRpYWxseSBleHBsb2l0YWJsZS4gSXQncyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIHdhbnQgdG8gZnV6eiBhbmQgdGVzdCB0aG9yb3VnaGx5LiBJIG5lZWQgdG8gbWFrZSBzdXJlIGBVU0VSRkFVTFRGRGAgaXMgZW5hYmxlZCB0byB0cmlnZ2VyIHRoaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc0MjEsIk91dHB1dFRva2VucyI6MjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NDYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTo1OC42NDE0MzIwMzRaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MDkxNTYyMjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFVTRVJGQVVMVEZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTEzODQ9Y29uZmlnIEhBVkVfQVJDSF9VU0VSRkFVTFRGRF9NSU5PUlxcbi0tXFxubW0vS2NvbmZpZy0xMzg4LVxcbm1tL0tjb25maWc6MTM4OTptZW51Y29uZmlnIFVTRVJGQVVMVEZEXFxubW0vS2NvbmZpZy0xMzkwLVxcdGJvb2wgXFxcIkVuYWJsZSB1c2VyZmF1bHRmZCgpIHN5c3RlbSBjYWxsXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjowMC4zNTA1OTU0ODZaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzIxMjY1ODg1NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKktlcm5lbCBDb25maWd1cmF0aW9uIEh1bnRpbmc6IFVTRVJGQVVMVEZEKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBgVVNFUkZBVUxURkRgIGZ1bmN0aW9uYWxpdHkgd2l0aGluIHRoZSBrZXJuZWwuIFRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50IGZvciBhbnkgY29uZmlndXJhdGlvbiBvcHRpb24gbGlrZSB0aGlzIGlzIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gVGhhdCdzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWdzIGFyZSBkZWZpbmVkLCBhbmQgYFVTRVJGQVVMVEZEYCBpcywgYXQgaXRzIGNvcmUsIGEgbWVtb3J5IG1hbmFnZW1lbnQgZmVhdHVyZSwgYWxiZWl0IGEgZmFpcmx5IGludm9sdmVkIG9uZS4gU28sIHRoZSBmaXJzdCB0aGluZyBJJ20gZ29pbmcgdG8gZG8gaXMgcHVsbCB1cCB0aGF0IGZpbGUgYW5kIGdldCBhIGRpcmVjdCBsb29rIGF0IHRoZSBhc3NvY2lhdGVkIG9wdGlvbnMsIGRlcGVuZGVuY2llcywgYW5kIGhlbHAgdGV4dC4gSSB3YW50IHRvIHF1aWNrbHkgZ2F1Z2U6XG5cbiogICBXaGF0IGFyZSB0aGUgY29yZSBkZXBlbmRlbmNpZXM/IEFueSByZXF1aXJlZCBoYXJkd2FyZSBmZWF0dXJlcywgb3RoZXIgY29uZmlncywgb3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvbnNpZGVyYXRpb25zIHRoYXQgaW1tZWRpYXRlbHkgcG9wIG91dD9cbiogICBJcyBpdCBhIG1vZHVsYXIgb3IgYnVpbHQtaW4gb3B0aW9uPyBUaGlzIHdpbGwgYWZmZWN0IGhvdyBpdCdzIGVuYWJsZWQgYW5kIHV0aWxpemVkIGluIGRpZmZlcmVudCBzY2VuYXJpb3MuXG4qICAgV2hhdCdzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBgVVNFUkZBVUxURkRgIGFuZCBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBmZWF0dXJlcyBsaWtlIGBIV1BPSVNPTmAgb3IgTlVNQSBzZXR0aW5ncz8gQXJlIHRoZXJlIGFueSBvYnZpb3VzIGNvbmZsaWN0cyBvciBpbnRlcnBsYXk/XG4qICAgRXNzZW50aWFsbHksIHdoYXQncyB0aGUgbGFuZHNjYXBlIGhlcmUgaW4gdGVybXMgb2YgaG93IEknZCBleHBlY3QgaXQgdG8gYmUgdXNlZCBhbmQgYW55IHR5cGljYWwgcGl0ZmFsbHMgb3IgZ290Y2hhcz9cblxuTGV0J3Mgc2VlIHdoYXQgYG1tL0tjb25maWdgIHRlbGxzIG1lLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NzgyLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MDMuNTYzMjU2NzUxWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMjk2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEzODksXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEzODk6XFx0bWVudWNvbmZpZyBVU0VSRkFVTFRGRFxcbjEzOTA6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIHVzZXJmYXVsdGZkKCkgc3lzdGVtIGNhbGxcXFwiXFxuMTM5MTpcXHRcXHRkZXBlbmRzIG9uIE1NVVxcbjEzOTI6XFx0XFx0aGVscFxcbjEzOTM6XFx0XFx0ICBFbmFibGUgdGhlIHVzZXJmYXVsdGZkKCkgc3lzdGVtIGNhbGwgdGhhdCBhbGxvd3MgdG8gaW50ZXJjZXB0IGFuZFxcbjEzOTQ6XFx0XFx0ICBoYW5kbGUgcGFnZSBmYXVsdHMgaW4gdXNlcmxhbmQuXFxuMTM5NTpcXHRcXG4xMzk2OlxcdGlmIFVTRVJGQVVMVEZEXFxuMTM5NzpcXHRjb25maWcgUFRFX01BUktFUl9VRkZEX1dQXFxuMTM5ODpcXHRcXHRib29sIFxcXCJVc2VyZmF1bHRmZCB3cml0ZSBwcm90ZWN0aW9uIHN1cHBvcnQgZm9yIHNobWVtL2h1Z2V0bGJmc1xcXCJcXG4xMzk5OlxcdFxcdGRlZmF1bHQgeVxcbjE0MDA6XFx0XFx0ZGVwZW5kcyBvbiBIQVZFX0FSQ0hfVVNFUkZBVUxURkRfV1BcXG4xNDAxOlxcdFxcbjE0MDI6XFx0XFx0aGVscFxcbjE0MDM6XFx0XFx0ICBBbGxvd3MgdG8gY3JlYXRlIG1hcmtlciBQVEVzIGZvciB1c2VyZmF1bHRmZCB3cml0ZSBwcm90ZWN0aW9uXFxuMTQwNDpcXHRcXHQgIHB1cnBvc2VzLiAgSXQgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIHVzZXJmYXVsdGZkIHdyaXRlIHByb3RlY3Rpb24gb25cXG4xNDA1OlxcdFxcdCAgZmlsZS1iYWNrZWQgbWVtb3J5IHR5cGVzIGxpa2Ugc2htZW0gYW5kIGh1Z2V0bGJmcy5cXG4xNDA2OlxcdGVuZGlmICMgVVNFUkZBVUxURkRcXG4xNDA3OlxcdFxcbjE0MDg6XFx0IyBtdWx0aS1nZW4gTFJVIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MDMuNTYzMzYxMzIxWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI5OTcwMDM3MTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBgVVNFUkZBVUxURkRgIEltcGxlbWVudGF0aW9uKipcblxuQWxyaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgYFVTRVJGQVVMVEZEYCDigJMgdGhhdCdzIHRoZSBjb25maWcgaW4gcGxheSBoZXJlLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaXMgd29ya2luZy4gSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlIGtleSBzeW1ib2xzLCBzcGVjaWZpY2FsbHkgYHVzZXJmYXVsdGZkX21vdmVgLCBgbW92ZV9wYWdlc2AsIGFuZCBgbW92ZV9wYWdlc19wdGVzYC4gSG1tLCBhIHF1aWNrIGNoZWNrLi4ucmlnaHQsIGBtb3ZlX3BhZ2VzYCBhbmQgYHVzZXJmYXVsdGZkX21vdmVgIGFyZSBib3RoIHN0YXRpYy4gR29vZCB0byBrbm93LCBoZWxwcyBtZSBuYXJyb3cgZG93biB0aGUgc2NvcGUgb2YgdGhpbmdzLiBOb3cgdGhlIGNyaXRpY2FsIHF1ZXN0aW9uOiB3aGVyZSBpcyBgdXNlcmZhdWx0ZmRfbW92ZWAgYWN0dWFsbHkgYmVpbmcgKmNhbGxlZCo/IFRoYXQncyB3aGVyZSB0aGUgcmVhbCBhY3Rpb24gd2lsbCBiZS4gVGltZSB0byB0cmFjZSB0aG9zZSBjYWxscyBhbmQgc2VlIHdoYXQncyB3aGF0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDE5LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjowNi41NjAzNjg2MTlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NzA0MTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInVzZXJmYXVsdGZkX21vdmVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vdXNlcmZhdWx0ZmQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS91c2VyZmF1bHRmZC5jPTQyMDc9c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWZmZF9jdHhfZmVhdHVyZXMoX191NjQgdXNlcl9mZWF0dXJlcylcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtNDIxNS1cXG5tbS91c2VyZmF1bHRmZC5jOjQyMTY6c3RhdGljIGludCB1c2VyZmF1bHRmZF9tb3ZlKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCxcXG5tbS91c2VyZmF1bHRmZC5jLTQyMTctXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz00MzUwPXN0YXRpYyBsb25nIHVzZXJmYXVsdGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTQzNzgtXFx0Y2FzZSBVRkZESU9fTU9WRTpcXG5tbS91c2VyZmF1bHRmZC5jOjQzNzk6XFx0XFx0cmV0ID0gdXNlcmZhdWx0ZmRfbW92ZShjdHgsIGFyZyk7XFxubW0vdXNlcmZhdWx0ZmQuYy00MzgwLVxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjowNi42MDYwNzc4MTlaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjg1NTA4NTQ5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuYWx5emluZyB0aGF0IGNvZGU6XG5cbioqQW5hbHl6aW5nIHRoZSBFbnRyeSBQb2ludCoqXG5cbk9rYXksIGZpcnN0IHRoaW5ncyBmaXJzdC4gVGhlIGB1c2VyZmF1bHRmZF9pb2N0bGAgZnVuY3Rpb24gaXMgdGhlIHBvaW50IG9mIGVudHJ5IGhlcmUuIFRoYXQncyB0aGUgZ2F0ZWtlZXBlciwgdGhlIGZ1bmN0aW9uIHRoYXQncyBiZWluZyBjYWxsZWQgd2hlbiBzb21lb25lIHdhbnRzIHRvIGludGVyYWN0IHdpdGggdXNlcmZhdWx0ZmQgdXNpbmcgYW4gaW9jdGwgY2FsbC4gTm93LCBsZXQncyBqdXN0IG1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgdGhlIGNvcnJlY3Qgc3lzY2FsbC4gSXMgYHN5c191c2VyZmF1bHRmZGAgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHN5c3RlbSBjYWxsIHdlJ3JlIGRlYWxpbmcgd2l0aD8gVGhhdCdzIHdoYXQgSSBuZWVkIHRvIHZlcmlmeSBuZXh0LiBVbmRlcnN0YW5kaW5nIHRoYXQgY29ubmVjdGlvbiBpcyBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgY29udHJvbCBmbG93LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5OTA5LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MDkuNDYxMTY3MjI4WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjQ1MDM1NTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIlNZU0NBTExfREVGSU5FLip1c2VyZmF1bHRmZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vdXNlcmZhdWx0ZmQuYz00NDgzPXN0YXRpYyBpbmxpbmUgYm9vbCB1c2VyZmF1bHRmZF9zeXNjYWxsX2FsbG93ZWQoaW50IGZsYWdzKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy00NDk5LVxcbm1tL3VzZXJmYXVsdGZkLmM6NDUwMDpTWVNDQUxMX0RFRklORTEodXNlcmZhdWx0ZmQsIGludCwgZmxhZ3MpXFxubW0vdXNlcmZhdWx0ZmQuYy00NTAxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MTEuNzA2MjA5NTI0WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgxNzQ1ODQ4ODEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIGB1c2VyZmF1bHRmZGAgVnVsbmVyYWJpbGl0eSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0byBmb2N1cyBvbiB0aGUgZW50cnkgcG9pbnRzLCBzbyBgc3lzX3VzZXJmYXVsdGZkYCBhbmQgYHVzZXJmYXVsdGZkX2lvY3RsYCBjYW1lIHRvIG1pbmQuIEhvd2V2ZXIsIGBzeXNfdXNlcmZhdWx0ZmRgIGlzIGp1c3QgdGhlIHN5c2NhbGwuIFRoZSByZWFsIG1lYXQgb2YgdGhlIGJ1ZyBsaWVzIGRlZXBlciwgd2l0aGluIGBtb3ZlX3BhZ2VzYCwgd2hpY2ggaXMgcmVhY2hlZCB2aWEgdGhlIGNhbGwgY2hhaW4gYHVzZXJmYXVsdGZkX2lvY3RsYCAtXHUwMDNlIGB1c2VyZmF1bHRmZF9tb3ZlYCAtXHUwMDNlIGBtb3ZlX3BhZ2VzYC4gU2luY2UgYHVzZXJmYXVsdGZkX2lvY3RsYCBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgZm9yIGlvY3RscywgSSdtIGNvbWZvcnRhYmxlIG1ha2luZyBpdCBhIGBGb2N1c1N5bWJvbGAuXG5cbkkgYnJpZWZseSBjb25zaWRlcmVkIGlmIGB1c2VyZmF1bHRmZF9tb3ZlYCBtaWdodCBiZSBpbmxpbmVkLCBidXQgaXQncyBkZWZpbmVkIGFzIGBzdGF0aWMgaW50IHVzZXJmYXVsdGZkX21vdmVgLCBzbyBpdCdzIHN0YXRpY2FsbHkgbGlua2VkLiBJIGNoZWNrZWQgdG8gbWFrZSBzdXJlIGl0J3Mgbm90IGlubGluZSwgc2luY2UgaXQncyBhIHNpemFibGUgZnVuY3Rpb24sIGFuZCBJJ20gcHJldHR5IGNlcnRhaW4gdGhhdCBgdXNlcmZhdWx0ZmRfaW9jdGxgIGlzbid0IGlubGluZWQuIEl0J3MgYmVzdCB0byBiZSB0aG9yb3VnaC5cblxuQ2hlY2tpbmcgdGhlIGNvbmZpZyBvcHRpb25zLCB0aGUgcHJpbWFyeSByZWxldmFudCBvbmUgaXMgYFVTRVJGQVVMVEZEYC5cblxuTm93LCBsZXQncyByZXZpZXcgdGhlIHBhdGNoIGl0c2VsZjpcblxuYGBgY1xuXHRcdFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxuXHRcdFx0XHRcdCAgICAgIGRzdF92bWEsIHNyY192bWEsIGRzdF9hZGRyLFxuXHRcdFx0XHRcdCAgICAgIHNyY19hZGRyLCBzcmNfZW5kIC0gc3JjX2FkZHIsIG1vZGUpO1xuLVx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuIFx0XHRcdFx0ZXJyID0gcmV0O1xuLVx0XHRcdGVsc2VcbitcdFx0XHR9IGVsc2Uge1xuK1x0XHRcdFx0ZXJyID0gMDtcbiBcdFx0XHRcdHN0ZXBfc2l6ZSA9IHJldDtcbitcdFx0XHR9XG5gYGBcblxuVGhpcyBpcyBhIGZ1bmN0aW9uYWwgYnVnIGZpeCwgcmlnaHQ/IFRoZSBvcmlnaW5hbCBjb2RlIGhhZCBhIGZsYXcgd2hlcmUsIGlmIGBlcnJgIHdhcyBzZXQgdG8gc29tZXRoaW5nIG5vbi16ZXJvIChsaWtlIGAtRUFHQUlOYCBmcm9tIGEgcHJldmlvdXMgaXRlcmF0aW9uIG9yIHNpZ25hbCkgYW5kIGBtb3ZlX3BhZ2VzX3B0ZXNgIHRoZW4gKnN1Y2NlZWRlZCosIHRoZSBjb2RlICp3b3VsZG4ndCogY2xlYXIgYGVycmAsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgaGFuZGxpbmcuIFRoZSBwYXRjaCBjb3JyZWN0cyB0aGlzIGJ5IHNldHRpbmcgYGVyciA9IDBgIGlmIGBtb3ZlX3BhZ2VzX3B0ZXNgIHN1Y2NlZWRzLlxuXG5CYXNlZCBvbiB0aGlzLCBJJ20gc2V0dGluZzpcblxuKiAgIGBXb3J0aEZ1enppbmc6IHRydWVgIC0gYmVjYXVzZSBpdCBpcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIGl0IGZpeGVzIGEga2V5IHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5LlxuKiAgIGBGb2N1c1N5bWJvbHM6IFtcInVzZXJmYXVsdGZkX2lvY3RsXCJdYCAtIGJlY2F1c2UgYHVzZXJmYXVsdGZkX2lvY3RsYCBpcyB0aGUgZW50cnkgcG9pbnQuXG4qICAgYEVuYWJsZUNvbmZpZ3M6IFtcIlVTRVJGQVVMVEZEXCJdYCAtIGJlY2F1c2UgdGhhdCdzIHRoZSBuZWNlc3NhcnkgY29uZmlnIG9wdGlvbi5cbiogICBgUmVhc29uaW5nOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy5cImBcblxuXG4iLCJJbnB1dFRva2VucyI6MTAxOTksIk91dHB1dFRva2VucyI6OTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MDksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MTkuODgwODAxOTk2WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODA5NzQ5OTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidXNlcmZhdWx0ZmRfaW9jdGxcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJVU0VSRkFVTFRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInVzZXJmYXVsdGZkX2lvY3RsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIFVGRkRJT19NT1ZFIGlvY3RsIGhhbmRsZXIgd2hlcmUgYSBwcmV2aW91c2x5IHNldCBlcnJvciBjb2RlIChsaWtlIC1FQUdBSU4pIHdhcyBub3QgY2xlYXJlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgcGFnZSBtb3ZlLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJlcG9ydGluZy4gVGhpcyBpcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUyOjE5Ljk2MTc4MzQ3NVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjgxMjk3OTY2MTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjoxOS45NjIzMzE2MjRaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MjgxMjkyNDQwNTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIGBtb3ZlX3BhZ2VzKClgIHdoZXJlIHRoZSBgZXJyYCB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVfcGFnZXNfcHRlcygpYC4gSWYgYGVycmAgd2FzIHByZXZpb3VzbHkgc2V0IHRvIGAtRUFHQUlOYCAoZS5nLiwgZnJvbSBhIHByaW9yIGZhaWxlZCBgbW92ZV9wYWdlc19odWdlX3BtZCgpYCBhdHRlbXB0IHRoYXQgdHJpZ2dlcmVkIGEgYGNvbnRpbnVlYCksIGl0IHdvdWxkIHJlbWFpbiBgLUVBR0FJTmAuIFRoaXMgd291bGQgY2F1c2UgdGhlIGxvb3AgdG8gaW5jb3JyZWN0bHkgc2tpcCBhZHZhbmNpbmcgdGhlIGBzcmNfYWRkcmAgYW5kIGBkc3RfYWRkcmAgcG9pbnRlcnMgYW5kIGBjb250aW51ZWAgYWdhaW4sIGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmV0dXJucy5cXG5cXG5UaGlzIGlzIGEgY29udHJvbCBmbG93IGFuZCBlcnJvciBoYW5kbGluZyBidWcuIEl0IGRvZXMgbm90IGludm9sdmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkaW5nIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTiBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0b3JzLCBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIHN1Y2ggaGFuZ3Mgb3IgbG9naWMgZXJyb3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDdmYTRlZjVhYjIxYzE2ZmE4OWJiNTYwZmU4MTI1YjgwYzE0MWE1OWJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAxNSAxMDo1MTozNSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jXG5pbmRleCBjM2FkZWRhYWY3ZDU0Li41OTVlN2UyMzJmOTAxIDEwMDY0NFxuLS0tIGEvbW0vdXNlcmZhdWx0ZmQuY1xuKysrIGIvbW0vdXNlcmZhdWx0ZmQuY1xuQEAgLTIwNjksMTAgKzIwNjksMTIgQEAgc3RhdGljIHNzaXplX3QgbW92ZV9wYWdlcyhzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgZHN0X3N0YXJ0LFxuIFx0XHRcdHJldCA9IG1vdmVfcGFnZXNfcHRlcyhtbSwgZHN0X3BtZCwgc3JjX3BtZCxcbiBcdFx0XHRcdFx0ICAgICAgZHN0X3ZtYSwgc3JjX3ZtYSwgZHN0X2FkZHIsXG4gXHRcdFx0XHRcdCAgICAgIHNyY19hZGRyLCBzcmNfZW5kIC0gc3JjX2FkZHIsIG1vZGUpO1xuLVx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuIFx0XHRcdFx0ZXJyID0gcmV0O1xuLVx0XHRcdGVsc2VcbitcdFx0XHR9IGVsc2Uge1xuK1x0XHRcdFx0ZXJyID0gMDtcbiBcdFx0XHRcdHN0ZXBfc2l6ZSA9IHJldDtcbitcdFx0XHR9XG4gXHRcdH1cbiBcbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjoxOS45NjIzMzI1MzVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzkyNjE3ODU1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBVc2VyZmF1bHRmZCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBtbS91c2VyZmF1bHRmZC5jYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGEgbW9kaWZpY2F0aW9uIHRvIHRoZSBgbW92ZV9wYWdlc2AgZnVuY3Rpb24uIFRoZSBjb2RlIHNuaXBwZXQgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDsgaXQncyBhIGNvbmRpdGlvbmFsIGNoYW5nZSBkZWFsaW5nIHdpdGggdGhlIHJldHVybiB2YWx1ZSwgYHJldGAsIGZyb20gYSBmdW5jdGlvbiBjYWxsLiBJdCBzZWVtcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIHNldCBgZXJyYCB0byB0aGUgdmFsdWUgb2YgYHJldGAgd2hlbiBgcmV0YCB3YXMgbmVnYXRpdmUsIGluZGljYXRpbmcgYW4gZXJyb3IuIFRoZSBwYXRjaCB3cmFwcyB0aGlzIGluIGEgY29uZGl0aW9uYWwsIGFuZCBhZGRzIGBlcnIgPSAwYCB3aGVuIGByZXQgXHUwMDNlPSAwYCwgYW5kIGBzdGVwX3NpemUgPSByZXRgLiBUaGF0IG1ha2VzIGl0IGNsZWFyIHRoYXQgYSBub24tbmVnYXRpdmUgcmV0dXJuIG5vdyBpbmRpY2F0ZXMgc3VjY2Vzcy5cblxuVG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbiwgSSBuZWVkIHRvIHNlZSB0aGUgc3Vycm91bmRpbmcgY29udGV4dC4gV2hhdCBleGFjdGx5IGlzIGBtb3ZlX3BhZ2VzYCBkb2luZyBpbiB0aGlzIHBhcnQgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbT8gV2hhdCBhcmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgYHJldGAsIGFuZCB3aGF0IGlzIGBlcnJgIHVzZWQgZm9yPyBJcyB0aGlzIGEgc3RhbmRhcmQgc3VjY2Vzcy9lcnJvciByZXR1cm4gbW9kZWwsIG9yIGlzIHRoZXJlIHNvbWV0aGluZyBzcGVjaWZpYyB0byB1c2VyZmF1bHRmZCBoYXBwZW5pbmcgaGVyZT9cblxuSSdsbCB1c2UgYHJlYWQtZmlsZWAgb3IgYGdyZXBwZXJgIHRvIHF1aWNrbHkgZmluZCB0aGUgYG1vdmVfcGFnZXNgIGZ1bmN0aW9uIGRlZmluaXRpb24gYW5kIGl0cyB1c2FnZSB3aXRoaW4gYG1tL3VzZXJmYXVsdGZkLmNgLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBpbmZvcm1hdGlvbiBJIG5lZWQgdG8gcHJvcGVybHkgYW5hbHl6ZSB0aGlzIHBhdGNoIGFuZCBpdHMgaW1wbGljYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDI2LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQ4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MjMuODg4NTE1OTkyWiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTU1MTg5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtb3ZlX3BhZ2VzXFxcXChcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vdXNlcmZhdWx0ZmQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS91c2VyZmF1bHRmZC5jPTE4NTk9c3RhdGljIHZvaWQgdWZmZF9tb3ZlX3VubG9jayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdF92bWEsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE4NzYtICpcXG5tbS91c2VyZmF1bHRmZC5jOjE4Nzc6ICogbW92ZV9wYWdlcygpIHJlbWFwcyBhcmJpdHJhcnkgYW5vbnltb3VzIHBhZ2VzIGF0b21pY2FsbHkgaW4gemVyb1xcbm1tL3VzZXJmYXVsdGZkLmMtMTg3OC0gKiBjb3B5LiBJdCBvbmx5IHdvcmtzIG9uIG5vbiBzaGFyZWQgYW5vbnltb3VzIHBhZ2VzIGJlY2F1c2UgdGhvc2UgY2FuXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE4ODgtICogc3RvcmFnZSBvciBhbnkgb3RoZXIgSS9PIGRldmljZSAoTUFEVl9ET05URk9SSyBpbiB0aGUgc291cmNlIHZtYVxcbm1tL3VzZXJmYXVsdGZkLmM6MTg4OTogKiBhdm9pZHMgbW92ZV9wYWdlcygpIHRvIGZhaWwgd2l0aCAtRUJVU1kgaWYgdGhlIHByb2Nlc3MgZm9ya3MgYmVmb3JlXFxubW0vdXNlcmZhdWx0ZmQuYzoxODkwOiAqIG1vdmVfcGFnZXMoKSBpcyBjYWxsZWQpLCB0aGVuIGl0IHdpbGwgY2FsbCBtb3ZlX3BhZ2VzKCkgdG8gbWFwIHRoZVxcbm1tL3VzZXJmYXVsdGZkLmMtMTg5MS0gKiBwYWdlIGluIHRoZSBmYXVsdGluZyBhZGRyZXNzIGluIHRoZSBkZXN0aW5hdGlvbiB2bWEuXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE5MDUtICogdGhlIGRlc3RpbmF0aW9uIHZpcnR1YWwgbWVtb3J5IHJhbmdlIGlzIG5vdCBhIHdob2xlIHVubWFwcGVkIGhvbGUsXFxubW0vdXNlcmZhdWx0ZmQuYzoxOTA2OiAqIG1vdmVfcGFnZXMoKSB3aWxsIGZhaWwgcmVzcGVjdGl2ZWx5IHdpdGggLUVOT0VOVCBvciAtRUVYSVNULiBUaGlzXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTA3LSAqIHByb3ZpZGVzIGEgdmVyeSBzdHJpY3QgYmVoYXZpb3IgdG8gYXZvaWQgYW55IGNoYW5jZSBvZiBtZW1vcnlcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMTkxMC0gKiB0aW1lIGZvciBhbnkgZ2l2ZW4gZmF1bHRpbmcgYWRkcmVzcy4gVGhpcyBtZWFucyB0aGF0IGlmIHR3byB0aHJlYWRzXFxubW0vdXNlcmZhdWx0ZmQuYzoxOTExOiAqIHRyeSB0byBib3RoIGNhbGwgbW92ZV9wYWdlcygpIG9uIHRoZSBzYW1lIGRlc3RpbmF0aW9uIGFkZHJlc3MgYXQgdGhlXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTEyLSAqIHNhbWUgdGltZSwgdGhlIHNlY29uZCB0aHJlYWQgd2lsbCBnZXQgYW4gZXhwbGljaXQgZXJyb3IgZnJvbSB0aGlzXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE5MjAtICogYW4gYW1vdW50IG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSBtb3ZlZC4gSWYgdGhlIHJldHZhbCByZXBvcnRzIGFcXG5tbS91c2VyZmF1bHRmZC5jOjE5MjE6ICogXFxcInNob3J0XFxcIiByZW1hcCwgdGhlIG1vdmVfcGFnZXMoKSBjb21tYW5kIHNob3VsZCBiZSByZXBlYXRlZCBieVxcbm1tL3VzZXJmYXVsdGZkLmMtMTkyMi0gKiB1c2VybGFuZCB3aXRoIHNyYytyZXR2YWwsIGRzdCtyZXZhbCwgbGVuLXJldHZhbCBpZiBpdCB3YW50cyB0byBrbm93XFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE5MzMtICovXFxubW0vdXNlcmZhdWx0ZmQuYzoxOTM0OnN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG5tbS91c2VyZmF1bHRmZC5jLTE5MzUtXFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBfX3U2NCBtb2RlKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz00MjE2PXN0YXRpYyBpbnQgdXNlcmZhdWx0ZmRfbW92ZShzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTQyNTUtXFx0aWYgKG1tZ2V0X25vdF96ZXJvKG1tKSkge1xcbm1tL3VzZXJmYXVsdGZkLmM6NDI1NjpcXHRcXHRyZXQgPSBtb3ZlX3BhZ2VzKGN0eCwgdWZmZGlvX21vdmUuZHN0LCB1ZmZkaW9fbW92ZS5zcmMsXFxubW0vdXNlcmZhdWx0ZmQuYy00MjU3LVxcdFxcdFxcdFxcdCB1ZmZkaW9fbW92ZS5sZW4sIHVmZmRpb19tb3ZlLm1vZGUpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjoyMy45MzQwNzMzNzJaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjY2MzMxMTUyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYG1vdmVfcGFnZXNgIGluIGBtbS91c2VyZmF1bHRmZC5jYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgbW92ZV9wYWdlc2AgaXMgaGFuZGxpbmcgdGhpbmdzIGluIHRoZSBjb250ZXh0IG9mIHVzZXJmYXVsdGZkLiBUaGlzIGZ1bmN0aW9uIGlzIGNyaXRpY2FsIGZvciBob3cgd2UgbWFuYWdlIHBhZ2UgbWlncmF0aW9uIGFuZCB0cmFuc2ZlciwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCB1c2VyLXNwYWNlIG1lbW9yeSBhY2Nlc3MgZmF1bHRzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUga2VybmVsIG9yY2hlc3RyYXRlcyB0aGlzIHdob2xlIGRhbmNlIGJldHdlZW4gdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlLiBTcGVjaWZpY2FsbHksIEknbSBpbnRlcmVzdGVkIGluIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiBgdXNlcmZhdWx0ZmRgIGFuZCB0aGUgcGFnZSBtaWdyYXRpb24gbWFjaGluZXJ5LiBIb3cgZG9lcyBpdCBrbm93IHdoZXJlIHBhZ2VzIGFyZSwgYW5kIGhvdyBkb2VzIGl0IGRpcmVjdCB0aGVtIHdoZXJlIHRoZXkgbmVlZCB0byBnbz8gSSdtIGV4cGVjdGluZyB0byBmaW5kIGEgZGVsaWNhdGUgYmFsYW5jaW5nIGFjdCBoZXJlLCBlbnN1cmluZyBkYXRhIGludGVncml0eSB3aGlsZSBtaW5pbWl6aW5nIHRoZSBwZXJmb3JtYW5jZSBoaXQgb2YgcGFnZSBmYXVsdHMuIExldCdzIHNlZSBob3cgdGhleSBkbyBpdC4gSSdtIGxvb2tpbmcgZm9yIHRoZSBrZXkgbG9ja2luZyBwcmltaXRpdmVzLCBlcnJvciBoYW5kbGluZyBwYXRocywgYW5kIHRoZSBvdmVyYWxsIGxvZ2ljIGZsb3cuIFRoaXMgY291bGQgZ2l2ZSBtZSBzb21lIGdyZWF0IGluc2lnaHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMjE2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MjYuNTk3Mzg5MjczWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NDAyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS91c2VyZmF1bHRmZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MzQsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTM0OlxcdHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG4xOTM1OlxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JjX3N0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgX191NjQgbW9kZSlcXG4xOTM2OlxcdHtcXG4xOTM3OlxcdFxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3R4LVxcdTAwM2VtbTtcXG4xOTM4OlxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSwgKmRzdF92bWE7XFxuMTkzOTpcXHRcXHR1bnNpZ25lZCBsb25nIHNyY19hZGRyLCBkc3RfYWRkciwgc3JjX2VuZDtcXG4xOTQwOlxcdFxcdHBtZF90ICpzcmNfcG1kLCAqZHN0X3BtZDtcXG4xOTQxOlxcdFxcdGxvbmcgZXJyID0gLUVJTlZBTDtcXG4xOTQyOlxcdFxcdHNzaXplX3QgbW92ZWQgPSAwO1xcbjE5NDM6XFx0XFxuMTk0NDpcXHRcXHQvKiBTYW5pdGl6ZSB0aGUgY29tbWFuZCBwYXJhbWV0ZXJzLiAqL1xcbjE5NDU6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDY6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGRzdF9zdGFydCBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDc6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDg6XFx0XFxuMTk0OTpcXHRcXHQvKiBEb2VzIHRoZSBhZGRyZXNzIHJhbmdlIHdyYXAsIG9yIGlzIHRoZSBzcGFuIHplcm8tc2l6ZWQ/ICovXFxuMTk1MDpcXHRcXHRWTV9XQVJOX09OX09OQ0Uoc3JjX3N0YXJ0ICsgbGVuIFxcdTAwM2Mgc3JjX3N0YXJ0KTtcXG4xOTUxOlxcdFxcdFZNX1dBUk5fT05fT05DRShkc3Rfc3RhcnQgKyBsZW4gXFx1MDAzYyBkc3Rfc3RhcnQpO1xcbjE5NTI6XFx0XFxuMTk1MzpcXHRcXHRlcnIgPSB1ZmZkX21vdmVfbG9jayhtbSwgZHN0X3N0YXJ0LCBzcmNfc3RhcnQsIFxcdTAwMjZkc3Rfdm1hLCBcXHUwMDI2c3JjX3ZtYSk7XFxuMTk1NDpcXHRcXHRpZiAoZXJyKVxcbjE5NTU6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk1NjpcXHRcXG4xOTU3OlxcdFxcdC8qIFJlLWNoZWNrIGFmdGVyIHRha2luZyBtYXBfY2hhbmdpbmdfbG9jayAqL1xcbjE5NTg6XFx0XFx0ZXJyID0gLUVBR0FJTjtcXG4xOTU5OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2Y3R4LVxcdTAwM2VtYXBfY2hhbmdpbmdfbG9jayk7XFxuMTk2MDpcXHRcXHRpZiAobGlrZWx5KGF0b21pY19yZWFkKFxcdTAwMjZjdHgtXFx1MDAzZW1tYXBfY2hhbmdpbmcpKSlcXG4xOTYxOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTYyOlxcdFxcdC8qXFxuMTk2MzpcXHRcXHQgKiBNYWtlIHN1cmUgdGhlIHZtYSBpcyBub3Qgc2hhcmVkLCB0aGF0IHRoZSBzcmMgYW5kIGRzdCByZW1hcFxcbjE5NjQ6XFx0XFx0ICogcmFuZ2VzIGFyZSBib3RoIHZhbGlkIGFuZCBmdWxseSB3aXRoaW4gYSBzaW5nbGUgZXhpc3RpbmdcXG4xOTY1OlxcdFxcdCAqIHZtYS5cXG4xOTY2OlxcdFxcdCAqL1xcbjE5Njc6XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4xOTY4OlxcdFxcdGlmIChzcmNfdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NIQVJFRClcXG4xOTY5OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTcwOlxcdFxcdGlmIChzcmNfc3RhcnQgKyBsZW4gXFx1MDAzZSBzcmNfdm1hLVxcdTAwM2V2bV9lbmQpXFxuMTk3MTpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk3MjpcXHRcXG4xOTczOlxcdFxcdGlmIChkc3Rfdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NIQVJFRClcXG4xOTc0OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTc1OlxcdFxcdGlmIChkc3Rfc3RhcnQgKyBsZW4gXFx1MDAzZSBkc3Rfdm1hLVxcdTAwM2V2bV9lbmQpXFxuMTk3NjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdFxcdGVyciA9IHZhbGlkYXRlX21vdmVfYXJlYXMoY3R4LCBzcmNfdm1hLCBkc3Rfdm1hKTtcXG4xOTc5OlxcdFxcdGlmIChlcnIpXFxuMTk4MDpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk4MTpcXHRcXG4xOTgyOlxcdFxcdGZvciAoc3JjX2FkZHIgPSBzcmNfc3RhcnQsIGRzdF9hZGRyID0gZHN0X3N0YXJ0LCBzcmNfZW5kID0gc3JjX3N0YXJ0ICsgbGVuO1xcbjE5ODM6XFx0XFx0ICAgICBzcmNfYWRkciBcXHUwMDNjIHNyY19lbmQ7KSB7XFxuMTk4NDpcXHRcXHRcXHRzcGlubG9ja190ICpwdGw7XFxuMTk4NTpcXHRcXHRcXHRwbWRfdCBkc3RfcG1kdmFsO1xcbjE5ODY6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzdGVwX3NpemU7XFxuMTk4NzpcXHRcXG4xOTg4OlxcdFxcdFxcdC8qXFxuMTk4OTpcXHRcXHRcXHQgKiBCZWxvdyB3b3JrcyBiZWNhdXNlIGFub255bW91cyBhcmVhIHdvdWxkIG5vdCBoYXZlIGFcXG4xOTkwOlxcdFxcdFxcdCAqIHRyYW5zcGFyZW50IGh1Z2UgUFVELiBJZiBmaWxlLWJhY2tlZCBzdXBwb3J0IGlzIGFkZGVkLFxcbjE5OTE6XFx0XFx0XFx0ICogdGhhdCBjYXNlIHdvdWxkIG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlLlxcbjE5OTI6XFx0XFx0XFx0ICovXFxuMTk5MzpcXHRcXHRcXHRzcmNfcG1kID0gbW1fZmluZF9wbWQobW0sIHNyY19hZGRyKTtcXG4xOTk0OlxcdFxcdFxcdGlmICh1bmxpa2VseSghc3JjX3BtZCkpIHtcXG4xOTk1OlxcdFxcdFxcdFxcdGlmICghKG1vZGUgXFx1MDAyNiBVRkZESU9fTU9WRV9NT0RFX0FMTE9XX1NSQ19IT0xFUykpIHtcXG4xOTk2OlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9FTlQ7XFxuMTk5NzpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4xOTk4OlxcdFxcdFxcdFxcdH1cXG4xOTk5OlxcdFxcdFxcdFxcdHNyY19wbWQgPSBtbV9hbGxvY19wbWQobW0sIHNyY19hZGRyKTtcXG4yMDAwOlxcdFxcdFxcdFxcdGlmICh1bmxpa2VseSghc3JjX3BtZCkpIHtcXG4yMDAxOlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjAwMjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4yMDAzOlxcdFxcdFxcdFxcdH1cXG4yMDA0OlxcdFxcdFxcdH1cXG4yMDA1OlxcdFxcdFxcdGRzdF9wbWQgPSBtbV9hbGxvY19wbWQobW0sIGRzdF9hZGRyKTtcXG4yMDA2OlxcdFxcdFxcdGlmICh1bmxpa2VseSghZHN0X3BtZCkpIHtcXG4yMDA3OlxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjAwODpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDA5OlxcdFxcdFxcdH1cXG4yMDEwOlxcdFxcbjIwMTE6XFx0XFx0XFx0ZHN0X3BtZHZhbCA9IHBtZHBfZ2V0X2xvY2tsZXNzKGRzdF9wbWQpO1xcbjIwMTI6XFx0XFx0XFx0LypcXG4yMDEzOlxcdFxcdFxcdCAqIElmIHRoZSBkc3RfcG1kIGlzIG1hcHBlZCBhcyBUSFAgZG9uJ3Qgb3ZlcnJpZGUgaXQgYW5kIGp1c3RcXG4yMDE0OlxcdFxcdFxcdCAqIGJlIHN0cmljdC4gSWYgZHN0X3BtZCBjaGFuZ2VzIGludG8gVFBIIGFmdGVyIHRoaXMgY2hlY2ssIHRoZVxcbjIwMTU6XFx0XFx0XFx0ICogbW92ZV9wYWdlc19odWdlX3BtZCgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIHJldHJ5XFxuMjAxNjpcXHRcXHRcXHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXFxuMjAxNzpcXHRcXHRcXHQgKi9cXG4yMDE4OlxcdFxcdFxcdGlmICh1bmxpa2VseShwbWRfdHJhbnNfaHVnZShkc3RfcG1kdmFsKSkpIHtcXG4yMDE5OlxcdFxcdFxcdFxcdGVyciA9IC1FRVhJU1Q7XFxuMjAyMDpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDIxOlxcdFxcdFxcdH1cXG4yMDIyOlxcdFxcbjIwMjM6XFx0XFx0XFx0cHRsID0gcG1kX3RyYW5zX2h1Z2VfbG9jayhzcmNfcG1kLCBzcmNfdm1hKTtcXG4yMDI0OlxcdFxcdFxcdGlmIChwdGwpIHtcXG4yMDI1OlxcdFxcdFxcdFxcdC8qIENoZWNrIGlmIHdlIGNhbiBtb3ZlIHRoZSBwbWQgd2l0aG91dCBzcGxpdHRpbmcgaXQuICovXFxuMjAyNjpcXHRcXHRcXHRcXHRpZiAobW92ZV9zcGxpdHNfaHVnZV9wbWQoZHN0X2FkZHIsIHNyY19hZGRyLCBzcmNfc3RhcnQgKyBsZW4pIHx8XFxuMjAyNzpcXHRcXHRcXHRcXHQgICAgIXBtZF9ub25lKGRzdF9wbWR2YWwpKSB7XFxuMjAyODpcXHRcXHRcXHRcXHRcXHQvKiBDYW4gYmUgYSBtaWdyYXRpb24gZW50cnkgKi9cXG4yMDI5OlxcdFxcdFxcdFxcdFxcdGlmIChwbWRfcHJlc2VudCgqc3JjX3BtZCkpIHtcXG4yMDMwOlxcdFxcdFxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwbWRfZm9saW8oKnNyY19wbWQpO1xcbjIwMzE6XFx0XFxuMjAzMjpcXHRcXHRcXHRcXHRcXHRcXHRpZiAoIWlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykgXFx1MDAyNlxcdTAwMjZcXG4yMDMzOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAhUGFnZUFub25FeGNsdXNpdmUoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjoyNi41OTc2NjU3MjNaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzYyMzk4ODAyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEaXZpbmcgRGVlcGVyIGludG8gYG1vdmVfcGFnZXNgKipcblxuQWxyaWdodCwgSSd2ZSBnb3QgdGhlIGluaXRpYWwgb3ZlcnZpZXcgb2YgYG1vdmVfcGFnZXNgIGluIG15IGhlYWQuIE5vdywgdGhlIHJlYWwgd29yayBiZWdpbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBudWFuY2VzLCB0aGUgZWRnZSBjYXNlcywgdGhlIHBvdGVudGlhbCBib3R0bGVuZWNrcy4gTGV0J3MgZGlnIGludG8gdGhlIG1lYXQgb2YgdGhlIGNvZGUuIE15IHByaW1hcnkgZm9jdXMgaXMgbGlrZWx5IG9uIGhvdyBpdCBoYW5kbGVzIG1lbW9yeSBtYW5hZ2VtZW50LCBlc3BlY2lhbGx5IGlmIHRoaXMgaXMgcmVsYXRlZCB0byBhIHBhZ2luZyBzeXN0ZW0sIG9yIHNvbWUgZm9ybSBvZiB2aXJ0dWFsIG1lbW9yeS4gSSdtIGxvb2tpbmcgZm9yIHdoZXJlIHBhZ2UgdGFibGVzIGFyZSB1cGRhdGVkLCB3aGVyZSBwaHlzaWNhbCBmcmFtZXMgbWlnaHQgYmUgYWxsb2NhdGVkIG9yIGRlYWxsb2NhdGVkLCBhbmQgaG93IGNvaGVyZW5jeSBpcyBtYWludGFpbmVkLCBpZiB0aGlzIG9wZXJhdGlvbiBpcyBoYXBwZW5pbmcgY29uY3VycmVudGx5LiBJcyBpdCB0aHJlYWQtc2FmZT8gRG9lcyBpdCBlbXBsb3kgbG9ja3MsIGFuZCBpZiBzbywgaG93IGdyYW51bGFyIGFyZSB0aGV5PyBBbnkgZGVhZGxvY2tzPyBBbHNvLCB3aGF0IGhhcHBlbnMgaW4gYSBzaXR1YXRpb24gb2YgYW4gb3V0LW9mLW1lbW9yeSBlcnJvci5cblxuSSB3YW50IHRvIHNlZSB0aGUgZGV0YWlscyBvbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGl0IG1hbmlwdWxhdGVzLiBIb3cgYXJlIHRoZSBwYWdlcyBvcmdhbml6ZWQgYmVmb3JlIHRoZSBtb3ZlPyBJcyBpdCBhIGxpbmtlZCBsaXN0LCBhIGhhc2ggdGFibGUsIGEgdHJlZSBzdHJ1Y3R1cmUsIG9yIHNvbWV0aGluZyBlbHNlPyBVbmRlcnN0YW5kaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcyBpcyBrZXkgdG8gb3B0aW1pemluZyB0aGUgYWxnb3JpdGhtLiBJJ2xsIGJlIHdhdGNoaW5nIGhvdyBpdCBoYW5kbGVzIGV4Y2VwdGlvbnMsIGVycm9yIHJlY292ZXJ5LCBhbmQgdGhlIG92ZXJhbGwgcmVsaWFiaWxpdHkgb2YgdGhlIGZ1bmN0aW9uLiBJcyBpdCBhdG9taWM/IEknbSBhbnRpY2lwYXRpbmcgdGhhdCBJJ2xsIGJlIG1lbnRhbGx5IG1hcHBpbmcgdGhlIGZ1bmN0aW9uJ3MgbG9naWMgdG8gdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgY2FwYWJpbGl0aWVzLCBwZXJoYXBzIGluY2x1ZGluZyB0aGUgQ1BVJ3MgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdCBhbmQgYW55IHJlbGV2YW50IGNhY2hlIGNvbmZpZ3VyYXRpb25zLiBVbmRlcnN0YW5kaW5nIHRoZXNlIGludGVyYWN0aW9ucyBpcyBjcml0aWNhbCwgYXMgaXQgaGFzIGEgbWFzc2l2ZSBwZXJmb3JtYW5jZSBpbXBhY3QuIEZpbmFsbHksIEkgd2lsbCBiZSB0aGlua2luZyBvZiB3YXlzIHRvIHJlZmFjdG9yIHRoaXMgZnVuY3Rpb24gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgbWFpbnRhaW5hYmlsaXR5LCBhbmQgcmVhZGFiaWxpdHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUxNTcsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUyOjMwLjIyMTY1NjY1NFoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTE0MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vdXNlcmZhdWx0ZmQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMDM0LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjAzNDpcXHRcXHRcXHRcXHRcXHRcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbjIwMzU6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ZXJyID0gLUVCVVNZO1xcbjIwMzY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjAzNzpcXHRcXHRcXHRcXHRcXHRcXHR9XFxuMjAzODpcXHRcXHRcXHRcXHRcXHR9XFxuMjAzOTpcXHRcXG4yMDQwOlxcdFxcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKHB0bCk7XFxuMjA0MTpcXHRcXHRcXHRcXHRcXHRzcGxpdF9odWdlX3BtZChzcmNfdm1hLCBzcmNfcG1kLCBzcmNfYWRkcik7XFxuMjA0MjpcXHRcXHRcXHRcXHRcXHQvKiBUaGUgZm9saW8gd2lsbCBiZSBzcGxpdCBieSBtb3ZlX3BhZ2VzX3B0ZSgpICovXFxuMjA0MzpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4yMDQ0OlxcdFxcdFxcdFxcdH1cXG4yMDQ1OlxcdFxcbjIwNDY6XFx0XFx0XFx0XFx0ZXJyID0gbW92ZV9wYWdlc19odWdlX3BtZChtbSwgZHN0X3BtZCwgc3JjX3BtZCxcXG4yMDQ3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgZHN0X3BtZHZhbCwgZHN0X3ZtYSwgc3JjX3ZtYSxcXG4yMDQ4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgZHN0X2FkZHIsIHNyY19hZGRyKTtcXG4yMDQ5OlxcdFxcdFxcdFxcdHN0ZXBfc2l6ZSA9IEhQQUdFX1BNRF9TSVpFO1xcbjIwNTA6XFx0XFx0XFx0fSBlbHNlIHtcXG4yMDUxOlxcdFxcdFxcdFxcdGxvbmcgcmV0O1xcbjIwNTI6XFx0XFxuMjA1MzpcXHRcXHRcXHRcXHRpZiAocG1kX25vbmUoKnNyY19wbWQpKSB7XFxuMjA1NDpcXHRcXHRcXHRcXHRcXHRpZiAoIShtb2RlIFxcdTAwMjYgVUZGRElPX01PVkVfTU9ERV9BTExPV19TUkNfSE9MRVMpKSB7XFxuMjA1NTpcXHRcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRU5PRU5UO1xcbjIwNTY6XFx0XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjA1NzpcXHRcXHRcXHRcXHRcXHR9XFxuMjA1ODpcXHRcXHRcXHRcXHRcXHRpZiAodW5saWtlbHkoX19wdGVfYWxsb2MobW0sIHNyY19wbWQpKSkge1xcbjIwNTk6XFx0XFx0XFx0XFx0XFx0XFx0ZXJyID0gLUVOT01FTTtcXG4yMDYwOlxcdFxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwNjE6XFx0XFx0XFx0XFx0XFx0fVxcbjIwNjI6XFx0XFx0XFx0XFx0fVxcbjIwNjM6XFx0XFxuMjA2NDpcXHRcXHRcXHRcXHRpZiAodW5saWtlbHkocHRlX2FsbG9jKG1tLCBkc3RfcG1kKSkpIHtcXG4yMDY1OlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjA2NjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4yMDY3OlxcdFxcdFxcdFxcdH1cXG4yMDY4OlxcdFxcbjIwNjk6XFx0XFx0XFx0XFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxcbjIwNzA6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgZHN0X3ZtYSwgc3JjX3ZtYSwgZHN0X2FkZHIsXFxuMjA3MTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBzcmNfYWRkciwgc3JjX2VuZCAtIHNyY19hZGRyLCBtb2RlKTtcXG4yMDcyOlxcdFxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKSB7XFxuMjA3MzpcXHRcXHRcXHRcXHRcXHRlcnIgPSByZXQ7XFxuMjA3NDpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbjIwNzU6XFx0XFx0XFx0XFx0XFx0ZXJyID0gMDtcXG4yMDc2OlxcdFxcdFxcdFxcdFxcdHN0ZXBfc2l6ZSA9IHJldDtcXG4yMDc3OlxcdFxcdFxcdFxcdH1cXG4yMDc4OlxcdFxcdFxcdH1cXG4yMDc5OlxcdFxcbjIwODA6XFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuMjA4MTpcXHRcXG4yMDgyOlxcdFxcdFxcdGlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkge1xcbjIwODM6XFx0XFx0XFx0XFx0LyogRG8gbm90IG92ZXJyaWRlIGFuIGVycm9yICovXFxuMjA4NDpcXHRcXHRcXHRcXHRpZiAoIWVyciB8fCBlcnIgPT0gLUVBR0FJTilcXG4yMDg1OlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FSU5UUjtcXG4yMDg2OlxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwODc6XFx0XFx0XFx0fVxcbjIwODg6XFx0XFxuMjA4OTpcXHRcXHRcXHRpZiAoZXJyKSB7XFxuMjA5MDpcXHRcXHRcXHRcXHRpZiAoZXJyID09IC1FQUdBSU4pXFxuMjA5MTpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4yMDkyOlxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwOTM6XFx0XFx0XFx0fVxcbjIwOTQ6XFx0XFxuMjA5NTpcXHRcXHRcXHQvKiBQcm9jZWVkIHRvIHRoZSBuZXh0IHBhZ2UgKi9cXG4yMDk2OlxcdFxcdFxcdGRzdF9hZGRyICs9IHN0ZXBfc2l6ZTtcXG4yMDk3OlxcdFxcdFxcdHNyY19hZGRyICs9IHN0ZXBfc2l6ZTtcXG4yMDk4OlxcdFxcdFxcdG1vdmVkICs9IHN0ZXBfc2l6ZTtcXG4yMDk5OlxcdFxcdH1cXG4yMTAwOlxcdFxcbjIxMDE6XFx0b3V0X3VubG9jazpcXG4yMTAyOlxcdFxcdHVwX3JlYWQoXFx1MDAyNmN0eC1cXHUwMDNlbWFwX2NoYW5naW5nX2xvY2spO1xcbjIxMDM6XFx0XFx0dWZmZF9tb3ZlX3VubG9jayhkc3Rfdm1hLCBzcmNfdm1hKTtcXG4yMTA0OlxcdG91dDpcXG4yMTA1OlxcdFxcdFZNX1dBUk5fT05fT05DRShtb3ZlZCBcXHUwMDNjIDApO1xcbjIxMDY6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGVyciBcXHUwMDNlIDApO1xcbjIxMDc6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCFtb3ZlZCBcXHUwMDI2XFx1MDAyNiAhZXJyKTtcXG4yMTA4OlxcdFxcdHJldHVybiBtb3ZlZCA/IG1vdmVkIDogZXJyO1xcbjIxMDk6XFx0fVxcbjIxMTA6XFx0XFxuMjExMTpcXHRzdGF0aWMgYm9vbCB2bWFfY2FuX3VzZXJmYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4yMTEyOlxcdFxcdFxcdCAgICAgICBib29sIHdwX2FzeW5jKVxcbjIxMTM6XFx0e1xcbjIxMTQ6XFx0XFx0Y29uc3Qgc3RydWN0IHZtX3VmZmRfb3BzICpvcHMgPSB2bWFfdWZmZF9vcHModm1hKTtcXG4yMTE1OlxcdFxcbjIxMTY6XFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiAoVk1fRFJPUFBBQkxFIHwgVk1fU0hBRE9XX1NUQUNLKSlcXG4yMTE3OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4yMTE4OlxcdFxcbjIxMTk6XFx0XFx0aWYgKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSBcXHUwMDI2XFx1MDAyNiAodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NQRUNJQUwpKVxcbjIxMjA6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbjIxMjE6XFx0XFxuMjEyMjpcXHRcXHR2bV9mbGFncyBcXHUwMDI2PSBfX1ZNX1VGRkRfRkxBR1M7XFxuMjEyMzpcXHRcXG4yMTI0OlxcdFxcdC8qXFxuMjEyNTpcXHRcXHQgKiBJZiBXUCBpcyB0aGUgb25seSBtb2RlIGVuYWJsZWQgYW5kIGNvbnRleHQgaXMgd3AgYXN5bmMsIGFsbG93IGFueVxcbjIxMjY6XFx0XFx0ICogbWVtb3J5IHR5cGUuXFxuMjEyNzpcXHRcXHQgKi9cXG4yMTI4OlxcdFxcdGlmICh3cF9hc3luYyBcXHUwMDI2XFx1MDAyNiAodm1fZmxhZ3MgPT0gVk1fVUZGRF9XUCkpXFxuMjEyOTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4yMTMwOlxcdFxcbjIxMzE6XFx0XFx0LyogRm9yIGFueSBvdGhlciBtb2RlIHJlamVjdCBWTUFzIHRoYXQgZG9uJ3QgaW1wbGVtZW50IHZtX3VmZmRfb3BzICovXFxuMjEzMjpcXHRcXHRpZiAoIW9wcylcXG4yMTMzOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MzAuMjIxOTQ5NDc0WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3ODY5NTk0ODc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIHRoZSBgbW92ZV9wYWdlc2AgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gdHJhY2luZyB0aHJvdWdoIHRoaXMgcGF0Y2ggYW5kIGl0cyBpbXBsaWNhdGlvbnMuIFRoZSBjb3JlIGlzc3VlIGlzIHRoYXQgYGVycmAgaXNuJ3QgYmVpbmcgcmVzZXQgcHJvcGVybHkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBtb3ZlX3BhZ2VzX3B0ZXNgIGNhbGwuIFRoaXMgY3JlYXRlcyBhIGNvbnRyb2wgZmxvdyBwcm9ibGVtLCBhbmQgaXQncyBtYWtpbmcgbWUgd29uZGVyIGlmIEtNU0FOIGlzIG5lY2Vzc2FyeSBmb3IgZGV0ZWN0aW5nIGl0LlxuXG5MZXQncyBicmVhayBpdCBkb3duLiBCZWZvcmUgdGhlIGxvb3AsIGBlcnJgIGlzIGluaXRpYWxpemVkIHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYHZhbGlkYXRlX21vdmVfYXJlYXNgLiBJbnNpZGUgdGhlIGxvb3AsIGBlcnJgIGNhbiBiZSBzZXQgdG8gYC1FQUdBSU5gIGlmIGBtb3ZlX3BhZ2VzX2h1Z2VfcG1kYCBmYWlscy4gVGhlIHByb2JsZW1hdGljIHBhcnQgaXMgd2hhdCBoYXBwZW5zIG5leHQuIElmIGBlcnJgICppcyogYC1FQUdBSU5gLCB0aGUgY29kZSAqY29udGludWVzKiB0byB0aGUgbmV4dCBpdGVyYXRpb24uIE5vdywgaWYgdGhlIGNvZGUgc3VjY2Vzc2Z1bGx5IGNhbGxzIGBtb3ZlX3BhZ2VzX3B0ZXNgIGluIHRoYXQgbmV4dCBpdGVyYXRpb24gYW5kIGdldHMgYSBwb3NpdGl2ZSByZXR1cm4gdmFsdWUsIHRoZSBgZXJyYCB2YXJpYWJsZSBpcyAqc3RpbGwqIGAtRUFHQUlOYC5cblxuVGhlIHByb2JsZW0gaXMgdGhlIGBpZiAoZXJyKSB7IGlmIChlcnIgPT0gLUVBR0FJTikgY29udGludWU7IGJyZWFrOyB9YCBsaW5lLiBTaW5jZSBgZXJyYCBzdGF5cyBgLUVBR0FJTmAsIHRoZSBjb2RlIGVudGVycyBhbiBpbmZpbml0ZSBsb29wLiBJdCB3aWxsIGNvbnRpbnVlLCBza2lwIGFkdmFuY2luZyB0aGUgYWRkcmVzc2VzLCBhbmQgcmUtYXR0ZW1wdCB0byBtb3ZlIHRoZSBzYW1lIHBhZ2UsIHdoaWNoIGNvdWxkIGxlYWQgdG8gYW4gaW5jb3JyZWN0IGVycm9yIGNvZGUgYmVpbmcgcmV0dXJuZWQgb3IgdGhlIGxvb3AgYmVpbmcgdGVybWluYXRlZCBiZWNhdXNlIHN1YnNlcXVlbnQgYXR0ZW1wdHMgdG8gbW92ZSB0aGUgc2FtZSBwYWdlIHdpbGwgbW9zdCBsaWtlbHkgZmFpbC4gVGhpcyBsb29wIHdpbGwgbm90IHRlcm1pbmF0ZS5cblxuVGhlIHF1ZXN0aW9uIHRoZW4gYmVjb21lczogaXMgdGhpcyBhIEtNU0FOIGlzc3VlPyBMZXQncyBjaGVjayBhZ2FpbnN0IHRoZSBLTVNBTiBydWxlcy4gTm8sIHRoaXMgaXNuJ3QgYWJvdXQgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIG9yIGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gVGhpcyBpcyBhIGxvZ2ljIGJ1ZzogYSBjb250cm9sIGZsb3cgZXJyb3IuIGByZXRgIGFuZCBgZXJyYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGludm9sdmVkLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgS0FTQU4sIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3Rpb24gd2lsbCBmbGFnIHRoZSBpbmZpbml0ZSBsb29wLiBUaGlzIGlzbid0IGEgY2FzZSB3aGVyZSBLTVNBTiBvZmZlcnMgYW55IHVuaXF1ZSBhZHZhbnRhZ2UuIFRoZSBwYXRjaCBtb2RpZmllcyBjb25kaXRpb25hbCBsb2dpYywgYnV0IG5vdCBpbiBhIHdheSB0aGF0IGNyZWF0ZXMgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmUuIEknbSBjb25maWRlbnQgaW4gc2F5aW5nIHRoYXQgS01TQU4gaXMgbm90IG5lY2Vzc2FyeSBoZXJlLiBUaGlzIGlzIGEgcHVyZSBsb2dpYyBlcnJvciwgYW5kIEtBU0FOIHdpbGwgY2F0Y2ggdGhlIGluZmluaXRlIGxvb3Agb3Igb3RoZXIgbG9naWMgZXJyb3JzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2OTQ5LCJPdXRwdXRUb2tlbnMiOjIxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4MDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1Mjo0OC4wOTE1NDc4MzJaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTAyOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIGBtb3ZlX3BhZ2VzKClgIHdoZXJlIHRoZSBgZXJyYCB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVfcGFnZXNfcHRlcygpYC4gSWYgYGVycmAgd2FzIHByZXZpb3VzbHkgc2V0IHRvIGAtRUFHQUlOYCAoZS5nLiwgZnJvbSBhIHByaW9yIGZhaWxlZCBgbW92ZV9wYWdlc19odWdlX3BtZCgpYCBhdHRlbXB0IHRoYXQgdHJpZ2dlcmVkIGEgYGNvbnRpbnVlYCksIGl0IHdvdWxkIHJlbWFpbiBgLUVBR0FJTmAuIFRoaXMgd291bGQgY2F1c2UgdGhlIGxvb3AgdG8gaW5jb3JyZWN0bHkgc2tpcCBhZHZhbmNpbmcgdGhlIGBzcmNfYWRkcmAgYW5kIGBkc3RfYWRkcmAgcG9pbnRlcnMgYW5kIGBjb250aW51ZWAgYWdhaW4sIGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmV0dXJucy5cXG5cXG5UaGlzIGlzIGEgY29udHJvbCBmbG93IGFuZCBlcnJvciBoYW5kbGluZyBidWcuIEl0IGRvZXMgbm90IGludm9sdmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkaW5nIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTiBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0b3JzLCBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIHN1Y2ggaGFuZ3Mgb3IgbG9naWMgZXJyb3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIGBtb3ZlX3BhZ2VzKClgIHdoZXJlIHRoZSBgZXJyYCB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVfcGFnZXNfcHRlcygpYC4gSWYgYGVycmAgd2FzIHByZXZpb3VzbHkgc2V0IHRvIGAtRUFHQUlOYCAoZS5nLiwgZnJvbSBhIHByaW9yIGZhaWxlZCBgbW92ZV9wYWdlc19odWdlX3BtZCgpYCBhdHRlbXB0IHRoYXQgdHJpZ2dlcmVkIGEgYGNvbnRpbnVlYCksIGl0IHdvdWxkIHJlbWFpbiBgLUVBR0FJTmAuIFRoaXMgd291bGQgY2F1c2UgdGhlIGxvb3AgdG8gaW5jb3JyZWN0bHkgc2tpcCBhZHZhbmNpbmcgdGhlIGBzcmNfYWRkcmAgYW5kIGBkc3RfYWRkcmAgcG9pbnRlcnMgYW5kIGBjb250aW51ZWAgYWdhaW4sIGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmV0dXJucy5cXG5cXG5UaGlzIGlzIGEgY29udHJvbCBmbG93IGFuZCBlcnJvciBoYW5kbGluZyBidWcuIEl0IGRvZXMgbm90IGludm9sdmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkaW5nIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTiBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0b3JzLCBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIHN1Y2ggaGFuZ3Mgb3IgbG9naWMgZXJyb3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflow62hb9[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-15 10:50:16 +0000 UTC FinishedAt: 2026-08-15 10:52:50 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "62cc90241548d5570ee68e01aaba6506964e9811", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "USERFAULTFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "62cc90241548d5570ee68e01aaba6506964e9811", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "USERFAULTFD" ], "series_id": "c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "userfaultfd_ioctl" ], "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+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1VTRVJGQVVMVEZEJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dXNlcmZhdWx0ZmRfaW9jdGwmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiBgbW92ZV9wYWdlcygpYCB3aGVyZSB0aGUgYGVycmAgdmFyaWFibGUgd2FzIG5vdCByZXNldCB0byAwIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGBtb3ZlX3BhZ2VzX3B0ZXMoKWAuIElmIGBlcnJgIHdhcyBwcmV2aW91c2x5IHNldCB0byBgLUVBR0FJTmAgKGUuZy4sIGZyb20gYSBwcmlvciBmYWlsZWQgYG1vdmVfcGFnZXNfaHVnZV9wbWQoKWAgYXR0ZW1wdCB0aGF0IHRyaWdnZXJlZCBhIGBjb250aW51ZWApLCBpdCB3b3VsZCByZW1haW4gYC1FQUdBSU5gLiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBsb29wIHRvIGluY29ycmVjdGx5IHNraXAgYWR2YW5jaW5nIHRoZSBgc3JjX2FkZHJgIGFuZCBgZHN0X2FkZHJgIHBvaW50ZXJzIGFuZCBgY29udGludWVgIGFnYWluLCBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJldHVybnMuXG5cblRoaXMgaXMgYSBjb250cm9sIGZsb3cgYW5kIGVycm9yIGhhbmRsaW5nIGJ1Zy4gSXQgZG9lcyBub3QgaW52b2x2ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRpbmcgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgaW5jbHVkaW5nIEtBU0FOIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3RvcnMsIGlzIHN1ZmZpY2llbnQgdG8gY2F0Y2ggc3VjaCBoYW5ncyBvciBsb2dpYyBlcnJvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgYnVnIGluIHRoZSBVRkZESU9fTU9WRSBpb2N0bCBoYW5kbGVyIHdoZXJlIGEgcHJldmlvdXNseSBzZXQgZXJyb3IgY29kZSAobGlrZSAtRUFHQUlOKSB3YXMgbm90IGNsZWFyZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhZ2UgbW92ZSwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBhbiBpbmZpbml0ZSBsb29wIG9yIGluY29ycmVjdCBlcnJvciByZXBvcnRpbmcuIFRoaXMgaXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgN2ZhNGVmNWFiMjFjMTZmYTg5YmI1NjBmZTgxMjViODBjMTQxYTU5YlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDE1IDEwOjUxOjM1IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jXG5pbmRleCBjM2FkZWRhYWY3ZDU0Li41OTVlN2UyMzJmOTAxIDEwMDY0NFxuLS0tIGEvbW0vdXNlcmZhdWx0ZmQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vdXNlcmZhdWx0ZmQuY1xuQEAgLTIwNjksMTAgJiM0MzsyMDY5LDEyIEBAIHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcbiBcdFx0XHRyZXQgPSBtb3ZlX3BhZ2VzX3B0ZXMobW0sIGRzdF9wbWQsIHNyY19wbWQsXG4gXHRcdFx0XHRcdCAgICAgIGRzdF92bWEsIHNyY192bWEsIGRzdF9hZGRyLFxuIFx0XHRcdFx0XHQgICAgICBzcmNfYWRkciwgc3JjX2VuZCAtIHNyY19hZGRyLCBtb2RlKTtcbi1cdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4gXHRcdFx0XHRlcnIgPSByZXQ7XG4tXHRcdFx0ZWxzZVxuJiM0MztcdFx0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRcdGVyciA9IDA7XG4gXHRcdFx0XHRzdGVwX3NpemUgPSByZXQ7XG4mIzQzO1x0XHRcdH1cbiBcdFx0fVxuIFxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1c2VyZmF1bHRmZF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDdmYTRlZjVhYjIxYzE2ZmE4OWJiNTYwZmU4MTI1YjgwYzE0MWE1OWIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAxNSAxMDo1MTozNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jCmluZGV4IGMzYWRlZGFhZjdkNTQuLjU5NWU3ZTIzMmY5MDEgMTAwNjQ0Ci0tLSBhL21tL3VzZXJmYXVsdGZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vdXNlcmZhdWx0ZmQuYwpAQCAtMjA2OSwxMCAmIzQzOzIwNjksMTIgQEAgc3RhdGljIHNzaXplX3QgbW92ZV9wYWdlcyhzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgZHN0X3N0YXJ0LAogCQkJcmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLAogCQkJCQkgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkciwKIAkJCQkJICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7Ci0JCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlpZiAocmV0ICZsdDsgMCkgewogCQkJCWVyciA9IHJldDsKLQkJCWVsc2UKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQllcnIgPSAwOwogCQkJCXN0ZXBfc2l6ZSA9IHJldDsKJiM0MzsJCQl9CiAJCX0KIAogCQljb25kX3Jlc2NoZWQoKTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjAyOQoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDExNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBVc2VyZmF1bHRmZCBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG1tL3VzZXJmYXVsdGZkLmNgLiBJbW1lZGlhdGVseSwgSSBzZWUgYSBzaW1wbGUsIGFsbW9zdCB0cml2aWFsLCBjb2RlIGNoYW5nZS4gVGhleSYjMzk7dmUgd3JhcHBlZCB0aGUgYGlmIChyZXQgJmx0OyAwKWAgYmxvY2sgd2l0aCBjdXJseSBicmFjZXMgYW5kLCBpbXBvcnRhbnRseSwgYWRkZWQgYGVyciA9IDA7YCB3aXRoaW4gdGhlIGBlbHNlYCBibG9jay4gTXkgaW5pdGlhbCByZWFjdGlvbiBpcywgJiMzNDtXaHk/JiMzNDsgSXQgbG9va3MgbGlrZSB0aGV5JiMzOTtyZSBleHBsaWNpdGx5IHNldHRpbmcgdGhlIGBlcnJgIHZhcmlhYmxlIHRvIHplcm8gaWYgdGhlIGByZXRgIGZyb20gc29tZSBmdW5jdGlvbiBjYWxsIGlzbiYjMzk7dCBhbiBlcnJvci4gVGhpcyBkZWZpbml0ZWx5IHJlcXVpcmVzIGEgY2xvc2VyIGxvb2suIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYHJldGAgcmVwcmVzZW50cyBhbmQgd2hhdCBgbW92ZV9wYWdlc2AgaXMgZG9pbmcgaW4gdGhpcyBjb250ZXh0IHRvIGZpZ3VyZSBvdXQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZS4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBgbW92ZV9wYWdlc2AgZnVuY3Rpb24gaW4gYG1tL3VzZXJmYXVsdGZkLmNgIGFuZCBzZWUgaWYgdGhlIGNvbnRleHQgY2xhcmlmaWVzIHRoZSByZWFzb25pbmcgYmVoaW5kIHplcm9pbmcgb3V0IHRoZSBgZXJyYCB2YWx1ZS4gSXQgc2VlbXMgb2RkIHRoYXQgdGhlIGVycm9yIHZhcmlhYmxlIGlzIGJlaW5nIGFzc2lnbmVkIDAgaW4gYSBub24tZXJyb3IgY29uZGl0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21vdmVfcGFnZXMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3VzZXJmYXVsdGZkLmM9MTM4Mj1zdGF0aWMgaW50IG1vdmVfemVyb3BhZ2VfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMTQxNC0gKi9cbm1tL3VzZXJmYXVsdGZkLmM6MTQxNTpzdGF0aWMgbG9uZyBtb3ZlX3BhZ2VzX3B0ZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpkc3RfcG1kLCBwbWRfdCAqc3JjX3BtZCxcbm1tL3VzZXJmYXVsdGZkLmMtMTQxNi1cdFx0XHQgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3Rfdm1hLFxuLS1cbm1tL3VzZXJmYXVsdGZkLmM9MTg1OT1zdGF0aWMgdm9pZCB1ZmZkX21vdmVfdW5sb2NrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0X3ZtYSxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE4NjctLyoqXG5tbS91c2VyZmF1bHRmZC5jOjE4Njg6ICogbW92ZV9wYWdlcyAtIG1vdmUgYXJiaXRyYXJ5IGFub255bW91cyBwYWdlcyBvZiBhbiBleGlzdGluZyB2bWFcbm1tL3VzZXJmYXVsdGZkLmMtMTg2OS0gKiBAY3R4OiBwb2ludGVyIHRvIHRoZSB1c2VyZmF1bHRmZCBjb250ZXh0XG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xODc2LSAqXG5tbS91c2VyZmF1bHRmZC5jOjE4Nzc6ICogbW92ZV9wYWdlcygpIHJlbWFwcyBhcmJpdHJhcnkgYW5vbnltb3VzIHBhZ2VzIGF0b21pY2FsbHkgaW4gemVyb1xubW0vdXNlcmZhdWx0ZmQuYy0xODc4LSAqIGNvcHkuIEl0IG9ubHkgd29ya3Mgb24gbm9uIHNoYXJlZCBhbm9ueW1vdXMgcGFnZXMgYmVjYXVzZSB0aG9zZSBjYW5cbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE4ODgtICogc3RvcmFnZSBvciBhbnkgb3RoZXIgSS9PIGRldmljZSAoTUFEVl9ET05URk9SSyBpbiB0aGUgc291cmNlIHZtYVxubW0vdXNlcmZhdWx0ZmQuYzoxODg5OiAqIGF2b2lkcyBtb3ZlX3BhZ2VzKCkgdG8gZmFpbCB3aXRoIC1FQlVTWSBpZiB0aGUgcHJvY2VzcyBmb3JrcyBiZWZvcmVcbm1tL3VzZXJmYXVsdGZkLmM6MTg5MDogKiBtb3ZlX3BhZ2VzKCkgaXMgY2FsbGVkKSwgdGhlbiBpdCB3aWxsIGNhbGwgbW92ZV9wYWdlcygpIHRvIG1hcCB0aGVcbm1tL3VzZXJmYXVsdGZkLmMtMTg5MS0gKiBwYWdlIGluIHRoZSBmYXVsdGluZyBhZGRyZXNzIGluIHRoZSBkZXN0aW5hdGlvbiB2bWEuXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xOTA1LSAqIHRoZSBkZXN0aW5hdGlvbiB2aXJ0dWFsIG1lbW9yeSByYW5nZSBpcyBub3QgYSB3aG9sZSB1bm1hcHBlZCBob2xlLFxubW0vdXNlcmZhdWx0ZmQuYzoxOTA2OiAqIG1vdmVfcGFnZXMoKSB3aWxsIGZhaWwgcmVzcGVjdGl2ZWx5IHdpdGggLUVOT0VOVCBvciAtRUVYSVNULiBUaGlzXG5tbS91c2VyZmF1bHRmZC5jLTE5MDctICogcHJvdmlkZXMgYSB2ZXJ5IHN0cmljdCBiZWhhdmlvciB0byBhdm9pZCBhbnkgY2hhbmNlIG9mIG1lbW9yeVxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMTkxMC0gKiB0aW1lIGZvciBhbnkgZ2l2ZW4gZmF1bHRpbmcgYWRkcmVzcy4gVGhpcyBtZWFucyB0aGF0IGlmIHR3byB0aHJlYWRzXG5tbS91c2VyZmF1bHRmZC5jOjE5MTE6ICogdHJ5IHRvIGJvdGggY2FsbCBtb3ZlX3BhZ2VzKCkgb24gdGhlIHNhbWUgZGVzdGluYXRpb24gYWRkcmVzcyBhdCB0aGVcbm1tL3VzZXJmYXVsdGZkLmMtMTkxMi0gKiBzYW1lIHRpbWUsIHRoZSBzZWNvbmQgdGhyZWFkIHdpbGwgZ2V0IGFuIGV4cGxpY2l0IGVycm9yIGZyb20gdGhpc1xuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMTkyMC0gKiBhbiBhbW91bnQgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5IG1vdmVkLiBJZiB0aGUgcmV0dmFsIHJlcG9ydHMgYVxubW0vdXNlcmZhdWx0ZmQuYzoxOTIxOiAqIFwmIzM0O3Nob3J0XCYjMzQ7IHJlbWFwLCB0aGUgbW92ZV9wYWdlcygpIGNvbW1hbmQgc2hvdWxkIGJlIHJlcGVhdGVkIGJ5XG5tbS91c2VyZmF1bHRmZC5jLTE5MjItICogdXNlcmxhbmQgd2l0aCBzcmMmIzQzO3JldHZhbCwgZHN0JiM0MztyZXZhbCwgbGVuLXJldHZhbCBpZiBpdCB3YW50cyB0byBrbm93XG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xOTMzLSAqL1xubW0vdXNlcmZhdWx0ZmQuYzoxOTM0OnN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcbm1tL3VzZXJmYXVsdGZkLmMtMTkzNS1cdFx0ICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBfX3U2NCBtb2RlKVxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMjAxNC1cdFx0ICogYmUgc3RyaWN0LiBJZiBkc3RfcG1kIGNoYW5nZXMgaW50byBUUEggYWZ0ZXIgdGhpcyBjaGVjaywgdGhlXG5tbS91c2VyZmF1bHRmZC5jOjIwMTU6XHRcdCAqIG1vdmVfcGFnZXNfaHVnZV9wbWQoKSB3aWxsIGRldGVjdCB0aGUgY2hhbmdlIGFuZCByZXRyeVxubW0vdXNlcmZhdWx0ZmQuYzoyMDE2Olx0XHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXG5tbS91c2VyZmF1bHRmZC5jLTIwMTctXHRcdCAqL1xuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMjA0MS1cdFx0XHRcdHNwbGl0X2h1Z2VfcG1kKHNyY192bWEsIHNyY19wbWQsIHNyY19hZGRyKTtcbm1tL3VzZXJmYXVsdGZkLmM6MjA0MjpcdFx0XHRcdC8qIFRoZSBmb2xpbyB3aWxsIGJlIHNwbGl0IGJ5IG1vdmVfcGFnZXNfcHRlKCkgKi9cbm1tL3VzZXJmYXVsdGZkLmMtMjA0My1cdFx0XHRcdGNvbnRpbnVlO1xuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMjA0NS1cbm1tL3VzZXJmYXVsdGZkLmM6MjA0NjpcdFx0XHRlcnIgPSBtb3ZlX3BhZ2VzX2h1Z2VfcG1kKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxubW0vdXNlcmZhdWx0ZmQuYy0yMDQ3LVx0XHRcdFx0XHRcdCAgZHN0X3BtZHZhbCwgZHN0X3ZtYSwgc3JjX3ZtYSxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTIwNjgtXG5tbS91c2VyZmF1bHRmZC5jOjIwNjk6XHRcdFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxubW0vdXNlcmZhdWx0ZmQuYy0yMDcwLVx0XHRcdFx0XHQgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkcixcbi0tXG5tbS91c2VyZmF1bHRmZC5jPTQyMTY9c3RhdGljIGludCB1c2VyZmF1bHRmZF9tb3ZlKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTQyNTUtXHRpZiAobW1nZXRfbm90X3plcm8obW0pKSB7XG5tbS91c2VyZmF1bHRmZC5jOjQyNTY6XHRcdHJldCA9IG1vdmVfcGFnZXMoY3R4LCB1ZmZkaW9fbW92ZS5kc3QsIHVmZmRpb19tb3ZlLnNyYyxcbm1tL3VzZXJmYXVsdGZkLmMtNDI1Ny1cdFx0XHRcdCB1ZmZkaW9fbW92ZS5sZW4sIHVmZmRpb19tb3ZlLm1vZGUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM2ODgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYG1vdmVfcGFnZXNgIGluIGBtbS91c2VyZmF1bHRmZC5jYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG1vdmVfcGFnZXNgIGlzIGhhbmRsaW5nIHRoaW5ncyBpbiB0aGUgY29udGV4dCBvZiB1c2VyZmF1bHRmZC4gVGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbCBmb3IgaG93IHdlIG1hbmFnZSBwYWdlIG1pZ3JhdGlvbiBhbmQgdHJhbnNmZXIsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdXNlci1zcGFjZSBtZW1vcnkgYWNjZXNzIGZhdWx0cy4gSSB3YW50IHRvIHNlZSBob3cgdGhlIGtlcm5lbCBvcmNoZXN0cmF0ZXMgdGhpcyB3aG9sZSBkYW5jZSBiZXR3ZWVuIHVzZXIgc3BhY2UgYW5kIGtlcm5lbCBzcGFjZS4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGludGVyZXN0ZWQgaW4gdGhlIGludGVycGxheSBiZXR3ZWVuIGB1c2VyZmF1bHRmZGAgYW5kIHRoZSBwYWdlIG1pZ3JhdGlvbiBtYWNoaW5lcnkuIEhvdyBkb2VzIGl0IGtub3cgd2hlcmUgcGFnZXMgYXJlLCBhbmQgaG93IGRvZXMgaXQgZGlyZWN0IHRoZW0gd2hlcmUgdGhleSBuZWVkIHRvIGdvPyBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIGEgZGVsaWNhdGUgYmFsYW5jaW5nIGFjdCBoZXJlLCBlbnN1cmluZyBkYXRhIGludGVncml0eSB3aGlsZSBtaW5pbWl6aW5nIHRoZSBwZXJmb3JtYW5jZSBoaXQgb2YgcGFnZSBmYXVsdHMuIExldCYjMzk7cyBzZWUgaG93IHRoZXkgZG8gaXQuIEkmIzM5O20gbG9va2luZyBmb3IgdGhlIGtleSBsb2NraW5nIHByaW1pdGl2ZXMsIGVycm9yIGhhbmRsaW5nIHBhdGhzLCBhbmQgdGhlIG92ZXJhbGwgbG9naWMgZmxvdy4gVGhpcyBjb3VsZCBnaXZlIG1lIHNvbWUgZ3JlYXQgaW5zaWdodHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTkzNCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkzNDpcdHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcbjE5MzU6XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBfX3U2NCBtb2RlKVxuMTkzNjpcdHtcbjE5Mzc6XHRcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3R4LVx1MDAzZW1tO1xuMTkzODpcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICpzcmNfdm1hLCAqZHN0X3ZtYTtcbjE5Mzk6XHRcdHVuc2lnbmVkIGxvbmcgc3JjX2FkZHIsIGRzdF9hZGRyLCBzcmNfZW5kO1xuMTk0MDpcdFx0cG1kX3QgKnNyY19wbWQsICpkc3RfcG1kO1xuMTk0MTpcdFx0bG9uZyBlcnIgPSAtRUlOVkFMO1xuMTk0MjpcdFx0c3NpemVfdCBtb3ZlZCA9IDA7XG4xOTQzOlx0XG4xOTQ0Olx0XHQvKiBTYW5pdGl6ZSB0aGUgY29tbWFuZCBwYXJhbWV0ZXJzLiAqL1xuMTk0NTpcdFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCBcdTAwMjYgflBBR0VfTUFTSyk7XG4xOTQ2Olx0XHRWTV9XQVJOX09OX09OQ0UoZHN0X3N0YXJ0IFx1MDAyNiB+UEFHRV9NQVNLKTtcbjE5NDc6XHRcdFZNX1dBUk5fT05fT05DRShsZW4gXHUwMDI2IH5QQUdFX01BU0spO1xuMTk0ODpcdFxuMTk0OTpcdFx0LyogRG9lcyB0aGUgYWRkcmVzcyByYW5nZSB3cmFwLCBvciBpcyB0aGUgc3BhbiB6ZXJvLXNpemVkPyAqL1xuMTk1MDpcdFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCAmIzQzOyBsZW4gXHUwMDNjIHNyY19zdGFydCk7XG4xOTUxOlx0XHRWTV9XQVJOX09OX09OQ0UoZHN0X3N0YXJ0ICYjNDM7IGxlbiBcdTAwM2MgZHN0X3N0YXJ0KTtcbjE5NTI6XHRcbjE5NTM6XHRcdGVyciA9IHVmZmRfbW92ZV9sb2NrKG1tLCBkc3Rfc3RhcnQsIHNyY19zdGFydCwgXHUwMDI2ZHN0X3ZtYSwgXHUwMDI2c3JjX3ZtYSk7XG4xOTU0Olx0XHRpZiAoZXJyKVxuMTk1NTpcdFx0XHRnb3RvIG91dDtcbjE5NTY6XHRcbjE5NTc6XHRcdC8qIFJlLWNoZWNrIGFmdGVyIHRha2luZyBtYXBfY2hhbmdpbmdfbG9jayAqL1xuMTk1ODpcdFx0ZXJyID0gLUVBR0FJTjtcbjE5NTk6XHRcdGRvd25fcmVhZChcdTAwMjZjdHgtXHUwMDNlbWFwX2NoYW5naW5nX2xvY2spO1xuMTk2MDpcdFx0aWYgKGxpa2VseShhdG9taWNfcmVhZChcdTAwMjZjdHgtXHUwMDNlbW1hcF9jaGFuZ2luZykpKVxuMTk2MTpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4xOTYyOlx0XHQvKlxuMTk2MzpcdFx0ICogTWFrZSBzdXJlIHRoZSB2bWEgaXMgbm90IHNoYXJlZCwgdGhhdCB0aGUgc3JjIGFuZCBkc3QgcmVtYXBcbjE5NjQ6XHRcdCAqIHJhbmdlcyBhcmUgYm90aCB2YWxpZCBhbmQgZnVsbHkgd2l0aGluIGEgc2luZ2xlIGV4aXN0aW5nXG4xOTY1Olx0XHQgKiB2bWEuXG4xOTY2Olx0XHQgKi9cbjE5Njc6XHRcdGVyciA9IC1FSU5WQUw7XG4xOTY4Olx0XHRpZiAoc3JjX3ZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fU0hBUkVEKVxuMTk2OTpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4xOTcwOlx0XHRpZiAoc3JjX3N0YXJ0ICYjNDM7IGxlbiBcdTAwM2Ugc3JjX3ZtYS1cdTAwM2V2bV9lbmQpXG4xOTcxOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbjE5NzI6XHRcbjE5NzM6XHRcdGlmIChkc3Rfdm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9TSEFSRUQpXG4xOTc0Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbjE5NzU6XHRcdGlmIChkc3Rfc3RhcnQgJiM0MzsgbGVuIFx1MDAzZSBkc3Rfdm1hLVx1MDAzZXZtX2VuZClcbjE5NzY6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTk3NzpcdFxuMTk3ODpcdFx0ZXJyID0gdmFsaWRhdGVfbW92ZV9hcmVhcyhjdHgsIHNyY192bWEsIGRzdF92bWEpO1xuMTk3OTpcdFx0aWYgKGVycilcbjE5ODA6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTk4MTpcdFxuMTk4MjpcdFx0Zm9yIChzcmNfYWRkciA9IHNyY19zdGFydCwgZHN0X2FkZHIgPSBkc3Rfc3RhcnQsIHNyY19lbmQgPSBzcmNfc3RhcnQgJiM0MzsgbGVuO1xuMTk4MzpcdFx0ICAgICBzcmNfYWRkciBcdTAwM2Mgc3JjX2VuZDspIHtcbjE5ODQ6XHRcdFx0c3BpbmxvY2tfdCAqcHRsO1xuMTk4NTpcdFx0XHRwbWRfdCBkc3RfcG1kdmFsO1xuMTk4NjpcdFx0XHR1bnNpZ25lZCBsb25nIHN0ZXBfc2l6ZTtcbjE5ODc6XHRcbjE5ODg6XHRcdFx0LypcbjE5ODk6XHRcdFx0ICogQmVsb3cgd29ya3MgYmVjYXVzZSBhbm9ueW1vdXMgYXJlYSB3b3VsZCBub3QgaGF2ZSBhXG4xOTkwOlx0XHRcdCAqIHRyYW5zcGFyZW50IGh1Z2UgUFVELiBJZiBmaWxlLWJhY2tlZCBzdXBwb3J0IGlzIGFkZGVkLFxuMTk5MTpcdFx0XHQgKiB0aGF0IGNhc2Ugd291bGQgbmVlZCB0byBiZSBoYW5kbGVkIGhlcmUuXG4xOTkyOlx0XHRcdCAqL1xuMTk5MzpcdFx0XHRzcmNfcG1kID0gbW1fZmluZF9wbWQobW0sIHNyY19hZGRyKTtcbjE5OTQ6XHRcdFx0aWYgKHVubGlrZWx5KCFzcmNfcG1kKSkge1xuMTk5NTpcdFx0XHRcdGlmICghKG1vZGUgXHUwMDI2IFVGRkRJT19NT1ZFX01PREVfQUxMT1dfU1JDX0hPTEVTKSkge1xuMTk5NjpcdFx0XHRcdFx0ZXJyID0gLUVOT0VOVDtcbjE5OTc6XHRcdFx0XHRcdGJyZWFrO1xuMTk5ODpcdFx0XHRcdH1cbjE5OTk6XHRcdFx0XHRzcmNfcG1kID0gbW1fYWxsb2NfcG1kKG1tLCBzcmNfYWRkcik7XG4yMDAwOlx0XHRcdFx0aWYgKHVubGlrZWx5KCFzcmNfcG1kKSkge1xuMjAwMTpcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbjIwMDI6XHRcdFx0XHRcdGJyZWFrO1xuMjAwMzpcdFx0XHRcdH1cbjIwMDQ6XHRcdFx0fVxuMjAwNTpcdFx0XHRkc3RfcG1kID0gbW1fYWxsb2NfcG1kKG1tLCBkc3RfYWRkcik7XG4yMDA2Olx0XHRcdGlmICh1bmxpa2VseSghZHN0X3BtZCkpIHtcbjIwMDc6XHRcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMjAwODpcdFx0XHRcdGJyZWFrO1xuMjAwOTpcdFx0XHR9XG4yMDEwOlx0XG4yMDExOlx0XHRcdGRzdF9wbWR2YWwgPSBwbWRwX2dldF9sb2NrbGVzcyhkc3RfcG1kKTtcbjIwMTI6XHRcdFx0LypcbjIwMTM6XHRcdFx0ICogSWYgdGhlIGRzdF9wbWQgaXMgbWFwcGVkIGFzIFRIUCBkb24mIzM5O3Qgb3ZlcnJpZGUgaXQgYW5kIGp1c3RcbjIwMTQ6XHRcdFx0ICogYmUgc3RyaWN0LiBJZiBkc3RfcG1kIGNoYW5nZXMgaW50byBUUEggYWZ0ZXIgdGhpcyBjaGVjaywgdGhlXG4yMDE1Olx0XHRcdCAqIG1vdmVfcGFnZXNfaHVnZV9wbWQoKSB3aWxsIGRldGVjdCB0aGUgY2hhbmdlIGFuZCByZXRyeVxuMjAxNjpcdFx0XHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXG4yMDE3Olx0XHRcdCAqL1xuMjAxODpcdFx0XHRpZiAodW5saWtlbHkocG1kX3RyYW5zX2h1Z2UoZHN0X3BtZHZhbCkpKSB7XG4yMDE5Olx0XHRcdFx0ZXJyID0gLUVFWElTVDtcbjIwMjA6XHRcdFx0XHRicmVhaztcbjIwMjE6XHRcdFx0fVxuMjAyMjpcdFxuMjAyMzpcdFx0XHRwdGwgPSBwbWRfdHJhbnNfaHVnZV9sb2NrKHNyY19wbWQsIHNyY192bWEpO1xuMjAyNDpcdFx0XHRpZiAocHRsKSB7XG4yMDI1Olx0XHRcdFx0LyogQ2hlY2sgaWYgd2UgY2FuIG1vdmUgdGhlIHBtZCB3aXRob3V0IHNwbGl0dGluZyBpdC4gKi9cbjIwMjY6XHRcdFx0XHRpZiAobW92ZV9zcGxpdHNfaHVnZV9wbWQoZHN0X2FkZHIsIHNyY19hZGRyLCBzcmNfc3RhcnQgJiM0MzsgbGVuKSB8fFxuMjAyNzpcdFx0XHRcdCAgICAhcG1kX25vbmUoZHN0X3BtZHZhbCkpIHtcbjIwMjg6XHRcdFx0XHRcdC8qIENhbiBiZSBhIG1pZ3JhdGlvbiBlbnRyeSAqL1xuMjAyOTpcdFx0XHRcdFx0aWYgKHBtZF9wcmVzZW50KCpzcmNfcG1kKSkge1xuMjAzMDpcdFx0XHRcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcG1kX2ZvbGlvKCpzcmNfcG1kKTtcbjIwMzE6XHRcbjIwMzI6XHRcdFx0XHRcdFx0aWYgKCFpc19odWdlX3plcm9fZm9saW8oZm9saW8pIFx1MDAyNlx1MDAyNlxuMjAzMzpcdFx0XHRcdFx0XHQgICAgIVBhZ2VBbm9uRXhjbHVzaXZlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTYyOQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqRGl2aW5nIERlZXBlciBpbnRvIGBtb3ZlX3BhZ2VzYCoqCgpBbHJpZ2h0LCBJJiMzOTt2ZSBnb3QgdGhlIGluaXRpYWwgb3ZlcnZpZXcgb2YgYG1vdmVfcGFnZXNgIGluIG15IGhlYWQuIE5vdywgdGhlIHJlYWwgd29yayBiZWdpbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBudWFuY2VzLCB0aGUgZWRnZSBjYXNlcywgdGhlIHBvdGVudGlhbCBib3R0bGVuZWNrcy4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBtZWF0IG9mIHRoZSBjb2RlLiBNeSBwcmltYXJ5IGZvY3VzIGlzIGxpa2VseSBvbiBob3cgaXQgaGFuZGxlcyBtZW1vcnkgbWFuYWdlbWVudCwgZXNwZWNpYWxseSBpZiB0aGlzIGlzIHJlbGF0ZWQgdG8gYSBwYWdpbmcgc3lzdGVtLCBvciBzb21lIGZvcm0gb2YgdmlydHVhbCBtZW1vcnkuIEkmIzM5O20gbG9va2luZyBmb3Igd2hlcmUgcGFnZSB0YWJsZXMgYXJlIHVwZGF0ZWQsIHdoZXJlIHBoeXNpY2FsIGZyYW1lcyBtaWdodCBiZSBhbGxvY2F0ZWQgb3IgZGVhbGxvY2F0ZWQsIGFuZCBob3cgY29oZXJlbmN5IGlzIG1haW50YWluZWQsIGlmIHRoaXMgb3BlcmF0aW9uIGlzIGhhcHBlbmluZyBjb25jdXJyZW50bHkuIElzIGl0IHRocmVhZC1zYWZlPyBEb2VzIGl0IGVtcGxveSBsb2NrcywgYW5kIGlmIHNvLCBob3cgZ3JhbnVsYXIgYXJlIHRoZXk/IEFueSBkZWFkbG9ja3M/IEFsc28sIHdoYXQgaGFwcGVucyBpbiBhIHNpdHVhdGlvbiBvZiBhbiBvdXQtb2YtbWVtb3J5IGVycm9yLgoKSSB3YW50IHRvIHNlZSB0aGUgZGV0YWlscyBvbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGl0IG1hbmlwdWxhdGVzLiBIb3cgYXJlIHRoZSBwYWdlcyBvcmdhbml6ZWQgYmVmb3JlIHRoZSBtb3ZlPyBJcyBpdCBhIGxpbmtlZCBsaXN0LCBhIGhhc2ggdGFibGUsIGEgdHJlZSBzdHJ1Y3R1cmUsIG9yIHNvbWV0aGluZyBlbHNlPyBVbmRlcnN0YW5kaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcyBpcyBrZXkgdG8gb3B0aW1pemluZyB0aGUgYWxnb3JpdGhtLiBJJiMzOTtsbCBiZSB3YXRjaGluZyBob3cgaXQgaGFuZGxlcyBleGNlcHRpb25zLCBlcnJvciByZWNvdmVyeSwgYW5kIHRoZSBvdmVyYWxsIHJlbGlhYmlsaXR5IG9mIHRoZSBmdW5jdGlvbi4gSXMgaXQgYXRvbWljPyBJJiMzOTttIGFudGljaXBhdGluZyB0aGF0IEkmIzM5O2xsIGJlIG1lbnRhbGx5IG1hcHBpbmcgdGhlIGZ1bmN0aW9uJiMzOTtzIGxvZ2ljIHRvIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIGNhcGFiaWxpdGllcywgcGVyaGFwcyBpbmNsdWRpbmcgdGhlIENQVSYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCB1bml0IGFuZCBhbnkgcmVsZXZhbnQgY2FjaGUgY29uZmlndXJhdGlvbnMuIFVuZGVyc3RhbmRpbmcgdGhlc2UgaW50ZXJhY3Rpb25zIGlzIGNyaXRpY2FsLCBhcyBpdCBoYXMgYSBtYXNzaXZlIHBlcmZvcm1hbmNlIGltcGFjdC4gRmluYWxseSwgSSB3aWxsIGJlIHRoaW5raW5nIG9mIHdheXMgdG8gcmVmYWN0b3IgdGhpcyBmdW5jdGlvbiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLCBtYWludGFpbmFiaWxpdHksIGFuZCByZWFkYWJpbGl0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3VzZXJmYXVsdGZkLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMDM0LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMDM0Olx0XHRcdFx0XHRcdFx0c3Bpbl91bmxvY2socHRsKTtcbjIwMzU6XHRcdFx0XHRcdFx0XHRlcnIgPSAtRUJVU1k7XG4yMDM2Olx0XHRcdFx0XHRcdFx0YnJlYWs7XG4yMDM3Olx0XHRcdFx0XHRcdH1cbjIwMzg6XHRcdFx0XHRcdH1cbjIwMzk6XHRcbjIwNDA6XHRcdFx0XHRcdHNwaW5fdW5sb2NrKHB0bCk7XG4yMDQxOlx0XHRcdFx0XHRzcGxpdF9odWdlX3BtZChzcmNfdm1hLCBzcmNfcG1kLCBzcmNfYWRkcik7XG4yMDQyOlx0XHRcdFx0XHQvKiBUaGUgZm9saW8gd2lsbCBiZSBzcGxpdCBieSBtb3ZlX3BhZ2VzX3B0ZSgpICovXG4yMDQzOlx0XHRcdFx0XHRjb250aW51ZTtcbjIwNDQ6XHRcdFx0XHR9XG4yMDQ1Olx0XG4yMDQ2Olx0XHRcdFx0ZXJyID0gbW92ZV9wYWdlc19odWdlX3BtZChtbSwgZHN0X3BtZCwgc3JjX3BtZCxcbjIwNDc6XHRcdFx0XHRcdFx0XHQgIGRzdF9wbWR2YWwsIGRzdF92bWEsIHNyY192bWEsXG4yMDQ4Olx0XHRcdFx0XHRcdFx0ICBkc3RfYWRkciwgc3JjX2FkZHIpO1xuMjA0OTpcdFx0XHRcdHN0ZXBfc2l6ZSA9IEhQQUdFX1BNRF9TSVpFO1xuMjA1MDpcdFx0XHR9IGVsc2Uge1xuMjA1MTpcdFx0XHRcdGxvbmcgcmV0O1xuMjA1MjpcdFxuMjA1MzpcdFx0XHRcdGlmIChwbWRfbm9uZSgqc3JjX3BtZCkpIHtcbjIwNTQ6XHRcdFx0XHRcdGlmICghKG1vZGUgXHUwMDI2IFVGRkRJT19NT1ZFX01PREVfQUxMT1dfU1JDX0hPTEVTKSkge1xuMjA1NTpcdFx0XHRcdFx0XHRlcnIgPSAtRU5PRU5UO1xuMjA1NjpcdFx0XHRcdFx0XHRicmVhaztcbjIwNTc6XHRcdFx0XHRcdH1cbjIwNTg6XHRcdFx0XHRcdGlmICh1bmxpa2VseShfX3B0ZV9hbGxvYyhtbSwgc3JjX3BtZCkpKSB7XG4yMDU5Olx0XHRcdFx0XHRcdGVyciA9IC1FTk9NRU07XG4yMDYwOlx0XHRcdFx0XHRcdGJyZWFrO1xuMjA2MTpcdFx0XHRcdFx0fVxuMjA2MjpcdFx0XHRcdH1cbjIwNjM6XHRcbjIwNjQ6XHRcdFx0XHRpZiAodW5saWtlbHkocHRlX2FsbG9jKG1tLCBkc3RfcG1kKSkpIHtcbjIwNjU6XHRcdFx0XHRcdGVyciA9IC1FTk9NRU07XG4yMDY2Olx0XHRcdFx0XHRicmVhaztcbjIwNjc6XHRcdFx0XHR9XG4yMDY4Olx0XG4yMDY5Olx0XHRcdFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxuMjA3MDpcdFx0XHRcdFx0XHQgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkcixcbjIwNzE6XHRcdFx0XHRcdFx0ICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7XG4yMDcyOlx0XHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuMjA3MzpcdFx0XHRcdFx0ZXJyID0gcmV0O1xuMjA3NDpcdFx0XHRcdH0gZWxzZSB7XG4yMDc1Olx0XHRcdFx0XHRlcnIgPSAwO1xuMjA3NjpcdFx0XHRcdFx0c3RlcF9zaXplID0gcmV0O1xuMjA3NzpcdFx0XHRcdH1cbjIwNzg6XHRcdFx0fVxuMjA3OTpcdFxuMjA4MDpcdFx0XHRjb25kX3Jlc2NoZWQoKTtcbjIwODE6XHRcbjIwODI6XHRcdFx0aWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7XG4yMDgzOlx0XHRcdFx0LyogRG8gbm90IG92ZXJyaWRlIGFuIGVycm9yICovXG4yMDg0Olx0XHRcdFx0aWYgKCFlcnIgfHwgZXJyID09IC1FQUdBSU4pXG4yMDg1Olx0XHRcdFx0XHRlcnIgPSAtRUlOVFI7XG4yMDg2Olx0XHRcdFx0YnJlYWs7XG4yMDg3Olx0XHRcdH1cbjIwODg6XHRcbjIwODk6XHRcdFx0aWYgKGVycikge1xuMjA5MDpcdFx0XHRcdGlmIChlcnIgPT0gLUVBR0FJTilcbjIwOTE6XHRcdFx0XHRcdGNvbnRpbnVlO1xuMjA5MjpcdFx0XHRcdGJyZWFrO1xuMjA5MzpcdFx0XHR9XG4yMDk0Olx0XG4yMDk1Olx0XHRcdC8qIFByb2NlZWQgdG8gdGhlIG5leHQgcGFnZSAqL1xuMjA5NjpcdFx0XHRkc3RfYWRkciAmIzQzOz0gc3RlcF9zaXplO1xuMjA5NzpcdFx0XHRzcmNfYWRkciAmIzQzOz0gc3RlcF9zaXplO1xuMjA5ODpcdFx0XHRtb3ZlZCAmIzQzOz0gc3RlcF9zaXplO1xuMjA5OTpcdFx0fVxuMjEwMDpcdFxuMjEwMTpcdG91dF91bmxvY2s6XG4yMTAyOlx0XHR1cF9yZWFkKFx1MDAyNmN0eC1cdTAwM2VtYXBfY2hhbmdpbmdfbG9jayk7XG4yMTAzOlx0XHR1ZmZkX21vdmVfdW5sb2NrKGRzdF92bWEsIHNyY192bWEpO1xuMjEwNDpcdG91dDpcbjIxMDU6XHRcdFZNX1dBUk5fT05fT05DRShtb3ZlZCBcdTAwM2MgMCk7XG4yMTA2Olx0XHRWTV9XQVJOX09OX09OQ0UoZXJyIFx1MDAzZSAwKTtcbjIxMDc6XHRcdFZNX1dBUk5fT05fT05DRSghbW92ZWQgXHUwMDI2XHUwMDI2ICFlcnIpO1xuMjEwODpcdFx0cmV0dXJuIG1vdmVkID8gbW92ZWQgOiBlcnI7XG4yMTA5Olx0fVxuMjExMDpcdFxuMjExMTpcdHN0YXRpYyBib29sIHZtYV9jYW5fdXNlcmZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB2bV9mbGFnc190IHZtX2ZsYWdzLFxuMjExMjpcdFx0XHQgICAgICAgYm9vbCB3cF9hc3luYylcbjIxMTM6XHR7XG4yMTE0Olx0XHRjb25zdCBzdHJ1Y3Qgdm1fdWZmZF9vcHMgKm9wcyA9IHZtYV91ZmZkX29wcyh2bWEpO1xuMjExNTpcdFxuMjExNjpcdFx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgKFZNX0RST1BQQUJMRSB8IFZNX1NIQURPV19TVEFDSykpXG4yMTE3Olx0XHRcdHJldHVybiBmYWxzZTtcbjIxMTg6XHRcbjIxMTk6XHRcdGlmICghaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkgXHUwMDI2XHUwMDI2ICh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX1NQRUNJQUwpKVxuMjEyMDpcdFx0XHRyZXR1cm4gZmFsc2U7XG4yMTIxOlx0XG4yMTIyOlx0XHR2bV9mbGFncyBcdTAwMjY9IF9fVk1fVUZGRF9GTEFHUztcbjIxMjM6XHRcbjIxMjQ6XHRcdC8qXG4yMTI1Olx0XHQgKiBJZiBXUCBpcyB0aGUgb25seSBtb2RlIGVuYWJsZWQgYW5kIGNvbnRleHQgaXMgd3AgYXN5bmMsIGFsbG93IGFueVxuMjEyNjpcdFx0ICogbWVtb3J5IHR5cGUuXG4yMTI3Olx0XHQgKi9cbjIxMjg6XHRcdGlmICh3cF9hc3luYyBcdTAwMjZcdTAwMjYgKHZtX2ZsYWdzID09IFZNX1VGRkRfV1ApKVxuMjEyOTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbjIxMzA6XHRcbjIxMzE6XHRcdC8qIEZvciBhbnkgb3RoZXIgbW9kZSByZWplY3QgVk1BcyB0aGF0IGRvbiYjMzk7dCBpbXBsZW1lbnQgdm1fdWZmZF9vcHMgKi9cbjIxMzI6XHRcdGlmICghb3BzKVxuMjEzMzpcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzQyMQoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDc0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBTdWJ0bGUgQnVnIGluIGBtb3ZlX3BhZ2VzYCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYG1vdmVfcGFnZXNgLCBhbmQgbXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdGhhdCBpdCYjMzk7cyBhZGRyZXNzaW5nIGEgcHJldHR5IG5hc3R5IGJ1Zy4gSXQgc2VlbXMgdGhhdCB0aGUgYGVycmAgdmFyaWFibGUsIHdoaWNoIGlzIHVzZWQgdG8gdHJhY2sgZXJyb3JzIGR1cmluZyB0aGUgcGFnZSBtaWdyYXRpb24gcHJvY2Vzcywgd2FzbiYjMzk7dCBiZWluZyBwcm9wZXJseSByZXNldCBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgbW92ZV9wYWdlc19wdGVzYC4gVGhpcyBtZWFucyB0aGF0IGlmIGBtb3ZlX3BhZ2VzX3B0ZXNgIHdvcmtlZCwgYnV0IGEgcHJldmlvdXMgb3BlcmF0aW9uIGluIHRoZSBsb29wIGhhZCBzZXQgYGVycmAgdG8gc29tZXRoaW5nIGxpa2UgYC1FSU5WQUxgIG9yIGAtRUFHQUlOYCwgdGhhdCBuZWdhdGl2ZSBlcnJvciBjb2RlIHdvdWxkIGluY29ycmVjdGx5IHBlcnNpc3QuCgpMZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBJbml0aWFsbHksIGBlcnJgIGlzIHNldCB0byBgLUVJTlZBTGAuIFRoZW4gYHZhbGlkYXRlX21vdmVfYXJlYXNgIGNhbiByZXNldCBpdC4gSW5zaWRlIHRoZSBtYWluIGxvb3AsIGlmIGFuIGVycm9yIGhhcHBlbnMgaW4gYSBmdW5jdGlvbiBsaWtlIGB2YWxpZGF0ZV9tb3ZlX2FyZWFzYCB0aGF0IGlzbiYjMzk7dCBmYXRhbCwgaXQgc2V0cyBgZXJyYCAoZm9yIGV4YW1wbGUsIHRvIGAtRUFHQUlOYCkgYW5kIHBvdGVudGlhbGx5IGNvbnRpbnVlcyBvciBicmVha3MgYmFzZWQgb24gdGhlIGVycm9yLiBJIGhhdmUgdG8gdGhpbmsgdGhyb3VnaCB0aGlzIGNhcmVmdWxseS4gQWgsIEkgc2VlIHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBUaGUgbG9vcCBpdHNlbGYgZG9lc24mIzM5O3QgcmVzZXQgYGVycmAgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGl0ZXJhdGlvbi4gU28sIGlmIGBtb3ZlX3BhZ2VzX3B0ZXNgIHN1Y2NlZWRzIG9uIGFuIGl0ZXJhdGlvbiwgYnV0IGBlcnJgIGhhZCBiZWVuIHNldCB0bywgc2F5LCBgLUVBR0FJTmAgaW4gdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiwgdGhlbiB0aGUgZnVuY3Rpb24gd291bGQgdXNlIHRoYXQgb2xkIGVycm9yIGNvZGUuIFNwZWNpZmljYWxseSwgaWYgYGVycmAgaXMgYC1FQUdBSU5gLCB0aGVuIHdlIGhpdCBgY29udGludWVgIGFuZCBhdm9pZCBpbmNyZW1lbnRpbmcgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuCgpPa2F5LCBzbyB0aGUgYGVyciA9PSAtRUFHQUlOYCBjaGVjayAqY29udGludWVzKiB0aGUgbG9vcCB3aXRob3V0IHVwZGF0aW5nIGBkc3RfYWRkcmAgb3IgYHNyY19hZGRyYCwgbWVhbmluZyBpdCYjMzk7cyBnb2luZyB0byByZXRyeSB0aGUgKnNhbWUqIG1lbW9yeSByZWdpb24gb3ZlciBhbmQgb3ZlciBhZ2FpbiwgaWYgYSB0ZW1wb3JhcnkgZXJyb3IgaXMgZW5jb3VudGVyZWQuIFRoaXMgaXMgYmFkOyB0aGlzIHdpbGwgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLCBvciBhdCBsZWFzdCBhIHZlcnkgbG9uZyB0aW1lb3V0ISBUaGF0JiMzOTtzIGEgZGVmaW5pdGUgZnVuY3Rpb25hbCBidWcuCgpOb3csIHRoZSBpbXBvcnRhbnQgcGFydDogaXMgdGhpcyBidWcgYWN0dWFsbHkgcmVhY2hhYmxlPyBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgYG1vdmVfcGFnZXNgIGlzIGNhbGxlZCBieSBgdXNlcmZhdWx0ZmRfbW92ZWAsIHdoaWNoIGl0c2VsZiBpcyB0aGUgaGFuZGxlciBmb3IgdGhlIGBVRkZESU9fTU9WRWAgaW9jdGwuIFNpbmNlIHRoYXQmIzM5O3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIHRoaXMgaXMgYWJzb2x1dGVseSBhIHJlYWNoYWJsZSBidWcsIGFuZCBwb3RlbnRpYWxseSBleHBsb2l0YWJsZS4gSXQmIzM5O3MgZGVmaW5pdGVseSBzb21ldGhpbmcgSSB3YW50IHRvIGZ1enogYW5kIHRlc3QgdGhvcm91Z2hseS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBgVVNFUkZBVUxURkRgIGlzIGVuYWJsZWQgdG8gdHJpZ2dlciB0aGlzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVVNFUkZBVUxURkQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz0xMzg0PWNvbmZpZyBIQVZFX0FSQ0hfVVNFUkZBVUxURkRfTUlOT1Jcbi0tXG5tbS9LY29uZmlnLTEzODgtXG5tbS9LY29uZmlnOjEzODk6bWVudWNvbmZpZyBVU0VSRkFVTFRGRFxubW0vS2NvbmZpZy0xMzkwLVx0Ym9vbCBcJiMzNDtFbmFibGUgdXNlcmZhdWx0ZmQoKSBzeXN0ZW0gY2FsbFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NzgyCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKktlcm5lbCBDb25maWd1cmF0aW9uIEh1bnRpbmc6IFVTRVJGQVVMVEZEKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGluLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGBVU0VSRkFVTFRGRGAgZnVuY3Rpb25hbGl0eSB3aXRoaW4gdGhlIGtlcm5lbC4gVGhlIG9idmlvdXMgc3RhcnRpbmcgcG9pbnQgZm9yIGFueSBjb25maWd1cmF0aW9uIG9wdGlvbiBsaWtlIHRoaXMgaXMgdGhlIGBtbS9LY29uZmlnYCBmaWxlLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWdzIGFyZSBkZWZpbmVkLCBhbmQgYFVTRVJGQVVMVEZEYCBpcywgYXQgaXRzIGNvcmUsIGEgbWVtb3J5IG1hbmFnZW1lbnQgZmVhdHVyZSwgYWxiZWl0IGEgZmFpcmx5IGludm9sdmVkIG9uZS4gU28sIHRoZSBmaXJzdCB0aGluZyBJJiMzOTttIGdvaW5nIHRvIGRvIGlzIHB1bGwgdXAgdGhhdCBmaWxlIGFuZCBnZXQgYSBkaXJlY3QgbG9vayBhdCB0aGUgYXNzb2NpYXRlZCBvcHRpb25zLCBkZXBlbmRlbmNpZXMsIGFuZCBoZWxwIHRleHQuIEkgd2FudCB0byBxdWlja2x5IGdhdWdlOgoKKiAgIFdoYXQgYXJlIHRoZSBjb3JlIGRlcGVuZGVuY2llcz8gQW55IHJlcXVpcmVkIGhhcmR3YXJlIGZlYXR1cmVzLCBvdGhlciBjb25maWdzLCBvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29uc2lkZXJhdGlvbnMgdGhhdCBpbW1lZGlhdGVseSBwb3Agb3V0PwoqICAgSXMgaXQgYSBtb2R1bGFyIG9yIGJ1aWx0LWluIG9wdGlvbj8gVGhpcyB3aWxsIGFmZmVjdCBob3cgaXQmIzM5O3MgZW5hYmxlZCBhbmQgdXRpbGl6ZWQgaW4gZGlmZmVyZW50IHNjZW5hcmlvcy4KKiAgIFdoYXQmIzM5O3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGBVU0VSRkFVTFRGRGAgYW5kIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGZlYXR1cmVzIGxpa2UgYEhXUE9JU09OYCBvciBOVU1BIHNldHRpbmdzPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgY29uZmxpY3RzIG9yIGludGVycGxheT8KKiAgIEVzc2VudGlhbGx5LCB3aGF0JiMzOTtzIHRoZSBsYW5kc2NhcGUgaGVyZSBpbiB0ZXJtcyBvZiBob3cgSSYjMzk7ZCBleHBlY3QgaXQgdG8gYmUgdXNlZCBhbmQgYW55IHR5cGljYWwgcGl0ZmFsbHMgb3IgZ290Y2hhcz8KCkxldCYjMzk7cyBzZWUgd2hhdCBgbW0vS2NvbmZpZ2AgdGVsbHMgbWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEzODksCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTM4OTpcdG1lbnVjb25maWcgVVNFUkZBVUxURkRcbjEzOTA6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIHVzZXJmYXVsdGZkKCkgc3lzdGVtIGNhbGxcJiMzNDtcbjEzOTE6XHRcdGRlcGVuZHMgb24gTU1VXG4xMzkyOlx0XHRoZWxwXG4xMzkzOlx0XHQgIEVuYWJsZSB0aGUgdXNlcmZhdWx0ZmQoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBpbnRlcmNlcHQgYW5kXG4xMzk0Olx0XHQgIGhhbmRsZSBwYWdlIGZhdWx0cyBpbiB1c2VybGFuZC5cbjEzOTU6XHRcbjEzOTY6XHRpZiBVU0VSRkFVTFRGRFxuMTM5NzpcdGNvbmZpZyBQVEVfTUFSS0VSX1VGRkRfV1BcbjEzOTg6XHRcdGJvb2wgXCYjMzQ7VXNlcmZhdWx0ZmQgd3JpdGUgcHJvdGVjdGlvbiBzdXBwb3J0IGZvciBzaG1lbS9odWdldGxiZnNcJiMzNDtcbjEzOTk6XHRcdGRlZmF1bHQgeVxuMTQwMDpcdFx0ZGVwZW5kcyBvbiBIQVZFX0FSQ0hfVVNFUkZBVUxURkRfV1BcbjE0MDE6XHRcbjE0MDI6XHRcdGhlbHBcbjE0MDM6XHRcdCAgQWxsb3dzIHRvIGNyZWF0ZSBtYXJrZXIgUFRFcyBmb3IgdXNlcmZhdWx0ZmQgd3JpdGUgcHJvdGVjdGlvblxuMTQwNDpcdFx0ICBwdXJwb3Nlcy4gIEl0IGlzIHJlcXVpcmVkIHRvIGVuYWJsZSB1c2VyZmF1bHRmZCB3cml0ZSBwcm90ZWN0aW9uIG9uXG4xNDA1Olx0XHQgIGZpbGUtYmFja2VkIG1lbW9yeSB0eXBlcyBsaWtlIHNobWVtIGFuZCBodWdldGxiZnMuXG4xNDA2Olx0ZW5kaWYgIyBVU0VSRkFVTFRGRFxuMTQwNzpcdFxuMTQwODpcdCMgbXVsdGktZ2VuIExSVSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0MTkKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA3MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIGBVU0VSRkFVTFRGRGAgSW1wbGVtZW50YXRpb24qKgoKQWxyaWdodCwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBVU0VSRkFVTFRGRGAg4oCTIHRoYXQmIzM5O3MgdGhlIGNvbmZpZyBpbiBwbGF5IGhlcmUuIE15IGdvYWwgaXMgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBpcyB3b3JraW5nLiBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUga2V5IHN5bWJvbHMsIHNwZWNpZmljYWxseSBgdXNlcmZhdWx0ZmRfbW92ZWAsIGBtb3ZlX3BhZ2VzYCwgYW5kIGBtb3ZlX3BhZ2VzX3B0ZXNgLiBIbW0sIGEgcXVpY2sgY2hlY2suLi5yaWdodCwgYG1vdmVfcGFnZXNgIGFuZCBgdXNlcmZhdWx0ZmRfbW92ZWAgYXJlIGJvdGggc3RhdGljLiBHb29kIHRvIGtub3csIGhlbHBzIG1lIG5hcnJvdyBkb3duIHRoZSBzY29wZSBvZiB0aGluZ3MuIE5vdyB0aGUgY3JpdGljYWwgcXVlc3Rpb246IHdoZXJlIGlzIGB1c2VyZmF1bHRmZF9tb3ZlYCBhY3R1YWxseSBiZWluZyAqY2FsbGVkKj8gVGhhdCYjMzk7cyB3aGVyZSB0aGUgcmVhbCBhY3Rpb24gd2lsbCBiZS4gVGltZSB0byB0cmFjZSB0aG9zZSBjYWxscyBhbmQgc2VlIHdoYXQmIzM5O3Mgd2hhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dXNlcmZhdWx0ZmRfbW92ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL3VzZXJmYXVsdGZkLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vdXNlcmZhdWx0ZmQuYz00MjA3PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVmZmRfY3R4X2ZlYXR1cmVzKF9fdTY0IHVzZXJfZmVhdHVyZXMpXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy00MjE1LVxubW0vdXNlcmZhdWx0ZmQuYzo0MjE2OnN0YXRpYyBpbnQgdXNlcmZhdWx0ZmRfbW92ZShzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsXG5tbS91c2VyZmF1bHRmZC5jLTQyMTctXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbm1tL3VzZXJmYXVsdGZkLmM9NDM1MD1zdGF0aWMgbG9uZyB1c2VyZmF1bHRmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLFxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtNDM3OC1cdGNhc2UgVUZGRElPX01PVkU6XG5tbS91c2VyZmF1bHRmZC5jOjQzNzk6XHRcdHJldCA9IHVzZXJmYXVsdGZkX21vdmUoY3R4LCBhcmcpO1xubW0vdXNlcmZhdWx0ZmQuYy00MzgwLVx0XHRicmVhaztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTkwOQoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuYWx5emluZyB0aGF0IGNvZGU6CgoqKkFuYWx5emluZyB0aGUgRW50cnkgUG9pbnQqKgoKT2theSwgZmlyc3QgdGhpbmdzIGZpcnN0LiBUaGUgYHVzZXJmYXVsdGZkX2lvY3RsYCBmdW5jdGlvbiBpcyB0aGUgcG9pbnQgb2YgZW50cnkgaGVyZS4gVGhhdCYjMzk7cyB0aGUgZ2F0ZWtlZXBlciwgdGhlIGZ1bmN0aW9uIHRoYXQmIzM5O3MgYmVpbmcgY2FsbGVkIHdoZW4gc29tZW9uZSB3YW50cyB0byBpbnRlcmFjdCB3aXRoIHVzZXJmYXVsdGZkIHVzaW5nIGFuIGlvY3RsIGNhbGwuIE5vdywgbGV0JiMzOTtzIGp1c3QgbWFrZSBzdXJlIHRoYXQgd2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgdGhlIGNvcnJlY3Qgc3lzY2FsbC4gSXMgYHN5c191c2VyZmF1bHRmZGAgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHN5c3RlbSBjYWxsIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGg/IFRoYXQmIzM5O3Mgd2hhdCBJIG5lZWQgdG8gdmVyaWZ5IG5leHQuIFVuZGVyc3RhbmRpbmcgdGhhdCBjb25uZWN0aW9uIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBjb250cm9sIGZsb3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1NZU0NBTExfREVGSU5FLip1c2VyZmF1bHRmZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0OyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jPTQ0ODM9c3RhdGljIGlubGluZSBib29sIHVzZXJmYXVsdGZkX3N5c2NhbGxfYWxsb3dlZChpbnQgZmxhZ3MpXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy00NDk5LVxubW0vdXNlcmZhdWx0ZmQuYzo0NTAwOlNZU0NBTExfREVGSU5FMSh1c2VyZmF1bHRmZCwgaW50LCBmbGFncylcbm1tL3VzZXJmYXVsdGZkLmMtNDUwMS17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMTk5CgkJCQkJCQlvdXRwdXQ6IDk4CgkJCQkJCQl0aG91Z2h0czogNTA5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBgdXNlcmZhdWx0ZmRgIFZ1bG5lcmFiaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0byBmb2N1cyBvbiB0aGUgZW50cnkgcG9pbnRzLCBzbyBgc3lzX3VzZXJmYXVsdGZkYCBhbmQgYHVzZXJmYXVsdGZkX2lvY3RsYCBjYW1lIHRvIG1pbmQuIEhvd2V2ZXIsIGBzeXNfdXNlcmZhdWx0ZmRgIGlzIGp1c3QgdGhlIHN5c2NhbGwuIFRoZSByZWFsIG1lYXQgb2YgdGhlIGJ1ZyBsaWVzIGRlZXBlciwgd2l0aGluIGBtb3ZlX3BhZ2VzYCwgd2hpY2ggaXMgcmVhY2hlZCB2aWEgdGhlIGNhbGwgY2hhaW4gYHVzZXJmYXVsdGZkX2lvY3RsYCAtJmd0OyBgdXNlcmZhdWx0ZmRfbW92ZWAgLSZndDsgYG1vdmVfcGFnZXNgLiBTaW5jZSBgdXNlcmZhdWx0ZmRfaW9jdGxgIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSBmb3IgaW9jdGxzLCBJJiMzOTttIGNvbWZvcnRhYmxlIG1ha2luZyBpdCBhIGBGb2N1c1N5bWJvbGAuCgpJIGJyaWVmbHkgY29uc2lkZXJlZCBpZiBgdXNlcmZhdWx0ZmRfbW92ZWAgbWlnaHQgYmUgaW5saW5lZCwgYnV0IGl0JiMzOTtzIGRlZmluZWQgYXMgYHN0YXRpYyBpbnQgdXNlcmZhdWx0ZmRfbW92ZWAsIHNvIGl0JiMzOTtzIHN0YXRpY2FsbHkgbGlua2VkLiBJIGNoZWNrZWQgdG8gbWFrZSBzdXJlIGl0JiMzOTtzIG5vdCBpbmxpbmUsIHNpbmNlIGl0JiMzOTtzIGEgc2l6YWJsZSBmdW5jdGlvbiwgYW5kIEkmIzM5O20gcHJldHR5IGNlcnRhaW4gdGhhdCBgdXNlcmZhdWx0ZmRfaW9jdGxgIGlzbiYjMzk7dCBpbmxpbmVkLiBJdCYjMzk7cyBiZXN0IHRvIGJlIHRob3JvdWdoLgoKQ2hlY2tpbmcgdGhlIGNvbmZpZyBvcHRpb25zLCB0aGUgcHJpbWFyeSByZWxldmFudCBvbmUgaXMgYFVTRVJGQVVMVEZEYC4KCk5vdywgbGV0JiMzOTtzIHJldmlldyB0aGUgcGF0Y2ggaXRzZWxmOgoKYGBgYwoJCQlyZXQgPSBtb3ZlX3BhZ2VzX3B0ZXMobW0sIGRzdF9wbWQsIHNyY19wbWQsCgkJCQkJICAgICAgZHN0X3ZtYSwgc3JjX3ZtYSwgZHN0X2FkZHIsCgkJCQkJICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7Ci0JCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlpZiAocmV0ICZsdDsgMCkgewogCQkJCWVyciA9IHJldDsKLQkJCWVsc2UKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQllcnIgPSAwOwogCQkJCXN0ZXBfc2l6ZSA9IHJldDsKJiM0MzsJCQl9CmBgYAoKVGhpcyBpcyBhIGZ1bmN0aW9uYWwgYnVnIGZpeCwgcmlnaHQ/IFRoZSBvcmlnaW5hbCBjb2RlIGhhZCBhIGZsYXcgd2hlcmUsIGlmIGBlcnJgIHdhcyBzZXQgdG8gc29tZXRoaW5nIG5vbi16ZXJvIChsaWtlIGAtRUFHQUlOYCBmcm9tIGEgcHJldmlvdXMgaXRlcmF0aW9uIG9yIHNpZ25hbCkgYW5kIGBtb3ZlX3BhZ2VzX3B0ZXNgIHRoZW4gKnN1Y2NlZWRlZCosIHRoZSBjb2RlICp3b3VsZG4mIzM5O3QqIGNsZWFyIGBlcnJgLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIGhhbmRsaW5nLiBUaGUgcGF0Y2ggY29ycmVjdHMgdGhpcyBieSBzZXR0aW5nIGBlcnIgPSAwYCBpZiBgbW92ZV9wYWdlc19wdGVzYCBzdWNjZWVkcy4KCkJhc2VkIG9uIHRoaXMsIEkmIzM5O20gc2V0dGluZzoKCiogICBgV29ydGhGdXp6aW5nOiB0cnVlYCAtIGJlY2F1c2UgaXQgaXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBpdCBmaXhlcyBhIGtleSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0eS4KKiAgIGBGb2N1c1N5bWJvbHM6IFsmIzM0O3VzZXJmYXVsdGZkX2lvY3RsJiMzNDtdYCAtIGJlY2F1c2UgYHVzZXJmYXVsdGZkX2lvY3RsYCBpcyB0aGUgZW50cnkgcG9pbnQuCiogICBgRW5hYmxlQ29uZmlnczogWyYjMzQ7VVNFUkZBVUxURkQmIzM0O11gIC0gYmVjYXVzZSB0aGF0JiMzOTtzIHRoZSBuZWNlc3NhcnkgY29uZmlnIG9wdGlvbi4KKiAgIGBSZWFzb25pbmc6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgYnVnIGluIHRoZSBVRkZESU9fTU9WRSBpb2N0bCBoYW5kbGVyIHdoZXJlIGEgcHJldmlvdXNseSBzZXQgZXJyb3IgY29kZSAobGlrZSAtRUFHQUlOKSB3YXMgbm90IGNsZWFyZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhZ2UgbW92ZSwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBhbiBpbmZpbml0ZSBsb29wIG9yIGluY29ycmVjdCBlcnJvciByZXBvcnRpbmcuIFRoaXMgaXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLiYjMzQ7YAoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1c2VyZmF1bHRmZF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt1c2VyZmF1bHRmZF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiBgbW92ZV9wYWdlcygpYCB3aGVyZSB0aGUgYGVycmAgdmFyaWFibGUgd2FzIG5vdCByZXNldCB0byAwIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGBtb3ZlX3BhZ2VzX3B0ZXMoKWAuIElmIGBlcnJgIHdhcyBwcmV2aW91c2x5IHNldCB0byBgLUVBR0FJTmAgKGUuZy4sIGZyb20gYSBwcmlvciBmYWlsZWQgYG1vdmVfcGFnZXNfaHVnZV9wbWQoKWAgYXR0ZW1wdCB0aGF0IHRyaWdnZXJlZCBhIGBjb250aW51ZWApLCBpdCB3b3VsZCByZW1haW4gYC1FQUdBSU5gLiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBsb29wIHRvIGluY29ycmVjdGx5IHNraXAgYWR2YW5jaW5nIHRoZSBgc3JjX2FkZHJgIGFuZCBgZHN0X2FkZHJgIHBvaW50ZXJzIGFuZCBgY29udGludWVgIGFnYWluLCBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJldHVybnMuXG5cblRoaXMgaXMgYSBjb250cm9sIGZsb3cgYW5kIGVycm9yIGhhbmRsaW5nIGJ1Zy4gSXQgZG9lcyBub3QgaW52b2x2ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRpbmcgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgaW5jbHVkaW5nIEtBU0FOIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3RvcnMsIGlzIHN1ZmZpY2llbnQgdG8gY2F0Y2ggc3VjaCBoYW5ncyBvciBsb2dpYyBlcnJvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDdmYTRlZjVhYjIxYzE2ZmE4OWJiNTYwZmU4MTI1YjgwYzE0MWE1OWIKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAxNSAxMDo1MTozNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jCmluZGV4IGMzYWRlZGFhZjdkNTQuLjU5NWU3ZTIzMmY5MDEgMTAwNjQ0Ci0tLSBhL21tL3VzZXJmYXVsdGZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vdXNlcmZhdWx0ZmQuYwpAQCAtMjA2OSwxMCAmIzQzOzIwNjksMTIgQEAgc3RhdGljIHNzaXplX3QgbW92ZV9wYWdlcyhzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgZHN0X3N0YXJ0LAogCQkJcmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLAogCQkJCQkgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkciwKIAkJCQkJICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7Ci0JCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlpZiAocmV0ICZsdDsgMCkgewogCQkJCWVyciA9IHJldDsKLQkJCWVsc2UKJiM0MzsJCQl9IGVsc2UgewomIzQzOwkJCQllcnIgPSAwOwogCQkJCXN0ZXBfc2l6ZSA9IHJldDsKJiM0MzsJCQl9CiAJCX0KIAogCQljb25kX3Jlc2NoZWQoKTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMjYKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxNDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgVXNlcmZhdWx0ZmQgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBtbS91c2VyZmF1bHRmZC5jYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGEgbW9kaWZpY2F0aW9uIHRvIHRoZSBgbW92ZV9wYWdlc2AgZnVuY3Rpb24uIFRoZSBjb2RlIHNuaXBwZXQgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDsgaXQmIzM5O3MgYSBjb25kaXRpb25hbCBjaGFuZ2UgZGVhbGluZyB3aXRoIHRoZSByZXR1cm4gdmFsdWUsIGByZXRgLCBmcm9tIGEgZnVuY3Rpb24gY2FsbC4gSXQgc2VlbXMgbGlrZSB0aGUgb3JpZ2luYWwgY29kZSBzZXQgYGVycmAgdG8gdGhlIHZhbHVlIG9mIGByZXRgIHdoZW4gYHJldGAgd2FzIG5lZ2F0aXZlLCBpbmRpY2F0aW5nIGFuIGVycm9yLiBUaGUgcGF0Y2ggd3JhcHMgdGhpcyBpbiBhIGNvbmRpdGlvbmFsLCBhbmQgYWRkcyBgZXJyID0gMGAgd2hlbiBgcmV0ICZndDs9IDBgLCBhbmQgYHN0ZXBfc2l6ZSA9IHJldGAuIFRoYXQgbWFrZXMgaXQgY2xlYXIgdGhhdCBhIG5vbi1uZWdhdGl2ZSByZXR1cm4gbm93IGluZGljYXRlcyBzdWNjZXNzLgoKVG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbiwgSSBuZWVkIHRvIHNlZSB0aGUgc3Vycm91bmRpbmcgY29udGV4dC4gV2hhdCBleGFjdGx5IGlzIGBtb3ZlX3BhZ2VzYCBkb2luZyBpbiB0aGlzIHBhcnQgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbT8gV2hhdCBhcmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgYHJldGAsIGFuZCB3aGF0IGlzIGBlcnJgIHVzZWQgZm9yPyBJcyB0aGlzIGEgc3RhbmRhcmQgc3VjY2Vzcy9lcnJvciByZXR1cm4gbW9kZWwsIG9yIGlzIHRoZXJlIHNvbWV0aGluZyBzcGVjaWZpYyB0byB1c2VyZmF1bHRmZCBoYXBwZW5pbmcgaGVyZT8KCkkmIzM5O2xsIHVzZSBgcmVhZC1maWxlYCBvciBgZ3JlcHBlcmAgdG8gcXVpY2tseSBmaW5kIHRoZSBgbW92ZV9wYWdlc2AgZnVuY3Rpb24gZGVmaW5pdGlvbiBhbmQgaXRzIHVzYWdlIHdpdGhpbiBgbW0vdXNlcmZhdWx0ZmQuY2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGluZm9ybWF0aW9uIEkgbmVlZCB0byBwcm9wZXJseSBhbmFseXplIHRoaXMgcGF0Y2ggYW5kIGl0cyBpbXBsaWNhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21vdmVfcGFnZXNcXCgmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL3VzZXJmYXVsdGZkLmM9MTg1OT1zdGF0aWMgdm9pZCB1ZmZkX21vdmVfdW5sb2NrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0X3ZtYSxcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE4NzYtICpcbm1tL3VzZXJmYXVsdGZkLmM6MTg3NzogKiBtb3ZlX3BhZ2VzKCkgcmVtYXBzIGFyYml0cmFyeSBhbm9ueW1vdXMgcGFnZXMgYXRvbWljYWxseSBpbiB6ZXJvXG5tbS91c2VyZmF1bHRmZC5jLTE4NzgtICogY29weS4gSXQgb25seSB3b3JrcyBvbiBub24gc2hhcmVkIGFub255bW91cyBwYWdlcyBiZWNhdXNlIHRob3NlIGNhblxuLS1cbm1tL3VzZXJmYXVsdGZkLmMtMTg4OC0gKiBzdG9yYWdlIG9yIGFueSBvdGhlciBJL08gZGV2aWNlIChNQURWX0RPTlRGT1JLIGluIHRoZSBzb3VyY2Ugdm1hXG5tbS91c2VyZmF1bHRmZC5jOjE4ODk6ICogYXZvaWRzIG1vdmVfcGFnZXMoKSB0byBmYWlsIHdpdGggLUVCVVNZIGlmIHRoZSBwcm9jZXNzIGZvcmtzIGJlZm9yZVxubW0vdXNlcmZhdWx0ZmQuYzoxODkwOiAqIG1vdmVfcGFnZXMoKSBpcyBjYWxsZWQpLCB0aGVuIGl0IHdpbGwgY2FsbCBtb3ZlX3BhZ2VzKCkgdG8gbWFwIHRoZVxubW0vdXNlcmZhdWx0ZmQuYy0xODkxLSAqIHBhZ2UgaW4gdGhlIGZhdWx0aW5nIGFkZHJlc3MgaW4gdGhlIGRlc3RpbmF0aW9uIHZtYS5cbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE5MDUtICogdGhlIGRlc3RpbmF0aW9uIHZpcnR1YWwgbWVtb3J5IHJhbmdlIGlzIG5vdCBhIHdob2xlIHVubWFwcGVkIGhvbGUsXG5tbS91c2VyZmF1bHRmZC5jOjE5MDY6ICogbW92ZV9wYWdlcygpIHdpbGwgZmFpbCByZXNwZWN0aXZlbHkgd2l0aCAtRU5PRU5UIG9yIC1FRVhJU1QuIFRoaXNcbm1tL3VzZXJmYXVsdGZkLmMtMTkwNy0gKiBwcm92aWRlcyBhIHZlcnkgc3RyaWN0IGJlaGF2aW9yIHRvIGF2b2lkIGFueSBjaGFuY2Ugb2YgbWVtb3J5XG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xOTEwLSAqIHRpbWUgZm9yIGFueSBnaXZlbiBmYXVsdGluZyBhZGRyZXNzLiBUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIHRocmVhZHNcbm1tL3VzZXJmYXVsdGZkLmM6MTkxMTogKiB0cnkgdG8gYm90aCBjYWxsIG1vdmVfcGFnZXMoKSBvbiB0aGUgc2FtZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGF0IHRoZVxubW0vdXNlcmZhdWx0ZmQuYy0xOTEyLSAqIHNhbWUgdGltZSwgdGhlIHNlY29uZCB0aHJlYWQgd2lsbCBnZXQgYW4gZXhwbGljaXQgZXJyb3IgZnJvbSB0aGlzXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0xOTIwLSAqIGFuIGFtb3VudCBvZiBieXRlcyBzdWNjZXNzZnVsbHkgbW92ZWQuIElmIHRoZSByZXR2YWwgcmVwb3J0cyBhXG5tbS91c2VyZmF1bHRmZC5jOjE5MjE6ICogXCYjMzQ7c2hvcnRcJiMzNDsgcmVtYXAsIHRoZSBtb3ZlX3BhZ2VzKCkgY29tbWFuZCBzaG91bGQgYmUgcmVwZWF0ZWQgYnlcbm1tL3VzZXJmYXVsdGZkLmMtMTkyMi0gKiB1c2VybGFuZCB3aXRoIHNyYyYjNDM7cmV0dmFsLCBkc3QmIzQzO3JldmFsLCBsZW4tcmV0dmFsIGlmIGl0IHdhbnRzIHRvIGtub3dcbi0tXG5tbS91c2VyZmF1bHRmZC5jLTE5MzMtICovXG5tbS91c2VyZmF1bHRmZC5jOjE5MzQ6c3RhdGljIHNzaXplX3QgbW92ZV9wYWdlcyhzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgZHN0X3N0YXJ0LFxubW0vdXNlcmZhdWx0ZmQuYy0xOTM1LVx0XHQgICB1bnNpZ25lZCBsb25nIHNyY19zdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sIF9fdTY0IG1vZGUpXG4tLVxubW0vdXNlcmZhdWx0ZmQuYz00MjE2PXN0YXRpYyBpbnQgdXNlcmZhdWx0ZmRfbW92ZShzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy00MjU1LVx0aWYgKG1tZ2V0X25vdF96ZXJvKG1tKSkge1xubW0vdXNlcmZhdWx0ZmQuYzo0MjU2Olx0XHRyZXQgPSBtb3ZlX3BhZ2VzKGN0eCwgdWZmZGlvX21vdmUuZHN0LCB1ZmZkaW9fbW92ZS5zcmMsXG5tbS91c2VyZmF1bHRmZC5jLTQyNTctXHRcdFx0XHQgdWZmZGlvX21vdmUubGVuLCB1ZmZkaW9fbW92ZS5tb2RlKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzIxNgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgbW92ZV9wYWdlc2AgaW4gYG1tL3VzZXJmYXVsdGZkLmNgKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgbW92ZV9wYWdlc2AgaXMgaGFuZGxpbmcgdGhpbmdzIGluIHRoZSBjb250ZXh0IG9mIHVzZXJmYXVsdGZkLiBUaGlzIGZ1bmN0aW9uIGlzIGNyaXRpY2FsIGZvciBob3cgd2UgbWFuYWdlIHBhZ2UgbWlncmF0aW9uIGFuZCB0cmFuc2ZlciwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCB1c2VyLXNwYWNlIG1lbW9yeSBhY2Nlc3MgZmF1bHRzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUga2VybmVsIG9yY2hlc3RyYXRlcyB0aGlzIHdob2xlIGRhbmNlIGJldHdlZW4gdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gaW50ZXJlc3RlZCBpbiB0aGUgaW50ZXJwbGF5IGJldHdlZW4gYHVzZXJmYXVsdGZkYCBhbmQgdGhlIHBhZ2UgbWlncmF0aW9uIG1hY2hpbmVyeS4gSG93IGRvZXMgaXQga25vdyB3aGVyZSBwYWdlcyBhcmUsIGFuZCBob3cgZG9lcyBpdCBkaXJlY3QgdGhlbSB3aGVyZSB0aGV5IG5lZWQgdG8gZ28/IEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgYSBkZWxpY2F0ZSBiYWxhbmNpbmcgYWN0IGhlcmUsIGVuc3VyaW5nIGRhdGEgaW50ZWdyaXR5IHdoaWxlIG1pbmltaXppbmcgdGhlIHBlcmZvcm1hbmNlIGhpdCBvZiBwYWdlIGZhdWx0cy4gTGV0JiMzOTtzIHNlZSBob3cgdGhleSBkbyBpdC4gSSYjMzk7bSBsb29raW5nIGZvciB0aGUga2V5IGxvY2tpbmcgcHJpbWl0aXZlcywgZXJyb3IgaGFuZGxpbmcgcGF0aHMsIGFuZCB0aGUgb3ZlcmFsbCBsb2dpYyBmbG93LiBUaGlzIGNvdWxkIGdpdmUgbWUgc29tZSBncmVhdCBpbnNpZ2h0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS91c2VyZmF1bHRmZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTkzNCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkzNDpcdHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcbjE5MzU6XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBfX3U2NCBtb2RlKVxuMTkzNjpcdHtcbjE5Mzc6XHRcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3R4LVx1MDAzZW1tO1xuMTkzODpcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICpzcmNfdm1hLCAqZHN0X3ZtYTtcbjE5Mzk6XHRcdHVuc2lnbmVkIGxvbmcgc3JjX2FkZHIsIGRzdF9hZGRyLCBzcmNfZW5kO1xuMTk0MDpcdFx0cG1kX3QgKnNyY19wbWQsICpkc3RfcG1kO1xuMTk0MTpcdFx0bG9uZyBlcnIgPSAtRUlOVkFMO1xuMTk0MjpcdFx0c3NpemVfdCBtb3ZlZCA9IDA7XG4xOTQzOlx0XG4xOTQ0Olx0XHQvKiBTYW5pdGl6ZSB0aGUgY29tbWFuZCBwYXJhbWV0ZXJzLiAqL1xuMTk0NTpcdFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCBcdTAwMjYgflBBR0VfTUFTSyk7XG4xOTQ2Olx0XHRWTV9XQVJOX09OX09OQ0UoZHN0X3N0YXJ0IFx1MDAyNiB+UEFHRV9NQVNLKTtcbjE5NDc6XHRcdFZNX1dBUk5fT05fT05DRShsZW4gXHUwMDI2IH5QQUdFX01BU0spO1xuMTk0ODpcdFxuMTk0OTpcdFx0LyogRG9lcyB0aGUgYWRkcmVzcyByYW5nZSB3cmFwLCBvciBpcyB0aGUgc3BhbiB6ZXJvLXNpemVkPyAqL1xuMTk1MDpcdFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCAmIzQzOyBsZW4gXHUwMDNjIHNyY19zdGFydCk7XG4xOTUxOlx0XHRWTV9XQVJOX09OX09OQ0UoZHN0X3N0YXJ0ICYjNDM7IGxlbiBcdTAwM2MgZHN0X3N0YXJ0KTtcbjE5NTI6XHRcbjE5NTM6XHRcdGVyciA9IHVmZmRfbW92ZV9sb2NrKG1tLCBkc3Rfc3RhcnQsIHNyY19zdGFydCwgXHUwMDI2ZHN0X3ZtYSwgXHUwMDI2c3JjX3ZtYSk7XG4xOTU0Olx0XHRpZiAoZXJyKVxuMTk1NTpcdFx0XHRnb3RvIG91dDtcbjE5NTY6XHRcbjE5NTc6XHRcdC8qIFJlLWNoZWNrIGFmdGVyIHRha2luZyBtYXBfY2hhbmdpbmdfbG9jayAqL1xuMTk1ODpcdFx0ZXJyID0gLUVBR0FJTjtcbjE5NTk6XHRcdGRvd25fcmVhZChcdTAwMjZjdHgtXHUwMDNlbWFwX2NoYW5naW5nX2xvY2spO1xuMTk2MDpcdFx0aWYgKGxpa2VseShhdG9taWNfcmVhZChcdTAwMjZjdHgtXHUwMDNlbW1hcF9jaGFuZ2luZykpKVxuMTk2MTpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4xOTYyOlx0XHQvKlxuMTk2MzpcdFx0ICogTWFrZSBzdXJlIHRoZSB2bWEgaXMgbm90IHNoYXJlZCwgdGhhdCB0aGUgc3JjIGFuZCBkc3QgcmVtYXBcbjE5NjQ6XHRcdCAqIHJhbmdlcyBhcmUgYm90aCB2YWxpZCBhbmQgZnVsbHkgd2l0aGluIGEgc2luZ2xlIGV4aXN0aW5nXG4xOTY1Olx0XHQgKiB2bWEuXG4xOTY2Olx0XHQgKi9cbjE5Njc6XHRcdGVyciA9IC1FSU5WQUw7XG4xOTY4Olx0XHRpZiAoc3JjX3ZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fU0hBUkVEKVxuMTk2OTpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4xOTcwOlx0XHRpZiAoc3JjX3N0YXJ0ICYjNDM7IGxlbiBcdTAwM2Ugc3JjX3ZtYS1cdTAwM2V2bV9lbmQpXG4xOTcxOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbjE5NzI6XHRcbjE5NzM6XHRcdGlmIChkc3Rfdm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9TSEFSRUQpXG4xOTc0Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbjE5NzU6XHRcdGlmIChkc3Rfc3RhcnQgJiM0MzsgbGVuIFx1MDAzZSBkc3Rfdm1hLVx1MDAzZXZtX2VuZClcbjE5NzY6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTk3NzpcdFxuMTk3ODpcdFx0ZXJyID0gdmFsaWRhdGVfbW92ZV9hcmVhcyhjdHgsIHNyY192bWEsIGRzdF92bWEpO1xuMTk3OTpcdFx0aWYgKGVycilcbjE5ODA6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuMTk4MTpcdFxuMTk4MjpcdFx0Zm9yIChzcmNfYWRkciA9IHNyY19zdGFydCwgZHN0X2FkZHIgPSBkc3Rfc3RhcnQsIHNyY19lbmQgPSBzcmNfc3RhcnQgJiM0MzsgbGVuO1xuMTk4MzpcdFx0ICAgICBzcmNfYWRkciBcdTAwM2Mgc3JjX2VuZDspIHtcbjE5ODQ6XHRcdFx0c3BpbmxvY2tfdCAqcHRsO1xuMTk4NTpcdFx0XHRwbWRfdCBkc3RfcG1kdmFsO1xuMTk4NjpcdFx0XHR1bnNpZ25lZCBsb25nIHN0ZXBfc2l6ZTtcbjE5ODc6XHRcbjE5ODg6XHRcdFx0LypcbjE5ODk6XHRcdFx0ICogQmVsb3cgd29ya3MgYmVjYXVzZSBhbm9ueW1vdXMgYXJlYSB3b3VsZCBub3QgaGF2ZSBhXG4xOTkwOlx0XHRcdCAqIHRyYW5zcGFyZW50IGh1Z2UgUFVELiBJZiBmaWxlLWJhY2tlZCBzdXBwb3J0IGlzIGFkZGVkLFxuMTk5MTpcdFx0XHQgKiB0aGF0IGNhc2Ugd291bGQgbmVlZCB0byBiZSBoYW5kbGVkIGhlcmUuXG4xOTkyOlx0XHRcdCAqL1xuMTk5MzpcdFx0XHRzcmNfcG1kID0gbW1fZmluZF9wbWQobW0sIHNyY19hZGRyKTtcbjE5OTQ6XHRcdFx0aWYgKHVubGlrZWx5KCFzcmNfcG1kKSkge1xuMTk5NTpcdFx0XHRcdGlmICghKG1vZGUgXHUwMDI2IFVGRkRJT19NT1ZFX01PREVfQUxMT1dfU1JDX0hPTEVTKSkge1xuMTk5NjpcdFx0XHRcdFx0ZXJyID0gLUVOT0VOVDtcbjE5OTc6XHRcdFx0XHRcdGJyZWFrO1xuMTk5ODpcdFx0XHRcdH1cbjE5OTk6XHRcdFx0XHRzcmNfcG1kID0gbW1fYWxsb2NfcG1kKG1tLCBzcmNfYWRkcik7XG4yMDAwOlx0XHRcdFx0aWYgKHVubGlrZWx5KCFzcmNfcG1kKSkge1xuMjAwMTpcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbjIwMDI6XHRcdFx0XHRcdGJyZWFrO1xuMjAwMzpcdFx0XHRcdH1cbjIwMDQ6XHRcdFx0fVxuMjAwNTpcdFx0XHRkc3RfcG1kID0gbW1fYWxsb2NfcG1kKG1tLCBkc3RfYWRkcik7XG4yMDA2Olx0XHRcdGlmICh1bmxpa2VseSghZHN0X3BtZCkpIHtcbjIwMDc6XHRcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMjAwODpcdFx0XHRcdGJyZWFrO1xuMjAwOTpcdFx0XHR9XG4yMDEwOlx0XG4yMDExOlx0XHRcdGRzdF9wbWR2YWwgPSBwbWRwX2dldF9sb2NrbGVzcyhkc3RfcG1kKTtcbjIwMTI6XHRcdFx0LypcbjIwMTM6XHRcdFx0ICogSWYgdGhlIGRzdF9wbWQgaXMgbWFwcGVkIGFzIFRIUCBkb24mIzM5O3Qgb3ZlcnJpZGUgaXQgYW5kIGp1c3RcbjIwMTQ6XHRcdFx0ICogYmUgc3RyaWN0LiBJZiBkc3RfcG1kIGNoYW5nZXMgaW50byBUUEggYWZ0ZXIgdGhpcyBjaGVjaywgdGhlXG4yMDE1Olx0XHRcdCAqIG1vdmVfcGFnZXNfaHVnZV9wbWQoKSB3aWxsIGRldGVjdCB0aGUgY2hhbmdlIGFuZCByZXRyeVxuMjAxNjpcdFx0XHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXG4yMDE3Olx0XHRcdCAqL1xuMjAxODpcdFx0XHRpZiAodW5saWtlbHkocG1kX3RyYW5zX2h1Z2UoZHN0X3BtZHZhbCkpKSB7XG4yMDE5Olx0XHRcdFx0ZXJyID0gLUVFWElTVDtcbjIwMjA6XHRcdFx0XHRicmVhaztcbjIwMjE6XHRcdFx0fVxuMjAyMjpcdFxuMjAyMzpcdFx0XHRwdGwgPSBwbWRfdHJhbnNfaHVnZV9sb2NrKHNyY19wbWQsIHNyY192bWEpO1xuMjAyNDpcdFx0XHRpZiAocHRsKSB7XG4yMDI1Olx0XHRcdFx0LyogQ2hlY2sgaWYgd2UgY2FuIG1vdmUgdGhlIHBtZCB3aXRob3V0IHNwbGl0dGluZyBpdC4gKi9cbjIwMjY6XHRcdFx0XHRpZiAobW92ZV9zcGxpdHNfaHVnZV9wbWQoZHN0X2FkZHIsIHNyY19hZGRyLCBzcmNfc3RhcnQgJiM0MzsgbGVuKSB8fFxuMjAyNzpcdFx0XHRcdCAgICAhcG1kX25vbmUoZHN0X3BtZHZhbCkpIHtcbjIwMjg6XHRcdFx0XHRcdC8qIENhbiBiZSBhIG1pZ3JhdGlvbiBlbnRyeSAqL1xuMjAyOTpcdFx0XHRcdFx0aWYgKHBtZF9wcmVzZW50KCpzcmNfcG1kKSkge1xuMjAzMDpcdFx0XHRcdFx0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gcG1kX2ZvbGlvKCpzcmNfcG1kKTtcbjIwMzE6XHRcbjIwMzI6XHRcdFx0XHRcdFx0aWYgKCFpc19odWdlX3plcm9fZm9saW8oZm9saW8pIFx1MDAyNlx1MDAyNlxuMjAzMzpcdFx0XHRcdFx0XHQgICAgIVBhZ2VBbm9uRXhjbHVzaXZlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUxNTcKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkRpdmluZyBEZWVwZXIgaW50byBgbW92ZV9wYWdlc2AqKgoKQWxyaWdodCwgSSYjMzk7dmUgZ290IHRoZSBpbml0aWFsIG92ZXJ2aWV3IG9mIGBtb3ZlX3BhZ2VzYCBpbiBteSBoZWFkLiBOb3csIHRoZSByZWFsIHdvcmsgYmVnaW5zLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbnVhbmNlcywgdGhlIGVkZ2UgY2FzZXMsIHRoZSBwb3RlbnRpYWwgYm90dGxlbmVja3MuIExldCYjMzk7cyBkaWcgaW50byB0aGUgbWVhdCBvZiB0aGUgY29kZS4gTXkgcHJpbWFyeSBmb2N1cyBpcyBsaWtlbHkgb24gaG93IGl0IGhhbmRsZXMgbWVtb3J5IG1hbmFnZW1lbnQsIGVzcGVjaWFsbHkgaWYgdGhpcyBpcyByZWxhdGVkIHRvIGEgcGFnaW5nIHN5c3RlbSwgb3Igc29tZSBmb3JtIG9mIHZpcnR1YWwgbWVtb3J5LiBJJiMzOTttIGxvb2tpbmcgZm9yIHdoZXJlIHBhZ2UgdGFibGVzIGFyZSB1cGRhdGVkLCB3aGVyZSBwaHlzaWNhbCBmcmFtZXMgbWlnaHQgYmUgYWxsb2NhdGVkIG9yIGRlYWxsb2NhdGVkLCBhbmQgaG93IGNvaGVyZW5jeSBpcyBtYWludGFpbmVkLCBpZiB0aGlzIG9wZXJhdGlvbiBpcyBoYXBwZW5pbmcgY29uY3VycmVudGx5LiBJcyBpdCB0aHJlYWQtc2FmZT8gRG9lcyBpdCBlbXBsb3kgbG9ja3MsIGFuZCBpZiBzbywgaG93IGdyYW51bGFyIGFyZSB0aGV5PyBBbnkgZGVhZGxvY2tzPyBBbHNvLCB3aGF0IGhhcHBlbnMgaW4gYSBzaXR1YXRpb24gb2YgYW4gb3V0LW9mLW1lbW9yeSBlcnJvci4KCkkgd2FudCB0byBzZWUgdGhlIGRldGFpbHMgb24gdGhlIGRhdGEgc3RydWN0dXJlcyBpdCBtYW5pcHVsYXRlcy4gSG93IGFyZSB0aGUgcGFnZXMgb3JnYW5pemVkIGJlZm9yZSB0aGUgbW92ZT8gSXMgaXQgYSBsaW5rZWQgbGlzdCwgYSBoYXNoIHRhYmxlLCBhIHRyZWUgc3RydWN0dXJlLCBvciBzb21ldGhpbmcgZWxzZT8gVW5kZXJzdGFuZGluZyB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZXMgaXMga2V5IHRvIG9wdGltaXppbmcgdGhlIGFsZ29yaXRobS4gSSYjMzk7bGwgYmUgd2F0Y2hpbmcgaG93IGl0IGhhbmRsZXMgZXhjZXB0aW9ucywgZXJyb3IgcmVjb3ZlcnksIGFuZCB0aGUgb3ZlcmFsbCByZWxpYWJpbGl0eSBvZiB0aGUgZnVuY3Rpb24uIElzIGl0IGF0b21pYz8gSSYjMzk7bSBhbnRpY2lwYXRpbmcgdGhhdCBJJiMzOTtsbCBiZSBtZW50YWxseSBtYXBwaW5nIHRoZSBmdW5jdGlvbiYjMzk7cyBsb2dpYyB0byB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBjYXBhYmlsaXRpZXMsIHBlcmhhcHMgaW5jbHVkaW5nIHRoZSBDUFUmIzM5O3MgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdCBhbmQgYW55IHJlbGV2YW50IGNhY2hlIGNvbmZpZ3VyYXRpb25zLiBVbmRlcnN0YW5kaW5nIHRoZXNlIGludGVyYWN0aW9ucyBpcyBjcml0aWNhbCwgYXMgaXQgaGFzIGEgbWFzc2l2ZSBwZXJmb3JtYW5jZSBpbXBhY3QuIEZpbmFsbHksIEkgd2lsbCBiZSB0aGlua2luZyBvZiB3YXlzIHRvIHJlZmFjdG9yIHRoaXMgZnVuY3Rpb24gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgbWFpbnRhaW5hYmlsaXR5LCBhbmQgcmVhZGFiaWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vdXNlcmZhdWx0ZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIwMzQsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIwMzQ6XHRcdFx0XHRcdFx0XHRzcGluX3VubG9jayhwdGwpO1xuMjAzNTpcdFx0XHRcdFx0XHRcdGVyciA9IC1FQlVTWTtcbjIwMzY6XHRcdFx0XHRcdFx0XHRicmVhaztcbjIwMzc6XHRcdFx0XHRcdFx0fVxuMjAzODpcdFx0XHRcdFx0fVxuMjAzOTpcdFxuMjA0MDpcdFx0XHRcdFx0c3Bpbl91bmxvY2socHRsKTtcbjIwNDE6XHRcdFx0XHRcdHNwbGl0X2h1Z2VfcG1kKHNyY192bWEsIHNyY19wbWQsIHNyY19hZGRyKTtcbjIwNDI6XHRcdFx0XHRcdC8qIFRoZSBmb2xpbyB3aWxsIGJlIHNwbGl0IGJ5IG1vdmVfcGFnZXNfcHRlKCkgKi9cbjIwNDM6XHRcdFx0XHRcdGNvbnRpbnVlO1xuMjA0NDpcdFx0XHRcdH1cbjIwNDU6XHRcbjIwNDY6XHRcdFx0XHRlcnIgPSBtb3ZlX3BhZ2VzX2h1Z2VfcG1kKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxuMjA0NzpcdFx0XHRcdFx0XHRcdCAgZHN0X3BtZHZhbCwgZHN0X3ZtYSwgc3JjX3ZtYSxcbjIwNDg6XHRcdFx0XHRcdFx0XHQgIGRzdF9hZGRyLCBzcmNfYWRkcik7XG4yMDQ5Olx0XHRcdFx0c3RlcF9zaXplID0gSFBBR0VfUE1EX1NJWkU7XG4yMDUwOlx0XHRcdH0gZWxzZSB7XG4yMDUxOlx0XHRcdFx0bG9uZyByZXQ7XG4yMDUyOlx0XG4yMDUzOlx0XHRcdFx0aWYgKHBtZF9ub25lKCpzcmNfcG1kKSkge1xuMjA1NDpcdFx0XHRcdFx0aWYgKCEobW9kZSBcdTAwMjYgVUZGRElPX01PVkVfTU9ERV9BTExPV19TUkNfSE9MRVMpKSB7XG4yMDU1Olx0XHRcdFx0XHRcdGVyciA9IC1FTk9FTlQ7XG4yMDU2Olx0XHRcdFx0XHRcdGJyZWFrO1xuMjA1NzpcdFx0XHRcdFx0fVxuMjA1ODpcdFx0XHRcdFx0aWYgKHVubGlrZWx5KF9fcHRlX2FsbG9jKG1tLCBzcmNfcG1kKSkpIHtcbjIwNTk6XHRcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbjIwNjA6XHRcdFx0XHRcdFx0YnJlYWs7XG4yMDYxOlx0XHRcdFx0XHR9XG4yMDYyOlx0XHRcdFx0fVxuMjA2MzpcdFxuMjA2NDpcdFx0XHRcdGlmICh1bmxpa2VseShwdGVfYWxsb2MobW0sIGRzdF9wbWQpKSkge1xuMjA2NTpcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbjIwNjY6XHRcdFx0XHRcdGJyZWFrO1xuMjA2NzpcdFx0XHRcdH1cbjIwNjg6XHRcbjIwNjk6XHRcdFx0XHRyZXQgPSBtb3ZlX3BhZ2VzX3B0ZXMobW0sIGRzdF9wbWQsIHNyY19wbWQsXG4yMDcwOlx0XHRcdFx0XHRcdCAgICAgIGRzdF92bWEsIHNyY192bWEsIGRzdF9hZGRyLFxuMjA3MTpcdFx0XHRcdFx0XHQgICAgICBzcmNfYWRkciwgc3JjX2VuZCAtIHNyY19hZGRyLCBtb2RlKTtcbjIwNzI6XHRcdFx0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4yMDczOlx0XHRcdFx0XHRlcnIgPSByZXQ7XG4yMDc0Olx0XHRcdFx0fSBlbHNlIHtcbjIwNzU6XHRcdFx0XHRcdGVyciA9IDA7XG4yMDc2Olx0XHRcdFx0XHRzdGVwX3NpemUgPSByZXQ7XG4yMDc3Olx0XHRcdFx0fVxuMjA3ODpcdFx0XHR9XG4yMDc5Olx0XG4yMDgwOlx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuMjA4MTpcdFxuMjA4MjpcdFx0XHRpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHtcbjIwODM6XHRcdFx0XHQvKiBEbyBub3Qgb3ZlcnJpZGUgYW4gZXJyb3IgKi9cbjIwODQ6XHRcdFx0XHRpZiAoIWVyciB8fCBlcnIgPT0gLUVBR0FJTilcbjIwODU6XHRcdFx0XHRcdGVyciA9IC1FSU5UUjtcbjIwODY6XHRcdFx0XHRicmVhaztcbjIwODc6XHRcdFx0fVxuMjA4ODpcdFxuMjA4OTpcdFx0XHRpZiAoZXJyKSB7XG4yMDkwOlx0XHRcdFx0aWYgKGVyciA9PSAtRUFHQUlOKVxuMjA5MTpcdFx0XHRcdFx0Y29udGludWU7XG4yMDkyOlx0XHRcdFx0YnJlYWs7XG4yMDkzOlx0XHRcdH1cbjIwOTQ6XHRcbjIwOTU6XHRcdFx0LyogUHJvY2VlZCB0byB0aGUgbmV4dCBwYWdlICovXG4yMDk2Olx0XHRcdGRzdF9hZGRyICYjNDM7PSBzdGVwX3NpemU7XG4yMDk3Olx0XHRcdHNyY19hZGRyICYjNDM7PSBzdGVwX3NpemU7XG4yMDk4Olx0XHRcdG1vdmVkICYjNDM7PSBzdGVwX3NpemU7XG4yMDk5Olx0XHR9XG4yMTAwOlx0XG4yMTAxOlx0b3V0X3VubG9jazpcbjIxMDI6XHRcdHVwX3JlYWQoXHUwMDI2Y3R4LVx1MDAzZW1hcF9jaGFuZ2luZ19sb2NrKTtcbjIxMDM6XHRcdHVmZmRfbW92ZV91bmxvY2soZHN0X3ZtYSwgc3JjX3ZtYSk7XG4yMTA0Olx0b3V0OlxuMjEwNTpcdFx0Vk1fV0FSTl9PTl9PTkNFKG1vdmVkIFx1MDAzYyAwKTtcbjIxMDY6XHRcdFZNX1dBUk5fT05fT05DRShlcnIgXHUwMDNlIDApO1xuMjEwNzpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFtb3ZlZCBcdTAwMjZcdTAwMjYgIWVycik7XG4yMTA4Olx0XHRyZXR1cm4gbW92ZWQgPyBtb3ZlZCA6IGVycjtcbjIxMDk6XHR9XG4yMTEwOlx0XG4yMTExOlx0c3RhdGljIGJvb2wgdm1hX2Nhbl91c2VyZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXG4yMTEyOlx0XHRcdCAgICAgICBib29sIHdwX2FzeW5jKVxuMjExMzpcdHtcbjIxMTQ6XHRcdGNvbnN0IHN0cnVjdCB2bV91ZmZkX29wcyAqb3BzID0gdm1hX3VmZmRfb3BzKHZtYSk7XG4yMTE1Olx0XG4yMTE2Olx0XHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiAoVk1fRFJPUFBBQkxFIHwgVk1fU0hBRE9XX1NUQUNLKSlcbjIxMTc6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMjExODpcdFxuMjExOTpcdFx0aWYgKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSBcdTAwMjZcdTAwMjYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fU1BFQ0lBTCkpXG4yMTIwOlx0XHRcdHJldHVybiBmYWxzZTtcbjIxMjE6XHRcbjIxMjI6XHRcdHZtX2ZsYWdzIFx1MDAyNj0gX19WTV9VRkZEX0ZMQUdTO1xuMjEyMzpcdFxuMjEyNDpcdFx0LypcbjIxMjU6XHRcdCAqIElmIFdQIGlzIHRoZSBvbmx5IG1vZGUgZW5hYmxlZCBhbmQgY29udGV4dCBpcyB3cCBhc3luYywgYWxsb3cgYW55XG4yMTI2Olx0XHQgKiBtZW1vcnkgdHlwZS5cbjIxMjc6XHRcdCAqL1xuMjEyODpcdFx0aWYgKHdwX2FzeW5jIFx1MDAyNlx1MDAyNiAodm1fZmxhZ3MgPT0gVk1fVUZGRF9XUCkpXG4yMTI5Olx0XHRcdHJldHVybiB0cnVlO1xuMjEzMDpcdFxuMjEzMTpcdFx0LyogRm9yIGFueSBvdGhlciBtb2RlIHJlamVjdCBWTUFzIHRoYXQgZG9uJiMzOTt0IGltcGxlbWVudCB2bV91ZmZkX29wcyAqL1xuMjEzMjpcdFx0aWYgKCFvcHMpXG4yMTMzOlx0XHRcdHJldHVybiBmYWxzZTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMTA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjk0OQoJCQkJCQkJb3V0cHV0OiAyMTkKCQkJCQkJCXRob3VnaHRzOiAxODAzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBgbW92ZV9wYWdlc2AgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiB0cmFjaW5nIHRocm91Z2ggdGhpcyBwYXRjaCBhbmQgaXRzIGltcGxpY2F0aW9ucy4gVGhlIGNvcmUgaXNzdWUgaXMgdGhhdCBgZXJyYCBpc24mIzM5O3QgYmVpbmcgcmVzZXQgcHJvcGVybHkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBtb3ZlX3BhZ2VzX3B0ZXNgIGNhbGwuIFRoaXMgY3JlYXRlcyBhIGNvbnRyb2wgZmxvdyBwcm9ibGVtLCBhbmQgaXQmIzM5O3MgbWFraW5nIG1lIHdvbmRlciBpZiBLTVNBTiBpcyBuZWNlc3NhcnkgZm9yIGRldGVjdGluZyBpdC4KCkxldCYjMzk7cyBicmVhayBpdCBkb3duLiBCZWZvcmUgdGhlIGxvb3AsIGBlcnJgIGlzIGluaXRpYWxpemVkIHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYHZhbGlkYXRlX21vdmVfYXJlYXNgLiBJbnNpZGUgdGhlIGxvb3AsIGBlcnJgIGNhbiBiZSBzZXQgdG8gYC1FQUdBSU5gIGlmIGBtb3ZlX3BhZ2VzX2h1Z2VfcG1kYCBmYWlscy4gVGhlIHByb2JsZW1hdGljIHBhcnQgaXMgd2hhdCBoYXBwZW5zIG5leHQuIElmIGBlcnJgICppcyogYC1FQUdBSU5gLCB0aGUgY29kZSAqY29udGludWVzKiB0byB0aGUgbmV4dCBpdGVyYXRpb24uIE5vdywgaWYgdGhlIGNvZGUgc3VjY2Vzc2Z1bGx5IGNhbGxzIGBtb3ZlX3BhZ2VzX3B0ZXNgIGluIHRoYXQgbmV4dCBpdGVyYXRpb24gYW5kIGdldHMgYSBwb3NpdGl2ZSByZXR1cm4gdmFsdWUsIHRoZSBgZXJyYCB2YXJpYWJsZSBpcyAqc3RpbGwqIGAtRUFHQUlOYC4KClRoZSBwcm9ibGVtIGlzIHRoZSBgaWYgKGVycikgeyBpZiAoZXJyID09IC1FQUdBSU4pIGNvbnRpbnVlOyBicmVhazsgfWAgbGluZS4gU2luY2UgYGVycmAgc3RheXMgYC1FQUdBSU5gLCB0aGUgY29kZSBlbnRlcnMgYW4gaW5maW5pdGUgbG9vcC4gSXQgd2lsbCBjb250aW51ZSwgc2tpcCBhZHZhbmNpbmcgdGhlIGFkZHJlc3NlcywgYW5kIHJlLWF0dGVtcHQgdG8gbW92ZSB0aGUgc2FtZSBwYWdlLCB3aGljaCBjb3VsZCBsZWFkIHRvIGFuIGluY29ycmVjdCBlcnJvciBjb2RlIGJlaW5nIHJldHVybmVkIG9yIHRoZSBsb29wIGJlaW5nIHRlcm1pbmF0ZWQgYmVjYXVzZSBzdWJzZXF1ZW50IGF0dGVtcHRzIHRvIG1vdmUgdGhlIHNhbWUgcGFnZSB3aWxsIG1vc3QgbGlrZWx5IGZhaWwuIFRoaXMgbG9vcCB3aWxsIG5vdCB0ZXJtaW5hdGUuCgpUaGUgcXVlc3Rpb24gdGhlbiBiZWNvbWVzOiBpcyB0aGlzIGEgS01TQU4gaXNzdWU/IExldCYjMzk7cyBjaGVjayBhZ2FpbnN0IHRoZSBLTVNBTiBydWxlcy4gTm8sIHRoaXMgaXNuJiMzOTt0IGFib3V0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGV4cG9zZWQgdG8gdXNlcnNwYWNlLCBvciBjb25kaXRpb25hbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoaXMgaXMgYSBsb2dpYyBidWc6IGEgY29udHJvbCBmbG93IGVycm9yLiBgcmV0YCBhbmQgYGVycmAgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyBpbnZvbHZlZC4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIEtBU0FOLCBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0aW9uIHdpbGwgZmxhZyB0aGUgaW5maW5pdGUgbG9vcC4gVGhpcyBpc24mIzM5O3QgYSBjYXNlIHdoZXJlIEtNU0FOIG9mZmVycyBhbnkgdW5pcXVlIGFkdmFudGFnZS4gVGhlIHBhdGNoIG1vZGlmaWVzIGNvbmRpdGlvbmFsIGxvZ2ljLCBidXQgbm90IGluIGEgd2F5IHRoYXQgY3JlYXRlcyB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZS4gSSYjMzk7bSBjb25maWRlbnQgaW4gc2F5aW5nIHRoYXQgS01TQU4gaXMgbm90IG5lY2Vzc2FyeSBoZXJlLiBUaGlzIGlzIGEgcHVyZSBsb2dpYyBlcnJvciwgYW5kIEtBU0FOIHdpbGwgY2F0Y2ggdGhlIGluZmluaXRlIGxvb3Agb3Igb3RoZXIgbG9naWMgZXJyb3JzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiBgbW92ZV9wYWdlcygpYCB3aGVyZSB0aGUgYGVycmAgdmFyaWFibGUgd2FzIG5vdCByZXNldCB0byAwIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGBtb3ZlX3BhZ2VzX3B0ZXMoKWAuIElmIGBlcnJgIHdhcyBwcmV2aW91c2x5IHNldCB0byBgLUVBR0FJTmAgKGUuZy4sIGZyb20gYSBwcmlvciBmYWlsZWQgYG1vdmVfcGFnZXNfaHVnZV9wbWQoKWAgYXR0ZW1wdCB0aGF0IHRyaWdnZXJlZCBhIGBjb250aW51ZWApLCBpdCB3b3VsZCByZW1haW4gYC1FQUdBSU5gLiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBsb29wIHRvIGluY29ycmVjdGx5IHNraXAgYWR2YW5jaW5nIHRoZSBgc3JjX2FkZHJgIGFuZCBgZHN0X2FkZHJgIHBvaW50ZXJzIGFuZCBgY29udGludWVgIGFnYWluLCBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJldHVybnMuXG5cblRoaXMgaXMgYSBjb250cm9sIGZsb3cgYW5kIGVycm9yIGhhbmRsaW5nIGJ1Zy4gSXQgZG9lcyBub3QgaW52b2x2ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRpbmcgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgaW5jbHVkaW5nIEtBU0FOIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3RvcnMsIGlzIHN1ZmZpY2llbnQgdG8gY2F0Y2ggc3VjaCBoYW5ncyBvciBsb2dpYyBlcnJvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiBgbW92ZV9wYWdlcygpYCB3aGVyZSB0aGUgYGVycmAgdmFyaWFibGUgd2FzIG5vdCByZXNldCB0byAwIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGBtb3ZlX3BhZ2VzX3B0ZXMoKWAuIElmIGBlcnJgIHdhcyBwcmV2aW91c2x5IHNldCB0byBgLUVBR0FJTmAgKGUuZy4sIGZyb20gYSBwcmlvciBmYWlsZWQgYG1vdmVfcGFnZXNfaHVnZV9wbWQoKWAgYXR0ZW1wdCB0aGF0IHRyaWdnZXJlZCBhIGBjb250aW51ZWApLCBpdCB3b3VsZCByZW1haW4gYC1FQUdBSU5gLiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBsb29wIHRvIGluY29ycmVjdGx5IHNraXAgYWR2YW5jaW5nIHRoZSBgc3JjX2FkZHJgIGFuZCBgZHN0X2FkZHJgIHBvaW50ZXJzIGFuZCBgY29udGludWVgIGFnYWluLCBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJldHVybnMuXG5cblRoaXMgaXMgYSBjb250cm9sIGZsb3cgYW5kIGVycm9yIGhhbmRsaW5nIGJ1Zy4gSXQgZG9lcyBub3QgaW52b2x2ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRpbmcgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgaW5jbHVkaW5nIEtBU0FOIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3RvcnMsIGlzIHN1ZmZpY2llbnQgdG8gY2F0Y2ggc3VjaCBoYW5ncyBvciBsb2dpYyBlcnJvcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjM3LjMyNjIwMTE2NFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcwNzY1MzkzMDc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidXNlcmZhdWx0ZmRfaW9jdGxcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIGBtb3ZlX3BhZ2VzKClgIHdoZXJlIHRoZSBgZXJyYCB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVfcGFnZXNfcHRlcygpYC4gSWYgYGVycmAgd2FzIHByZXZpb3VzbHkgc2V0IHRvIGAtRUFHQUlOYCAoZS5nLiwgZnJvbSBhIHByaW9yIGZhaWxlZCBgbW92ZV9wYWdlc19odWdlX3BtZCgpYCBhdHRlbXB0IHRoYXQgdHJpZ2dlcmVkIGEgYGNvbnRpbnVlYCksIGl0IHdvdWxkIHJlbWFpbiBgLUVBR0FJTmAuIFRoaXMgd291bGQgY2F1c2UgdGhlIGxvb3AgdG8gaW5jb3JyZWN0bHkgc2tpcCBhZHZhbmNpbmcgdGhlIGBzcmNfYWRkcmAgYW5kIGBkc3RfYWRkcmAgcG9pbnRlcnMgYW5kIGBjb250aW51ZWAgYWdhaW4sIGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmV0dXJucy5cXG5cXG5UaGlzIGlzIGEgY29udHJvbCBmbG93IGFuZCBlcnJvciBoYW5kbGluZyBidWcuIEl0IGRvZXMgbm90IGludm9sdmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkaW5nIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTiBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0b3JzLCBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIHN1Y2ggaGFuZ3Mgb3IgbG9naWMgZXJyb3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgYnVnIGluIHRoZSBVRkZESU9fTU9WRSBpb2N0bCBoYW5kbGVyIHdoZXJlIGEgcHJldmlvdXNseSBzZXQgZXJyb3IgY29kZSAobGlrZSAtRUFHQUlOKSB3YXMgbm90IGNsZWFyZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhZ2UgbW92ZSwgcG90ZW50aWFsbHkgbGVhZGluZyB0byBhbiBpbmZpbml0ZSBsb29wIG9yIGluY29ycmVjdCBlcnJvciByZXBvcnRpbmcuIFRoaXMgaXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTozNy4zMjYyMDY5ODRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyODY0NTg1MzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3ZmE0ZWY1YWIyMWMxNmZhODliYjU2MGZlODEyNWI4MGMxNDFhNTliXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgQXVnIDE1IDEwOjUxOjM1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jXFxuaW5kZXggYzNhZGVkYWFmN2Q1NC4uNTk1ZTdlMjMyZjkwMSAxMDA2NDRcXG4tLS0gYS9tbS91c2VyZmF1bHRmZC5jXFxuKysrIGIvbW0vdXNlcmZhdWx0ZmQuY1xcbkBAIC0yMDY5LDEwICsyMDY5LDEyIEBAIHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG4gXFx0XFx0XFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkcixcXG4gXFx0XFx0XFx0XFx0XFx0ICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7XFxuLVxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMCkge1xcbiBcXHRcXHRcXHRcXHRlcnIgPSByZXQ7XFxuLVxcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0XFx0ZXJyID0gMDtcXG4gXFx0XFx0XFx0XFx0c3RlcF9zaXplID0gcmV0O1xcbitcXHRcXHRcXHR9XFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTozOC42MTMzNDY3MVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjQxMzQ4NDMzNTY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidXNlcmZhdWx0ZmRfaW9jdGxcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgN2ZhNGVmNWFiMjFjMTZmYTg5YmI1NjBmZTgxMjViODBjMTQxYTU5YlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDE1IDEwOjUxOjM1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vdXNlcmZhdWx0ZmQuYyBiL21tL3VzZXJmYXVsdGZkLmNcbmluZGV4IGMzYWRlZGFhZjdkNTQuLjU5NWU3ZTIzMmY5MDEgMTAwNjQ0XG4tLS0gYS9tbS91c2VyZmF1bHRmZC5jXG4rKysgYi9tbS91c2VyZmF1bHRmZC5jXG5AQCAtMjA2OSwxMCArMjA2OSwxMiBAQCBzdGF0aWMgc3NpemVfdCBtb3ZlX3BhZ2VzKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBkc3Rfc3RhcnQsXG4gXHRcdFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxuIFx0XHRcdFx0XHQgICAgICBkc3Rfdm1hLCBzcmNfdm1hLCBkc3RfYWRkcixcbiBcdFx0XHRcdFx0ICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7XG4tXHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4gXHRcdFx0XHRlcnIgPSByZXQ7XG4tXHRcdFx0ZWxzZVxuK1x0XHRcdH0gZWxzZSB7XG4rXHRcdFx0XHRlcnIgPSAwO1xuIFx0XHRcdFx0c3RlcF9zaXplID0gcmV0O1xuK1x0XHRcdH1cbiBcdFx0fVxuIFxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjM4LjYxMzM0ODI1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM2MzM5ODM0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBVc2VyZmF1bHRmZCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBtbS91c2VyZmF1bHRmZC5jYC4gSW1tZWRpYXRlbHksIEkgc2VlIGEgc2ltcGxlLCBhbG1vc3QgdHJpdmlhbCwgY29kZSBjaGFuZ2UuIFRoZXkndmUgd3JhcHBlZCB0aGUgYGlmIChyZXQgXHUwMDNjIDApYCBibG9jayB3aXRoIGN1cmx5IGJyYWNlcyBhbmQsIGltcG9ydGFudGx5LCBhZGRlZCBgZXJyID0gMDtgIHdpdGhpbiB0aGUgYGVsc2VgIGJsb2NrLiBNeSBpbml0aWFsIHJlYWN0aW9uIGlzLCBcIldoeT9cIiBJdCBsb29rcyBsaWtlIHRoZXkncmUgZXhwbGljaXRseSBzZXR0aW5nIHRoZSBgZXJyYCB2YXJpYWJsZSB0byB6ZXJvIGlmIHRoZSBgcmV0YCBmcm9tIHNvbWUgZnVuY3Rpb24gY2FsbCBpc24ndCBhbiBlcnJvci4gVGhpcyBkZWZpbml0ZWx5IHJlcXVpcmVzIGEgY2xvc2VyIGxvb2suIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYHJldGAgcmVwcmVzZW50cyBhbmQgd2hhdCBgbW92ZV9wYWdlc2AgaXMgZG9pbmcgaW4gdGhpcyBjb250ZXh0IHRvIGZpZ3VyZSBvdXQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZS4gTGV0J3MgZGlnIGludG8gdGhlIGBtb3ZlX3BhZ2VzYCBmdW5jdGlvbiBpbiBgbW0vdXNlcmZhdWx0ZmQuY2AgYW5kIHNlZSBpZiB0aGUgY29udGV4dCBjbGFyaWZpZXMgdGhlIHJlYXNvbmluZyBiZWhpbmQgemVyb2luZyBvdXQgdGhlIGBlcnJgIHZhbHVlLiBJdCBzZWVtcyBvZGQgdGhhdCB0aGUgZXJyb3IgdmFyaWFibGUgaXMgYmVpbmcgYXNzaWduZWQgMCBpbiBhIG5vbi1lcnJvciBjb25kaXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMjksIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTo0MS45NzY3NDg0OTRaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUyNjgwNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibW92ZV9wYWdlc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS91c2VyZmF1bHRmZC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL3VzZXJmYXVsdGZkLmM9MTM4Mj1zdGF0aWMgaW50IG1vdmVfemVyb3BhZ2VfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xNDE0LSAqL1xcbm1tL3VzZXJmYXVsdGZkLmM6MTQxNTpzdGF0aWMgbG9uZyBtb3ZlX3BhZ2VzX3B0ZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpkc3RfcG1kLCBwbWRfdCAqc3JjX3BtZCxcXG5tbS91c2VyZmF1bHRmZC5jLTE0MTYtXFx0XFx0XFx0ICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0X3ZtYSxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmM9MTg1OT1zdGF0aWMgdm9pZCB1ZmZkX21vdmVfdW5sb2NrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0X3ZtYSxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMTg2Ny0vKipcXG5tbS91c2VyZmF1bHRmZC5jOjE4Njg6ICogbW92ZV9wYWdlcyAtIG1vdmUgYXJiaXRyYXJ5IGFub255bW91cyBwYWdlcyBvZiBhbiBleGlzdGluZyB2bWFcXG5tbS91c2VyZmF1bHRmZC5jLTE4NjktICogQGN0eDogcG9pbnRlciB0byB0aGUgdXNlcmZhdWx0ZmQgY29udGV4dFxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xODc2LSAqXFxubW0vdXNlcmZhdWx0ZmQuYzoxODc3OiAqIG1vdmVfcGFnZXMoKSByZW1hcHMgYXJiaXRyYXJ5IGFub255bW91cyBwYWdlcyBhdG9taWNhbGx5IGluIHplcm9cXG5tbS91c2VyZmF1bHRmZC5jLTE4NzgtICogY29weS4gSXQgb25seSB3b3JrcyBvbiBub24gc2hhcmVkIGFub255bW91cyBwYWdlcyBiZWNhdXNlIHRob3NlIGNhblxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xODg4LSAqIHN0b3JhZ2Ugb3IgYW55IG90aGVyIEkvTyBkZXZpY2UgKE1BRFZfRE9OVEZPUksgaW4gdGhlIHNvdXJjZSB2bWFcXG5tbS91c2VyZmF1bHRmZC5jOjE4ODk6ICogYXZvaWRzIG1vdmVfcGFnZXMoKSB0byBmYWlsIHdpdGggLUVCVVNZIGlmIHRoZSBwcm9jZXNzIGZvcmtzIGJlZm9yZVxcbm1tL3VzZXJmYXVsdGZkLmM6MTg5MDogKiBtb3ZlX3BhZ2VzKCkgaXMgY2FsbGVkKSwgdGhlbiBpdCB3aWxsIGNhbGwgbW92ZV9wYWdlcygpIHRvIG1hcCB0aGVcXG5tbS91c2VyZmF1bHRmZC5jLTE4OTEtICogcGFnZSBpbiB0aGUgZmF1bHRpbmcgYWRkcmVzcyBpbiB0aGUgZGVzdGluYXRpb24gdm1hLlxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTA1LSAqIHRoZSBkZXN0aW5hdGlvbiB2aXJ0dWFsIG1lbW9yeSByYW5nZSBpcyBub3QgYSB3aG9sZSB1bm1hcHBlZCBob2xlLFxcbm1tL3VzZXJmYXVsdGZkLmM6MTkwNjogKiBtb3ZlX3BhZ2VzKCkgd2lsbCBmYWlsIHJlc3BlY3RpdmVseSB3aXRoIC1FTk9FTlQgb3IgLUVFWElTVC4gVGhpc1xcbm1tL3VzZXJmYXVsdGZkLmMtMTkwNy0gKiBwcm92aWRlcyBhIHZlcnkgc3RyaWN0IGJlaGF2aW9yIHRvIGF2b2lkIGFueSBjaGFuY2Ugb2YgbWVtb3J5XFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE5MTAtICogdGltZSBmb3IgYW55IGdpdmVuIGZhdWx0aW5nIGFkZHJlc3MuIFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gdGhyZWFkc1xcbm1tL3VzZXJmYXVsdGZkLmM6MTkxMTogKiB0cnkgdG8gYm90aCBjYWxsIG1vdmVfcGFnZXMoKSBvbiB0aGUgc2FtZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGF0IHRoZVxcbm1tL3VzZXJmYXVsdGZkLmMtMTkxMi0gKiBzYW1lIHRpbWUsIHRoZSBzZWNvbmQgdGhyZWFkIHdpbGwgZ2V0IGFuIGV4cGxpY2l0IGVycm9yIGZyb20gdGhpc1xcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTIwLSAqIGFuIGFtb3VudCBvZiBieXRlcyBzdWNjZXNzZnVsbHkgbW92ZWQuIElmIHRoZSByZXR2YWwgcmVwb3J0cyBhXFxubW0vdXNlcmZhdWx0ZmQuYzoxOTIxOiAqIFxcXCJzaG9ydFxcXCIgcmVtYXAsIHRoZSBtb3ZlX3BhZ2VzKCkgY29tbWFuZCBzaG91bGQgYmUgcmVwZWF0ZWQgYnlcXG5tbS91c2VyZmF1bHRmZC5jLTE5MjItICogdXNlcmxhbmQgd2l0aCBzcmMrcmV0dmFsLCBkc3QrcmV2YWwsIGxlbi1yZXR2YWwgaWYgaXQgd2FudHMgdG8ga25vd1xcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTMzLSAqL1xcbm1tL3VzZXJmYXVsdGZkLmM6MTkzNDpzdGF0aWMgc3NpemVfdCBtb3ZlX3BhZ2VzKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBkc3Rfc3RhcnQsXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTM1LVxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JjX3N0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgX191NjQgbW9kZSlcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMjAxNC1cXHRcXHQgKiBiZSBzdHJpY3QuIElmIGRzdF9wbWQgY2hhbmdlcyBpbnRvIFRQSCBhZnRlciB0aGlzIGNoZWNrLCB0aGVcXG5tbS91c2VyZmF1bHRmZC5jOjIwMTU6XFx0XFx0ICogbW92ZV9wYWdlc19odWdlX3BtZCgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIHJldHJ5XFxubW0vdXNlcmZhdWx0ZmQuYzoyMDE2OlxcdFxcdCAqIHdoaWxlIG1vdmVfcGFnZXNfcHRlKCkgd2lsbCBkZXRlY3QgdGhlIGNoYW5nZSBhbmQgZmFpbC5cXG5tbS91c2VyZmF1bHRmZC5jLTIwMTctXFx0XFx0ICovXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTIwNDEtXFx0XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWQoc3JjX3ZtYSwgc3JjX3BtZCwgc3JjX2FkZHIpO1xcbm1tL3VzZXJmYXVsdGZkLmM6MjA0MjpcXHRcXHRcXHRcXHQvKiBUaGUgZm9saW8gd2lsbCBiZSBzcGxpdCBieSBtb3ZlX3BhZ2VzX3B0ZSgpICovXFxubW0vdXNlcmZhdWx0ZmQuYy0yMDQzLVxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy0yMDQ1LVxcbm1tL3VzZXJmYXVsdGZkLmM6MjA0NjpcXHRcXHRcXHRlcnIgPSBtb3ZlX3BhZ2VzX2h1Z2VfcG1kKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxcbm1tL3VzZXJmYXVsdGZkLmMtMjA0Ny1cXHRcXHRcXHRcXHRcXHRcXHQgIGRzdF9wbWR2YWwsIGRzdF92bWEsIHNyY192bWEsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTIwNjgtXFxubW0vdXNlcmZhdWx0ZmQuYzoyMDY5OlxcdFxcdFxcdHJldCA9IG1vdmVfcGFnZXNfcHRlcyhtbSwgZHN0X3BtZCwgc3JjX3BtZCxcXG5tbS91c2VyZmF1bHRmZC5jLTIwNzAtXFx0XFx0XFx0XFx0XFx0ICAgICAgZHN0X3ZtYSwgc3JjX3ZtYSwgZHN0X2FkZHIsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jPTQyMTY9c3RhdGljIGludCB1c2VyZmF1bHRmZF9tb3ZlKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtNDI1NS1cXHRpZiAobW1nZXRfbm90X3plcm8obW0pKSB7XFxubW0vdXNlcmZhdWx0ZmQuYzo0MjU2OlxcdFxcdHJldCA9IG1vdmVfcGFnZXMoY3R4LCB1ZmZkaW9fbW92ZS5kc3QsIHVmZmRpb19tb3ZlLnNyYyxcXG5tbS91c2VyZmF1bHRmZC5jLTQyNTctXFx0XFx0XFx0XFx0IHVmZmRpb19tb3ZlLmxlbiwgdWZmZGlvX21vdmUubW9kZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjQyLjAyMjAyMTU5M1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0MzIyMDMyNzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGBtb3ZlX3BhZ2VzYCBpbiBgbW0vdXNlcmZhdWx0ZmQuY2AqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG1vdmVfcGFnZXNgIGlzIGhhbmRsaW5nIHRoaW5ncyBpbiB0aGUgY29udGV4dCBvZiB1c2VyZmF1bHRmZC4gVGhpcyBmdW5jdGlvbiBpcyBjcml0aWNhbCBmb3IgaG93IHdlIG1hbmFnZSBwYWdlIG1pZ3JhdGlvbiBhbmQgdHJhbnNmZXIsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdXNlci1zcGFjZSBtZW1vcnkgYWNjZXNzIGZhdWx0cy4gSSB3YW50IHRvIHNlZSBob3cgdGhlIGtlcm5lbCBvcmNoZXN0cmF0ZXMgdGhpcyB3aG9sZSBkYW5jZSBiZXR3ZWVuIHVzZXIgc3BhY2UgYW5kIGtlcm5lbCBzcGFjZS4gU3BlY2lmaWNhbGx5LCBJJ20gaW50ZXJlc3RlZCBpbiB0aGUgaW50ZXJwbGF5IGJldHdlZW4gYHVzZXJmYXVsdGZkYCBhbmQgdGhlIHBhZ2UgbWlncmF0aW9uIG1hY2hpbmVyeS4gSG93IGRvZXMgaXQga25vdyB3aGVyZSBwYWdlcyBhcmUsIGFuZCBob3cgZG9lcyBpdCBkaXJlY3QgdGhlbSB3aGVyZSB0aGV5IG5lZWQgdG8gZ28/IEknbSBleHBlY3RpbmcgdG8gZmluZCBhIGRlbGljYXRlIGJhbGFuY2luZyBhY3QgaGVyZSwgZW5zdXJpbmcgZGF0YSBpbnRlZ3JpdHkgd2hpbGUgbWluaW1pemluZyB0aGUgcGVyZm9ybWFuY2UgaGl0IG9mIHBhZ2UgZmF1bHRzLiBMZXQncyBzZWUgaG93IHRoZXkgZG8gaXQuIEknbSBsb29raW5nIGZvciB0aGUga2V5IGxvY2tpbmcgcHJpbWl0aXZlcywgZXJyb3IgaGFuZGxpbmcgcGF0aHMsIGFuZCB0aGUgb3ZlcmFsbCBsb2dpYyBmbG93LiBUaGlzIGNvdWxkIGdpdmUgbWUgc29tZSBncmVhdCBpbnNpZ2h0cy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzY4OCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjQ1LjQ1NDIyNzU3NloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMDMwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS91c2VyZmF1bHRmZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MzQsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTM0OlxcdHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG4xOTM1OlxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JjX3N0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgX191NjQgbW9kZSlcXG4xOTM2OlxcdHtcXG4xOTM3OlxcdFxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3R4LVxcdTAwM2VtbTtcXG4xOTM4OlxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSwgKmRzdF92bWE7XFxuMTkzOTpcXHRcXHR1bnNpZ25lZCBsb25nIHNyY19hZGRyLCBkc3RfYWRkciwgc3JjX2VuZDtcXG4xOTQwOlxcdFxcdHBtZF90ICpzcmNfcG1kLCAqZHN0X3BtZDtcXG4xOTQxOlxcdFxcdGxvbmcgZXJyID0gLUVJTlZBTDtcXG4xOTQyOlxcdFxcdHNzaXplX3QgbW92ZWQgPSAwO1xcbjE5NDM6XFx0XFxuMTk0NDpcXHRcXHQvKiBTYW5pdGl6ZSB0aGUgY29tbWFuZCBwYXJhbWV0ZXJzLiAqL1xcbjE5NDU6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDY6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGRzdF9zdGFydCBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDc6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDg6XFx0XFxuMTk0OTpcXHRcXHQvKiBEb2VzIHRoZSBhZGRyZXNzIHJhbmdlIHdyYXAsIG9yIGlzIHRoZSBzcGFuIHplcm8tc2l6ZWQ/ICovXFxuMTk1MDpcXHRcXHRWTV9XQVJOX09OX09OQ0Uoc3JjX3N0YXJ0ICsgbGVuIFxcdTAwM2Mgc3JjX3N0YXJ0KTtcXG4xOTUxOlxcdFxcdFZNX1dBUk5fT05fT05DRShkc3Rfc3RhcnQgKyBsZW4gXFx1MDAzYyBkc3Rfc3RhcnQpO1xcbjE5NTI6XFx0XFxuMTk1MzpcXHRcXHRlcnIgPSB1ZmZkX21vdmVfbG9jayhtbSwgZHN0X3N0YXJ0LCBzcmNfc3RhcnQsIFxcdTAwMjZkc3Rfdm1hLCBcXHUwMDI2c3JjX3ZtYSk7XFxuMTk1NDpcXHRcXHRpZiAoZXJyKVxcbjE5NTU6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk1NjpcXHRcXG4xOTU3OlxcdFxcdC8qIFJlLWNoZWNrIGFmdGVyIHRha2luZyBtYXBfY2hhbmdpbmdfbG9jayAqL1xcbjE5NTg6XFx0XFx0ZXJyID0gLUVBR0FJTjtcXG4xOTU5OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2Y3R4LVxcdTAwM2VtYXBfY2hhbmdpbmdfbG9jayk7XFxuMTk2MDpcXHRcXHRpZiAobGlrZWx5KGF0b21pY19yZWFkKFxcdTAwMjZjdHgtXFx1MDAzZW1tYXBfY2hhbmdpbmcpKSlcXG4xOTYxOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTYyOlxcdFxcdC8qXFxuMTk2MzpcXHRcXHQgKiBNYWtlIHN1cmUgdGhlIHZtYSBpcyBub3Qgc2hhcmVkLCB0aGF0IHRoZSBzcmMgYW5kIGRzdCByZW1hcFxcbjE5NjQ6XFx0XFx0ICogcmFuZ2VzIGFyZSBib3RoIHZhbGlkIGFuZCBmdWxseSB3aXRoaW4gYSBzaW5nbGUgZXhpc3RpbmdcXG4xOTY1OlxcdFxcdCAqIHZtYS5cXG4xOTY2OlxcdFxcdCAqL1xcbjE5Njc6XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4xOTY4OlxcdFxcdGlmIChzcmNfdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NIQVJFRClcXG4xOTY5OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTcwOlxcdFxcdGlmIChzcmNfc3RhcnQgKyBsZW4gXFx1MDAzZSBzcmNfdm1hLVxcdTAwM2V2bV9lbmQpXFxuMTk3MTpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk3MjpcXHRcXG4xOTczOlxcdFxcdGlmIChkc3Rfdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NIQVJFRClcXG4xOTc0OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTc1OlxcdFxcdGlmIChkc3Rfc3RhcnQgKyBsZW4gXFx1MDAzZSBkc3Rfdm1hLVxcdTAwM2V2bV9lbmQpXFxuMTk3NjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdFxcdGVyciA9IHZhbGlkYXRlX21vdmVfYXJlYXMoY3R4LCBzcmNfdm1hLCBkc3Rfdm1hKTtcXG4xOTc5OlxcdFxcdGlmIChlcnIpXFxuMTk4MDpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk4MTpcXHRcXG4xOTgyOlxcdFxcdGZvciAoc3JjX2FkZHIgPSBzcmNfc3RhcnQsIGRzdF9hZGRyID0gZHN0X3N0YXJ0LCBzcmNfZW5kID0gc3JjX3N0YXJ0ICsgbGVuO1xcbjE5ODM6XFx0XFx0ICAgICBzcmNfYWRkciBcXHUwMDNjIHNyY19lbmQ7KSB7XFxuMTk4NDpcXHRcXHRcXHRzcGlubG9ja190ICpwdGw7XFxuMTk4NTpcXHRcXHRcXHRwbWRfdCBkc3RfcG1kdmFsO1xcbjE5ODY6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzdGVwX3NpemU7XFxuMTk4NzpcXHRcXG4xOTg4OlxcdFxcdFxcdC8qXFxuMTk4OTpcXHRcXHRcXHQgKiBCZWxvdyB3b3JrcyBiZWNhdXNlIGFub255bW91cyBhcmVhIHdvdWxkIG5vdCBoYXZlIGFcXG4xOTkwOlxcdFxcdFxcdCAqIHRyYW5zcGFyZW50IGh1Z2UgUFVELiBJZiBmaWxlLWJhY2tlZCBzdXBwb3J0IGlzIGFkZGVkLFxcbjE5OTE6XFx0XFx0XFx0ICogdGhhdCBjYXNlIHdvdWxkIG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlLlxcbjE5OTI6XFx0XFx0XFx0ICovXFxuMTk5MzpcXHRcXHRcXHRzcmNfcG1kID0gbW1fZmluZF9wbWQobW0sIHNyY19hZGRyKTtcXG4xOTk0OlxcdFxcdFxcdGlmICh1bmxpa2VseSghc3JjX3BtZCkpIHtcXG4xOTk1OlxcdFxcdFxcdFxcdGlmICghKG1vZGUgXFx1MDAyNiBVRkZESU9fTU9WRV9NT0RFX0FMTE9XX1NSQ19IT0xFUykpIHtcXG4xOTk2OlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9FTlQ7XFxuMTk5NzpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4xOTk4OlxcdFxcdFxcdFxcdH1cXG4xOTk5OlxcdFxcdFxcdFxcdHNyY19wbWQgPSBtbV9hbGxvY19wbWQobW0sIHNyY19hZGRyKTtcXG4yMDAwOlxcdFxcdFxcdFxcdGlmICh1bmxpa2VseSghc3JjX3BtZCkpIHtcXG4yMDAxOlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjAwMjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4yMDAzOlxcdFxcdFxcdFxcdH1cXG4yMDA0OlxcdFxcdFxcdH1cXG4yMDA1OlxcdFxcdFxcdGRzdF9wbWQgPSBtbV9hbGxvY19wbWQobW0sIGRzdF9hZGRyKTtcXG4yMDA2OlxcdFxcdFxcdGlmICh1bmxpa2VseSghZHN0X3BtZCkpIHtcXG4yMDA3OlxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjAwODpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDA5OlxcdFxcdFxcdH1cXG4yMDEwOlxcdFxcbjIwMTE6XFx0XFx0XFx0ZHN0X3BtZHZhbCA9IHBtZHBfZ2V0X2xvY2tsZXNzKGRzdF9wbWQpO1xcbjIwMTI6XFx0XFx0XFx0LypcXG4yMDEzOlxcdFxcdFxcdCAqIElmIHRoZSBkc3RfcG1kIGlzIG1hcHBlZCBhcyBUSFAgZG9uJ3Qgb3ZlcnJpZGUgaXQgYW5kIGp1c3RcXG4yMDE0OlxcdFxcdFxcdCAqIGJlIHN0cmljdC4gSWYgZHN0X3BtZCBjaGFuZ2VzIGludG8gVFBIIGFmdGVyIHRoaXMgY2hlY2ssIHRoZVxcbjIwMTU6XFx0XFx0XFx0ICogbW92ZV9wYWdlc19odWdlX3BtZCgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIHJldHJ5XFxuMjAxNjpcXHRcXHRcXHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXFxuMjAxNzpcXHRcXHRcXHQgKi9cXG4yMDE4OlxcdFxcdFxcdGlmICh1bmxpa2VseShwbWRfdHJhbnNfaHVnZShkc3RfcG1kdmFsKSkpIHtcXG4yMDE5OlxcdFxcdFxcdFxcdGVyciA9IC1FRVhJU1Q7XFxuMjAyMDpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDIxOlxcdFxcdFxcdH1cXG4yMDIyOlxcdFxcbjIwMjM6XFx0XFx0XFx0cHRsID0gcG1kX3RyYW5zX2h1Z2VfbG9jayhzcmNfcG1kLCBzcmNfdm1hKTtcXG4yMDI0OlxcdFxcdFxcdGlmIChwdGwpIHtcXG4yMDI1OlxcdFxcdFxcdFxcdC8qIENoZWNrIGlmIHdlIGNhbiBtb3ZlIHRoZSBwbWQgd2l0aG91dCBzcGxpdHRpbmcgaXQuICovXFxuMjAyNjpcXHRcXHRcXHRcXHRpZiAobW92ZV9zcGxpdHNfaHVnZV9wbWQoZHN0X2FkZHIsIHNyY19hZGRyLCBzcmNfc3RhcnQgKyBsZW4pIHx8XFxuMjAyNzpcXHRcXHRcXHRcXHQgICAgIXBtZF9ub25lKGRzdF9wbWR2YWwpKSB7XFxuMjAyODpcXHRcXHRcXHRcXHRcXHQvKiBDYW4gYmUgYSBtaWdyYXRpb24gZW50cnkgKi9cXG4yMDI5OlxcdFxcdFxcdFxcdFxcdGlmIChwbWRfcHJlc2VudCgqc3JjX3BtZCkpIHtcXG4yMDMwOlxcdFxcdFxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwbWRfZm9saW8oKnNyY19wbWQpO1xcbjIwMzE6XFx0XFxuMjAzMjpcXHRcXHRcXHRcXHRcXHRcXHRpZiAoIWlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykgXFx1MDAyNlxcdTAwMjZcXG4yMDMzOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAhUGFnZUFub25FeGNsdXNpdmUoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTo0NS40NTQ0NjAxOTZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTUwMDUyNjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byBgbW92ZV9wYWdlc2AqKlxuXG5BbHJpZ2h0LCBJJ3ZlIGdvdCB0aGUgaW5pdGlhbCBvdmVydmlldyBvZiBgbW92ZV9wYWdlc2AgaW4gbXkgaGVhZC4gTm93LCB0aGUgcmVhbCB3b3JrIGJlZ2lucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIG51YW5jZXMsIHRoZSBlZGdlIGNhc2VzLCB0aGUgcG90ZW50aWFsIGJvdHRsZW5lY2tzLiBMZXQncyBkaWcgaW50byB0aGUgbWVhdCBvZiB0aGUgY29kZS4gTXkgcHJpbWFyeSBmb2N1cyBpcyBsaWtlbHkgb24gaG93IGl0IGhhbmRsZXMgbWVtb3J5IG1hbmFnZW1lbnQsIGVzcGVjaWFsbHkgaWYgdGhpcyBpcyByZWxhdGVkIHRvIGEgcGFnaW5nIHN5c3RlbSwgb3Igc29tZSBmb3JtIG9mIHZpcnR1YWwgbWVtb3J5LiBJJ20gbG9va2luZyBmb3Igd2hlcmUgcGFnZSB0YWJsZXMgYXJlIHVwZGF0ZWQsIHdoZXJlIHBoeXNpY2FsIGZyYW1lcyBtaWdodCBiZSBhbGxvY2F0ZWQgb3IgZGVhbGxvY2F0ZWQsIGFuZCBob3cgY29oZXJlbmN5IGlzIG1haW50YWluZWQsIGlmIHRoaXMgb3BlcmF0aW9uIGlzIGhhcHBlbmluZyBjb25jdXJyZW50bHkuIElzIGl0IHRocmVhZC1zYWZlPyBEb2VzIGl0IGVtcGxveSBsb2NrcywgYW5kIGlmIHNvLCBob3cgZ3JhbnVsYXIgYXJlIHRoZXk/IEFueSBkZWFkbG9ja3M/IEFsc28sIHdoYXQgaGFwcGVucyBpbiBhIHNpdHVhdGlvbiBvZiBhbiBvdXQtb2YtbWVtb3J5IGVycm9yLlxuXG5JIHdhbnQgdG8gc2VlIHRoZSBkZXRhaWxzIG9uIHRoZSBkYXRhIHN0cnVjdHVyZXMgaXQgbWFuaXB1bGF0ZXMuIEhvdyBhcmUgdGhlIHBhZ2VzIG9yZ2FuaXplZCBiZWZvcmUgdGhlIG1vdmU/IElzIGl0IGEgbGlua2VkIGxpc3QsIGEgaGFzaCB0YWJsZSwgYSB0cmVlIHN0cnVjdHVyZSwgb3Igc29tZXRoaW5nIGVsc2U/IFVuZGVyc3RhbmRpbmcgdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmVzIGlzIGtleSB0byBvcHRpbWl6aW5nIHRoZSBhbGdvcml0aG0uIEknbGwgYmUgd2F0Y2hpbmcgaG93IGl0IGhhbmRsZXMgZXhjZXB0aW9ucywgZXJyb3IgcmVjb3ZlcnksIGFuZCB0aGUgb3ZlcmFsbCByZWxpYWJpbGl0eSBvZiB0aGUgZnVuY3Rpb24uIElzIGl0IGF0b21pYz8gSSdtIGFudGljaXBhdGluZyB0aGF0IEknbGwgYmUgbWVudGFsbHkgbWFwcGluZyB0aGUgZnVuY3Rpb24ncyBsb2dpYyB0byB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBjYXBhYmlsaXRpZXMsIHBlcmhhcHMgaW5jbHVkaW5nIHRoZSBDUFUncyBtZW1vcnkgbWFuYWdlbWVudCB1bml0IGFuZCBhbnkgcmVsZXZhbnQgY2FjaGUgY29uZmlndXJhdGlvbnMuIFVuZGVyc3RhbmRpbmcgdGhlc2UgaW50ZXJhY3Rpb25zIGlzIGNyaXRpY2FsLCBhcyBpdCBoYXMgYSBtYXNzaXZlIHBlcmZvcm1hbmNlIGltcGFjdC4gRmluYWxseSwgSSB3aWxsIGJlIHRoaW5raW5nIG9mIHdheXMgdG8gcmVmYWN0b3IgdGhpcyBmdW5jdGlvbiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLCBtYWludGFpbmFiaWxpdHksIGFuZCByZWFkYWJpbGl0eS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTYyOSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTE6NDkuNDA0NTE2NDc0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkwMzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3VzZXJmYXVsdGZkLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjAzNCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIwMzQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0c3Bpbl91bmxvY2socHRsKTtcXG4yMDM1OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGVyciA9IC1FQlVTWTtcXG4yMDM2OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwMzc6XFx0XFx0XFx0XFx0XFx0XFx0fVxcbjIwMzg6XFx0XFx0XFx0XFx0XFx0fVxcbjIwMzk6XFx0XFxuMjA0MDpcXHRcXHRcXHRcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbjIwNDE6XFx0XFx0XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWQoc3JjX3ZtYSwgc3JjX3BtZCwgc3JjX2FkZHIpO1xcbjIwNDI6XFx0XFx0XFx0XFx0XFx0LyogVGhlIGZvbGlvIHdpbGwgYmUgc3BsaXQgYnkgbW92ZV9wYWdlc19wdGUoKSAqL1xcbjIwNDM6XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjA0NDpcXHRcXHRcXHRcXHR9XFxuMjA0NTpcXHRcXG4yMDQ2OlxcdFxcdFxcdFxcdGVyciA9IG1vdmVfcGFnZXNfaHVnZV9wbWQobW0sIGRzdF9wbWQsIHNyY19wbWQsXFxuMjA0NzpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGRzdF9wbWR2YWwsIGRzdF92bWEsIHNyY192bWEsXFxuMjA0ODpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgIGRzdF9hZGRyLCBzcmNfYWRkcik7XFxuMjA0OTpcXHRcXHRcXHRcXHRzdGVwX3NpemUgPSBIUEFHRV9QTURfU0laRTtcXG4yMDUwOlxcdFxcdFxcdH0gZWxzZSB7XFxuMjA1MTpcXHRcXHRcXHRcXHRsb25nIHJldDtcXG4yMDUyOlxcdFxcbjIwNTM6XFx0XFx0XFx0XFx0aWYgKHBtZF9ub25lKCpzcmNfcG1kKSkge1xcbjIwNTQ6XFx0XFx0XFx0XFx0XFx0aWYgKCEobW9kZSBcXHUwMDI2IFVGRkRJT19NT1ZFX01PREVfQUxMT1dfU1JDX0hPTEVTKSkge1xcbjIwNTU6XFx0XFx0XFx0XFx0XFx0XFx0ZXJyID0gLUVOT0VOVDtcXG4yMDU2OlxcdFxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwNTc6XFx0XFx0XFx0XFx0XFx0fVxcbjIwNTg6XFx0XFx0XFx0XFx0XFx0aWYgKHVubGlrZWx5KF9fcHRlX2FsbG9jKG1tLCBzcmNfcG1kKSkpIHtcXG4yMDU5OlxcdFxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjA2MDpcXHRcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4yMDYxOlxcdFxcdFxcdFxcdFxcdH1cXG4yMDYyOlxcdFxcdFxcdFxcdH1cXG4yMDYzOlxcdFxcbjIwNjQ6XFx0XFx0XFx0XFx0aWYgKHVubGlrZWx5KHB0ZV9hbGxvYyhtbSwgZHN0X3BtZCkpKSB7XFxuMjA2NTpcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbjIwNjY6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjA2NzpcXHRcXHRcXHRcXHR9XFxuMjA2ODpcXHRcXG4yMDY5OlxcdFxcdFxcdFxcdHJldCA9IG1vdmVfcGFnZXNfcHRlcyhtbSwgZHN0X3BtZCwgc3JjX3BtZCxcXG4yMDcwOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIGRzdF92bWEsIHNyY192bWEsIGRzdF9hZGRyLFxcbjIwNzE6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgc3JjX2FkZHIsIHNyY19lbmQgLSBzcmNfYWRkciwgbW9kZSk7XFxuMjA3MjpcXHRcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2MgMCkge1xcbjIwNzM6XFx0XFx0XFx0XFx0XFx0ZXJyID0gcmV0O1xcbjIwNzQ6XFx0XFx0XFx0XFx0fSBlbHNlIHtcXG4yMDc1OlxcdFxcdFxcdFxcdFxcdGVyciA9IDA7XFxuMjA3NjpcXHRcXHRcXHRcXHRcXHRzdGVwX3NpemUgPSByZXQ7XFxuMjA3NzpcXHRcXHRcXHRcXHR9XFxuMjA3ODpcXHRcXHRcXHR9XFxuMjA3OTpcXHRcXG4yMDgwOlxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbjIwODE6XFx0XFxuMjA4MjpcXHRcXHRcXHRpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHtcXG4yMDgzOlxcdFxcdFxcdFxcdC8qIERvIG5vdCBvdmVycmlkZSBhbiBlcnJvciAqL1xcbjIwODQ6XFx0XFx0XFx0XFx0aWYgKCFlcnIgfHwgZXJyID09IC1FQUdBSU4pXFxuMjA4NTpcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRUlOVFI7XFxuMjA4NjpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDg3OlxcdFxcdFxcdH1cXG4yMDg4OlxcdFxcbjIwODk6XFx0XFx0XFx0aWYgKGVycikge1xcbjIwOTA6XFx0XFx0XFx0XFx0aWYgKGVyciA9PSAtRUFHQUlOKVxcbjIwOTE6XFx0XFx0XFx0XFx0XFx0Y29udGludWU7XFxuMjA5MjpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDkzOlxcdFxcdFxcdH1cXG4yMDk0OlxcdFxcbjIwOTU6XFx0XFx0XFx0LyogUHJvY2VlZCB0byB0aGUgbmV4dCBwYWdlICovXFxuMjA5NjpcXHRcXHRcXHRkc3RfYWRkciArPSBzdGVwX3NpemU7XFxuMjA5NzpcXHRcXHRcXHRzcmNfYWRkciArPSBzdGVwX3NpemU7XFxuMjA5ODpcXHRcXHRcXHRtb3ZlZCArPSBzdGVwX3NpemU7XFxuMjA5OTpcXHRcXHR9XFxuMjEwMDpcXHRcXG4yMTAxOlxcdG91dF91bmxvY2s6XFxuMjEwMjpcXHRcXHR1cF9yZWFkKFxcdTAwMjZjdHgtXFx1MDAzZW1hcF9jaGFuZ2luZ19sb2NrKTtcXG4yMTAzOlxcdFxcdHVmZmRfbW92ZV91bmxvY2soZHN0X3ZtYSwgc3JjX3ZtYSk7XFxuMjEwNDpcXHRvdXQ6XFxuMjEwNTpcXHRcXHRWTV9XQVJOX09OX09OQ0UobW92ZWQgXFx1MDAzYyAwKTtcXG4yMTA2OlxcdFxcdFZNX1dBUk5fT05fT05DRShlcnIgXFx1MDAzZSAwKTtcXG4yMTA3OlxcdFxcdFZNX1dBUk5fT05fT05DRSghbW92ZWQgXFx1MDAyNlxcdTAwMjYgIWVycik7XFxuMjEwODpcXHRcXHRyZXR1cm4gbW92ZWQgPyBtb3ZlZCA6IGVycjtcXG4yMTA5OlxcdH1cXG4yMTEwOlxcdFxcbjIxMTE6XFx0c3RhdGljIGJvb2wgdm1hX2Nhbl91c2VyZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHZtX2ZsYWdzX3Qgdm1fZmxhZ3MsXFxuMjExMjpcXHRcXHRcXHQgICAgICAgYm9vbCB3cF9hc3luYylcXG4yMTEzOlxcdHtcXG4yMTE0OlxcdFxcdGNvbnN0IHN0cnVjdCB2bV91ZmZkX29wcyAqb3BzID0gdm1hX3VmZmRfb3BzKHZtYSk7XFxuMjExNTpcXHRcXG4yMTE2OlxcdFxcdGlmICh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgKFZNX0RST1BQQUJMRSB8IFZNX1NIQURPV19TVEFDSykpXFxuMjExNzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuMjExODpcXHRcXG4yMTE5OlxcdFxcdGlmICghaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkgXFx1MDAyNlxcdTAwMjYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9TUEVDSUFMKSlcXG4yMTIwOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4yMTIxOlxcdFxcbjIxMjI6XFx0XFx0dm1fZmxhZ3MgXFx1MDAyNj0gX19WTV9VRkZEX0ZMQUdTO1xcbjIxMjM6XFx0XFxuMjEyNDpcXHRcXHQvKlxcbjIxMjU6XFx0XFx0ICogSWYgV1AgaXMgdGhlIG9ubHkgbW9kZSBlbmFibGVkIGFuZCBjb250ZXh0IGlzIHdwIGFzeW5jLCBhbGxvdyBhbnlcXG4yMTI2OlxcdFxcdCAqIG1lbW9yeSB0eXBlLlxcbjIxMjc6XFx0XFx0ICovXFxuMjEyODpcXHRcXHRpZiAod3BfYXN5bmMgXFx1MDAyNlxcdTAwMjYgKHZtX2ZsYWdzID09IFZNX1VGRkRfV1ApKVxcbjIxMjk6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuMjEzMDpcXHRcXG4yMTMxOlxcdFxcdC8qIEZvciBhbnkgb3RoZXIgbW9kZSByZWplY3QgVk1BcyB0aGF0IGRvbid0IGltcGxlbWVudCB2bV91ZmZkX29wcyAqL1xcbjIxMzI6XFx0XFx0aWYgKCFvcHMpXFxuMjEzMzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUxOjQ5LjQwNDcwOTY4NFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkyMzY3MTg3NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgU3VidGxlIEJ1ZyBpbiBgbW92ZV9wYWdlc2AqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciBgbW92ZV9wYWdlc2AsIGFuZCBteSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0aGF0IGl0J3MgYWRkcmVzc2luZyBhIHByZXR0eSBuYXN0eSBidWcuIEl0IHNlZW1zIHRoYXQgdGhlIGBlcnJgIHZhcmlhYmxlLCB3aGljaCBpcyB1c2VkIHRvIHRyYWNrIGVycm9ycyBkdXJpbmcgdGhlIHBhZ2UgbWlncmF0aW9uIHByb2Nlc3MsIHdhc24ndCBiZWluZyBwcm9wZXJseSByZXNldCBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgbW92ZV9wYWdlc19wdGVzYC4gVGhpcyBtZWFucyB0aGF0IGlmIGBtb3ZlX3BhZ2VzX3B0ZXNgIHdvcmtlZCwgYnV0IGEgcHJldmlvdXMgb3BlcmF0aW9uIGluIHRoZSBsb29wIGhhZCBzZXQgYGVycmAgdG8gc29tZXRoaW5nIGxpa2UgYC1FSU5WQUxgIG9yIGAtRUFHQUlOYCwgdGhhdCBuZWdhdGl2ZSBlcnJvciBjb2RlIHdvdWxkIGluY29ycmVjdGx5IHBlcnNpc3QuXG5cbkxldCBtZSBicmVhayB0aGlzIGRvd24uIEluaXRpYWxseSwgYGVycmAgaXMgc2V0IHRvIGAtRUlOVkFMYC4gVGhlbiBgdmFsaWRhdGVfbW92ZV9hcmVhc2AgY2FuIHJlc2V0IGl0LiBJbnNpZGUgdGhlIG1haW4gbG9vcCwgaWYgYW4gZXJyb3IgaGFwcGVucyBpbiBhIGZ1bmN0aW9uIGxpa2UgYHZhbGlkYXRlX21vdmVfYXJlYXNgIHRoYXQgaXNuJ3QgZmF0YWwsIGl0IHNldHMgYGVycmAgKGZvciBleGFtcGxlLCB0byBgLUVBR0FJTmApIGFuZCBwb3RlbnRpYWxseSBjb250aW51ZXMgb3IgYnJlYWtzIGJhc2VkIG9uIHRoZSBlcnJvci4gSSBoYXZlIHRvIHRoaW5rIHRocm91Z2ggdGhpcyBjYXJlZnVsbHkuIEFoLCBJIHNlZSB3aGF0J3MgaGFwcGVuaW5nLiBUaGUgbG9vcCBpdHNlbGYgZG9lc24ndCByZXNldCBgZXJyYCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggaXRlcmF0aW9uLiBTbywgaWYgYG1vdmVfcGFnZXNfcHRlc2Agc3VjY2VlZHMgb24gYW4gaXRlcmF0aW9uLCBidXQgYGVycmAgaGFkIGJlZW4gc2V0IHRvLCBzYXksIGAtRUFHQUlOYCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLCB0aGVuIHRoZSBmdW5jdGlvbiB3b3VsZCB1c2UgdGhhdCBvbGQgZXJyb3IgY29kZS4gU3BlY2lmaWNhbGx5LCBpZiBgZXJyYCBpcyBgLUVBR0FJTmAsIHRoZW4gd2UgaGl0IGBjb250aW51ZWAgYW5kIGF2b2lkIGluY3JlbWVudGluZyB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3Nlcy5cblxuT2theSwgc28gdGhlIGBlcnIgPT0gLUVBR0FJTmAgY2hlY2sgKmNvbnRpbnVlcyogdGhlIGxvb3Agd2l0aG91dCB1cGRhdGluZyBgZHN0X2FkZHJgIG9yIGBzcmNfYWRkcmAsIG1lYW5pbmcgaXQncyBnb2luZyB0byByZXRyeSB0aGUgKnNhbWUqIG1lbW9yeSByZWdpb24gb3ZlciBhbmQgb3ZlciBhZ2FpbiwgaWYgYSB0ZW1wb3JhcnkgZXJyb3IgaXMgZW5jb3VudGVyZWQuIFRoaXMgaXMgYmFkOyB0aGlzIHdpbGwgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLCBvciBhdCBsZWFzdCBhIHZlcnkgbG9uZyB0aW1lb3V0ISBUaGF0J3MgYSBkZWZpbml0ZSBmdW5jdGlvbmFsIGJ1Zy5cblxuTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IGlzIHRoaXMgYnVnIGFjdHVhbGx5IHJlYWNoYWJsZT8gVGhlIGdvb2QgbmV3cyBpcyB0aGF0IGBtb3ZlX3BhZ2VzYCBpcyBjYWxsZWQgYnkgYHVzZXJmYXVsdGZkX21vdmVgLCB3aGljaCBpdHNlbGYgaXMgdGhlIGhhbmRsZXIgZm9yIHRoZSBgVUZGRElPX01PVkVgIGlvY3RsLiBTaW5jZSB0aGF0J3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIHRoaXMgaXMgYWJzb2x1dGVseSBhIHJlYWNoYWJsZSBidWcsIGFuZCBwb3RlbnRpYWxseSBleHBsb2l0YWJsZS4gSXQncyBkZWZpbml0ZWx5IHNvbWV0aGluZyBJIHdhbnQgdG8gZnV6eiBhbmQgdGVzdCB0aG9yb3VnaGx5LiBJIG5lZWQgdG8gbWFrZSBzdXJlIGBVU0VSRkFVTFRGRGAgaXMgZW5hYmxlZCB0byB0cmlnZ2VyIHRoaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc0MjEsIk91dHB1dFRva2VucyI6MjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NDYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MTo1OC42NDE0MzIwMzRaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MDkxNTYyMjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFVTRVJGQVVMVEZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTEzODQ9Y29uZmlnIEhBVkVfQVJDSF9VU0VSRkFVTFRGRF9NSU5PUlxcbi0tXFxubW0vS2NvbmZpZy0xMzg4LVxcbm1tL0tjb25maWc6MTM4OTptZW51Y29uZmlnIFVTRVJGQVVMVEZEXFxubW0vS2NvbmZpZy0xMzkwLVxcdGJvb2wgXFxcIkVuYWJsZSB1c2VyZmF1bHRmZCgpIHN5c3RlbSBjYWxsXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjowMC4zNTA1OTU0ODZaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzIxMjY1ODg1NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKktlcm5lbCBDb25maWd1cmF0aW9uIEh1bnRpbmc6IFVTRVJGQVVMVEZEKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBgVVNFUkZBVUxURkRgIGZ1bmN0aW9uYWxpdHkgd2l0aGluIHRoZSBrZXJuZWwuIFRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50IGZvciBhbnkgY29uZmlndXJhdGlvbiBvcHRpb24gbGlrZSB0aGlzIGlzIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gVGhhdCdzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWdzIGFyZSBkZWZpbmVkLCBhbmQgYFVTRVJGQVVMVEZEYCBpcywgYXQgaXRzIGNvcmUsIGEgbWVtb3J5IG1hbmFnZW1lbnQgZmVhdHVyZSwgYWxiZWl0IGEgZmFpcmx5IGludm9sdmVkIG9uZS4gU28sIHRoZSBmaXJzdCB0aGluZyBJJ20gZ29pbmcgdG8gZG8gaXMgcHVsbCB1cCB0aGF0IGZpbGUgYW5kIGdldCBhIGRpcmVjdCBsb29rIGF0IHRoZSBhc3NvY2lhdGVkIG9wdGlvbnMsIGRlcGVuZGVuY2llcywgYW5kIGhlbHAgdGV4dC4gSSB3YW50IHRvIHF1aWNrbHkgZ2F1Z2U6XG5cbiogICBXaGF0IGFyZSB0aGUgY29yZSBkZXBlbmRlbmNpZXM/IEFueSByZXF1aXJlZCBoYXJkd2FyZSBmZWF0dXJlcywgb3RoZXIgY29uZmlncywgb3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvbnNpZGVyYXRpb25zIHRoYXQgaW1tZWRpYXRlbHkgcG9wIG91dD9cbiogICBJcyBpdCBhIG1vZHVsYXIgb3IgYnVpbHQtaW4gb3B0aW9uPyBUaGlzIHdpbGwgYWZmZWN0IGhvdyBpdCdzIGVuYWJsZWQgYW5kIHV0aWxpemVkIGluIGRpZmZlcmVudCBzY2VuYXJpb3MuXG4qICAgV2hhdCdzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBgVVNFUkZBVUxURkRgIGFuZCBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBmZWF0dXJlcyBsaWtlIGBIV1BPSVNPTmAgb3IgTlVNQSBzZXR0aW5ncz8gQXJlIHRoZXJlIGFueSBvYnZpb3VzIGNvbmZsaWN0cyBvciBpbnRlcnBsYXk/XG4qICAgRXNzZW50aWFsbHksIHdoYXQncyB0aGUgbGFuZHNjYXBlIGhlcmUgaW4gdGVybXMgb2YgaG93IEknZCBleHBlY3QgaXQgdG8gYmUgdXNlZCBhbmQgYW55IHR5cGljYWwgcGl0ZmFsbHMgb3IgZ290Y2hhcz9cblxuTGV0J3Mgc2VlIHdoYXQgYG1tL0tjb25maWdgIHRlbGxzIG1lLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NzgyLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MDMuNTYzMjU2NzUxWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMjk2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEzODksXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEzODk6XFx0bWVudWNvbmZpZyBVU0VSRkFVTFRGRFxcbjEzOTA6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIHVzZXJmYXVsdGZkKCkgc3lzdGVtIGNhbGxcXFwiXFxuMTM5MTpcXHRcXHRkZXBlbmRzIG9uIE1NVVxcbjEzOTI6XFx0XFx0aGVscFxcbjEzOTM6XFx0XFx0ICBFbmFibGUgdGhlIHVzZXJmYXVsdGZkKCkgc3lzdGVtIGNhbGwgdGhhdCBhbGxvd3MgdG8gaW50ZXJjZXB0IGFuZFxcbjEzOTQ6XFx0XFx0ICBoYW5kbGUgcGFnZSBmYXVsdHMgaW4gdXNlcmxhbmQuXFxuMTM5NTpcXHRcXG4xMzk2OlxcdGlmIFVTRVJGQVVMVEZEXFxuMTM5NzpcXHRjb25maWcgUFRFX01BUktFUl9VRkZEX1dQXFxuMTM5ODpcXHRcXHRib29sIFxcXCJVc2VyZmF1bHRmZCB3cml0ZSBwcm90ZWN0aW9uIHN1cHBvcnQgZm9yIHNobWVtL2h1Z2V0bGJmc1xcXCJcXG4xMzk5OlxcdFxcdGRlZmF1bHQgeVxcbjE0MDA6XFx0XFx0ZGVwZW5kcyBvbiBIQVZFX0FSQ0hfVVNFUkZBVUxURkRfV1BcXG4xNDAxOlxcdFxcbjE0MDI6XFx0XFx0aGVscFxcbjE0MDM6XFx0XFx0ICBBbGxvd3MgdG8gY3JlYXRlIG1hcmtlciBQVEVzIGZvciB1c2VyZmF1bHRmZCB3cml0ZSBwcm90ZWN0aW9uXFxuMTQwNDpcXHRcXHQgIHB1cnBvc2VzLiAgSXQgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIHVzZXJmYXVsdGZkIHdyaXRlIHByb3RlY3Rpb24gb25cXG4xNDA1OlxcdFxcdCAgZmlsZS1iYWNrZWQgbWVtb3J5IHR5cGVzIGxpa2Ugc2htZW0gYW5kIGh1Z2V0bGJmcy5cXG4xNDA2OlxcdGVuZGlmICMgVVNFUkZBVUxURkRcXG4xNDA3OlxcdFxcbjE0MDg6XFx0IyBtdWx0aS1nZW4gTFJVIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MDMuNTYzMzYxMzIxWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI5OTcwMDM3MTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBgVVNFUkZBVUxURkRgIEltcGxlbWVudGF0aW9uKipcblxuQWxyaWdodCwgc28gSSdtIGxvb2tpbmcgYXQgYFVTRVJGQVVMVEZEYCDigJMgdGhhdCdzIHRoZSBjb25maWcgaW4gcGxheSBoZXJlLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgaXMgd29ya2luZy4gSSBuZWVkIHRvIHplcm8gaW4gb24gdGhlIGtleSBzeW1ib2xzLCBzcGVjaWZpY2FsbHkgYHVzZXJmYXVsdGZkX21vdmVgLCBgbW92ZV9wYWdlc2AsIGFuZCBgbW92ZV9wYWdlc19wdGVzYC4gSG1tLCBhIHF1aWNrIGNoZWNrLi4ucmlnaHQsIGBtb3ZlX3BhZ2VzYCBhbmQgYHVzZXJmYXVsdGZkX21vdmVgIGFyZSBib3RoIHN0YXRpYy4gR29vZCB0byBrbm93LCBoZWxwcyBtZSBuYXJyb3cgZG93biB0aGUgc2NvcGUgb2YgdGhpbmdzLiBOb3cgdGhlIGNyaXRpY2FsIHF1ZXN0aW9uOiB3aGVyZSBpcyBgdXNlcmZhdWx0ZmRfbW92ZWAgYWN0dWFsbHkgYmVpbmcgKmNhbGxlZCo/IFRoYXQncyB3aGVyZSB0aGUgcmVhbCBhY3Rpb24gd2lsbCBiZS4gVGltZSB0byB0cmFjZSB0aG9zZSBjYWxscyBhbmQgc2VlIHdoYXQncyB3aGF0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDE5LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjowNi41NjAzNjg2MTlaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NzA0MTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInVzZXJmYXVsdGZkX21vdmVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vdXNlcmZhdWx0ZmQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS91c2VyZmF1bHRmZC5jPTQyMDc9c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWZmZF9jdHhfZmVhdHVyZXMoX191NjQgdXNlcl9mZWF0dXJlcylcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtNDIxNS1cXG5tbS91c2VyZmF1bHRmZC5jOjQyMTY6c3RhdGljIGludCB1c2VyZmF1bHRmZF9tb3ZlKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCxcXG5tbS91c2VyZmF1bHRmZC5jLTQyMTctXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz00MzUwPXN0YXRpYyBsb25nIHVzZXJmYXVsdGZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTQzNzgtXFx0Y2FzZSBVRkZESU9fTU9WRTpcXG5tbS91c2VyZmF1bHRmZC5jOjQzNzk6XFx0XFx0cmV0ID0gdXNlcmZhdWx0ZmRfbW92ZShjdHgsIGFyZyk7XFxubW0vdXNlcmZhdWx0ZmQuYy00MzgwLVxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjowNi42MDYwNzc4MTlaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjg1NTA4NTQ5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuYWx5emluZyB0aGF0IGNvZGU6XG5cbioqQW5hbHl6aW5nIHRoZSBFbnRyeSBQb2ludCoqXG5cbk9rYXksIGZpcnN0IHRoaW5ncyBmaXJzdC4gVGhlIGB1c2VyZmF1bHRmZF9pb2N0bGAgZnVuY3Rpb24gaXMgdGhlIHBvaW50IG9mIGVudHJ5IGhlcmUuIFRoYXQncyB0aGUgZ2F0ZWtlZXBlciwgdGhlIGZ1bmN0aW9uIHRoYXQncyBiZWluZyBjYWxsZWQgd2hlbiBzb21lb25lIHdhbnRzIHRvIGludGVyYWN0IHdpdGggdXNlcmZhdWx0ZmQgdXNpbmcgYW4gaW9jdGwgY2FsbC4gTm93LCBsZXQncyBqdXN0IG1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgdGhlIGNvcnJlY3Qgc3lzY2FsbC4gSXMgYHN5c191c2VyZmF1bHRmZGAgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHN5c3RlbSBjYWxsIHdlJ3JlIGRlYWxpbmcgd2l0aD8gVGhhdCdzIHdoYXQgSSBuZWVkIHRvIHZlcmlmeSBuZXh0LiBVbmRlcnN0YW5kaW5nIHRoYXQgY29ubmVjdGlvbiBpcyBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgY29udHJvbCBmbG93LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5OTA5LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MDkuNDYxMTY3MjI4WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjQ1MDM1NTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIlNZU0NBTExfREVGSU5FLip1c2VyZmF1bHRmZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vdXNlcmZhdWx0ZmQuYz00NDgzPXN0YXRpYyBpbmxpbmUgYm9vbCB1c2VyZmF1bHRmZF9zeXNjYWxsX2FsbG93ZWQoaW50IGZsYWdzKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYy00NDk5LVxcbm1tL3VzZXJmYXVsdGZkLmM6NDUwMDpTWVNDQUxMX0RFRklORTEodXNlcmZhdWx0ZmQsIGludCwgZmxhZ3MpXFxubW0vdXNlcmZhdWx0ZmQuYy00NTAxLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MTEuNzA2MjA5NTI0WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgxNzQ1ODQ4ODEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIGB1c2VyZmF1bHRmZGAgVnVsbmVyYWJpbGl0eSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0byBmb2N1cyBvbiB0aGUgZW50cnkgcG9pbnRzLCBzbyBgc3lzX3VzZXJmYXVsdGZkYCBhbmQgYHVzZXJmYXVsdGZkX2lvY3RsYCBjYW1lIHRvIG1pbmQuIEhvd2V2ZXIsIGBzeXNfdXNlcmZhdWx0ZmRgIGlzIGp1c3QgdGhlIHN5c2NhbGwuIFRoZSByZWFsIG1lYXQgb2YgdGhlIGJ1ZyBsaWVzIGRlZXBlciwgd2l0aGluIGBtb3ZlX3BhZ2VzYCwgd2hpY2ggaXMgcmVhY2hlZCB2aWEgdGhlIGNhbGwgY2hhaW4gYHVzZXJmYXVsdGZkX2lvY3RsYCAtXHUwMDNlIGB1c2VyZmF1bHRmZF9tb3ZlYCAtXHUwMDNlIGBtb3ZlX3BhZ2VzYC4gU2luY2UgYHVzZXJmYXVsdGZkX2lvY3RsYCBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgZm9yIGlvY3RscywgSSdtIGNvbWZvcnRhYmxlIG1ha2luZyBpdCBhIGBGb2N1c1N5bWJvbGAuXG5cbkkgYnJpZWZseSBjb25zaWRlcmVkIGlmIGB1c2VyZmF1bHRmZF9tb3ZlYCBtaWdodCBiZSBpbmxpbmVkLCBidXQgaXQncyBkZWZpbmVkIGFzIGBzdGF0aWMgaW50IHVzZXJmYXVsdGZkX21vdmVgLCBzbyBpdCdzIHN0YXRpY2FsbHkgbGlua2VkLiBJIGNoZWNrZWQgdG8gbWFrZSBzdXJlIGl0J3Mgbm90IGlubGluZSwgc2luY2UgaXQncyBhIHNpemFibGUgZnVuY3Rpb24sIGFuZCBJJ20gcHJldHR5IGNlcnRhaW4gdGhhdCBgdXNlcmZhdWx0ZmRfaW9jdGxgIGlzbid0IGlubGluZWQuIEl0J3MgYmVzdCB0byBiZSB0aG9yb3VnaC5cblxuQ2hlY2tpbmcgdGhlIGNvbmZpZyBvcHRpb25zLCB0aGUgcHJpbWFyeSByZWxldmFudCBvbmUgaXMgYFVTRVJGQVVMVEZEYC5cblxuTm93LCBsZXQncyByZXZpZXcgdGhlIHBhdGNoIGl0c2VsZjpcblxuYGBgY1xuXHRcdFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxuXHRcdFx0XHRcdCAgICAgIGRzdF92bWEsIHNyY192bWEsIGRzdF9hZGRyLFxuXHRcdFx0XHRcdCAgICAgIHNyY19hZGRyLCBzcmNfZW5kIC0gc3JjX2FkZHIsIG1vZGUpO1xuLVx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuIFx0XHRcdFx0ZXJyID0gcmV0O1xuLVx0XHRcdGVsc2VcbitcdFx0XHR9IGVsc2Uge1xuK1x0XHRcdFx0ZXJyID0gMDtcbiBcdFx0XHRcdHN0ZXBfc2l6ZSA9IHJldDtcbitcdFx0XHR9XG5gYGBcblxuVGhpcyBpcyBhIGZ1bmN0aW9uYWwgYnVnIGZpeCwgcmlnaHQ/IFRoZSBvcmlnaW5hbCBjb2RlIGhhZCBhIGZsYXcgd2hlcmUsIGlmIGBlcnJgIHdhcyBzZXQgdG8gc29tZXRoaW5nIG5vbi16ZXJvIChsaWtlIGAtRUFHQUlOYCBmcm9tIGEgcHJldmlvdXMgaXRlcmF0aW9uIG9yIHNpZ25hbCkgYW5kIGBtb3ZlX3BhZ2VzX3B0ZXNgIHRoZW4gKnN1Y2NlZWRlZCosIHRoZSBjb2RlICp3b3VsZG4ndCogY2xlYXIgYGVycmAsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgaGFuZGxpbmcuIFRoZSBwYXRjaCBjb3JyZWN0cyB0aGlzIGJ5IHNldHRpbmcgYGVyciA9IDBgIGlmIGBtb3ZlX3BhZ2VzX3B0ZXNgIHN1Y2NlZWRzLlxuXG5CYXNlZCBvbiB0aGlzLCBJJ20gc2V0dGluZzpcblxuKiAgIGBXb3J0aEZ1enppbmc6IHRydWVgIC0gYmVjYXVzZSBpdCBpcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIGl0IGZpeGVzIGEga2V5IHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5LlxuKiAgIGBGb2N1c1N5bWJvbHM6IFtcInVzZXJmYXVsdGZkX2lvY3RsXCJdYCAtIGJlY2F1c2UgYHVzZXJmYXVsdGZkX2lvY3RsYCBpcyB0aGUgZW50cnkgcG9pbnQuXG4qICAgYEVuYWJsZUNvbmZpZ3M6IFtcIlVTRVJGQVVMVEZEXCJdYCAtIGJlY2F1c2UgdGhhdCdzIHRoZSBuZWNlc3NhcnkgY29uZmlnIG9wdGlvbi5cbiogICBgUmVhc29uaW5nOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy5cImBcblxuXG4iLCJJbnB1dFRva2VucyI6MTAxOTksIk91dHB1dFRva2VucyI6OTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MDksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MTkuODgwODAxOTk2WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODA5NzQ5OTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidXNlcmZhdWx0ZmRfaW9jdGxcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGJ1ZyBpbiB0aGUgVUZGRElPX01PVkUgaW9jdGwgaGFuZGxlciB3aGVyZSBhIHByZXZpb3VzbHkgc2V0IGVycm9yIGNvZGUgKGxpa2UgLUVBR0FJTikgd2FzIG5vdCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYWdlIG1vdmUsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLiBUaGlzIGlzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJVU0VSRkFVTFRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInVzZXJmYXVsdGZkX2lvY3RsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBidWcgaW4gdGhlIFVGRkRJT19NT1ZFIGlvY3RsIGhhbmRsZXIgd2hlcmUgYSBwcmV2aW91c2x5IHNldCBlcnJvciBjb2RlIChsaWtlIC1FQUdBSU4pIHdhcyBub3QgY2xlYXJlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgcGFnZSBtb3ZlLCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGFuIGluZmluaXRlIGxvb3Agb3IgaW5jb3JyZWN0IGVycm9yIHJlcG9ydGluZy4gVGhpcyBpcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUyOjE5Ljk2MTc4MzQ3NVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjgxMjk3OTY2MTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjoxOS45NjIzMzE2MjRaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MjgxMjkyNDQwNTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIGBtb3ZlX3BhZ2VzKClgIHdoZXJlIHRoZSBgZXJyYCB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVfcGFnZXNfcHRlcygpYC4gSWYgYGVycmAgd2FzIHByZXZpb3VzbHkgc2V0IHRvIGAtRUFHQUlOYCAoZS5nLiwgZnJvbSBhIHByaW9yIGZhaWxlZCBgbW92ZV9wYWdlc19odWdlX3BtZCgpYCBhdHRlbXB0IHRoYXQgdHJpZ2dlcmVkIGEgYGNvbnRpbnVlYCksIGl0IHdvdWxkIHJlbWFpbiBgLUVBR0FJTmAuIFRoaXMgd291bGQgY2F1c2UgdGhlIGxvb3AgdG8gaW5jb3JyZWN0bHkgc2tpcCBhZHZhbmNpbmcgdGhlIGBzcmNfYWRkcmAgYW5kIGBkc3RfYWRkcmAgcG9pbnRlcnMgYW5kIGBjb250aW51ZWAgYWdhaW4sIGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmV0dXJucy5cXG5cXG5UaGlzIGlzIGEgY29udHJvbCBmbG93IGFuZCBlcnJvciBoYW5kbGluZyBidWcuIEl0IGRvZXMgbm90IGludm9sdmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkaW5nIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTiBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0b3JzLCBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIHN1Y2ggaGFuZ3Mgb3IgbG9naWMgZXJyb3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDdmYTRlZjVhYjIxYzE2ZmE4OWJiNTYwZmU4MTI1YjgwYzE0MWE1OWJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAxNSAxMDo1MTozNSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3VzZXJmYXVsdGZkLmMgYi9tbS91c2VyZmF1bHRmZC5jXG5pbmRleCBjM2FkZWRhYWY3ZDU0Li41OTVlN2UyMzJmOTAxIDEwMDY0NFxuLS0tIGEvbW0vdXNlcmZhdWx0ZmQuY1xuKysrIGIvbW0vdXNlcmZhdWx0ZmQuY1xuQEAgLTIwNjksMTAgKzIwNjksMTIgQEAgc3RhdGljIHNzaXplX3QgbW92ZV9wYWdlcyhzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsIHVuc2lnbmVkIGxvbmcgZHN0X3N0YXJ0LFxuIFx0XHRcdHJldCA9IG1vdmVfcGFnZXNfcHRlcyhtbSwgZHN0X3BtZCwgc3JjX3BtZCxcbiBcdFx0XHRcdFx0ICAgICAgZHN0X3ZtYSwgc3JjX3ZtYSwgZHN0X2FkZHIsXG4gXHRcdFx0XHRcdCAgICAgIHNyY19hZGRyLCBzcmNfZW5kIC0gc3JjX2FkZHIsIG1vZGUpO1xuLVx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuIFx0XHRcdFx0ZXJyID0gcmV0O1xuLVx0XHRcdGVsc2VcbitcdFx0XHR9IGVsc2Uge1xuK1x0XHRcdFx0ZXJyID0gMDtcbiBcdFx0XHRcdHN0ZXBfc2l6ZSA9IHJldDtcbitcdFx0XHR9XG4gXHRcdH1cbiBcbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjoxOS45NjIzMzI1MzVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzkyNjE3ODU1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBVc2VyZmF1bHRmZCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBtbS91c2VyZmF1bHRmZC5jYCwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGEgbW9kaWZpY2F0aW9uIHRvIHRoZSBgbW92ZV9wYWdlc2AgZnVuY3Rpb24uIFRoZSBjb2RlIHNuaXBwZXQgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZDsgaXQncyBhIGNvbmRpdGlvbmFsIGNoYW5nZSBkZWFsaW5nIHdpdGggdGhlIHJldHVybiB2YWx1ZSwgYHJldGAsIGZyb20gYSBmdW5jdGlvbiBjYWxsLiBJdCBzZWVtcyBsaWtlIHRoZSBvcmlnaW5hbCBjb2RlIHNldCBgZXJyYCB0byB0aGUgdmFsdWUgb2YgYHJldGAgd2hlbiBgcmV0YCB3YXMgbmVnYXRpdmUsIGluZGljYXRpbmcgYW4gZXJyb3IuIFRoZSBwYXRjaCB3cmFwcyB0aGlzIGluIGEgY29uZGl0aW9uYWwsIGFuZCBhZGRzIGBlcnIgPSAwYCB3aGVuIGByZXQgXHUwMDNlPSAwYCwgYW5kIGBzdGVwX3NpemUgPSByZXRgLiBUaGF0IG1ha2VzIGl0IGNsZWFyIHRoYXQgYSBub24tbmVnYXRpdmUgcmV0dXJuIG5vdyBpbmRpY2F0ZXMgc3VjY2Vzcy5cblxuVG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBpbXBsaWNhdGlvbiwgSSBuZWVkIHRvIHNlZSB0aGUgc3Vycm91bmRpbmcgY29udGV4dC4gV2hhdCBleGFjdGx5IGlzIGBtb3ZlX3BhZ2VzYCBkb2luZyBpbiB0aGlzIHBhcnQgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbT8gV2hhdCBhcmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgYHJldGAsIGFuZCB3aGF0IGlzIGBlcnJgIHVzZWQgZm9yPyBJcyB0aGlzIGEgc3RhbmRhcmQgc3VjY2Vzcy9lcnJvciByZXR1cm4gbW9kZWwsIG9yIGlzIHRoZXJlIHNvbWV0aGluZyBzcGVjaWZpYyB0byB1c2VyZmF1bHRmZCBoYXBwZW5pbmcgaGVyZT9cblxuSSdsbCB1c2UgYHJlYWQtZmlsZWAgb3IgYGdyZXBwZXJgIHRvIHF1aWNrbHkgZmluZCB0aGUgYG1vdmVfcGFnZXNgIGZ1bmN0aW9uIGRlZmluaXRpb24gYW5kIGl0cyB1c2FnZSB3aXRoaW4gYG1tL3VzZXJmYXVsdGZkLmNgLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBpbmZvcm1hdGlvbiBJIG5lZWQgdG8gcHJvcGVybHkgYW5hbHl6ZSB0aGlzIHBhdGNoIGFuZCBpdHMgaW1wbGljYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDI2LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQ4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MjMuODg4NTE1OTkyWiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTU1MTg5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtb3ZlX3BhZ2VzXFxcXChcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vdXNlcmZhdWx0ZmQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS91c2VyZmF1bHRmZC5jPTE4NTk9c3RhdGljIHZvaWQgdWZmZF9tb3ZlX3VubG9jayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdF92bWEsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE4NzYtICpcXG5tbS91c2VyZmF1bHRmZC5jOjE4Nzc6ICogbW92ZV9wYWdlcygpIHJlbWFwcyBhcmJpdHJhcnkgYW5vbnltb3VzIHBhZ2VzIGF0b21pY2FsbHkgaW4gemVyb1xcbm1tL3VzZXJmYXVsdGZkLmMtMTg3OC0gKiBjb3B5LiBJdCBvbmx5IHdvcmtzIG9uIG5vbiBzaGFyZWQgYW5vbnltb3VzIHBhZ2VzIGJlY2F1c2UgdGhvc2UgY2FuXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE4ODgtICogc3RvcmFnZSBvciBhbnkgb3RoZXIgSS9PIGRldmljZSAoTUFEVl9ET05URk9SSyBpbiB0aGUgc291cmNlIHZtYVxcbm1tL3VzZXJmYXVsdGZkLmM6MTg4OTogKiBhdm9pZHMgbW92ZV9wYWdlcygpIHRvIGZhaWwgd2l0aCAtRUJVU1kgaWYgdGhlIHByb2Nlc3MgZm9ya3MgYmVmb3JlXFxubW0vdXNlcmZhdWx0ZmQuYzoxODkwOiAqIG1vdmVfcGFnZXMoKSBpcyBjYWxsZWQpLCB0aGVuIGl0IHdpbGwgY2FsbCBtb3ZlX3BhZ2VzKCkgdG8gbWFwIHRoZVxcbm1tL3VzZXJmYXVsdGZkLmMtMTg5MS0gKiBwYWdlIGluIHRoZSBmYXVsdGluZyBhZGRyZXNzIGluIHRoZSBkZXN0aW5hdGlvbiB2bWEuXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE5MDUtICogdGhlIGRlc3RpbmF0aW9uIHZpcnR1YWwgbWVtb3J5IHJhbmdlIGlzIG5vdCBhIHdob2xlIHVubWFwcGVkIGhvbGUsXFxubW0vdXNlcmZhdWx0ZmQuYzoxOTA2OiAqIG1vdmVfcGFnZXMoKSB3aWxsIGZhaWwgcmVzcGVjdGl2ZWx5IHdpdGggLUVOT0VOVCBvciAtRUVYSVNULiBUaGlzXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTA3LSAqIHByb3ZpZGVzIGEgdmVyeSBzdHJpY3QgYmVoYXZpb3IgdG8gYXZvaWQgYW55IGNoYW5jZSBvZiBtZW1vcnlcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMTkxMC0gKiB0aW1lIGZvciBhbnkgZ2l2ZW4gZmF1bHRpbmcgYWRkcmVzcy4gVGhpcyBtZWFucyB0aGF0IGlmIHR3byB0aHJlYWRzXFxubW0vdXNlcmZhdWx0ZmQuYzoxOTExOiAqIHRyeSB0byBib3RoIGNhbGwgbW92ZV9wYWdlcygpIG9uIHRoZSBzYW1lIGRlc3RpbmF0aW9uIGFkZHJlc3MgYXQgdGhlXFxubW0vdXNlcmZhdWx0ZmQuYy0xOTEyLSAqIHNhbWUgdGltZSwgdGhlIHNlY29uZCB0aHJlYWQgd2lsbCBnZXQgYW4gZXhwbGljaXQgZXJyb3IgZnJvbSB0aGlzXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE5MjAtICogYW4gYW1vdW50IG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSBtb3ZlZC4gSWYgdGhlIHJldHZhbCByZXBvcnRzIGFcXG5tbS91c2VyZmF1bHRmZC5jOjE5MjE6ICogXFxcInNob3J0XFxcIiByZW1hcCwgdGhlIG1vdmVfcGFnZXMoKSBjb21tYW5kIHNob3VsZCBiZSByZXBlYXRlZCBieVxcbm1tL3VzZXJmYXVsdGZkLmMtMTkyMi0gKiB1c2VybGFuZCB3aXRoIHNyYytyZXR2YWwsIGRzdCtyZXZhbCwgbGVuLXJldHZhbCBpZiBpdCB3YW50cyB0byBrbm93XFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTE5MzMtICovXFxubW0vdXNlcmZhdWx0ZmQuYzoxOTM0OnN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG5tbS91c2VyZmF1bHRmZC5jLTE5MzUtXFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLCBfX3U2NCBtb2RlKVxcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz00MjE2PXN0YXRpYyBpbnQgdXNlcmZhdWx0ZmRfbW92ZShzdHJ1Y3QgdXNlcmZhdWx0ZmRfY3R4ICpjdHgsXFxuLS1cXG5tbS91c2VyZmF1bHRmZC5jLTQyNTUtXFx0aWYgKG1tZ2V0X25vdF96ZXJvKG1tKSkge1xcbm1tL3VzZXJmYXVsdGZkLmM6NDI1NjpcXHRcXHRyZXQgPSBtb3ZlX3BhZ2VzKGN0eCwgdWZmZGlvX21vdmUuZHN0LCB1ZmZkaW9fbW92ZS5zcmMsXFxubW0vdXNlcmZhdWx0ZmQuYy00MjU3LVxcdFxcdFxcdFxcdCB1ZmZkaW9fbW92ZS5sZW4sIHVmZmRpb19tb3ZlLm1vZGUpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjoyMy45MzQwNzMzNzJaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjY2MzMxMTUyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gYG1vdmVfcGFnZXNgIGluIGBtbS91c2VyZmF1bHRmZC5jYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgbW92ZV9wYWdlc2AgaXMgaGFuZGxpbmcgdGhpbmdzIGluIHRoZSBjb250ZXh0IG9mIHVzZXJmYXVsdGZkLiBUaGlzIGZ1bmN0aW9uIGlzIGNyaXRpY2FsIGZvciBob3cgd2UgbWFuYWdlIHBhZ2UgbWlncmF0aW9uIGFuZCB0cmFuc2ZlciwgZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCB1c2VyLXNwYWNlIG1lbW9yeSBhY2Nlc3MgZmF1bHRzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUga2VybmVsIG9yY2hlc3RyYXRlcyB0aGlzIHdob2xlIGRhbmNlIGJldHdlZW4gdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlLiBTcGVjaWZpY2FsbHksIEknbSBpbnRlcmVzdGVkIGluIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiBgdXNlcmZhdWx0ZmRgIGFuZCB0aGUgcGFnZSBtaWdyYXRpb24gbWFjaGluZXJ5LiBIb3cgZG9lcyBpdCBrbm93IHdoZXJlIHBhZ2VzIGFyZSwgYW5kIGhvdyBkb2VzIGl0IGRpcmVjdCB0aGVtIHdoZXJlIHRoZXkgbmVlZCB0byBnbz8gSSdtIGV4cGVjdGluZyB0byBmaW5kIGEgZGVsaWNhdGUgYmFsYW5jaW5nIGFjdCBoZXJlLCBlbnN1cmluZyBkYXRhIGludGVncml0eSB3aGlsZSBtaW5pbWl6aW5nIHRoZSBwZXJmb3JtYW5jZSBoaXQgb2YgcGFnZSBmYXVsdHMuIExldCdzIHNlZSBob3cgdGhleSBkbyBpdC4gSSdtIGxvb2tpbmcgZm9yIHRoZSBrZXkgbG9ja2luZyBwcmltaXRpdmVzLCBlcnJvciBoYW5kbGluZyBwYXRocywgYW5kIHRoZSBvdmVyYWxsIGxvZ2ljIGZsb3cuIFRoaXMgY291bGQgZ2l2ZSBtZSBzb21lIGdyZWF0IGluc2lnaHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMjE2LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MjYuNTk3Mzg5MjczWiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NDAyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS91c2VyZmF1bHRmZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MzQsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTM0OlxcdHN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG4xOTM1OlxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgc3JjX3N0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgX191NjQgbW9kZSlcXG4xOTM2OlxcdHtcXG4xOTM3OlxcdFxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3R4LVxcdTAwM2VtbTtcXG4xOTM4OlxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSwgKmRzdF92bWE7XFxuMTkzOTpcXHRcXHR1bnNpZ25lZCBsb25nIHNyY19hZGRyLCBkc3RfYWRkciwgc3JjX2VuZDtcXG4xOTQwOlxcdFxcdHBtZF90ICpzcmNfcG1kLCAqZHN0X3BtZDtcXG4xOTQxOlxcdFxcdGxvbmcgZXJyID0gLUVJTlZBTDtcXG4xOTQyOlxcdFxcdHNzaXplX3QgbW92ZWQgPSAwO1xcbjE5NDM6XFx0XFxuMTk0NDpcXHRcXHQvKiBTYW5pdGl6ZSB0aGUgY29tbWFuZCBwYXJhbWV0ZXJzLiAqL1xcbjE5NDU6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKHNyY19zdGFydCBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDY6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGRzdF9zdGFydCBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDc6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDI2IH5QQUdFX01BU0spO1xcbjE5NDg6XFx0XFxuMTk0OTpcXHRcXHQvKiBEb2VzIHRoZSBhZGRyZXNzIHJhbmdlIHdyYXAsIG9yIGlzIHRoZSBzcGFuIHplcm8tc2l6ZWQ/ICovXFxuMTk1MDpcXHRcXHRWTV9XQVJOX09OX09OQ0Uoc3JjX3N0YXJ0ICsgbGVuIFxcdTAwM2Mgc3JjX3N0YXJ0KTtcXG4xOTUxOlxcdFxcdFZNX1dBUk5fT05fT05DRShkc3Rfc3RhcnQgKyBsZW4gXFx1MDAzYyBkc3Rfc3RhcnQpO1xcbjE5NTI6XFx0XFxuMTk1MzpcXHRcXHRlcnIgPSB1ZmZkX21vdmVfbG9jayhtbSwgZHN0X3N0YXJ0LCBzcmNfc3RhcnQsIFxcdTAwMjZkc3Rfdm1hLCBcXHUwMDI2c3JjX3ZtYSk7XFxuMTk1NDpcXHRcXHRpZiAoZXJyKVxcbjE5NTU6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk1NjpcXHRcXG4xOTU3OlxcdFxcdC8qIFJlLWNoZWNrIGFmdGVyIHRha2luZyBtYXBfY2hhbmdpbmdfbG9jayAqL1xcbjE5NTg6XFx0XFx0ZXJyID0gLUVBR0FJTjtcXG4xOTU5OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2Y3R4LVxcdTAwM2VtYXBfY2hhbmdpbmdfbG9jayk7XFxuMTk2MDpcXHRcXHRpZiAobGlrZWx5KGF0b21pY19yZWFkKFxcdTAwMjZjdHgtXFx1MDAzZW1tYXBfY2hhbmdpbmcpKSlcXG4xOTYxOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTYyOlxcdFxcdC8qXFxuMTk2MzpcXHRcXHQgKiBNYWtlIHN1cmUgdGhlIHZtYSBpcyBub3Qgc2hhcmVkLCB0aGF0IHRoZSBzcmMgYW5kIGRzdCByZW1hcFxcbjE5NjQ6XFx0XFx0ICogcmFuZ2VzIGFyZSBib3RoIHZhbGlkIGFuZCBmdWxseSB3aXRoaW4gYSBzaW5nbGUgZXhpc3RpbmdcXG4xOTY1OlxcdFxcdCAqIHZtYS5cXG4xOTY2OlxcdFxcdCAqL1xcbjE5Njc6XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4xOTY4OlxcdFxcdGlmIChzcmNfdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NIQVJFRClcXG4xOTY5OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTcwOlxcdFxcdGlmIChzcmNfc3RhcnQgKyBsZW4gXFx1MDAzZSBzcmNfdm1hLVxcdTAwM2V2bV9lbmQpXFxuMTk3MTpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk3MjpcXHRcXG4xOTczOlxcdFxcdGlmIChkc3Rfdm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NIQVJFRClcXG4xOTc0OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4xOTc1OlxcdFxcdGlmIChkc3Rfc3RhcnQgKyBsZW4gXFx1MDAzZSBkc3Rfdm1hLVxcdTAwM2V2bV9lbmQpXFxuMTk3NjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdFxcdGVyciA9IHZhbGlkYXRlX21vdmVfYXJlYXMoY3R4LCBzcmNfdm1hLCBkc3Rfdm1hKTtcXG4xOTc5OlxcdFxcdGlmIChlcnIpXFxuMTk4MDpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuMTk4MTpcXHRcXG4xOTgyOlxcdFxcdGZvciAoc3JjX2FkZHIgPSBzcmNfc3RhcnQsIGRzdF9hZGRyID0gZHN0X3N0YXJ0LCBzcmNfZW5kID0gc3JjX3N0YXJ0ICsgbGVuO1xcbjE5ODM6XFx0XFx0ICAgICBzcmNfYWRkciBcXHUwMDNjIHNyY19lbmQ7KSB7XFxuMTk4NDpcXHRcXHRcXHRzcGlubG9ja190ICpwdGw7XFxuMTk4NTpcXHRcXHRcXHRwbWRfdCBkc3RfcG1kdmFsO1xcbjE5ODY6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzdGVwX3NpemU7XFxuMTk4NzpcXHRcXG4xOTg4OlxcdFxcdFxcdC8qXFxuMTk4OTpcXHRcXHRcXHQgKiBCZWxvdyB3b3JrcyBiZWNhdXNlIGFub255bW91cyBhcmVhIHdvdWxkIG5vdCBoYXZlIGFcXG4xOTkwOlxcdFxcdFxcdCAqIHRyYW5zcGFyZW50IGh1Z2UgUFVELiBJZiBmaWxlLWJhY2tlZCBzdXBwb3J0IGlzIGFkZGVkLFxcbjE5OTE6XFx0XFx0XFx0ICogdGhhdCBjYXNlIHdvdWxkIG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlLlxcbjE5OTI6XFx0XFx0XFx0ICovXFxuMTk5MzpcXHRcXHRcXHRzcmNfcG1kID0gbW1fZmluZF9wbWQobW0sIHNyY19hZGRyKTtcXG4xOTk0OlxcdFxcdFxcdGlmICh1bmxpa2VseSghc3JjX3BtZCkpIHtcXG4xOTk1OlxcdFxcdFxcdFxcdGlmICghKG1vZGUgXFx1MDAyNiBVRkZESU9fTU9WRV9NT0RFX0FMTE9XX1NSQ19IT0xFUykpIHtcXG4xOTk2OlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9FTlQ7XFxuMTk5NzpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4xOTk4OlxcdFxcdFxcdFxcdH1cXG4xOTk5OlxcdFxcdFxcdFxcdHNyY19wbWQgPSBtbV9hbGxvY19wbWQobW0sIHNyY19hZGRyKTtcXG4yMDAwOlxcdFxcdFxcdFxcdGlmICh1bmxpa2VseSghc3JjX3BtZCkpIHtcXG4yMDAxOlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjAwMjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4yMDAzOlxcdFxcdFxcdFxcdH1cXG4yMDA0OlxcdFxcdFxcdH1cXG4yMDA1OlxcdFxcdFxcdGRzdF9wbWQgPSBtbV9hbGxvY19wbWQobW0sIGRzdF9hZGRyKTtcXG4yMDA2OlxcdFxcdFxcdGlmICh1bmxpa2VseSghZHN0X3BtZCkpIHtcXG4yMDA3OlxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjAwODpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDA5OlxcdFxcdFxcdH1cXG4yMDEwOlxcdFxcbjIwMTE6XFx0XFx0XFx0ZHN0X3BtZHZhbCA9IHBtZHBfZ2V0X2xvY2tsZXNzKGRzdF9wbWQpO1xcbjIwMTI6XFx0XFx0XFx0LypcXG4yMDEzOlxcdFxcdFxcdCAqIElmIHRoZSBkc3RfcG1kIGlzIG1hcHBlZCBhcyBUSFAgZG9uJ3Qgb3ZlcnJpZGUgaXQgYW5kIGp1c3RcXG4yMDE0OlxcdFxcdFxcdCAqIGJlIHN0cmljdC4gSWYgZHN0X3BtZCBjaGFuZ2VzIGludG8gVFBIIGFmdGVyIHRoaXMgY2hlY2ssIHRoZVxcbjIwMTU6XFx0XFx0XFx0ICogbW92ZV9wYWdlc19odWdlX3BtZCgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIHJldHJ5XFxuMjAxNjpcXHRcXHRcXHQgKiB3aGlsZSBtb3ZlX3BhZ2VzX3B0ZSgpIHdpbGwgZGV0ZWN0IHRoZSBjaGFuZ2UgYW5kIGZhaWwuXFxuMjAxNzpcXHRcXHRcXHQgKi9cXG4yMDE4OlxcdFxcdFxcdGlmICh1bmxpa2VseShwbWRfdHJhbnNfaHVnZShkc3RfcG1kdmFsKSkpIHtcXG4yMDE5OlxcdFxcdFxcdFxcdGVyciA9IC1FRVhJU1Q7XFxuMjAyMDpcXHRcXHRcXHRcXHRicmVhaztcXG4yMDIxOlxcdFxcdFxcdH1cXG4yMDIyOlxcdFxcbjIwMjM6XFx0XFx0XFx0cHRsID0gcG1kX3RyYW5zX2h1Z2VfbG9jayhzcmNfcG1kLCBzcmNfdm1hKTtcXG4yMDI0OlxcdFxcdFxcdGlmIChwdGwpIHtcXG4yMDI1OlxcdFxcdFxcdFxcdC8qIENoZWNrIGlmIHdlIGNhbiBtb3ZlIHRoZSBwbWQgd2l0aG91dCBzcGxpdHRpbmcgaXQuICovXFxuMjAyNjpcXHRcXHRcXHRcXHRpZiAobW92ZV9zcGxpdHNfaHVnZV9wbWQoZHN0X2FkZHIsIHNyY19hZGRyLCBzcmNfc3RhcnQgKyBsZW4pIHx8XFxuMjAyNzpcXHRcXHRcXHRcXHQgICAgIXBtZF9ub25lKGRzdF9wbWR2YWwpKSB7XFxuMjAyODpcXHRcXHRcXHRcXHRcXHQvKiBDYW4gYmUgYSBtaWdyYXRpb24gZW50cnkgKi9cXG4yMDI5OlxcdFxcdFxcdFxcdFxcdGlmIChwbWRfcHJlc2VudCgqc3JjX3BtZCkpIHtcXG4yMDMwOlxcdFxcdFxcdFxcdFxcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBwbWRfZm9saW8oKnNyY19wbWQpO1xcbjIwMzE6XFx0XFxuMjAzMjpcXHRcXHRcXHRcXHRcXHRcXHRpZiAoIWlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykgXFx1MDAyNlxcdTAwMjZcXG4yMDMzOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAhUGFnZUFub25FeGNsdXNpdmUoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1MjoyNi41OTc2NjU3MjNaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzYyMzk4ODAyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEaXZpbmcgRGVlcGVyIGludG8gYG1vdmVfcGFnZXNgKipcblxuQWxyaWdodCwgSSd2ZSBnb3QgdGhlIGluaXRpYWwgb3ZlcnZpZXcgb2YgYG1vdmVfcGFnZXNgIGluIG15IGhlYWQuIE5vdywgdGhlIHJlYWwgd29yayBiZWdpbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBudWFuY2VzLCB0aGUgZWRnZSBjYXNlcywgdGhlIHBvdGVudGlhbCBib3R0bGVuZWNrcy4gTGV0J3MgZGlnIGludG8gdGhlIG1lYXQgb2YgdGhlIGNvZGUuIE15IHByaW1hcnkgZm9jdXMgaXMgbGlrZWx5IG9uIGhvdyBpdCBoYW5kbGVzIG1lbW9yeSBtYW5hZ2VtZW50LCBlc3BlY2lhbGx5IGlmIHRoaXMgaXMgcmVsYXRlZCB0byBhIHBhZ2luZyBzeXN0ZW0sIG9yIHNvbWUgZm9ybSBvZiB2aXJ0dWFsIG1lbW9yeS4gSSdtIGxvb2tpbmcgZm9yIHdoZXJlIHBhZ2UgdGFibGVzIGFyZSB1cGRhdGVkLCB3aGVyZSBwaHlzaWNhbCBmcmFtZXMgbWlnaHQgYmUgYWxsb2NhdGVkIG9yIGRlYWxsb2NhdGVkLCBhbmQgaG93IGNvaGVyZW5jeSBpcyBtYWludGFpbmVkLCBpZiB0aGlzIG9wZXJhdGlvbiBpcyBoYXBwZW5pbmcgY29uY3VycmVudGx5LiBJcyBpdCB0aHJlYWQtc2FmZT8gRG9lcyBpdCBlbXBsb3kgbG9ja3MsIGFuZCBpZiBzbywgaG93IGdyYW51bGFyIGFyZSB0aGV5PyBBbnkgZGVhZGxvY2tzPyBBbHNvLCB3aGF0IGhhcHBlbnMgaW4gYSBzaXR1YXRpb24gb2YgYW4gb3V0LW9mLW1lbW9yeSBlcnJvci5cblxuSSB3YW50IHRvIHNlZSB0aGUgZGV0YWlscyBvbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGl0IG1hbmlwdWxhdGVzLiBIb3cgYXJlIHRoZSBwYWdlcyBvcmdhbml6ZWQgYmVmb3JlIHRoZSBtb3ZlPyBJcyBpdCBhIGxpbmtlZCBsaXN0LCBhIGhhc2ggdGFibGUsIGEgdHJlZSBzdHJ1Y3R1cmUsIG9yIHNvbWV0aGluZyBlbHNlPyBVbmRlcnN0YW5kaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcyBpcyBrZXkgdG8gb3B0aW1pemluZyB0aGUgYWxnb3JpdGhtLiBJJ2xsIGJlIHdhdGNoaW5nIGhvdyBpdCBoYW5kbGVzIGV4Y2VwdGlvbnMsIGVycm9yIHJlY292ZXJ5LCBhbmQgdGhlIG92ZXJhbGwgcmVsaWFiaWxpdHkgb2YgdGhlIGZ1bmN0aW9uLiBJcyBpdCBhdG9taWM/IEknbSBhbnRpY2lwYXRpbmcgdGhhdCBJJ2xsIGJlIG1lbnRhbGx5IG1hcHBpbmcgdGhlIGZ1bmN0aW9uJ3MgbG9naWMgdG8gdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgY2FwYWJpbGl0aWVzLCBwZXJoYXBzIGluY2x1ZGluZyB0aGUgQ1BVJ3MgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdCBhbmQgYW55IHJlbGV2YW50IGNhY2hlIGNvbmZpZ3VyYXRpb25zLiBVbmRlcnN0YW5kaW5nIHRoZXNlIGludGVyYWN0aW9ucyBpcyBjcml0aWNhbCwgYXMgaXQgaGFzIGEgbWFzc2l2ZSBwZXJmb3JtYW5jZSBpbXBhY3QuIEZpbmFsbHksIEkgd2lsbCBiZSB0aGlua2luZyBvZiB3YXlzIHRvIHJlZmFjdG9yIHRoaXMgZnVuY3Rpb24gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgbWFpbnRhaW5hYmlsaXR5LCBhbmQgcmVhZGFiaWxpdHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUxNTcsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDEwOjUyOjMwLjIyMTY1NjY1NFoiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTE0MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vdXNlcmZhdWx0ZmQuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMDM0LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjAzNDpcXHRcXHRcXHRcXHRcXHRcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbjIwMzU6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ZXJyID0gLUVCVVNZO1xcbjIwMzY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjAzNzpcXHRcXHRcXHRcXHRcXHRcXHR9XFxuMjAzODpcXHRcXHRcXHRcXHRcXHR9XFxuMjAzOTpcXHRcXG4yMDQwOlxcdFxcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKHB0bCk7XFxuMjA0MTpcXHRcXHRcXHRcXHRcXHRzcGxpdF9odWdlX3BtZChzcmNfdm1hLCBzcmNfcG1kLCBzcmNfYWRkcik7XFxuMjA0MjpcXHRcXHRcXHRcXHRcXHQvKiBUaGUgZm9saW8gd2lsbCBiZSBzcGxpdCBieSBtb3ZlX3BhZ2VzX3B0ZSgpICovXFxuMjA0MzpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4yMDQ0OlxcdFxcdFxcdFxcdH1cXG4yMDQ1OlxcdFxcbjIwNDY6XFx0XFx0XFx0XFx0ZXJyID0gbW92ZV9wYWdlc19odWdlX3BtZChtbSwgZHN0X3BtZCwgc3JjX3BtZCxcXG4yMDQ3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgZHN0X3BtZHZhbCwgZHN0X3ZtYSwgc3JjX3ZtYSxcXG4yMDQ4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgZHN0X2FkZHIsIHNyY19hZGRyKTtcXG4yMDQ5OlxcdFxcdFxcdFxcdHN0ZXBfc2l6ZSA9IEhQQUdFX1BNRF9TSVpFO1xcbjIwNTA6XFx0XFx0XFx0fSBlbHNlIHtcXG4yMDUxOlxcdFxcdFxcdFxcdGxvbmcgcmV0O1xcbjIwNTI6XFx0XFxuMjA1MzpcXHRcXHRcXHRcXHRpZiAocG1kX25vbmUoKnNyY19wbWQpKSB7XFxuMjA1NDpcXHRcXHRcXHRcXHRcXHRpZiAoIShtb2RlIFxcdTAwMjYgVUZGRElPX01PVkVfTU9ERV9BTExPV19TUkNfSE9MRVMpKSB7XFxuMjA1NTpcXHRcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRU5PRU5UO1xcbjIwNTY6XFx0XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjA1NzpcXHRcXHRcXHRcXHRcXHR9XFxuMjA1ODpcXHRcXHRcXHRcXHRcXHRpZiAodW5saWtlbHkoX19wdGVfYWxsb2MobW0sIHNyY19wbWQpKSkge1xcbjIwNTk6XFx0XFx0XFx0XFx0XFx0XFx0ZXJyID0gLUVOT01FTTtcXG4yMDYwOlxcdFxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwNjE6XFx0XFx0XFx0XFx0XFx0fVxcbjIwNjI6XFx0XFx0XFx0XFx0fVxcbjIwNjM6XFx0XFxuMjA2NDpcXHRcXHRcXHRcXHRpZiAodW5saWtlbHkocHRlX2FsbG9jKG1tLCBkc3RfcG1kKSkpIHtcXG4yMDY1OlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjA2NjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4yMDY3OlxcdFxcdFxcdFxcdH1cXG4yMDY4OlxcdFxcbjIwNjk6XFx0XFx0XFx0XFx0cmV0ID0gbW92ZV9wYWdlc19wdGVzKG1tLCBkc3RfcG1kLCBzcmNfcG1kLFxcbjIwNzA6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgZHN0X3ZtYSwgc3JjX3ZtYSwgZHN0X2FkZHIsXFxuMjA3MTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBzcmNfYWRkciwgc3JjX2VuZCAtIHNyY19hZGRyLCBtb2RlKTtcXG4yMDcyOlxcdFxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKSB7XFxuMjA3MzpcXHRcXHRcXHRcXHRcXHRlcnIgPSByZXQ7XFxuMjA3NDpcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbjIwNzU6XFx0XFx0XFx0XFx0XFx0ZXJyID0gMDtcXG4yMDc2OlxcdFxcdFxcdFxcdFxcdHN0ZXBfc2l6ZSA9IHJldDtcXG4yMDc3OlxcdFxcdFxcdFxcdH1cXG4yMDc4OlxcdFxcdFxcdH1cXG4yMDc5OlxcdFxcbjIwODA6XFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuMjA4MTpcXHRcXG4yMDgyOlxcdFxcdFxcdGlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkge1xcbjIwODM6XFx0XFx0XFx0XFx0LyogRG8gbm90IG92ZXJyaWRlIGFuIGVycm9yICovXFxuMjA4NDpcXHRcXHRcXHRcXHRpZiAoIWVyciB8fCBlcnIgPT0gLUVBR0FJTilcXG4yMDg1OlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FSU5UUjtcXG4yMDg2OlxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwODc6XFx0XFx0XFx0fVxcbjIwODg6XFx0XFxuMjA4OTpcXHRcXHRcXHRpZiAoZXJyKSB7XFxuMjA5MDpcXHRcXHRcXHRcXHRpZiAoZXJyID09IC1FQUdBSU4pXFxuMjA5MTpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4yMDkyOlxcdFxcdFxcdFxcdGJyZWFrO1xcbjIwOTM6XFx0XFx0XFx0fVxcbjIwOTQ6XFx0XFxuMjA5NTpcXHRcXHRcXHQvKiBQcm9jZWVkIHRvIHRoZSBuZXh0IHBhZ2UgKi9cXG4yMDk2OlxcdFxcdFxcdGRzdF9hZGRyICs9IHN0ZXBfc2l6ZTtcXG4yMDk3OlxcdFxcdFxcdHNyY19hZGRyICs9IHN0ZXBfc2l6ZTtcXG4yMDk4OlxcdFxcdFxcdG1vdmVkICs9IHN0ZXBfc2l6ZTtcXG4yMDk5OlxcdFxcdH1cXG4yMTAwOlxcdFxcbjIxMDE6XFx0b3V0X3VubG9jazpcXG4yMTAyOlxcdFxcdHVwX3JlYWQoXFx1MDAyNmN0eC1cXHUwMDNlbWFwX2NoYW5naW5nX2xvY2spO1xcbjIxMDM6XFx0XFx0dWZmZF9tb3ZlX3VubG9jayhkc3Rfdm1hLCBzcmNfdm1hKTtcXG4yMTA0OlxcdG91dDpcXG4yMTA1OlxcdFxcdFZNX1dBUk5fT05fT05DRShtb3ZlZCBcXHUwMDNjIDApO1xcbjIxMDY6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKGVyciBcXHUwMDNlIDApO1xcbjIxMDc6XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCFtb3ZlZCBcXHUwMDI2XFx1MDAyNiAhZXJyKTtcXG4yMTA4OlxcdFxcdHJldHVybiBtb3ZlZCA/IG1vdmVkIDogZXJyO1xcbjIxMDk6XFx0fVxcbjIxMTA6XFx0XFxuMjExMTpcXHRzdGF0aWMgYm9vbCB2bWFfY2FuX3VzZXJmYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdm1fZmxhZ3NfdCB2bV9mbGFncyxcXG4yMTEyOlxcdFxcdFxcdCAgICAgICBib29sIHdwX2FzeW5jKVxcbjIxMTM6XFx0e1xcbjIxMTQ6XFx0XFx0Y29uc3Qgc3RydWN0IHZtX3VmZmRfb3BzICpvcHMgPSB2bWFfdWZmZF9vcHModm1hKTtcXG4yMTE1OlxcdFxcbjIxMTY6XFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiAoVk1fRFJPUFBBQkxFIHwgVk1fU0hBRE9XX1NUQUNLKSlcXG4yMTE3OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4yMTE4OlxcdFxcbjIxMTk6XFx0XFx0aWYgKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSBcXHUwMDI2XFx1MDAyNiAodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX1NQRUNJQUwpKVxcbjIxMjA6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbjIxMjE6XFx0XFxuMjEyMjpcXHRcXHR2bV9mbGFncyBcXHUwMDI2PSBfX1ZNX1VGRkRfRkxBR1M7XFxuMjEyMzpcXHRcXG4yMTI0OlxcdFxcdC8qXFxuMjEyNTpcXHRcXHQgKiBJZiBXUCBpcyB0aGUgb25seSBtb2RlIGVuYWJsZWQgYW5kIGNvbnRleHQgaXMgd3AgYXN5bmMsIGFsbG93IGFueVxcbjIxMjY6XFx0XFx0ICogbWVtb3J5IHR5cGUuXFxuMjEyNzpcXHRcXHQgKi9cXG4yMTI4OlxcdFxcdGlmICh3cF9hc3luYyBcXHUwMDI2XFx1MDAyNiAodm1fZmxhZ3MgPT0gVk1fVUZGRF9XUCkpXFxuMjEyOTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4yMTMwOlxcdFxcbjIxMzE6XFx0XFx0LyogRm9yIGFueSBvdGhlciBtb2RlIHJlamVjdCBWTUFzIHRoYXQgZG9uJ3QgaW1wbGVtZW50IHZtX3VmZmRfb3BzICovXFxuMjEzMjpcXHRcXHRpZiAoIW9wcylcXG4yMTMzOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMTA6NTI6MzAuMjIxOTQ5NDc0WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3ODY5NTk0ODc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIHRoZSBgbW92ZV9wYWdlc2AgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gdHJhY2luZyB0aHJvdWdoIHRoaXMgcGF0Y2ggYW5kIGl0cyBpbXBsaWNhdGlvbnMuIFRoZSBjb3JlIGlzc3VlIGlzIHRoYXQgYGVycmAgaXNuJ3QgYmVpbmcgcmVzZXQgcHJvcGVybHkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBtb3ZlX3BhZ2VzX3B0ZXNgIGNhbGwuIFRoaXMgY3JlYXRlcyBhIGNvbnRyb2wgZmxvdyBwcm9ibGVtLCBhbmQgaXQncyBtYWtpbmcgbWUgd29uZGVyIGlmIEtNU0FOIGlzIG5lY2Vzc2FyeSBmb3IgZGV0ZWN0aW5nIGl0LlxuXG5MZXQncyBicmVhayBpdCBkb3duLiBCZWZvcmUgdGhlIGxvb3AsIGBlcnJgIGlzIGluaXRpYWxpemVkIHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYHZhbGlkYXRlX21vdmVfYXJlYXNgLiBJbnNpZGUgdGhlIGxvb3AsIGBlcnJgIGNhbiBiZSBzZXQgdG8gYC1FQUdBSU5gIGlmIGBtb3ZlX3BhZ2VzX2h1Z2VfcG1kYCBmYWlscy4gVGhlIHByb2JsZW1hdGljIHBhcnQgaXMgd2hhdCBoYXBwZW5zIG5leHQuIElmIGBlcnJgICppcyogYC1FQUdBSU5gLCB0aGUgY29kZSAqY29udGludWVzKiB0byB0aGUgbmV4dCBpdGVyYXRpb24uIE5vdywgaWYgdGhlIGNvZGUgc3VjY2Vzc2Z1bGx5IGNhbGxzIGBtb3ZlX3BhZ2VzX3B0ZXNgIGluIHRoYXQgbmV4dCBpdGVyYXRpb24gYW5kIGdldHMgYSBwb3NpdGl2ZSByZXR1cm4gdmFsdWUsIHRoZSBgZXJyYCB2YXJpYWJsZSBpcyAqc3RpbGwqIGAtRUFHQUlOYC5cblxuVGhlIHByb2JsZW0gaXMgdGhlIGBpZiAoZXJyKSB7IGlmIChlcnIgPT0gLUVBR0FJTikgY29udGludWU7IGJyZWFrOyB9YCBsaW5lLiBTaW5jZSBgZXJyYCBzdGF5cyBgLUVBR0FJTmAsIHRoZSBjb2RlIGVudGVycyBhbiBpbmZpbml0ZSBsb29wLiBJdCB3aWxsIGNvbnRpbnVlLCBza2lwIGFkdmFuY2luZyB0aGUgYWRkcmVzc2VzLCBhbmQgcmUtYXR0ZW1wdCB0byBtb3ZlIHRoZSBzYW1lIHBhZ2UsIHdoaWNoIGNvdWxkIGxlYWQgdG8gYW4gaW5jb3JyZWN0IGVycm9yIGNvZGUgYmVpbmcgcmV0dXJuZWQgb3IgdGhlIGxvb3AgYmVpbmcgdGVybWluYXRlZCBiZWNhdXNlIHN1YnNlcXVlbnQgYXR0ZW1wdHMgdG8gbW92ZSB0aGUgc2FtZSBwYWdlIHdpbGwgbW9zdCBsaWtlbHkgZmFpbC4gVGhpcyBsb29wIHdpbGwgbm90IHRlcm1pbmF0ZS5cblxuVGhlIHF1ZXN0aW9uIHRoZW4gYmVjb21lczogaXMgdGhpcyBhIEtNU0FOIGlzc3VlPyBMZXQncyBjaGVjayBhZ2FpbnN0IHRoZSBLTVNBTiBydWxlcy4gTm8sIHRoaXMgaXNuJ3QgYWJvdXQgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgZXhwb3NlZCB0byB1c2Vyc3BhY2UsIG9yIGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gVGhpcyBpcyBhIGxvZ2ljIGJ1ZzogYSBjb250cm9sIGZsb3cgZXJyb3IuIGByZXRgIGFuZCBgZXJyYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGludm9sdmVkLiBTdGFuZGFyZCBrZXJuZWwgdGVzdGluZywgS0FTQU4sIGFuZCBzb2Z0IGxvY2t1cCBkZXRlY3Rpb24gd2lsbCBmbGFnIHRoZSBpbmZpbml0ZSBsb29wLiBUaGlzIGlzbid0IGEgY2FzZSB3aGVyZSBLTVNBTiBvZmZlcnMgYW55IHVuaXF1ZSBhZHZhbnRhZ2UuIFRoZSBwYXRjaCBtb2RpZmllcyBjb25kaXRpb25hbCBsb2dpYywgYnV0IG5vdCBpbiBhIHdheSB0aGF0IGNyZWF0ZXMgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmUuIEknbSBjb25maWRlbnQgaW4gc2F5aW5nIHRoYXQgS01TQU4gaXMgbm90IG5lY2Vzc2FyeSBoZXJlLiBUaGlzIGlzIGEgcHVyZSBsb2dpYyBlcnJvciwgYW5kIEtBU0FOIHdpbGwgY2F0Y2ggdGhlIGluZmluaXRlIGxvb3Agb3Igb3RoZXIgbG9naWMgZXJyb3JzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2OTQ5LCJPdXRwdXRUb2tlbnMiOjIxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4MDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQxMDo1Mjo0OC4wOTE1NDc4MzJaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTAyOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIGBtb3ZlX3BhZ2VzKClgIHdoZXJlIHRoZSBgZXJyYCB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVfcGFnZXNfcHRlcygpYC4gSWYgYGVycmAgd2FzIHByZXZpb3VzbHkgc2V0IHRvIGAtRUFHQUlOYCAoZS5nLiwgZnJvbSBhIHByaW9yIGZhaWxlZCBgbW92ZV9wYWdlc19odWdlX3BtZCgpYCBhdHRlbXB0IHRoYXQgdHJpZ2dlcmVkIGEgYGNvbnRpbnVlYCksIGl0IHdvdWxkIHJlbWFpbiBgLUVBR0FJTmAuIFRoaXMgd291bGQgY2F1c2UgdGhlIGxvb3AgdG8gaW5jb3JyZWN0bHkgc2tpcCBhZHZhbmNpbmcgdGhlIGBzcmNfYWRkcmAgYW5kIGBkc3RfYWRkcmAgcG9pbnRlcnMgYW5kIGBjb250aW51ZWAgYWdhaW4sIGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmV0dXJucy5cXG5cXG5UaGlzIGlzIGEgY29udHJvbCBmbG93IGFuZCBlcnJvciBoYW5kbGluZyBidWcuIEl0IGRvZXMgbm90IGludm9sdmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkaW5nIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTiBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0b3JzLCBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIHN1Y2ggaGFuZ3Mgb3IgbG9naWMgZXJyb3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIGBtb3ZlX3BhZ2VzKClgIHdoZXJlIHRoZSBgZXJyYCB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IHRvIDAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVfcGFnZXNfcHRlcygpYC4gSWYgYGVycmAgd2FzIHByZXZpb3VzbHkgc2V0IHRvIGAtRUFHQUlOYCAoZS5nLiwgZnJvbSBhIHByaW9yIGZhaWxlZCBgbW92ZV9wYWdlc19odWdlX3BtZCgpYCBhdHRlbXB0IHRoYXQgdHJpZ2dlcmVkIGEgYGNvbnRpbnVlYCksIGl0IHdvdWxkIHJlbWFpbiBgLUVBR0FJTmAuIFRoaXMgd291bGQgY2F1c2UgdGhlIGxvb3AgdG8gaW5jb3JyZWN0bHkgc2tpcCBhZHZhbmNpbmcgdGhlIGBzcmNfYWRkcmAgYW5kIGBkc3RfYWRkcmAgcG9pbnRlcnMgYW5kIGBjb250aW51ZWAgYWdhaW4sIGxlYWRpbmcgdG8gYW4gaW5maW5pdGUgbG9vcCBvciBpbmNvcnJlY3QgZXJyb3IgcmV0dXJucy5cXG5cXG5UaGlzIGlzIGEgY29udHJvbCBmbG93IGFuZCBlcnJvciBoYW5kbGluZyBidWcuIEl0IGRvZXMgbm90IGludm9sdmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkaW5nIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gU3RhbmRhcmQga2VybmVsIHRlc3RpbmcsIGluY2x1ZGluZyBLQVNBTiBhbmQgc29mdCBsb2NrdXAgZGV0ZWN0b3JzLCBpcyBzdWZmaWNpZW50IHRvIGNhdGNoIHN1Y2ggaGFuZ3Mgb3IgbG9naWMgZXJyb3JzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflow62hb9[1] Phase: Succeeded StartedAt: 2026-08-15 10:53:24 +0000 UTC FinishedAt: 2026-08-15 10:53:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-15 10:53:24 +0000 UTC FinishedAt: 2026-08-15 10:53:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2] Phase: Succeeded StartedAt: 2026-08-15 10:53:24 +0000 UTC FinishedAt: 2026-08-15 14:43:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-15 10:53:24 +0000 UTC FinishedAt: 2026-08-15 14:43:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-15 10:53:24 +0000 UTC FinishedAt: 2026-08-15 10:53:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-15 10:53:24 +0000 UTC FinishedAt: 2026-08-15 10:53:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.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-workflow62hb9/series-workflow62hb9-convert-artifact-2530203024/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-15 10:53:34 +0000 UTC FinishedAt: 2026-08-15 11:14:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-15 10:53:34 +0000 UTC FinishedAt: 2026-08-15 11:14:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*be43196c-f948-4dcc-a62c-0c5d12c42e8e,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-workflow62hb9/series-workflow62hb9-convert-artifact-2530203024/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": "ac226d90-d92b-4320-83b6-c7fa750960d3", "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-workflow62hb9/series-workflow62hb9-build-action-2373513750/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-15 10:53:34 +0000 UTC FinishedAt: 2026-08-15 11:13:53 +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:*be43196c-f948-4dcc-a62c-0c5d12c42e8e,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-workflow62hb9/series-workflow62hb9-convert-artifact-2530203024/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": "ac226d90-d92b-4320-83b6-c7fa750960d3", "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-workflow62hb9/series-workflow62hb9-build-action-2373513750/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-15 11:14:15 +0000 UTC FinishedAt: 2026-08-15 11:14:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-15 11:14:15 +0000 UTC FinishedAt: 2026-08-15 11:14:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-15 11:14:15 +0000 UTC FinishedAt: 2026-08-15 11:14:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-15 11:14:15 +0000 UTC FinishedAt: 2026-08-15 11:14:19 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.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-workflow62hb9/series-workflow62hb9-convert-artifact-3032922359/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-15 11:14:25 +0000 UTC FinishedAt: 2026-08-15 11:16:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-15 11:14:25 +0000 UTC FinishedAt: 2026-08-15 11:16:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ac226d90-d92b-4320-83b6-c7fa750960d3,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-workflow62hb9/series-workflow62hb9-build-action-2373513750/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-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-15 11:16:25 +0000 UTC FinishedAt: 2026-08-15 11:16:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-15 11:16:25 +0000 UTC FinishedAt: 2026-08-15 11:16:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-15 11:16:25 +0000 UTC FinishedAt: 2026-08-15 11:36:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-15 11:16:25 +0000 UTC FinishedAt: 2026-08-15 11:36:35 +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:*be43196c-f948-4dcc-a62c-0c5d12c42e8e,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-workflow62hb9/series-workflow62hb9-convert-artifact-3032922359/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": "3883f0d5-e7cc-4c19-9a54-f0d1539c8195", "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-workflow62hb9/series-workflow62hb9-build-action-2219805627/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-15 11:16:25 +0000 UTC FinishedAt: 2026-08-15 11:36:25 +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:*be43196c-f948-4dcc-a62c-0c5d12c42e8e,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-workflow62hb9/series-workflow62hb9-convert-artifact-3032922359/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": "3883f0d5-e7cc-4c19-9a54-f0d1539c8195", "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-workflow62hb9/series-workflow62hb9-build-action-2219805627/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-15 11:36:35 +0000 UTC FinishedAt: 2026-08-15 11:36:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-15 11:36:35 +0000 UTC FinishedAt: 2026-08-15 11:36:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-15 11:36:35 +0000 UTC FinishedAt: 2026-08-15 11:38:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-15 11:36:35 +0000 UTC FinishedAt: 2026-08-15 11:38:17 +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:*3883f0d5-e7cc-4c19-9a54-f0d1539c8195,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-workflow62hb9/series-workflow62hb9-build-action-2219805627/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-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-15 11:38:27 +0000 UTC FinishedAt: 2026-08-15 14:43:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-15 11:38:27 +0000 UTC FinishedAt: 2026-08-15 14:43:48 +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":["userfaultfd_ioctl"],"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:*ac226d90-d92b-4320-83b6-c7fa750960d3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*3883f0d5-e7cc-4c19-9a54-f0d1539c8195,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-workflow62hb9/series-workflow62hb9-build-action-2373513750/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-workflow62hb9/series-workflow62hb9-build-action-2219805627/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-15 11:38:27 +0000 UTC FinishedAt: 2026-08-15 11:38:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-15 11:38:27 +0000 UTC FinishedAt: 2026-08-15 11:38:32 +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":["userfaultfd_ioctl"],"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-workflow62hb9/series-workflow62hb9-convert-artifact-4247881008/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-15 11:38:27 +0000 UTC FinishedAt: 2026-08-15 11:38:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-15 11:38:27 +0000 UTC FinishedAt: 2026-08-15 11:38:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-15 11:38:27 +0000 UTC FinishedAt: 2026-08-15 11:38:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-15 11:38:37 +0000 UTC FinishedAt: 2026-08-15 14:43:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflow62hb9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["userfaultfd_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"62cc90241548d5570ee68e01aaba6506964e9811","config_name":"upstream-apparmor-kasan.config","enable_configs":["USERFAULTFD"],"series_id":"c5e69fd5-c4ea-4035-95eb-b9c558d9e9eb","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-15 11:38:37 +0000 UTC FinishedAt: 2026-08-15 14:43:37 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ac226d90-d92b-4320-83b6-c7fa750960d3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*3883f0d5-e7cc-4c19-9a54-f0d1539c8195,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-workflow62hb9/series-workflow62hb9-build-action-2373513750/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-workflow62hb9/series-workflow62hb9-build-action-2219805627/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-workflow62hb9/series-workflow62hb9-convert-artifact-4247881008/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,}