Name: series-workflowjbqks Phase: Succeeded StartedAt: 2026-08-07 20:05:16 +0000 UTC FinishedAt: 2026-08-08 00:15:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[0] Phase: Succeeded StartedAt: 2026-08-07 20:05:16 +0000 UTC FinishedAt: 2026-08-07 20:33:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[0].run-triage Phase: Succeeded StartedAt: 2026-08-07 20:05:16 +0000 UTC FinishedAt: 2026-08-07 20:33:14 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "594d905195024b228c962627ae5ae7c17bd582a4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TLS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "594d905195024b228c962627ae5ae7c17bd582a4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TLS" ], "series_id": "a8897df4-2b76-41d6-be86-9a70a926932e" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "tls_strp_check_rcv", "tls_sw_recvmsg", "tls_strp_data_ready" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RMUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3Rsc19zdHJwX2NoZWNrX3JjdiYjMzQ7LAogICAgJiMzNDt0bHNfc3dfcmVjdm1zZyYjMzQ7LAogICAgJiMzNDt0bHNfc3RycF9kYXRhX3JlYWR5JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXG5cbkJ5IGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKClgIGJlZm9yZSByZWFkaW5nIHRoZSBoZWFkZXIsIHRoZSBjb2RlIGRldGVjdHMgb3ZlcmxhcHBpbmcgc2VnbWVudHMgb3IgbWl4ZWQgZGVjcnlwdGVkIHN0YXR1cyBhbmQgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5KClgLiBUaGlzIGZhbGxiYWNrIHVzZXMgYHRjcF9yZWFkX3NvY2soKWAgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgb3ZlcmxhcHMgYW5kIGNvcHkgdGhlIGxvZ2ljYWwgc3RyZWFtIGludG8gYSBsaW5lYXIgYnVmZmVyLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBhNmIwNWI3ZTM1N2QxM2I1OTdlZjhjYjIyNmY0ZmFiNDBmZTNiOTIwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMDoyOToyNyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvdGxzL3Rsc19zdHJwLmMgYi9uZXQvdGxzL3Rsc19zdHJwLmNcbmluZGV4IDYxYjEwYzY5N2VjY2IuLjY0ZDVkZWE5MDU0MDMgMTAwNjQ0XG4tLS0gYS9uZXQvdGxzL3Rsc19zdHJwLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC90bHMvdGxzX3N0cnAuY1xuQEAgLTQzMCw5ICYjNDM7NDMwLDkgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuJiM0MztzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGxlbilcbiB7XG4tXHR1bnNpZ25lZCBpbnQgbGVuID0gc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuO1xuIFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0LCAqc2tiO1xuIFx0dTMyIHNlcTtcbiBcbkBAIC01MjUsNiAmIzQzOzUyNSwxMiBAQCBzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcbiBcbiBcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcbiBcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pIHtcbiYjNDM7XHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbiYjNDM7XHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBUTFNfSEVBREVSX1NJWkUpKVxuJiM0MztcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcbiYjNDM7XG4gXHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXHUwMDNlYW5jaG9yKTtcbiBcdFx0aWYgKHN6IFx1MDAzYyAwKVxuIFx0XHRcdHJldHVybiBzejtcbkBAIC01MzUsNyAmIzQzOzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gXHR9XG4gXG4tXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKVxuJiM0MztcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSlcbiBcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4gXG4gXHRXUklURV9PTkNFKHN0cnAtXHUwMDNlbXNnX3JlYWR5LCAxKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VExTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dGxzX3N0cnBfY2hlY2tfcmN2JiMzNDssCiAgICAmIzM0O3Rsc19zd19yZWN2bXNnJiMzNDssCiAgICAmIzM0O3Rsc19zdHJwX2RhdGFfcmVhZHkmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIFRMUyBzdHJlYW0gcGFyc2VyIGxvZ2ljIChgdGxzX3N0cnBfcmVhZF9zb2NrYCBhbmQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCkgdG8gY29ycmVjdGx5IGNoZWNrIGlmIHRoZSByZWNlaXZlIHF1ZXVlIGhhcyBlbm91Z2ggZGF0YSBmb3IgdGhlIFRMUyBoZWFkZXIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZCBpdC4gVGhpcyBpcyBjb3JlIG5ldHdvcmsgcmVjZWl2ZSBsb2dpYyBmb3IgVExTIHNvY2tldHMgYW5kIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIGByZWN2bXNnYCBvbiBUTFMgc29ja2V0cy4gSXQgaXMgd29ydGggZnV6emluZyB0byBlbnN1cmUgdGhlIHN0cmVhbSBwYXJzZXIgaGFuZGxlcyBmcmFnbWVudGVkIG9yIHNob3J0IFRMUyByZWNvcmRzIGNvcnJlY3RseSB3aXRob3V0IG1lbW9yeSBjb3JydXB0aW9uIG9yIHN0YWxscy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGE2YjA1YjdlMzU3ZDEzYjU5N2VmOGNiMjI2ZjRmYWI0MGZlM2I5MjAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDIwOjI5OjI3IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L3Rscy90bHNfc3RycC5jIGIvbmV0L3Rscy90bHNfc3RycC5jCmluZGV4IDYxYjEwYzY5N2VjY2IuLjY0ZDVkZWE5MDU0MDMgMTAwNjQ0Ci0tLSBhL25ldC90bHMvdGxzX3N0cnAuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvdGxzL3Rsc19zdHJwLmMKQEAgLTQzMCw5ICYjNDM7NDMwLDkgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCkKJiM0MztzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JdW5zaWduZWQgaW50IGxlbiA9IHN0cnAtJmd0O3N0bS5vZmZzZXQgJiM0Mzsgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuOwogCXN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjsKIAl1MzIgc2VxOwogCkBAIC01MjUsNiAmIzQzOzUyNSwxMiBAQCBzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCkKIAogCXRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTsKIAlpZiAoIXN0cnAtJmd0O3N0bS5mdWxsX2xlbikgewomIzQzOwkJaWYgKGlucSAmbHQ7IFRMU19IRUFERVJfU0laRSkKJiM0MzsJCQlyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpOwomIzQzOwomIzQzOwkJaWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpCiYjNDM7CQkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CiYjNDM7CiAJCXN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtJmd0O2FuY2hvcik7CiAJCWlmIChzeiAmbHQ7IDApCiAJCQlyZXR1cm4gc3o7CkBAIC01MzUsNyAmIzQzOzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKQogCQkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTsKIAl9CiAKLQlpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKQomIzQzOwlpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtJmd0O3N0bS5vZmZzZXQgJiM0Mzsgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuKSkKIAkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CiAKIAlXUklURV9PTkNFKHN0cnAtJmd0O21zZ19yZWFkeSwgMSk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNzAKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxNzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUTFMgU3RyaXAgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBuZXQvdGxzL3Rsc19zdHJwLmNgIGFuZCBpbW1lZGlhdGVseSwgSSBzZWUgYSBzaWduaWZpY2FudCBjaGFuZ2UgaW4gaG93IHdlJiMzOTtyZSBoYW5kbGluZyBxdWV1ZSBjaGVja3MuIFRoZSBwcmltYXJ5IG1vZGlmaWNhdGlvbiByZXZvbHZlcyBhcm91bmQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgbGVuZ3RoIGludGVybmFsbHksIGl0IG5vdyBhY2NlcHRzIGEgYGxlbmAgcGFyYW1ldGVyLiBUaGlzIGlzIGludGVyZXN0aW5nLCBpdCBpbXBsaWVzIHdlJiMzOTtyZSB0cnlpbmcgdG8gY2VudHJhbGl6ZSBvciBvcHRpbWl6ZSBob3cgdGhpcyBsZW5ndGggaXMgZGV0ZXJtaW5lZC4KClRoZSBvdGhlciBrZXkgY2hhbmdlIGlzIHdpdGhpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYC4gVGhlIHBhdGNoIG1vdmVzIHRoZSBjYWxsIHRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmJlZm9yZSogd2UgY2FsbCBgdGxzX3J4X21zZ19zaXplYC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBjbGVhciwgd2UgbmVlZCB0byBlbnN1cmUgdGhlIHF1ZXVlIGhhcyB0aGUgcmVzb3VyY2VzIG5lZWRlZCB0byByZWFkIHRoZSBUTFMgaGVhZGVyICpiZWZvcmUqIHdlIGV2ZW4gYXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIGhlYWRlciYjMzk7cyBzaXplLiBJdCYjMzk7cyBhIHByZWVtcHRpdmUgc2FmZXR5IGNoZWNrLiBJZiB0aGUgcXVldWUgaXNuJiMzOTt0IHN1aXRhYmxlLCBpdCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBUaGlzIG1ha2VzIHNlbnNlLCBpdCYjMzk7cyBhIGdvb2QgZmFpbC1zYWZlLgoKVGltZSB0byBkaXZlIGRlZXBlci4gSSYjMzk7bGwgdXNlIGBncmVwcGVyYCB0byBsb2NhdGUgYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaW4gdGhlIGZpbGUuIEkgd2FudCB0byBzZWUgaG93IHRoZXNlIGNoYW5nZXMgYXJlIGltcGFjdGluZyB0aGUgb3ZlcmFsbCBmbG93LCBzcGVjaWZpY2FsbHkgaG93IGBsZW5gIGlzIGJlaW5nIGNhbGN1bGF0ZWQgYW5kIHBhc3NlZCwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIHNpZGUgZWZmZWN0cyB0byBiZSBhd2FyZSBvZi4gSSYjMzk7bGwgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIGNoYW5nZSBpcyBpbmRlZWQgYW4gaW1wcm92ZW1lbnQsIGFuZCBoYXNuJiMzOTt0IGludHJvZHVjZWQgYW55IHVuaW50ZW5kZWQgY29uc2VxdWVuY2VzIHJlbGF0ZWQgdG8gcmFjZSBjb25kaXRpb25zIG9yIGJ1ZmZlciBvdmVyZmxvd3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGxzX3N0cnBfcmVhZF9zb2NrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3RycC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYz00ODM9Ym9vbCB0bHNfc3RycF9tc2dfbG9hZChzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBmb3JjZV9yZWZyZXNoKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01MTEtLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIG9uIGxvd2VyIHNvY2tldCAqL1xubmV0L3Rscy90bHNfc3RycC5jOjUxMjpzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcbm5ldC90bHMvdGxzX3N0cnAuYy01MTMte1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01NTc9dm9pZCB0bHNfc3RycF9jaGVja19yY3Yoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgYW5ub3VuY2UpXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTU2MS1cbm5ldC90bHMvdGxzX3N0cnAuYzo1NjI6XHRpZiAodGxzX3N0cnBfcmVhZF9zb2NrKHN0cnApID09IC1FTk9NRU0pXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTYzLVx0XHRxdWV1ZV93b3JrKHRsc19zdHJwX3dxLCBcdTAwMjZzdHJwLVx1MDAzZXdvcmspO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxODcKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBgdGxzX3N0cnBfcmVhZF9zb2NrYCYjMzk7cyBDYWxsIENoYWluKioKCkFscmlnaHQsIHNvIGB0bHNfc3RycF9yZWFkX3NvY2tgIGlzIGEgc3RhdGljIGZ1bmN0aW9uLiBUaGF0IG1lYW5zIGl0cyBzY29wZSBpcyBsaW1pdGVkLCBtYWtpbmcgaXQgZWFzaWVyIHRvIHJlYXNvbiBhYm91dCwgYnV0IGFsc28gcG90ZW50aWFsbHkgaGlkZXMgaXRzIHVzZS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGxldCYjMzk7cyB0cmFjZSBpdHMgdXNhZ2UuIEkga25vdyBpdCYjMzk7cyBjYWxsZWQgYnkgYHRsc19zdHJwX2NoZWNrX3JjdmAsIHdoaWNoIGhlbHBzIGEgbG90LiBCdXQgSSBuZWVkIHRoZSB3aG9sZSBwaWN0dXJlLiBTbyB0aGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gc2VlICp3aG8qIGlzIGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3JjdmAuIEZpZ3VyaW5nIG91dCB0aGF0IGNhbGxpbmcgaGllcmFyY2h5IGlzIHRoZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgZnVuY3Rpb24mIzM5O3MgcGxhY2UgaW4gdGhlIGJyb2FkZXIgc3lzdGVtIGFuZCBhbnkgcG90ZW50aWFsIHNpZGUgZWZmZWN0cyBvZiBpdHMgZGVzaWduLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Rsc19zdHJwX2NoZWNrX3JjdiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzLmg9MTk0PXZvaWQgdGxzX3N0cnBfZGF0YV9yZWFkeShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCk7XG5uZXQvdGxzL3Rscy5oLTE5NS1cbm5ldC90bHMvdGxzLmg6MTk2OnZvaWQgdGxzX3N0cnBfY2hlY2tfcmN2KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGFubm91bmNlKTtcbm5ldC90bHMvdGxzLmgtMTk3LXZvaWQgdGxzX3N0cnBfbXNnX2NvbnN1bWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApO1xuLS1cbm5ldC90bHMvdGxzX21haW4uYz02Mjc9c3RhdGljIGludCBkb190bHNfc2V0c29ja29wdF9jb25mKHN0cnVjdCBzb2NrICpzaywgc29ja3B0cl90IG9wdHZhbCxcbi0tXG5uZXQvdGxzL3Rsc19tYWluLmMtNzc0LVxubmV0L3Rscy90bHNfbWFpbi5jOjc3NTpcdFx0dGxzX3N0cnBfY2hlY2tfcmN2KFx1MDAyNnJ4X2N0eC1cdTAwM2VzdHJwLCB0cnVlKTtcbm5ldC90bHMvdGxzX21haW4uYy03NzYtXHR9XG4tLVxubmV0L3Rscy90bHNfc3RycC5jPTUxMj1zdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcbi0tXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTU2LSAqL1xubmV0L3Rscy90bHNfc3RycC5jOjU1Nzp2b2lkIHRsc19zdHJwX2NoZWNrX3JjdihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBhbm5vdW5jZSlcbm5ldC90bHMvdGxzX3N0cnAuYy01NTgte1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01Njk9dm9pZCB0bHNfc3RycF9kYXRhX3JlYWR5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01ODItXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTgzOlx0dGxzX3N0cnBfY2hlY2tfcmN2KHN0cnAsIHRydWUpO1xubmV0L3Rscy90bHNfc3RycC5jLTU4NC19XG4tLVxubmV0L3Rscy90bHNfc3RycC5jPTU4Nj1zdGF0aWMgdm9pZCB0bHNfc3RycF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdylcbi0tXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTkxLVx0bG9ja19zb2NrKHN0cnAtXHUwMDNlc2spO1xubmV0L3Rscy90bHNfc3RycC5jOjU5MjpcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcbm5ldC90bHMvdGxzX3N0cnAuYy01OTMtXHRyZWxlYXNlX3NvY2soc3RycC1cdTAwM2Vzayk7XG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTU5Ni0vKiBSZWxlYXNlIHRoZSBjdXJyZW50IHJlY29yZCB3aXRob3V0IHRyaWdnZXJpbmcgYSBjaGVjayBmb3IgdGhlXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTk3OiAqIG5leHQgcmVjb3JkLiBDYWxsZXJzIG11c3QgaW52b2tlIHRsc19zdHJwX2NoZWNrX3JjdigpIGJlZm9yZVxubmV0L3Rscy90bHNfc3RycC5jLTU5OC0gKiByZWxlYXNpbmcgdGhlIHNvY2tldCBsb2NrLCBvciBxdWV1ZWQgZGF0YSB3aWxsIHN0YWxsIHVudGlsIHRoZVxuLS1cbm5ldC90bHMvdGxzX3N3LmM9MTA5NT10bHNfcnhfcmVjX3dhaXQoc3RydWN0IHNvY2sgKnNrLCBib29sIG5vbmJsb2NrLCBib29sIHJlbGVhc2VkLCBib29sIGhhc19jb3BpZWQpXG4tLVxubmV0L3Rscy90bHNfc3cuYy0xMTI0LVx0XHRcdCAqL1xubmV0L3Rscy90bHNfc3cuYzoxMTI1Olx0XHRcdHRsc19zdHJwX2NoZWNrX3JjdihcdTAwMjZjdHgtXHUwMDNlc3RycCwgZmFsc2UpO1xubmV0L3Rscy90bHNfc3cuYy0xMTI2LVx0XHRcdGlmICh0bHNfc3RycF9tc2dfcmVhZHkoY3R4KSlcbi0tXG5uZXQvdGxzL3Rsc19zdy5jPTE2MjQ9c3RhdGljIHZvaWQgdGxzX3J4X3JlY19kb25lKHN0cnVjdCB0bHNfc3dfY29udGV4dF9yeCAqY3R4KVxuLS1cbm5ldC90bHMvdGxzX3N3LmMtMTYyNi1cdHRsc19zdHJwX21zZ19jb25zdW1lKFx1MDAyNmN0eC1cdTAwM2VzdHJwKTtcbm5ldC90bHMvdGxzX3N3LmM6MTYyNzpcdHRsc19zdHJwX2NoZWNrX3JjdihcdTAwMjZjdHgtXHUwMDNlc3RycCwgZmFsc2UpO1xubmV0L3Rscy90bHNfc3cuYy0xNjI4LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MzU1CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMjc3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKioKCk9rYXksIHNvIHRoaXMgaXMgZGVmaW5pdGVseSBjb3JlIFRMUyByZWNlaXZlIGxvZ2ljLCB3aGljaCBtZWFucyBpdCYjMzk7cyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gR2l2ZW4gdGhlIHBhdGNoIG1vZGlmaWVzIGB0bHNfc3RycF9yZWFkX3NvY2tgLCBhbmQgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYHRsc19zdHJwX2NoZWNrX3JjdmAsIHRoYXQmIzM5O3MgYW4gaW1tZWRpYXRlIGFyZWEgb2YgaW50ZXJlc3QuIE5vdywgYHRsc19zdHJwX2NoZWNrX3JjdmAgaXMgY2FsbGVkIGZyb20gYSBoYW5kZnVsIG9mIG90aGVyIGZ1bmN0aW9uczogYHRsc19yeF9yZWNfd2FpdGAsIGB0bHNfcnhfcmVjX2RvbmVgLCBgdGxzX3N0cnBfd29ya2AsIGB0bHNfc3RycF9kYXRhX3JlYWR5YCwgYW5kIGBkb190bHNfc2V0c29ja29wdF9jb25mYC4KCkluaXRpYWxseSwgSSB0aG91Z2h0IHRoZSBwcmltYXJ5IGZvY3VzIHNob3VsZCBiZSBvbiB0aGUgY2FsbHMgdG8gYHRsc19zdHJwX2NoZWNrX3JjdmAsIGB0bHNfc3RycF9kYXRhX3JlYWR5YCwgYHRsc19yeF9yZWNfd2FpdGAsIGFuZCBgdGxzX3J4X3JlY19kb25lYCwgYnV0IHdhaXQsIGB0bHNfcnhfcmVjX3dhaXRgIGFuZCBgdGxzX3J4X3JlY19kb25lYCBhcmUgc3RhdGljIGZ1bmN0aW9ucy4uLiBzbyB0aGF0IGNvbXBsaWNhdGVzIHRoaW5ncy4KCkxldCYjMzk7cyBzdGFydCBieSBkaWdnaW5nIGludG8gYHRsc19zdHJwX2NoZWNrX3JjdmAgYW5kIGB0bHNfc3RycF9kYXRhX3JlYWR5YCBhbmQgc2VlIHdoYXQgd2UgY2FuIGZpbmQuIE9oLCBhbHNvLCB3aGF0IGFib3V0IGB0bHNfc3RycF9tc2dfbG9hZGA/IE1heWJlIHdlIHNob3VsZCBjaGVjayB3aG8gY2FsbHMgYHRsc19zdHJwX3JlYWRfc29ja2AgdG8gc2VlIGlmIHdlIG1pc3NlZCBhbnl0aGluZy4gQWgsIGFuZCBpdCB0dXJucyBvdXQsIGB0bHNfc3RycF9yZWFkX3NvY2tgIGlzIG9ubHkgY2FsbGVkIGZyb20gYHRsc19zdHJwX2NoZWNrX3JjdmAuCgpBbHJpZ2h0LCBpdCBsb29rcyBsaWtlIGB0bHNfc3RycF9jaGVja19yY3ZgIGlzIHRoZSBtb3N0IGltcG9ydGFudCBzeW1ib2wgdG8gZm9jdXMgb24gZm9yIG5vdy4gTmV4dCwgSSBzaG91bGQgY2hlY2sgdGhlIEtjb25maWcgdG8gc2VlIGhvdyBUTFMgaXMgY29uZmlndXJlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVExTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3Rscy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3Rscy9LY29uZmlnLTQtI1xubmV0L3Rscy9LY29uZmlnOjU6Y29uZmlnIFRMU1xubmV0L3Rscy9LY29uZmlnLTYtXHR0cmlzdGF0ZSBcJiMzNDtUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgc3VwcG9ydFwmIzM0O1xuLS1cbm5ldC90bHMvS2NvbmZpZy0xOC1cbm5ldC90bHMvS2NvbmZpZzoxOTpjb25maWcgVExTX0RFVklDRVxubmV0L3Rscy9LY29uZmlnLTIwLVx0Ym9vbCBcJiMzNDtUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgSFcgb2ZmbG9hZFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUxNDAKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgcHJlc2VudGVkIGFzIG15IG93biBtZW50YWwgcHJvY2VzcywgZ2l2ZW4gbXkgZXhwZXJ0aXNlOgoKKipDaGVja2luZyBUTFMgU3RyaXBwaW5nIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgdGhlIGNvbmZpZ3VyYXRpb24gaW4gcXVlc3Rpb24gaXMgZGVmaW5pdGVseSBzZXQgdG8gVExTLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB3aXRoIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgcmVsYXRlZCB0byBUTFMgc3RyaXBwaW5nLiBUaGVyZWZvcmUsIG15IG5leHQgdGhvdWdodCBpcyB0byBpbnZlc3RpZ2F0ZSB0aGUgYHRsc19zdHJwX2NoZWNrX3JjdmAgZnVuY3Rpb24uIFRoYXQmIzM5O3MgYSBzdHJvbmcgaW5kaWNhdG9yLiBJdCYjMzk7cyBsb2NhdGVkIGluIGBuZXQvdGxzL3Rsc19zdHJwLmNgLCB3aGljaCBtYWtlcyBzZW5zZSBhcyB0aGUgbmV0IGRpcmVjdG9yeSBzdWdnZXN0cyBpdCByZWxhdGVzIHRvIG5ldHdvcmsgZnVuY3Rpb25zLiBJIHdhbnQgdG8gY2hlY2sgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBiZWNhdXNlIGl0JiMzOTtzIGhpZ2hseSBsaWtlbHkgdG8gaG9sZCB0aGUgY29yZSBsb2dpYyBmb3IgdGhlIFRMUyBzdHJpcHBpbmcgY2hlY2ssIHBhcnRpY3VsYXJseSByZWdhcmRpbmcgaW5jb21pbmcgZGF0YS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IHZhbGlkYXRlcyByZWNlaXZlZCBkYXRhIGluIHRoaXMgc3BlY2lmaWMgVExTIGNvbmZpZ3VyYXRpb24gdG8gaWRlbnRpZnkgYW55IHBvdGVudGlhbCB3ZWFrbmVzc2VzLiBJJiMzOTttIGxvb2tpbmcgZm9yIGtub3duIGJ5cGFzc2VzIG9yIGVkZ2UgY2FzZXMgaGVyZSwgSSYjMzk7bGwgc2VlIHdoYXQgSSBjYW4gZmluZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGxzX3N0cnBfY2hlY2tfcmN2JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3RycC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTU1Ni0gKi9cbm5ldC90bHMvdGxzX3N0cnAuYzo1NTc6dm9pZCB0bHNfc3RycF9jaGVja19yY3Yoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgYW5ub3VuY2UpXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTU4LXtcbi0tXG5uZXQvdGxzL3Rsc19zdHJwLmM9NTY5PXZvaWQgdGxzX3N0cnBfZGF0YV9yZWFkeShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcbi0tXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTgyLVxubmV0L3Rscy90bHNfc3RycC5jOjU4MzpcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcbm5ldC90bHMvdGxzX3N0cnAuYy01ODQtfVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01ODY9c3RhdGljIHZvaWQgdGxzX3N0cnBfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTU5MS1cdGxvY2tfc29jayhzdHJwLVx1MDAzZXNrKTtcbm5ldC90bHMvdGxzX3N0cnAuYzo1OTI6XHR0bHNfc3RycF9jaGVja19yY3Yoc3RycCwgdHJ1ZSk7XG5uZXQvdGxzL3Rsc19zdHJwLmMtNTkzLVx0cmVsZWFzZV9zb2NrKHN0cnAtXHUwMDNlc2spO1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01OTYtLyogUmVsZWFzZSB0aGUgY3VycmVudCByZWNvcmQgd2l0aG91dCB0cmlnZ2VyaW5nIGEgY2hlY2sgZm9yIHRoZVxubmV0L3Rscy90bHNfc3RycC5jOjU5NzogKiBuZXh0IHJlY29yZC4gQ2FsbGVycyBtdXN0IGludm9rZSB0bHNfc3RycF9jaGVja19yY3YoKSBiZWZvcmVcbm5ldC90bHMvdGxzX3N0cnAuYy01OTgtICogcmVsZWFzaW5nIHRoZSBzb2NrZXQgbG9jaywgb3IgcXVldWVkIGRhdGEgd2lsbCBzdGFsbCB1bnRpbCB0aGVcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTgzOQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRoZSBleHBlcnQ6CgoqKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWxseSBFeHBvc2VkIFRMUyBGdW5jdGlvbioqCgpPa2F5LCBzbyBgdGxzX3N0cnBfY2hlY2tfcmN2YCBpcyBlaXRoZXIgZXhwb3J0ZWQgb3IsIGF0IHRoZSB2ZXJ5IGxlYXN0LCBub3QgZGVjbGFyZWQgYXMgc3RhdGljLiBUaGF0JiMzOTtzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nOyBpdCBtZWFucyBpdCYjMzk7cyBwb3RlbnRpYWxseSBhY2Nlc3NpYmxlIG91dHNpZGUgaXRzIGN1cnJlbnQgc2NvcGUuIE15IG5leHQgc3RlcCBpcyB0byBwaW5wb2ludCBpdHMgdXNhZ2Ugd2l0aGluIHRoZSBUTFMgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgdG8gc2VlIGhvdyBpdCBmaXRzIGludG8gdGhlIGRhdGEgcmVjZWl2ZSBwYXRoLiBMZXQmIzM5O3MgZGlnIGludG8gYG5ldC90bHMvdGxzX3N3LmNgIGFuZCBzZWFyY2ggZm9yIHRoZSBgdGxzX3N3X3JlY3Ztc2dgIGZ1bmN0aW9uLiBGaW5kaW5nIHRoYXQgd2lsbCBsaWtlbHkgZ2l2ZSBtZSB0aGUgc3Vycm91bmRpbmcgY29udGV4dCBhbmQgcXVpY2tseSByZXZlYWwgaG93IGB0bHNfc3RycF9jaGVja19yY3ZgIGlzIGludm9rZWQuIEl0JiMzOTtsbCBnaXZlIG1lIGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIHdoZXJlIGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFuZCBpdHMgb3ZlcmFsbCBpbXBvcnRhbmNlLiBJJiMzOTttIGhvcGluZyB0aGlzIHdpbGwgcHJvdmlkZSBlbm91Z2ggY29udGV4dCBmb3IgbWUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZnVuY3Rpb24gaXMgYSBwb2ludCBvZiBjb25jZXJuLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0bHNfc3dfcmVjdm1zZyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N3LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3cuYz0xODAwPXN0YXRpYyB2b2lkIHRsc19yeF9yZWFkZXJfdW5sb2NrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRsc19zd19jb250ZXh0X3J4ICpjdHgpXG4tLVxubmV0L3Rscy90bHNfc3cuYy0xODA1LVxubmV0L3Rscy90bHNfc3cuYzoxODA2OmludCB0bHNfc3dfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssXG5uZXQvdGxzL3Rsc19zdy5jLTE4MDctXHRcdCAgIHN0cnVjdCBtc2doZHIgKm1zZyxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjI0MAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDE5MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgVExTIFNvY2tldCBSZWNlcHRpb24gVnVsbmVyYWJpbGl0aWVzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBUTFMgc29ja2V0IGhhbmRsaW5nLCBzcGVjaWZpY2FsbHkgdGhlIHJlY2VwdGlvbiBwcm9jZXNzLiBgdGxzX3N3X3JlY3Ztc2dgIGlzIHRoZSBrZXkgZnVuY3Rpb24gaGVyZSwgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBhbmFseXNpcy4gQW5kIEkgc2hvdWxkIGFsc28ga2VlcCBhbiBleWUgb24gYHRsc19zdHJwX2RhdGFfcmVhZHlgIGFzIHRoZSBkYXRhLXJlYWR5IGNhbGxiYWNrLgoKUmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gYG5ldC90bHMvdGxzX3N0cnAuY2AgYW5kIHRha2UgYSBsb29rIGF0IGB0bHNfc3RycF9yZWFkX3NvY2tgLiBJdCYjMzk7cyBzdGF0aWMsIHNvIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgaXQgY2FyZWZ1bGx5LiBBaCwgaGVyZSYjMzk7cyBhIHBhdGNoIHRoYXQgYWRkcmVzc2VzIGEgYnVnIHdoZXJlIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2Agd2FzIGJlaW5nIGNhbGxlZCBpbmNvcnJlY3RseSwgZWl0aGVyIHdpdGggYW4gaW5jb3JyZWN0IGxlbmd0aCBvciBhdCB0aGUgd3JvbmcgdGltZS4gVGhpcyB3b3VsZCBsZWFkIHRvIHByb2JsZW1zIHdoZW4gdGhlIHJlY2VpdmUgcXVldWUgZG9lc24mIzM5O3QgaGF2ZSB0aGUgY29tcGxldGUgVExTIGhlYWRlciwgd2hpY2ggd291bGQgYmUgYSBzaWduaWZpY2FudCB2dWxuZXJhYmlsaXR5IHRvIGV4cGxvaXQuIFRoaXMgaXMgKmRlZmluaXRlbHkqIGZ1enppbmcgbWF0ZXJpYWwuIFRoZSBwb3RlbnRpYWwgaGVyZSBpcyBxdWl0ZSBpbnRlcmVzdGluZy4KClRvIGFpZCB3aXRoIHRoYXQsIGxldCBtZSBub3RlIGRvd24gc29tZSBtb3JlIGZvY3VzIHN5bWJvbHMuIEkgaGF2ZToKCi0gICBgdGxzX3N0cnBfY2hlY2tfcmN2YAotICAgYHRsc19zd19yZWN2bXNnYAotICAgYHRsc19zdHJwX2RhdGFfcmVhZHlgCgpHb29kLCBnb29kLiBJ4oCZbGwgbWFrZSBzdXJlIHRoZSBgVExTYCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBOb3csIGxldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgdGhhdCBtaWdodCBiZSBpbiBwbGF5LiBBbHdheXMgZ29vZCB0byBjb3ZlciBteSBiYXNlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdGxzL0tjb25maWc9NT1jb25maWcgVExTXG5uZXQvdGxzL0tjb25maWctNi1cdHRyaXN0YXRlIFwmIzM0O1RyYW5zcG9ydCBMYXllciBTZWN1cml0eSBzdXBwb3J0XCYjMzQ7XG5uZXQvdGxzL0tjb25maWc6NzpcdGRlcGVuZHMgb24gSU5FVFxubmV0L3Rscy9LY29uZmlnLTgtXHRzZWxlY3QgQ1JZUFRPXG4tLVxubmV0L3Rscy9LY29uZmlnPTE5PWNvbmZpZyBUTFNfREVWSUNFXG5uZXQvdGxzL0tjb25maWctMjAtXHRib29sIFwmIzM0O1RyYW5zcG9ydCBMYXllciBTZWN1cml0eSBIVyBvZmZsb2FkXCYjMzQ7XG5uZXQvdGxzL0tjb25maWc6MjE6XHRkZXBlbmRzIG9uIFRMU1xubmV0L3Rscy9LY29uZmlnLTIyLVx0c2VsZWN0IFNLQl9ERUNSWVBURURcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjkxNAoJCQkJCQkJb3V0cHV0OiAxNjMKCQkJCQkJCXRob3VnaHRzOiAxMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgVExTIFN0cmVhbSBQYXJzZXIgUGF0Y2gqKgoKT2theSwgc28gdGhlIGdpc3Qgb2YgaXQgaXMgdGhpczogYElORVRgIGlzIHRoZSBnby10bywgYW5kIGBUTFNgIGlzIGdvb2QgZW5vdWdoIGZvciB3aGF0IHdlJiMzOTtyZSBkb2luZy4gTGV0IG1lIGJyZWFrIGRvd24gdGhlIHRoaW5raW5nIGhlcmUuCgpUaGlzIHBhdGNoLCBpdCYjMzk7cyBtZXNzaW5nIHdpdGggdGhlIFRMUyBzdHJlYW0gcGFyc2VyLCBzcGVjaWZpY2FsbHkgdGhvc2UgYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgZnVuY3Rpb25zLiBJdCYjMzk7cyBhYm91dCBtYWtpbmcgc3VyZSB0aGUgY29kZSAqYWN0dWFsbHkqIGNoZWNrcyBpZiB0aGVyZSYjMzk7cyBlbm91Z2ggZGF0YSBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBiZWZvcmUgdHJ5aW5nIHRvIHBhcnNlIHRoZSBUTFMgaGVhZGVyLiBUaGF0JiMzOTtzIGNyaXRpY2FsIG5ldHdvcmsgcmVjZWl2ZSBsb2dpYywgdGhlIGJyZWFkIGFuZCBidXR0ZXIgb2YgVExTIHNvY2tldHMsIGFuZCBpdCYjMzk7cyBzb21ldGhpbmcgdXNlcnNwYWNlIGNhbiBwb2tlIGF0IHdpdGggYHJlY3Ztc2dgIG9uIHRob3NlIFRMUyBzb2NrZXRzLiBUaGlzIGlzICpwcmltZSogZnV6emluZyBtYXRlcmlhbCwgbm8gcXVlc3Rpb24uIFdlIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlIHBhcnNlciBncmFjZWZ1bGx5IGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3Jkcy4gTm8gbWVtb3J5IGNvcnJ1cHRpb24sIG5vIHN0YWxscyDigJMgdGhhdCYjMzk7cyB0aGUgbmFtZSBvZiB0aGUgZ2FtZS4gV2UgYXJlIGdvaW5nIHRvIG5lZWQgdG8gcHJvdmlkZSB0aGVzZSByZXN1bHRzIHdpdGggYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RMUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3Rsc19zdHJwX2NoZWNrX3JjdiYjMzQ7LAogICAgJiMzNDt0bHNfc3dfcmVjdm1zZyYjMzQ7LAogICAgJiMzNDt0bHNfc3RycF9kYXRhX3JlYWR5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RMUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3Rsc19zdHJwX2NoZWNrX3JjdiYjMzQ7LAogICAgJiMzNDt0bHNfc3dfcmVjdm1zZyYjMzQ7LAogICAgJiMzNDt0bHNfc3RycF9kYXRhX3JlYWR5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjNtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXG5cbkJ5IGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKClgIGJlZm9yZSByZWFkaW5nIHRoZSBoZWFkZXIsIHRoZSBjb2RlIGRldGVjdHMgb3ZlcmxhcHBpbmcgc2VnbWVudHMgb3IgbWl4ZWQgZGVjcnlwdGVkIHN0YXR1cyBhbmQgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5KClgLiBUaGlzIGZhbGxiYWNrIHVzZXMgYHRjcF9yZWFkX3NvY2soKWAgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgb3ZlcmxhcHMgYW5kIGNvcHkgdGhlIGxvZ2ljYWwgc3RyZWFtIGludG8gYSBsaW5lYXIgYnVmZmVyLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGE2YjA1YjdlMzU3ZDEzYjU5N2VmOGNiMjI2ZjRmYWI0MGZlM2I5MjAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDIwOjI5OjI3IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L3Rscy90bHNfc3RycC5jIGIvbmV0L3Rscy90bHNfc3RycC5jCmluZGV4IDYxYjEwYzY5N2VjY2IuLjY0ZDVkZWE5MDU0MDMgMTAwNjQ0Ci0tLSBhL25ldC90bHMvdGxzX3N0cnAuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvdGxzL3Rsc19zdHJwLmMKQEAgLTQzMCw5ICYjNDM7NDMwLDkgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCkKJiM0MztzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JdW5zaWduZWQgaW50IGxlbiA9IHN0cnAtJmd0O3N0bS5vZmZzZXQgJiM0Mzsgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuOwogCXN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjsKIAl1MzIgc2VxOwogCkBAIC01MjUsNiAmIzQzOzUyNSwxMiBAQCBzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCkKIAogCXRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTsKIAlpZiAoIXN0cnAtJmd0O3N0bS5mdWxsX2xlbikgewomIzQzOwkJaWYgKGlucSAmbHQ7IFRMU19IRUFERVJfU0laRSkKJiM0MzsJCQlyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpOwomIzQzOwomIzQzOwkJaWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpCiYjNDM7CQkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CiYjNDM7CiAJCXN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtJmd0O2FuY2hvcik7CiAJCWlmIChzeiAmbHQ7IDApCiAJCQlyZXR1cm4gc3o7CkBAIC01MzUsNyAmIzQzOzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKQogCQkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTsKIAl9CiAKLQlpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKQomIzQzOwlpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtJmd0O3N0bS5vZmZzZXQgJiM0Mzsgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuKSkKIAkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CiAKIAlXUklURV9PTkNFKHN0cnAtJmd0O21zZ19yZWFkeSwgMSk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzY3CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMjQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgVExTIFN0cmVhbSBQcm9jZXNzaW5nIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgYWltZWQgYXQgaW1wcm92aW5nIHRoZSBoYW5kbGluZyBvZiBUTFMgc3RyZWFtIHByb2Nlc3NpbmcsIHNwZWNpZmljYWxseSBhcm91bmQgaG93IHRoZSBpbnB1dCBxdWV1ZSBpcyB2YWxpZGF0ZWQgYW5kIHJlYWQuIFRoZSBrZXkgY2hhbmdlIGlzIHRoYXQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBub3cgYWNjZXB0cyBhbiBleHBsaWNpdCBsZW5ndGggYXJndW1lbnQgKGBsZW5gKSBpbnN0ZWFkIG9mIHJlY2FsY3VsYXRpbmcgaXQgZnJvbSBgc3RycC0mZ3Q7c3RtLm9mZnNldGAgYW5kIGBzdHJwLSZndDtzdG0uZnVsbF9sZW5gLiBUaGlzIGlzIGEgc3VidGxlIGJ1dCBpbXBvcnRhbnQgc2hpZnQg4oCTIGl0IGFsbG93cyBmb3IgbW9yZSBmbGV4aWJpbGl0eSBhbmQgcG90ZW50aWFsbHkgYXZvaWRzIHJlZHVuZGFudCBjYWxjdWxhdGlvbnMgb3IgcG9zc2libGUgb2ZmLWJ5LW9uZSBlcnJvcnMgdGhhdCBtaWdodCBhcmlzZSBmcm9tIHRoZSBpbXBsaWNpdCBjYWxjdWxhdGlvbi4KClRoZSBvdGhlciBwb2ludCBvZiBpbnRlcmVzdCBpcyB0aGUgYWRkZWQgY2hlY2sgd2l0aGluIGB0bHNfc3RycF9yZWFkX3NvY2tgLiBUaGUgY29kZSBub3cgZXhwbGljaXRseSBhZGRyZXNzZXMgdGhlIGNhc2Ugd2hlcmUgYHN0cnAtJmd0O3N0bS5mdWxsX2xlbmAgaXMgemVyby4gV2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5LCBpdCBmaXJzdCBsb2FkcyBhbiBhbmNob3IgZnJvbSB0aGUgcXVldWUuIFRoZW4sIHRoZSBwYXRjaCBpbnNlcnRzIGFkZGl0aW9uYWwgY29uZGl0aW9uYWwgbG9naWM6CgoxLiAgSWYgdGhlIGlucHV0IHF1ZXVlIHNpemUgKGBpbnFgKSBpcyBzbWFsbGVyIHRoYW4gYFRMU19IRUFERVJfU0laRWAsIGl0IGNhbGxzIGB0bHNfc3RycF9yZWFkX2NvcHlgLCB3aGljaCBJIGluZmVyIG1pZ2h0IGhhbmRsZSBhIHNob3J0IHJlYWQgb3IgYSBzcGVjaWFsIGluaXRpYWxpemF0aW9uLgoyLiAgSWYgdGhlIHNpemUgaXMgc3VmZmljaWVudCAoYGlucWAgJmd0Oz0gYFRMU19IRUFERVJfU0laRWApIGl0IHRoZW4gY2FsbHMgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aXRoIGEgc2l6ZSBvZiBgc3RycC0mZ3Q7c3RtLm9mZnNldCAmIzQzOyBUTFNfSEVBREVSX1NJWkVgLiBUaGlzIHNpemUgaXMgbW9zdCBsaWtlbHkgY2hlY2tpbmcgaWYgdGhlIFRMUyBoZWFkZXIgaXMgdmFsaWQgd2l0aGluIHRoZSBxdWV1ZS4gSWYgaXQgKmlzbiYjMzk7dCogb2theSwgaXQgY2FsbHMgYHRsc19zdHJwX3JlYWRfY29weWAgYWdhaW4sIHRoaXMgdGltZSB3aXRoIGEgYGZhbHNlYCBhcmd1bWVudC4KCkkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgZXhhY3RseSBgdGxzX3N0cnBfcmVhZF9jb3B5YCBkb2VzIGluIHRob3NlIGNhc2VzLiBUaGUgYHRydWVgIGFuZCBgZmFsc2VgIGFyZ3VtZW50cyBzdWdnZXN0IGRpZmZlcmVudCBiZWhhdmlvcnMsIGFuZCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRob3NlIGRpZmZlcmVuY2VzIGFyZSwgd2hpY2ggd2lsbCBwcm9iYWJseSB0ZWxsIG1lIHdoYXQmIzM5O3MgZ29pbmcgb24gaGVyZS4gVGhlIGNhbGwgdG8gYHRsc19yeF9tc2dfc2l6ZWAgYWZ0ZXIgdGhlc2UgY2hlY2tzIGltcGxpZXMgdGhhdCB0aGUgY29kZSBpcyBhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgaW5jb21pbmcgVExTIG1lc3NhZ2UuCgpVbHRpbWF0ZWx5LCB0aGUgZ29hbCBpcyB0byBtYWtlIHN1cmUgdGhhdCB3aGF0ZXZlciYjMzk7cyBpbiB0aGUgaW5wdXQgcXVldWUgaXMgdmFsaWQgYW5kIHNhZmUgdG8gcHJvY2VzcywgZXNwZWNpYWxseSB3aGVuIHRoZSBzdHJlYW0gbGVuZ3RoIGlzbiYjMzk7dCBpbW1lZGlhdGVseSBrbm93bi4gVGhlIGV4cGxpY2l0IGxlbmd0aCBhcmd1bWVudCB0byBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHN1Z2dlc3RzIGEgZGVzaXJlIGZvciBncmVhdGVyIHByZWNpc2lvbiBhbmQgcG90ZW50aWFsbHkgbW9yZSBlZmZpY2llbnQgdmFsaWRhdGlvbi4gSSBzaG91bGQgZGVsdmUgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjaGFuZ2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Rsc19zdHJwX2NoZWNrX3F1ZXVlX29rJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3RycC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYz0zOTA9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy00MzItXG5uZXQvdGxzL3Rsc19zdHJwLmM6NDMzOnN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxubmV0L3Rscy90bHNfc3RycC5jLTQzNC1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTUzMC1cbm5ldC90bHMvdGxzX3N0cnAuYzo1MzE6XHRcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTMyLVx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01NDMtXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTQ0Olx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0Mzsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxubmV0L3Rscy90bHNfc3RycC5jLTU0NS1cdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM1MzMKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aG9zZSBmdW5jdGlvbnMsIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgYW5kIGB0bHNfc3RycF9yZWFkX3NvY2tgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgcXVldWUgYW5kIHNvY2tldCBoYW5kbGluZyBoZXJlLCBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIHRoZSBvdmVyYWxsIFRMUy9TUlAgcHJvY2Vzcy4KCioqRGl2aW5nIGludG8gUXVldWUgYW5kIFNvY2tldCBJbnRlZ3JpdHkqKgoKSSYjMzk7bSBpbW1lZGlhdGVseSBmb2N1c2luZyBvbiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gbGlrZWx5IGV4YW1pbmVzIHRoZSBzdGF0ZSBvZiBhIHF1ZXVlLCBwcmVzdW1hYmx5IHJlbGF0ZWQgdG8gZGF0YSBjb21pbmcgaW4gb3IgZ29pbmcgb3V0IG9mIHRoZSBUTFMvU1JQIGNvbW11bmljYXRpb24uIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgY29uc3RpdHV0ZXMgYW4gJiMzNDtvayYjMzQ7IHN0YXRlLiBJcyBpdCBjaGVja2luZyBmb3Igb3ZlcmZsb3c/IFVuZGVyZmxvdz8gU3BlY2lmaWMgZmxhZ3M/IEFyZSB3ZSB0YWxraW5nIGFib3V0IGEgc2ltcGxlIEZJRk8gcXVldWUsIG9yIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/IFRoZSAmIzM0O29rJiMzNDsgY29uZGl0aW9uIHdpbGwgYmUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGVycm9yIGhhbmRsaW5nIG9yIGZsb3cgY29udHJvbCBtZWNoYW5pc21zIGluIHBsYWNlLiBUaGUgbmFtaW5nIGNvbnZlbnRpb24gc3VnZ2VzdHMgaXQgbWlnaHQgYmUgc3BlY2lmaWMgdG8gU2VjdXJlIFJlbW90ZSBQYXNzd29yZC4KCk5leHQsIGB0bHNfc3RycF9yZWFkX3NvY2tgLiBUaGUgYHJlYWRfc29ja2AgcGFydCBpcyBzdHJhaWdodGZvcndhcmQg4oCTIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgZGF0YSBmcm9tIHRoZSBzb2NrZXQuIEhvd2V2ZXIsIHRoZSAmIzM0O1NSUCYjMzQ7IHByZWZpeCBzdWdnZXN0cyBhIHZlcnkgc3BlY2lmaWMsIGFuZCBwcm9iYWJseSBzZWN1cml0eS1zZW5zaXRpdmUsIG9wZXJhdGlvbi4gSSYjMzk7bSBndWVzc2luZyB0aGF0IHRoaXMgaXMgcmVsYXRlZCB0byByZWNlaXZpbmcgU1JQIGNoYWxsZW5nZSByZXNwb25zZXMsIHZlcmlmaWNhdGlvbiBkYXRhLCBvciBwZXJoYXBzIGV2ZW4gdGhlIFRMUyBoYW5kc2hha2UgaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGxhcmdlciBUTFMvU1JQIHN0YXRlIG1hY2hpbmUuIElzIGl0IGJsb2NraW5nLCBub24tYmxvY2tpbmcsIG9yIHVzaW5nIHNlbGVjdC9wb2xsPyBBcmUgdGhlcmUgc3BlY2lmaWMgZXJyb3IgY29kZXMgdG8gaGFuZGxlPyBXaGF0IGhhcHBlbnMgb24gcGFydGlhbCByZWFkcz8gV2hhdCBzZWN1cml0eSBjaGVja3MgYXJlIGhhcHBlbmluZyBoZXJlPwoKTXkgcHJpbWFyeSBjb25jZXJuIHdpdGggdGhlc2UgdHdvIGZ1bmN0aW9ucyB3aWxsIGJlIHVuZGVyc3RhbmRpbmcgdGhlaXIgaW50ZXJwbGF5LiBIb3cgZG9lcyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGluZmx1ZW5jZSB0aGUgYmVoYXZpb3Igb2YgYHRsc19zdHJwX3JlYWRfc29ja2A/IERvZXMgdGhlIHF1ZXVlIGNoZWNrIGdhdGUgdGhlIHJlYWQ/IERvZXMgdGhlIHF1ZXVlIHJlcHJlc2VudCBhIGJ1ZmZlciBmb3IgZGF0YSByZWNlaXZlZCBieSB0aGUgc29ja2V0PyBUaGUgcmVsYXRpb25zaGlwcyBhcmUga2V5LiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSB0cmFjZSB0aGUgZGF0YSBmbG93IGFuZCBwb3RlbnRpYWwgZXJyb3IgY29uZGl0aW9ucyBpbiB0aGUgc3lzdGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQzMDpcdFx0cmV0dXJuIDA7XG4gNDMxOlx0fVxuIDQzMjpcdFxuIDQzMzpcdHN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxuIDQzNDpcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBsZW4pXG4gNDM1Olx0e1xuIDQzNjpcdFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0LCAqc2tiO1xuIDQzNzpcdFx0dTMyIHNlcTtcbiA0Mzg6XHRcbiA0Mzk6XHRcdGZpcnN0ID0gc2tiX3NoaW5mbyhzdHJwLVx1MDAzZWFuY2hvciktXHUwMDNlZnJhZ19saXN0O1xuIDQ0MDpcdFx0c2tiID0gZmlyc3Q7XG4gNDQxOlx0XHRzZXEgPSBUQ1BfU0tCX0NCKGZpcnN0KS1cdTAwM2VzZXE7XG4gNDQyOlx0XG4gNDQzOlx0XHQvKiBNYWtlIHN1cmUgdGhlcmUmIzM5O3Mgbm8gZHVwbGljYXRlIGRhdGEgaW4gdGhlIHF1ZXVlLFxuIDQ0NDpcdFx0ICogYW5kIHRoZSBkZWNyeXB0ZWQgc3RhdHVzIG1hdGNoZXMuXG4gNDQ1Olx0XHQgKi9cbiA0NDY6XHRcdHdoaWxlIChza2ItXHUwMDNlbGVuIFx1MDAzYyBsZW4pIHtcbiA0NDc6XHRcdFx0c2VxICYjNDM7PSBza2ItXHUwMDNlbGVuO1xuIDQ0ODpcdFx0XHRsZW4gLT0gc2tiLVx1MDAzZWxlbjtcbiA0NDk6XHRcdFx0c2tiID0gc2tiLVx1MDAzZW5leHQ7XG4gNDUwOlx0XG4gNDUxOlx0XHRcdGlmIChUQ1BfU0tCX0NCKHNrYiktXHUwMDNlc2VxICE9IHNlcSlcbiA0NTI6XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gNDUzOlx0XHRcdGlmIChza2JfY21wX2RlY3J5cHRlZChmaXJzdCwgc2tiKSlcbiA0NTQ6XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gNDU1Olx0XHR9XG4gNDU2Olx0XG4gNDU3Olx0XHRyZXR1cm4gdHJ1ZTtcbiA0NTg6XHR9XG4gNDU5Olx0XG4gNDYwOlx0c3RhdGljIHZvaWQgdGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgaW50IGxlbilcbiA0NjE6XHR7XG4gNDYyOlx0XHRzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHN0cnAtXHUwMDNlc2spO1xuIDQ2MzpcdFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0O1xuIDQ2NDpcdFx0dTMyIG9mZnNldDtcbiA0NjU6XHRcbiA0NjY6XHRcdGZpcnN0ID0gdGNwX3JlY3Zfc2tiKHN0cnAtXHUwMDNlc2ssIHRwLVx1MDAzZWNvcGllZF9zZXEsIFx1MDAyNm9mZnNldCk7XG4gNDY3Olx0XHRpZiAoV0FSTl9PTl9PTkNFKCFmaXJzdCkpXG4gNDY4Olx0XHRcdHJldHVybjtcbiA0Njk6XHRcbiA0NzA6XHRcdC8qIEJlc3RvdyB0aGUgc3RhdGUgb250byB0aGUgYW5jaG9yICovXG4gNDcxOlx0XHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2VsZW4gPSBvZmZzZXQgJiM0MzsgbGVuO1xuIDQ3MjpcdFx0c3RycC1cdTAwM2VhbmNob3ItXHUwMDNlZGF0YV9sZW4gPSBvZmZzZXQgJiM0MzsgbGVuO1xuIDQ3MzpcdFx0c3RycC1cdTAwM2VhbmNob3ItXHUwMDNldHJ1ZXNpemUgPSBvZmZzZXQgJiM0MzsgbGVuO1xuIDQ3NDpcdFxuIDQ3NTpcdFx0c2tiX3NoaW5mbyhzdHJwLVx1MDAzZWFuY2hvciktXHUwMDNlZnJhZ19saXN0ID0gZmlyc3Q7XG4gNDc2Olx0XG4gNDc3Olx0XHRza2JfY29weV9oZWFkZXIoc3RycC1cdTAwM2VhbmNob3IsIGZpcnN0KTtcbiA0Nzg6XHRcdHN0cnAtXHUwMDNlYW5jaG9yLVx1MDAzZWRlc3RydWN0b3IgPSBOVUxMO1xuIDQ3OTpcdFxuIDQ4MDpcdFx0c3RycC1cdTAwM2VzdG0ub2Zmc2V0ID0gb2Zmc2V0O1xuIDQ4MTpcdH1cbiA0ODI6XHRcbiA0ODM6XHRib29sIHRsc19zdHJwX21zZ19sb2FkKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGZvcmNlX3JlZnJlc2gpXG4gNDg0Olx0e1xuIDQ4NTpcdFx0c3RydWN0IHN0cnBfbXNnICpyeG07XG4gNDg2Olx0XHRzdHJ1Y3QgdGxzX21zZyAqdGxtO1xuIDQ4NzpcdFxuIDQ4ODpcdFx0REVCVUdfTkVUX1dBUk5fT05fT05DRSghc3RycC1cdTAwM2Vtc2dfcmVhZHkpO1xuIDQ4OTpcdFx0REVCVUdfTkVUX1dBUk5fT05fT05DRSghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pO1xuIDQ5MDpcdFxuIDQ5MTpcdFx0aWYgKCFzdHJwLVx1MDAzZWNvcHlfbW9kZSBcdTAwMjZcdTAwMjYgZm9yY2VfcmVmcmVzaCkge1xuIDQ5MjpcdFx0XHRpZiAodW5saWtlbHkodGNwX2lucShzdHJwLVx1MDAzZXNrKSBcdTAwM2Mgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKSB7XG4gNDkzOlx0XHRcdFx0V1JJVEVfT05DRShzdHJwLVx1MDAzZW1zZ19yZWFkeSwgMCk7XG4gNDk0Olx0XHRcdFx0c3RycC1cdTAwM2Vtc2dfYW5ub3VuY2VkID0gMDtcbiA0OTU6XHRcdFx0XHRtZW1zZXQoXHUwMDI2c3RycC1cdTAwM2VzdG0sIDAsIHNpemVvZihzdHJwLVx1MDAzZXN0bSkpO1xuIDQ5NjpcdFx0XHRcdHJldHVybiBmYWxzZTtcbiA0OTc6XHRcdFx0fVxuIDQ5ODpcdFxuIDQ5OTpcdFx0XHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKTtcbiA1MDA6XHRcdH1cbiA1MDE6XHRcbiA1MDI6XHRcdHJ4bSA9IHN0cnBfbXNnKHN0cnAtXHUwMDNlYW5jaG9yKTtcbiA1MDM6XHRcdHJ4bS1cdTAwM2VmdWxsX2xlblx0PSBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbjtcbiA1MDQ6XHRcdHJ4bS1cdTAwM2VvZmZzZXRcdD0gc3RycC1cdTAwM2VzdG0ub2Zmc2V0O1xuIDUwNTpcdFx0dGxtID0gdGxzX21zZyhzdHJwLVx1MDAzZWFuY2hvcik7XG4gNTA2Olx0XHR0bG0tXHUwMDNlY29udHJvbFx0PSBzdHJwLVx1MDAzZW1hcms7XG4gNTA3Olx0XG4gNTA4Olx0XHRyZXR1cm4gdHJ1ZTtcbiA1MDk6XHR9XG4gNTEwOlx0XG4gNTExOlx0LyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIG9uIGxvd2VyIHNvY2tldCAqL1xuIDUxMjpcdHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIDUxMzpcdHtcbiA1MTQ6XHRcdGludCBzeiwgaW5xO1xuIDUxNTpcdFxuIDUxNjpcdFx0aW5xID0gdGNwX2lucShzdHJwLVx1MDAzZXNrKTtcbiA1MTc6XHRcdGlmIChpbnEgXHUwMDNjIDEpXG4gNTE4Olx0XHRcdHJldHVybiAwO1xuIDUxOTpcdFxuIDUyMDpcdFx0aWYgKHVubGlrZWx5KHN0cnAtXHUwMDNlY29weV9tb2RlKSlcbiA1MjE6XHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weWluKHN0cnApO1xuIDUyMjpcdFxuIDUyMzpcdFx0aWYgKGlucSBcdTAwM2Mgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pXG4gNTI0Olx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gNTI1Olx0XG4gNTI2Olx0XHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XG4gNTI3Olx0XHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG4gNTI4Olx0XHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbiA1Mjk6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NTI0CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93biwgYXNzdW1pbmcgSSYjMzk7bSBhbiBleHBlcnQgaW4gdGhpcyBmaWVsZDoKCioqRGl2aW5nIGludG8gYHRsc19zdHJwX3JlYWRfc29ja2AqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCBkaWcgaW50byB0aGUgcmVzdCBvZiB0aGlzIGB0bHNfc3RycF9yZWFkX3NvY2tgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29tcGxldGUgb3BlcmF0aW9uYWwgY29udGV4dC4gVGhpcyBpbml0aWFsIHNlY3Rpb24gcHJvdmlkZWQgYSBrZXksIGJ1dCBJIG5lZWQgdG8gc2VlIHRoZSBlbnRpcmUgdGhpbmcuIFRoZSBoZWFkZXIgdGVsbHMgbWUgd2hlcmUgd2UgYXJlLCBidXQgSSBuZWVkIHRoZSBmdWxsIHBpY3R1cmUgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGRvaW5nLCBob3cgaXQgaGFuZGxlcyBlcnJvcnMsIGFuZCB0aGUgbG9naWMgZmxvdy4gTGV0JiMzOTtzIHNlZSBob3cgdGhlIHJlc3Qgb2YgaXQgaGFuZGxlcyBpdHMgY29yZSByZXNwb25zaWJpbGl0aWVzLiBUaGlzIHdpbGwgY2xhcmlmeSB0aGUgYWN0dWFsIG1lY2hhbmlzbXMgZm9yIGhhbmRsaW5nIHRoZSBzb2NrZXQgcmVhZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1MjU6XHRcbiA1MjY6XHRcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcbiA1Mjc6XHRcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pIHtcbiA1Mjg6XHRcdFx0aWYgKGlucSBcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxuIDUyOTpcdFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gNTMwOlx0XG4gNTMxOlx0XHRcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpXG4gNTMyOlx0XHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4gNTMzOlx0XG4gNTM0Olx0XHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXHUwMDNlYW5jaG9yKTtcbiA1MzU6XHRcdFx0aWYgKHN6IFx1MDAzYyAwKVxuIDUzNjpcdFx0XHRcdHJldHVybiBzejtcbiA1Mzc6XHRcbiA1Mzg6XHRcdFx0c3RycC1cdTAwM2VzdG0uZnVsbF9sZW4gPSBzejtcbiA1Mzk6XHRcbiA1NDA6XHRcdFx0aWYgKCFzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiB8fCBpbnEgXHUwMDNjIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKVxuIDU0MTpcdFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gNTQyOlx0XHR9XG4gNTQzOlx0XG4gNTQ0Olx0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbikpXG4gNTQ1Olx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuIDU0NjpcdFxuIDU0NzpcdFx0V1JJVEVfT05DRShzdHJwLVx1MDAzZW1zZ19yZWFkeSwgMSk7XG4gNTQ4Olx0XG4gNTQ5Olx0XHRyZXR1cm4gMDtcbiA1NTA6XHR9XG4gNTUxOlx0XG4gNTUyOlx0LyogUGFyc2UgcXVldWVkIGRhdGEuIFdoZW4gQGFubm91bmNlIGlzIHRydWUgYW5kIHBhcnNpbmcgcHJvZHVjZXMgYVxuIDU1MzpcdCAqIG5ld2x5LXJlYWR5IHJlY29yZCwgZmlyZSB0aGUgY29uc3VtZXIgbm90aWZpY2F0aW9uLiBDYWxsZXJzIHRoYXRcbiA1NTQ6XHQgKiBuZWVkIHRvIG5vdGlmeSBhIHdhaXRlciBhYm91dCBhIHJlY29yZCBwYXJzZWQgYnkgYW5vdGhlciBwYXRoXG4gNTU1Olx0ICogc2hvdWxkIGludm9rZSB0bHNfcnhfbXNnX21heWJlX2Fubm91bmNlKCkgZGlyZWN0bHkuXG4gNTU2Olx0ICovXG4gNTU3Olx0dm9pZCB0bHNfc3RycF9jaGVja19yY3Yoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgYW5ub3VuY2UpXG4gNTU4Olx0e1xuIDU1OTpcdFx0aWYgKHVubGlrZWx5KHN0cnAtXHUwMDNlc3RvcHBlZCkgfHwgc3RycC1cdTAwM2Vtc2dfcmVhZHkpXG4gNTYwOlx0XHRcdHJldHVybjtcbiA1NjE6XHRcbiA1NjI6XHRcdGlmICh0bHNfc3RycF9yZWFkX3NvY2soc3RycCkgPT0gLUVOT01FTSlcbiA1NjM6XHRcdFx0cXVldWVfd29yayh0bHNfc3RycF93cSwgXHUwMDI2c3RycC1cdTAwM2V3b3JrKTtcbiA1NjQ6XHRcdGVsc2UgaWYgKGFubm91bmNlIFx1MDAyNlx1MDAyNiBzdHJwLVx1MDAzZW1zZ19yZWFkeSlcbiA1NjU6XHRcdFx0dGxzX3J4X21zZ19tYXliZV9hbm5vdW5jZShzdHJwKTtcbiA1NjY6XHR9XG4gNTY3Olx0XG4gNTY4Olx0LyogTG93ZXIgc29jayBsb2NrIGhlbGQgKi9cbiA1Njk6XHR2b2lkIHRsc19zdHJwX2RhdGFfcmVhZHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gNTcwOlx0e1xuIDU3MTpcdFx0LyogVGhpcyBjaGVjayBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUgd2l0aCBkb190bHNfc3RycF93b3JrLlxuIDU3MjpcdFx0ICogZG9fdGxzX3N0cnBfd29yayBhY3F1aXJlcyBhIHByb2Nlc3MgbG9jayAobG9ja19zb2NrKSB3aGVyZWFzXG4gNTczOlx0XHQgKiB0aGUgbG9jayBoZWxkIGhlcmUgaXMgYmhfbG9ja19zb2NrLiBUaGUgdHdvIGxvY2tzIGNhbiBiZVxuIDU3NDpcdFx0ICogaGVsZCBieSBkaWZmZXJlbnQgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLCBidXQgYmhfbG9ja19zb2NrXG4gNTc1Olx0XHQgKiBhbGxvd3MgYSB0aHJlYWQgaW4gQkggY29udGV4dCB0byBzYWZlbHkgY2hlY2sgaWYgdGhlIHByb2Nlc3NcbiA1NzY6XHRcdCAqIGxvY2sgaXMgaGVsZC4gSW4gdGhpcyBjYXNlLCBpZiB0aGUgbG9jayBpcyBoZWxkLCBxdWV1ZSB3b3JrLlxuIDU3NzpcdFx0ICovXG4gNTc4Olx0XHRpZiAoc29ja19vd25lZF9ieV91c2VyX25vY2hlY2soc3RycC1cdTAwM2VzaykpIHtcbiA1Nzk6XHRcdFx0cXVldWVfd29yayh0bHNfc3RycF93cSwgXHUwMDI2c3RycC1cdTAwM2V3b3JrKTtcbiA1ODA6XHRcdFx0cmV0dXJuO1xuIDU4MTpcdFx0fVxuIDU4MjpcdFxuIDU4MzpcdFx0dGxzX3N0cnBfY2hlY2tfcmN2KHN0cnAsIHRydWUpO1xuIDU4NDpcdH1cbiA1ODU6XHRcbiA1ODY6XHRzdGF0aWMgdm9pZCB0bHNfc3RycF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdylcbiA1ODc6XHR7XG4gNTg4Olx0XHRzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCA9XG4gNTg5Olx0XHRcdGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgdGxzX3N0cnBhcnNlciwgd29yayk7XG4gNTkwOlx0XG4gNTkxOlx0XHRsb2NrX3NvY2soc3RycC1cdTAwM2Vzayk7XG4gNTkyOlx0XHR0bHNfc3RycF9jaGVja19yY3Yoc3RycCwgdHJ1ZSk7XG4gNTkzOlx0XHRyZWxlYXNlX3NvY2soc3RycC1cdTAwM2Vzayk7XG4gNTk0Olx0fVxuIDU5NTpcdFxuIDU5NjpcdC8qIFJlbGVhc2UgdGhlIGN1cnJlbnQgcmVjb3JkIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGNoZWNrIGZvciB0aGVcbiA1OTc6XHQgKiBuZXh0IHJlY29yZC4gQ2FsbGVycyBtdXN0IGludm9rZSB0bHNfc3RycF9jaGVja19yY3YoKSBiZWZvcmVcbiA1OTg6XHQgKiByZWxlYXNpbmcgdGhlIHNvY2tldCBsb2NrLCBvciBxdWV1ZWQgZGF0YSB3aWxsIHN0YWxsIHVudGlsIHRoZVxuIDU5OTpcdCAqIG5leHQgdGxzX3N0cnBfZGF0YV9yZWFkeSgpIGV2ZW50LlxuIDYwMDpcdCAqL1xuIDYwMTpcdHZvaWQgdGxzX3N0cnBfbXNnX2NvbnN1bWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gNjAyOlx0e1xuIDYwMzpcdFx0V0FSTl9PTighc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pO1xuIDYwNDpcdFxuIDYwNTpcdFx0aWYgKGxpa2VseSghc3RycC1cdTAwM2Vjb3B5X21vZGUpKVxuIDYwNjpcdFx0XHR0Y3BfcmVhZF9kb25lKHN0cnAtXHUwMDNlc2ssIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKTtcbiA2MDc6XHRcdGVsc2VcbiA2MDg6XHRcdFx0dGxzX3N0cnBfZmx1c2hfYW5jaG9yX2NvcHkoc3RycCk7XG4gNjA5Olx0XG4gNjEwOlx0XHRXUklURV9PTkNFKHN0cnAtXHUwMDNlbXNnX3JlYWR5LCAwKTtcbiA2MTE6XHRcdHN0cnAtXHUwMDNlbXNnX2Fubm91bmNlZCA9IDA7XG4gNjEyOlx0XHRtZW1zZXQoXHUwMDI2c3RycC1cdTAwM2VzdG0sIDAsIHNpemVvZihzdHJwLVx1MDAzZXN0bSkpO1xuIDYxMzpcdH1cbiA2MTQ6XHRcbiA2MTU6XHR2b2lkIHRsc19zdHJwX3N0b3Aoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gNjE2Olx0e1xuIDYxNzpcdFx0c3RycC1cdTAwM2VzdG9wcGVkID0gMTtcbiA2MTg6XHR9XG4gNjE5Olx0XG4gNjIwOlx0aW50IHRsc19zdHJwX2luaXQoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBzb2NrICpzaylcbiA2MjE6XHR7XG4gNjIyOlx0XHRtZW1zZXQoc3RycCwgMCwgc2l6ZW9mKCpzdHJwKSk7XG4gNjIzOlx0XG4gNjI0Olx0XHRzdHJwLVx1MDAzZXNrID0gc2s7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDczNzIKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAyMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUTFMgU3RyZWFtIFByb2Nlc3NpbmcgUGF0Y2gqKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyBhaW1lZCBhdCBpbXByb3ZpbmcgaG93IHdlIGhhbmRsZSB0aGUgVExTIHN0cmVhbSBwcm9jZXNzaW5nLiBUaGUgY29yZSBvZiB0aGUgY2hhbmdlIHJldm9sdmVzIGFyb3VuZCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiAgSSBzZWUgaXQmIzM5O3Mgbm93IHRha2luZyBhbiBleHBsaWNpdCBgbGVuYCBhcmd1bWVudCwgd2hpY2ggaXMgYSBnb29kIHByYWN0aWNlIGZvciBjbGFyaXR5LiBUaGUgaW50ZW50IGhlcmUgaXMgY2xlYXIsIHdl4oCZcmUgYWRkaW5nIGEgcHJvYWN0aXZlIGNoZWNrIGluIGB0bHNfc3RycF9yZWFkX3NvY2tgIHRvIGVuc3VyZSB0aGF0IHRoZSByZWNlaXZlIHF1ZXVlIGlzIHZhbGlkICpiZWZvcmUqIHdlIGV2ZW4gY2FsbCBgdGxzX3J4X21zZ19zaXplYC4gIFRoYXQgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2U7IHByZS1lbXB0aXZlbHkgdmFsaWRhdGluZyBiZWZvcmUgcG90ZW50aWFsbHkgY29zdGx5IG9wZXJhdGlvbnMgaXMgYSBzb2xpZCBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcgYXBwcm9hY2guCgpJJiMzOTttIGFzc3VtaW5nIGB0bHNfcnhfbXNnX3NpemVgIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNpcGhlcmluZyB0aGUgVExTIGhlYWRlciB0byBkZXRlcm1pbmUgdGhlIHN1YnNlcXVlbnQgbWVzc2FnZSBzaXplLiBUaGF0JiMzOTtzIGEgcmVhc29uYWJsZSBhc3N1bXB0aW9uLCBnaXZlbiBpdHMgbmFtZS4gVGhlIHBhdGNoIGhpZ2hsaWdodHMgdGhhdCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHdpbGwgcmV0dXJuIGZhbHNlIGlmIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBtZXNzZWQtdXAgcXVldWUg4oCTIG1lYW5pbmcgbWl4ZWQgZGVjcnlwdGVkIGFuZCB1bi1kZWNyeXB0ZWQgZGF0YSwgb3IgcGVyaGFwcyBvdXQtb2Ytb3JkZXIgZGF0YSBzZWdtZW50cy4gIFRoZSBjcnVjaWFsIHBhcnQgaXMgdGhlIGZhbGxiYWNrIG1lY2hhbmlzbTogaWYgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBmYWlscywgaXQgZmFsbHMgYmFjayB0byB1c2luZyBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gIFRoaXMgaXMgYSBkZWZpbml0ZSBidWcgZml4LCBwcm90ZWN0aW5nIGFnYWluc3Qgc2l0dWF0aW9ucyB3aGVyZSBgdGxzX3J4X21zZ19zaXplYCBtaWdodCBiZSBnaXZlbiBhbiBpbnZhbGlkIG9yIGluY29uc2lzdGVudCBTS0IsIHdoaWNoIGlzIGNydWNpYWwgZm9yIHByZXZlbnRpbmcgY3Jhc2hlcyBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuCgpXYWl0IGEgc2Vjb25k4oCmIEkgbmVlZCB0byBjbGFyaWZ5IHNvbWV0aGluZy4gIGB0bHNfcnhfbXNnX3NpemVgIGRvZXNuJiMzOTt0IGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgc29ja2V0IGJ1ZmZlciAoYHNrYmApLiBJIHNlZW0gdG8gcmVjYWxsIGl0IHJlYWRzIGZyb20gYHN0cnAtJmd0O2FuY2hvcmAuIFRoaXMgaXMgaW1wb3J0YW50LCBzbyBsZXQgbWUganVzdCB0YWtlIGEgcXVpY2sgbG9vayBhdCB0aGUgc291cmNlIGNvZGUgZm9yIGB0bHNfcnhfbXNnX3NpemVgIHRvIGNvbmZpcm0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Rsc19yeF9tc2dfc2l6ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzLmg9MTk3PXZvaWQgdGxzX3N0cnBfbXNnX2NvbnN1bWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApO1xubmV0L3Rscy90bHMuaC0xOTgtXG5uZXQvdGxzL3Rscy5oOjE5OTppbnQgdGxzX3J4X21zZ19zaXplKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTtcbm5ldC90bHMvdGxzLmgtMjAwLXZvaWQgdGxzX3J4X21zZ19tYXliZV9hbm5vdW5jZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCk7XG4tLVxubmV0L3Rscy90bHNfc3RycC5jPTIxMD1zdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbl9mcmFnKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy0yMzktXG5uZXQvdGxzL3Rsc19zdHJwLmM6MjQwOlx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBza2IpO1xubmV0L3Rscy90bHNfc3RycC5jLTI0MS1cdFx0aWYgKHN6IFx1MDAzYyAwKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz0yODY9c3RhdGljIGludCB0bHNfc3RycF9jb3B5aW5fc2tiKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy0zMTktXHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG5uZXQvdGxzL3Rsc19zdHJwLmM6MzIwOlx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBza2IpO1xubmV0L3Rscy90bHNfc3RycC5jLTMyMS1cdFx0aWYgKHN6IFx1MDAzYyAwKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTUzMy1cbm5ldC90bHMvdGxzX3N0cnAuYzo1MzQ6XHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXHUwMDNlYW5jaG9yKTtcbm5ldC90bHMvdGxzX3N0cnAuYy01MzUtXHRcdGlmIChzeiBcdTAwM2MgMClcbi0tXG5uZXQvdGxzL3Rsc19zdy5jPTIxNzA9Ym9vbCB0bHNfc3dfc29ja19pc19yZWFkYWJsZShzdHJ1Y3Qgc29jayAqc2spXG4tLVxubmV0L3Rscy90bHNfc3cuYy0yMTc4LVxubmV0L3Rscy90bHNfc3cuYzoyMTc5OmludCB0bHNfcnhfbXNnX3NpemUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvdGxzL3Rsc19zdy5jLTIxODAte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NjIxCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5JiMzOTtyZSBteSBvd246CgoqKkFuYWx5emluZyBgdGxzX3J4X21zZ19zaXplYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgcHVsbCB1cCBhbmQgYW5hbHl6ZSB0aGlzIGB0bHNfcnhfbXNnX3NpemVgIHRoaW5nLiBJJiMzOTttIGltbWVkaWF0ZWx5IHRoaW5raW5nLCBva2F5LCB0aGlzIGxpa2VseSByZWxhdGVzIHRvIHRoZSByZWNlcHRpb24gc2lkZSBvZiBUTFMsIHJpZ2h0PyBUaGUgc2l6ZSBvZiBhIHJlY2VpdmVkIFRMUyBtZXNzYWdlLiBOb3csIHRoZSBjb250ZXh0IGlzIGtleS4gV2hhdCYjMzk7cyB0aGUgZW52aXJvbm1lbnQ/IElzIHRoaXMgY2xpZW50LXNpZGUsIHNlcnZlci1zaWRlLCBvciBzb21ldGhpbmcgZWxzZT8gSXMgdGhpcyBjb2RlIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBUTFMgbGlicmFyeT8gQW5kLCBtb3JlIGltcG9ydGFudGx5LCB3aGF0JiMzOTtzIHRoZSBsZXZlbCBvZiBhYnN0cmFjdGlvbiB3ZSYjMzk7cmUgYXQ/IEFyZSB3ZSBsb29raW5nIGF0IGEgcmF3IGJ5dGUgYnVmZmVyLCBvciBhcmUgd2UgZGVhbGluZyB3aXRoIGEgaGlnaGVyLWxldmVsIGRhdGEgc3RydWN0dXJlPyBUaGUgZGV2aWwgaXMgYWx3YXlzIGluIHRoZSBkZXRhaWxzIHdpdGggVExTLCBhbmQgbWVzc2FnZSBzaXppbmcgaXMgYSBrbm93biBhdHRhY2sgdmVjdG9yLCBzbyBJJiMzOTtsbCBiZSBrZWVwaW5nIGEgc2hhcnAgZXllIG91dCBmb3IgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyBsaWtlIGludGVnZXIgb3ZlcmZsb3dzIG9yIHJlc291cmNlIGV4aGF1c3Rpb24gaGVyZS4gV2XigJlsbCBiZSBjaGVja2luZyBob3cgc2l6ZSBpcyBkZXRlcm1pbmVkIGFuZCB1c2VkLCBhbmQgd2hlcmUgdGhlIHZhbHVlIGNhbWUgZnJvbS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjE3OSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMTc5Olx0aW50IHRsc19yeF9tc2dfc2l6ZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYilcbjIxODA6XHR7XG4yMTgxOlx0XHRzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHggPSB0bHNfZ2V0X2N0eChzdHJwLVx1MDAzZXNrKTtcbjIxODI6XHRcdHN0cnVjdCB0bHNfcHJvdF9pbmZvICpwcm90ID0gXHUwMDI2dGxzX2N0eC1cdTAwM2Vwcm90X2luZm87XG4yMTgzOlx0XHRjaGFyIGhlYWRlcltUTFNfSEVBREVSX1NJWkUgJiM0MzsgVExTX01BWF9JVl9TSVpFXTtcbjIxODQ6XHRcdHNpemVfdCBjaXBoZXJfb3ZlcmhlYWQ7XG4yMTg1Olx0XHRzaXplX3QgZGF0YV9sZW4gPSAwO1xuMjE4NjpcdFx0aW50IHJldDtcbjIxODc6XHRcbjIxODg6XHRcdC8qIFZlcmlmeSB0aGF0IHdlIGhhdmUgYSBmdWxsIFRMUyBoZWFkZXIsIG9yIHdhaXQgZm9yIG1vcmUgZGF0YSAqL1xuMjE4OTpcdFx0aWYgKHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBwcm90LVx1MDAzZXByZXBlbmRfc2l6ZSBcdTAwM2Ugc2tiLVx1MDAzZWxlbilcbjIxOTA6XHRcdFx0cmV0dXJuIDA7XG4yMTkxOlx0XG4yMTkyOlx0XHQvKiBTYW5pdHktY2hlY2sgc2l6ZSBvZiBvbi1zdGFjayBidWZmZXIuICovXG4yMTkzOlx0XHRpZiAoV0FSTl9PTihwcm90LVx1MDAzZXByZXBlbmRfc2l6ZSBcdTAwM2Ugc2l6ZW9mKGhlYWRlcikpKSB7XG4yMTk0Olx0XHRcdHJldCA9IC1FSU5WQUw7XG4yMTk1Olx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjE5NjpcdFx0fVxuMjE5NzpcdFxuMjE5ODpcdFx0LyogTGluZWFyaXplIGhlYWRlciB0byBsb2NhbCBidWZmZXIgKi9cbjIxOTk6XHRcdHJldCA9IHNrYl9jb3B5X2JpdHMoc2tiLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQsIGhlYWRlciwgcHJvdC1cdTAwM2VwcmVwZW5kX3NpemUpO1xuMjIwMDpcdFx0aWYgKHJldCBcdTAwM2MgMClcbjIyMDE6XHRcdFx0Z290byByZWFkX2ZhaWx1cmU7XG4yMjAyOlx0XG4yMjAzOlx0XHRzdHJwLVx1MDAzZW1hcmsgPSBoZWFkZXJbMF07XG4yMjA0Olx0XG4yMjA1Olx0XHRkYXRhX2xlbiA9ICgoaGVhZGVyWzRdIFx1MDAyNiAweEZGKSB8IChoZWFkZXJbM10gXHUwMDNjXHUwMDNjIDgpKTtcbjIyMDY6XHRcbjIyMDc6XHRcdGNpcGhlcl9vdmVyaGVhZCA9IHByb3QtXHUwMDNldGFnX3NpemU7XG4yMjA4Olx0XHRpZiAocHJvdC1cdTAwM2V2ZXJzaW9uICE9IFRMU18xXzNfVkVSU0lPTiBcdTAwMjZcdTAwMjZcbjIyMDk6XHRcdCAgICBwcm90LVx1MDAzZWNpcGhlcl90eXBlICE9IFRMU19DSVBIRVJfQ0hBQ0hBMjBfUE9MWTEzMDUpXG4yMjEwOlx0XHRcdGNpcGhlcl9vdmVyaGVhZCAmIzQzOz0gcHJvdC1cdTAwM2Vpdl9zaXplO1xuMjIxMTpcdFxuMjIxMjpcdFx0aWYgKGRhdGFfbGVuIFx1MDAzZSBUTFNfTUFYX1BBWUxPQURfU0laRSAmIzQzOyBjaXBoZXJfb3ZlcmhlYWQgJiM0MztcbjIyMTM6XHRcdCAgICBwcm90LVx1MDAzZXRhaWxfc2l6ZSkge1xuMjIxNDpcdFx0XHRyZXQgPSAtRU1TR1NJWkU7XG4yMjE1Olx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjIxNjpcdFx0fVxuMjIxNzpcdFx0aWYgKGRhdGFfbGVuIFx1MDAzYyBjaXBoZXJfb3ZlcmhlYWQpIHtcbjIyMTg6XHRcdFx0cmV0ID0gLUVCQURNU0c7XG4yMjE5Olx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjIyMDpcdFx0fVxuMjIyMTpcdFxuMjIyMjpcdFx0LyogTm90ZSB0aGF0IGJvdGggVExTMS4zIGFuZCBUTFMxLjIgdXNlIFRMU18xXzIgdmVyc2lvbiBoZXJlICovXG4yMjIzOlx0XHRpZiAoaGVhZGVyWzFdICE9IFRMU18xXzJfVkVSU0lPTl9NSU5PUiB8fFxuMjIyNDpcdFx0ICAgIGhlYWRlclsyXSAhPSBUTFNfMV8yX1ZFUlNJT05fTUFKT1IpIHtcbjIyMjU6XHRcdFx0cmV0ID0gLUVJTlZBTDtcbjIyMjY6XHRcdFx0Z290byByZWFkX2ZhaWx1cmU7XG4yMjI3Olx0XHR9XG4yMjI4Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk3MTMKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA1NTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFRMUyBWdWxuZXJhYmlsaXR5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGB0bHNfcnhfbXNnX3NpemVgIGZ1bmN0aW9uLCBhbmQgaXQmIzM5O3MgY2FsbGluZyBgc2tiX2NvcHlfYml0c2AuIFRoZSBwb3RlbnRpYWwgcHJvYmxlbSBpbW1lZGlhdGVseSBoaXRzIG1lOiBpZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzbiYjMzk7dCBjYWxsZWQgKmJlZm9yZSogdGhpcyBgc2tiX2NvcHlfYml0c2AgY2FsbCwgdGhlbiB0aGUgU29ja2V0IEJ1ZmZlciAoc2tiKSBjb3VsZCBjb250YWluIG1peGVkIG9yIG91dC1vZi1vcmRlciBkZWNyeXB0ZWQgZGF0YS4gYHNrYl9jb3B5X2JpdHNgIGp1c3QgKnJlYWRzKiBmcm9tIHRoZSBza2IsIHNvIGl0IGNhbiYjMzk7dCBiZSBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZS4gSXQgY29waWVzIGRhdGEgZnJvbSB0aGUgc29ja2V0IGJ1ZmZlciBpbnRvIGBoZWFkZXJgLiBCdXQgaWYgdGhlIHNrYiBoYXMgYmFkIGRhdGEsIGBza2JfY29weV9iaXRzYCBpcyBnb2luZyB0byByZWFkIGdhcmJhZ2UuCgpJZiBpdCByZWFkcyBnYXJiYWdlLCB0aGF0IG1lYW5zIGl0IG1pZ2h0IGNhbGN1bGF0ZSBhIGNvbXBsZXRlbHkgaW5jb3JyZWN0IGBkYXRhX2xlbmAuIFRoZSBvcmlnaW5hbCBhbmFseXNpcyBzYWlkIGBoZWFkZXJgIGlzIGZ1bGx5IHdyaXR0ZW4gYnkgYHNrYl9jb3B5X2JpdHNgLCBvciBpdCByZXR1cm5zIGFuIGVycm9yLCBzbyBgaGVhZGVyYCB3aWxsIGJlIGluaXRpYWxpemVkIGluIGFsbCBjYXNlcy4KClRoZSByZWFsIGlzc3VlIGlzIHRoZSB0aW1pbmcuIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKnVzZWQqIHRvIGJlIGNhbGxlZCAqYWZ0ZXIqIGB0bHNfcnhfbXNnX3NpemVgIGFuZCB0aGUgc2V0dGluZyBvZiBgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuYC4gVGhpcyBvcmRlciBpcyBjcml0aWNhbCBiZWNhdXNlIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgdmVyaWZpZXMgdGhlIHF1ZXVlJiMzOTtzIGludGVncml0eSBiYXNlZCBvbiBgc3RycC0mZ3Q7c3RtLm9mZnNldCAmIzQzOyBzdHJwLSZndDtzdG0uZnVsbF9sZW5gLiBJZiB0aGUgcXVldWUgaXNuJiMzOTt0IE9LLCBpdCBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5YC4KClNvLCBiZWZvcmUgdGhpcyBwYXRjaCwgYHRsc19yeF9tc2dfc2l6ZWAgY291bGQgcmVhZCBmcm9tIGEgY29ycnVwdCBxdWV1ZS4gVGhhdCB3b3VsZCBnaXZlIGl0IGEgYmFkIFRMUyBoZWFkZXIgYW5kIHRoZXJlZm9yZSwgYSB3cm9uZyBgc3pgIHZhbHVlLiBUaGVuLCB3aGVuIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaXMgY2FsbGVkICphZnRlciogdGhpcyBjYWxjdWxhdGlvbiwgaXQmIzM5O3MgY2hlY2tpbmcgYWdhaW5zdCBhbiBhbHJlYWR5IGluY29ycmVjdCBgZnVsbF9sZW5gLgoKSWYgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBmYWlscywgaXQgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gSG93ZXZlciwgZXZlbiBpZiB0aGUgcXVldWUgaXMgYmFkLCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgICptaWdodCogaXRlcmF0ZSBvdmVyIHRoZSBxdWV1ZSB1cCB0byBgbGVuYCBpZiB0aGUgcmVzdWx0aW5nIGBzemAgaXMgYSBodWdlIHZhbHVlLiBUaGlzIGNvdWxkIG9wZW4gYSBuZXcgYXZlbnVlIGZvciBhdHRhY2suIEkgbmVlZCB0byByZS1leGFtaW5lIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgbW9yZSBjbG9zZWx5IHRvIGJlIHN1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3RycC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDMzLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MzM6XHRzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcbiA0MzQ6XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxuIDQzNTpcdHtcbiA0MzY6XHRcdHN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjtcbiA0Mzc6XHRcdHUzMiBzZXE7XG4gNDM4Olx0XG4gNDM5Olx0XHRmaXJzdCA9IHNrYl9zaGluZm8oc3RycC1cdTAwM2VhbmNob3IpLVx1MDAzZWZyYWdfbGlzdDtcbiA0NDA6XHRcdHNrYiA9IGZpcnN0O1xuIDQ0MTpcdFx0c2VxID0gVENQX1NLQl9DQihmaXJzdCktXHUwMDNlc2VxO1xuIDQ0MjpcdFxuIDQ0MzpcdFx0LyogTWFrZSBzdXJlIHRoZXJlJiMzOTtzIG5vIGR1cGxpY2F0ZSBkYXRhIGluIHRoZSBxdWV1ZSxcbiA0NDQ6XHRcdCAqIGFuZCB0aGUgZGVjcnlwdGVkIHN0YXR1cyBtYXRjaGVzLlxuIDQ0NTpcdFx0ICovXG4gNDQ2Olx0XHR3aGlsZSAoc2tiLVx1MDAzZWxlbiBcdTAwM2MgbGVuKSB7XG4gNDQ3Olx0XHRcdHNlcSAmIzQzOz0gc2tiLVx1MDAzZWxlbjtcbiA0NDg6XHRcdFx0bGVuIC09IHNrYi1cdTAwM2VsZW47XG4gNDQ5Olx0XHRcdHNrYiA9IHNrYi1cdTAwM2VuZXh0O1xuIDQ1MDpcdFxuIDQ1MTpcdFx0XHRpZiAoVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcSAhPSBzZXEpXG4gNDUyOlx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDQ1MzpcdFx0XHRpZiAoc2tiX2NtcF9kZWNyeXB0ZWQoZmlyc3QsIHNrYikpXG4gNDU0Olx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDQ1NTpcdFx0fVxuIDQ1NjpcdFxuIDQ1NzpcdFx0cmV0dXJuIHRydWU7XG4gNDU4Olx0fVxuIDQ1OTpcdFxuIDQ2MDpcdHN0YXRpYyB2b2lkIHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGludCBsZW4pXG4gNDYxOlx0e1xuIDQ2MjpcdFx0c3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzdHJwLVx1MDAzZXNrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEyNjgKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA1OTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIE5VTEwgUG9pbnRlciBEZXJlZmVyZW5jZSBpbiB0aGUgVExTIFN0YWNrKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIEkgc2VlIHRoaXMgbG9vcCBpdGVyYXRpbmcgdGhyb3VnaCBhbiBgc2tiYCBmcmFnX2xpc3QuIFRoZSBjb3JlIGNvbmNlcm4gaGVyZSBpcyB0aGF0IGlmIHRoZSBgbGVuYCB2YWx1ZSBpcyBleGNlc3NpdmVseSBsYXJnZSwgbGlrZWx5IGR1ZSB0byBhIGdhcmJhZ2UgdmFsdWUgZnJvbSB0aGUgYHN6YCBjYWxjdWxhdGlvbiwgdGhlIGBza2JgIHBvaW50ZXIgY291bGQgYmVjb21lIE5VTEwgYmVmb3JlIGBsZW5gIGlzIGZ1bGx5IGNvbnN1bWVkLiBTcGVjaWZpY2FsbHksIGluc2lkZSB0aGUgbG9vcCwgaWYgd2UgZXhoYXVzdCB0aGUgZnJhZ19saXN0IGFuZCBgc2tiYCBiZWNvbWVzIE5VTEwgYmVmb3JlIGBsZW5gIGlzIHplcm8sIHRoZW4gdGhlIHN1YnNlcXVlbnQgYWNjZXNzIHRvIGBUQ1BfU0tCX0NCKHNrYilgIHdpbGwgcmVzdWx0IGluIGEgZGVyZWZlcmVuY2Ugb2YgYSBOVUxMIHBvaW50ZXIsIGxlYWRpbmcgdG8gYSBjcmFzaCDigJMgYSBjbGFzc2ljIGFuZCByZWFkaWx5IGRldGVjdGFibGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGJ1Zy4gS0FTQU4gd291bGQgZGVmaW5pdGVseSBmbGFnIHRoaXMsIG9yIHdlJiMzOTtkIGdldCBhIGtlcm5lbCBvb3BzLgoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0byBjb25zaWRlciBpZiB0aGlzIHJlbGF0ZXMgdG8gdW5pbml0aWFsaXplZCBtZW1vcnksIGJ1dCB0aGVuIEkgcmVtZW1iZXJlZCB0aGF0IGBza2JfY29weV9iaXRzYCBpbml0aWFsaXplcyB0aGUgYGhlYWRlcmAuIFNvLCBpdCYjMzk7cyBub3QgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBjcnV4IG9mIHRoZSBpc3N1ZSBhcHBlYXJzIHRvIGJlIHRoYXQgYHRsc19yeF9tc2dfc2l6ZWAgaXMgcmVhZGluZyBhIG1hbGZvcm1lZCBxdWV1ZSwgb2J0YWlucyBhIGdhcmJhZ2UgbGVuZ3RoIGFuZCB0aGVuIHRoYXQgZ2FyYmFnZSBsZW5ndGggZ2V0cyB1c2VkIGJ5IGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIHdoaWNoIHRoZW4gaXRlcmF0ZXMgb3ZlciB0aGUgZnJhZ19saXN0IHBvdGVudGlhbGx5IGRlcmVmZXJlbmNpbmcgYSBOVUxMIHBvaW50ZXIuCgpCdXQgd2FpdCwgaXMgYGxlbmAgKmd1YXJhbnRlZWQqIHRvIGJlIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBmcmFnX2xpc3Q/IExldCYjMzk7cyB0cmFjZSBpdCBiYWNrLiBgdGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZWAgc2V0cyBgc3RycC0mZ3Q7YW5jaG9yLSZndDtsZW5gIHRvIGBvZmZzZXQgJiM0MzsgbGVuYCwgd2hlcmUgYGxlbmAgaXMgYGlucWAuIEhvd2V2ZXIsIGBzemAgY2FuIGJlIGFzIGxhcmdlIGFzIGBUTFNfTUFYX1BBWUxPQURfU0laRSAmIzQzOyBjaXBoZXJfb3ZlcmhlYWQgJiM0MzsgcHJvdC0mZ3Q7dGFpbF9zaXplYCwgd2hpY2ggaXMgYXJvdW5kIDE2S0IuCgpOb3csIGxldCYjMzk7cyBsb29rIGF0IGB0bHNfc3RycF9yZWFkX3NvY2tgLiBJZiBgaW5xYCBpcyBzbWFsbGVyIHRoYW4gYHN0cnAtJmd0O3N0bS5mdWxsX2xlbmAsIHRoZW4gdGhlIGNvZGUgcmV0dXJucyBgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpYCAqYmVmb3JlKiBjYWxsaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuIFNvLCB0aGUgdnVsbmVyYWJsZSBjYXNlIGlzIHByZWNpc2VseSB3aGVuIGBpbnFgIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gYHN0cnAtJmd0O3N0bS5mdWxsX2xlbmAsIGluIG90aGVyIHdvcmRzIHdlIGNhbiBnZXQgYSBsYXJnZXIgbGVuZ3RoIGNhbGN1bGF0ZWQsIGFuZCB0aGVuIGl0IGlzIHBhc3NlZCBpbnRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuIE5lZWQgdG8gbG9vayBhdCBgdGxzX3N0cnBfcmVhZF9zb2NrYCBhZ2FpbiBhbmQgY29uZmlybSB0aGlzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDUyNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTI1Olx0XG4gNTI2Olx0XHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XG4gNTI3Olx0XHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG4gNTI4Olx0XHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbiA1Mjk6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuIDUzMDpcdFxuIDUzMTpcdFx0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBUTFNfSEVBREVSX1NJWkUpKVxuIDUzMjpcdFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuIDUzMzpcdFxuIDUzNDpcdFx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVx1MDAzZWFuY2hvcik7XG4gNTM1Olx0XHRcdGlmIChzeiBcdTAwM2MgMClcbiA1MzY6XHRcdFx0XHRyZXR1cm4gc3o7XG4gNTM3Olx0XG4gNTM4Olx0XHRcdHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XG4gNTM5Olx0XG4gNTQwOlx0XHRcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4gfHwgaW5xIFx1MDAzYyBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbilcbiA1NDE6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuIDU0MjpcdFx0fVxuIDU0MzpcdFxuIDU0NDpcdFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0Mzsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxuIDU0NTpcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcbiA1NDY6XHRcbiA1NDc6XHRcdFdSSVRFX09OQ0Uoc3RycC1cdTAwM2Vtc2dfcmVhZHksIDEpO1xuIDU0ODpcdFxuIDU0OTpcdFx0cmV0dXJuIDA7XG4gNTUwOlx0fVxuIDU1MTpcdFxuIDU1MjpcdC8qIFBhcnNlIHF1ZXVlZCBkYXRhLiBXaGVuIEBhbm5vdW5jZSBpcyB0cnVlIGFuZCBwYXJzaW5nIHByb2R1Y2VzIGFcbiA1NTM6XHQgKiBuZXdseS1yZWFkeSByZWNvcmQsIGZpcmUgdGhlIGNvbnN1bWVyIG5vdGlmaWNhdGlvbi4gQ2FsbGVycyB0aGF0XG4gNTU0Olx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjk1OAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDEzNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGB0bHNfc3RycF9yZWFkX3NvY2tgIGFuZCBRdWV1ZSBJbnRlZ3JpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSW4gYHRsc19zdHJwX3JlYWRfc29ja2AsIEkmIzM5O20gbG9va2luZyBhdCBob3cgd2UmIzM5O3JlIGhhbmRsaW5nIGRhdGEgcmVjZXB0aW9uLCBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgVExTIHN0cmVhbS4gVGhlIGNyaXRpY2FsIHBhcnQgaXMgdGhhdCBjb25kaXRpb25hbCBibG9jazoKCmBgYGMKCQlpZiAoIXN0cnAtJmd0O3N0bS5mdWxsX2xlbiB8fCBpbnEgJmx0OyBzdHJwLSZndDtzdG0uZnVsbF9sZW4pCgkJCXJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7Cgl9CgoJaWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IHN0cnAtJmd0O3N0bS5mdWxsX2xlbikpCgkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CmBgYAoKRXNzZW50aWFsbHksIGlmIHdlIGhhdmVuJiMzOTt0IGRldGVybWluZWQgdGhlIGZ1bGwgbWVzc2FnZSBsZW5ndGggeWV0IChgIXN0cnAtJmd0O3N0bS5mdWxsX2xlbmApIG9yIGlmIHRoZSBhdmFpbGFibGUgZGF0YSBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSAoYGlucWApIGlzIGxlc3MgdGhhbiB0aGUgZXhwZWN0ZWQgZnVsbCBsZW5ndGgsIHdlIGZhbGwgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gSG93ZXZlciwgdGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoZSBzZWNvbmQgY29uZGl0aW9uLiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzIG9ubHkgY2FsbGVkIGlmIGBpbnEgJmd0Oz0gc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuYC4gVGhpcyBtZWFucyB0aGUgY29kZSBhc3N1bWVzIHRoYXQgaWYgd2UgaGF2ZSBlbm91Z2ggKnRvdGFsKiBkYXRhLCB3ZSBjYW4gcHJvY2VlZC4KCk5vdywgaWYgYGlucWAgdHJ1bHkgcmVwcmVzZW50cyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBmcmFnX2xpc3QgKHdoaWNoIGlzIHBvcHVsYXRlZCB2aWEgYHRjcF9yZWN2X3NrYmApLCB0aGVuIHRoZSBgc2tiLSZndDtuZXh0YCBwb2ludGVyICpzaG91bGQqIG5ldmVyIGJlIE5VTEwgaW5zaWRlIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIHByb3ZpZGVkIHRoZSBjb25kaXRpb24gaXMgYGlucSAmZ3Q7PSBzdHJwLSZndDtzdG0uZnVsbF9sZW5gLCBiZWNhdXNlIHRoZSB0b3RhbCBvZiB0aGUgc2tiJiMzOTtzIGxlbiB3aWxsIGJlIGF0IGxlYXN0IGBzdHJwLSZndDtzdG0uZnVsbF9sZW5gLgoKSG93ZXZlciwgYHRjcF9yZWN2X3NrYmAgcmV0dXJucyBvbmx5IHRoZSBmaXJzdCBTS0IsIHdoaWNoIGlzIHRoZW4gbGlua2VkIHZpYSBgc2tiLSZndDtuZXh0YC4gSWYgdGhlIHRvdGFsIHN1bSBvZiBgc2tiLSZndDtsZW5gIG9mIGFsbCBza2JzIGlzIGF0IGxlYXN0IGBsZW5gLCB0aGVuIGBza2JgIHdpbGwgbm90IGJlIE5VTEwgYWZ0ZXIgdGhlIGl0ZXJhdGlvbi4KCkkgbmVlZCB0byBjb25maXJtIGlmIGBpbnFgIHRydWx5IHJlZmxlY3RzIHRoZSBzdW0gb2YgYWxsIGBza2ItJmd0O2xlbmAgdmFsdWVzIGluIHRoZSByZWNlaXZlIHF1ZXVlLCBhcyB0aGUgY2hlY2sgaW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBkZXBlbmRzIG9uIHRoaXMuIEJhc2VkIG9uIGhvdyBgdGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZWAgaXMgZGVmaW5lZDoKCmBgYGMKCWZpcnN0ID0gdGNwX3JlY3Zfc2tiKHN0cnAtJmd0O3NrLCB0cC0mZ3Q7Y29waWVkX3NlcSwgJmFtcDtvZmZzZXQpOwoJaWYgKFdBUk5fT05fT05DRSghZmlyc3QpKQoJCXJldHVybjsKCgkvKiBCZXN0b3cgdGhlIHN0YXRlIG9udG8gdGhlIGFuY2hvciAqLwoJc3RycC0mZ3Q7YW5jaG9yLSZndDtsZW4gPSBvZmZzZXQgJiM0MzsgbGVuOwoJc3RycC0mZ3Q7YW5jaG9yLSZndDtkYXRhX2xlbiA9IG9mZnNldCAmIzQzOyBsZW47CglzdHJwLSZndDthbmNob3ItJmd0O3RydWVzaXplID0gb2Zmc2V0ICYjNDM7IGxlbjsKCglza2Jfc2hpbmZvKHN0cnAtJmd0O2FuY2hvciktJmd0O2ZyYWdfbGlzdCA9IGZpcnN0OwpgYGAKCmB0Y3BfcmVjdl9za2JgIGFuZCBgdGNwX2lucWAgd29yayB0b2dldGhlciB0byAqZ3VhcmFudGVlKiB0aGF0IGBpbnFgIHJlcHJlc2VudHMgdGhlIHRvdGFsIGFtb3VudCBvZiBhdmFpbGFibGUgZGF0YSwgYWx0aG91Z2ggb25seSB0aGUgZmlyc3QgU0tCIGlzIGltbWVkaWF0ZWx5IGxpbmtlZC4KCk15IGNvbmNlcm4gc3RlbXMgZnJvbSBhIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5IGluIGhvdyBgdGxzX3J4X21zZ19zaXplYCBoYW5kbGVzIGZyYWdtZW50ZWQsIHBvdGVudGlhbGx5IG1hbGZvcm1lZCwgVENQIGRhdGEgd2l0aGluIHRoZSBgZnJhZ19saXN0YCBzdHJ1Y3R1cmUuIFRoZSBmdW5jdGlvbiByZWFkcyB0aGUgbWVzc2FnZSBzaXplIHVzaW5nIGBza2JfY29weV9iaXRzYCwgc3RhcnRpbmcgZnJvbSBhIGtub3duIG9mZnNldCB3aXRoaW4gdGhlIGBzdHJwLSZndDthbmNob3JgIFNLQi4gSG93ZXZlciwgaWYgdGhlIFRDUCByZWNlaXZlIHF1ZXVlIGlzIGNvcnJ1cHRlZCwgd2l0aCBvdXQtb2Ytb3JkZXIsIG92ZXJsYXBwaW5nIG9yIG1pc3Npbmcgc2ticywgYHNrYl9jb3B5X2JpdHNgIG1heSByZWFkIHRoZSB3cm9uZyBiaXRzLCBiYXNlZCBvbiBpbmNvcnJlY3QgYXNzdW1wdGlvbnMgYWJvdXQgZGF0YSBjb250aWd1aXR5IHdpdGhpbiB0aGUgYGZyYWdfbGlzdGAuCgpUaGUgVENQIHJlY2VpdmUgcXVldWUgY29udGFpbnMgKmluLW9yZGVyKiBza2JzLgoKQnV0LCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGNoZWNrcyBgVENQX1NLQl9DQihza2IpLSZndDtzZXEgIT0gc2VxYC4gSXMgdGhpcyBjb3JyZWN0PyBJcyBpdCBjaGVja2luZyBmb3IgKmVuY3J5cHRlZCogZGF0YSBpbiB0aGUgcmVjZWl2ZSBxdWV1ZT8KCmBgYGMKCQlpZiAoVENQX1NLQl9DQihza2IpLSZndDtzZXEgIT0gc2VxKQoJCQlyZXR1cm4gZmFsc2U7CgkJaWYgKHNrYl9jbXBfZGVjcnlwdGVkKGZpcnN0LCBza2IpKQoJCQlyZXR1cm4gZmFsc2U7CmBgYAoKSWYgYFRDUF9TS0JfQ0Ioc2tiKS0mZ3Q7c2VxICE9IHNlcWAsIGl0IG1lYW5zIGRhdGEgaXMgb3V0LW9mLW9yZGVyLCBvciBwb3NzaWJseSB0aGVyZSBpcyBhIGdhcC4gT3ZlcmxhcHBpbmcgc2ticyBhcmUgcG9zc2libGUsIGFuZCBgc2tiX2NvcHlfYml0c2AgKndpbGwqIHJlYWQgdGhlIHdyb25nIGJ5dGVzIGZyb20gdGhlc2UgZnJhZ21lbnRzLiBJdCBtYXkgcmVhZCBmcm9tIG92ZXJsYXBwaW5nIGRhdGEsIGxlYWRpbmcgdG8gaW5jb3JyZWN0IHNpemUgY2FsY3VsYXRpb24uIElmIHRoZSBzaXplIGlzIGluY29ycmVjdCwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBtaWdodCB0aGVuIGZhaWwuCgpUaGUgcGF0Y2gmIzM5O3MgaW50cm9kdWN0aW9uIG9mIHRoZSBgaWYgKGlucQoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3cuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIxNzksCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjE3OTpcdGludCB0bHNfcnhfbXNnX3NpemUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpXG4yMTgwOlx0e1xuMjE4MTpcdFx0c3RydWN0IHRsc19jb250ZXh0ICp0bHNfY3R4ID0gdGxzX2dldF9jdHgoc3RycC1cdTAwM2Vzayk7XG4yMTgyOlx0XHRzdHJ1Y3QgdGxzX3Byb3RfaW5mbyAqcHJvdCA9IFx1MDAyNnRsc19jdHgtXHUwMDNlcHJvdF9pbmZvO1xuMjE4MzpcdFx0Y2hhciBoZWFkZXJbVExTX0hFQURFUl9TSVpFICYjNDM7IFRMU19NQVhfSVZfU0laRV07XG4yMTg0Olx0XHRzaXplX3QgY2lwaGVyX292ZXJoZWFkO1xuMjE4NTpcdFx0c2l6ZV90IGRhdGFfbGVuID0gMDtcbjIxODY6XHRcdGludCByZXQ7XG4yMTg3Olx0XG4yMTg4Olx0XHQvKiBWZXJpZnkgdGhhdCB3ZSBoYXZlIGEgZnVsbCBUTFMgaGVhZGVyLCBvciB3YWl0IGZvciBtb3JlIGRhdGEgKi9cbjIxODk6XHRcdGlmIChzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0MzsgcHJvdC1cdTAwM2VwcmVwZW5kX3NpemUgXHUwMDNlIHNrYi1cdTAwM2VsZW4pXG4yMTkwOlx0XHRcdHJldHVybiAwO1xuMjE5MTpcdFxuMjE5MjpcdFx0LyogU2FuaXR5LWNoZWNrIHNpemUgb2Ygb24tc3RhY2sgYnVmZmVyLiAqL1xuMjE5MzpcdFx0aWYgKFdBUk5fT04ocHJvdC1cdTAwM2VwcmVwZW5kX3NpemUgXHUwMDNlIHNpemVvZihoZWFkZXIpKSkge1xuMjE5NDpcdFx0XHRyZXQgPSAtRUlOVkFMO1xuMjE5NTpcdFx0XHRnb3RvIHJlYWRfZmFpbHVyZTtcbjIxOTY6XHRcdH1cbjIxOTc6XHRcbjIxOTg6XHRcdC8qIExpbmVhcml6ZSBoZWFkZXIgdG8gbG9jYWwgYnVmZmVyICovXG4yMTk5Olx0XHRyZXQgPSBza2JfY29weV9iaXRzKHNrYiwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0LCBoZWFkZXIsIHByb3QtXHUwMDNlcHJlcGVuZF9zaXplKTtcbjIyMDA6XHRcdGlmIChyZXQgXHUwMDNjIDApXG4yMjAxOlx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjIwMjpcdFxuMjIwMzpcdFx0c3RycC1cdTAwM2VtYXJrID0gaGVhZGVyWzBdO1xuMjIwNDpcdFxuMjIwNTpcdFx0ZGF0YV9sZW4gPSAoKGhlYWRlcls0XSBcdTAwMjYgMHhGRikgfCAoaGVhZGVyWzNdIFx1MDAzY1x1MDAzYyA4KSk7XG4yMjA2Olx0XG4yMjA3Olx0XHRjaXBoZXJfb3ZlcmhlYWQgPSBwcm90LVx1MDAzZXRhZ19zaXplO1xuMjIwODpcdFx0aWYgKHByb3QtXHUwMDNldmVyc2lvbiAhPSBUTFNfMV8zX1ZFUlNJT04gXHUwMDI2XHUwMDI2XG4yMjA5Olx0XHQgICAgcHJvdC1cdTAwM2VjaXBoZXJfdHlwZSAhPSBUTFNfQ0lQSEVSX0NIQUNIQTIwX1BPTFkxMzA1KVxuMjIxMDpcdFx0XHRjaXBoZXJfb3ZlcmhlYWQgJiM0Mzs9IHByb3QtXHUwMDNlaXZfc2l6ZTtcbjIyMTE6XHRcbjIyMTI6XHRcdGlmIChkYXRhX2xlbiBcdTAwM2UgVExTX01BWF9QQVlMT0FEX1NJWkUgJiM0MzsgY2lwaGVyX292ZXJoZWFkICYjNDM7XG4yMjEzOlx0XHQgICAgcHJvdC1cdTAwM2V0YWlsX3NpemUpIHtcbjIyMTQ6XHRcdFx0cmV0ID0gLUVNU0dTSVpFO1xuMjIxNTpcdFx0XHRnb3RvIHJlYWRfZmFpbHVyZTtcbjIyMTY6XHRcdH1cbjIyMTc6XHRcdGlmIChkYXRhX2xlbiBcdTAwM2MgY2lwaGVyX292ZXJoZWFkKSB7XG4yMjE4Olx0XHRcdHJldCA9IC1FQkFETVNHO1xuMjIxOTpcdFx0XHRnb3RvIHJlYWRfZmFpbHVyZTtcbjIyMjA6XHRcdH1cbjIyMjE6XHRcbjIyMjI6XHRcdC8qIE5vdGUgdGhhdCBib3RoIFRMUzEuMyBhbmQgVExTMS4yIHVzZSBUTFNfMV8yIHZlcnNpb24gaGVyZSAqL1xuMjIyMzpcdFx0aWYgKGhlYWRlclsxXSAhPSBUTFNfMV8yX1ZFUlNJT05fTUlOT1IgfHxcbjIyMjQ6XHRcdCAgICBoZWFkZXJbMl0gIT0gVExTXzFfMl9WRVJTSU9OX01BSk9SKSB7XG4yMjI1Olx0XHRcdHJldCA9IC1FSU5WQUw7XG4yMjI2Olx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjIyNzpcdFx0fVxuMjIyODpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjIwMgoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDM0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBSZWFzb25pbmcgb24gdGhlIFRMUyBSWCBNZXNzYWdlIFNpemUgYW5kIFF1ZXVlIFZhbGlkaXR5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgd2UgaGFuZGxlIG1lc3NhZ2Ugc2l6ZXMgaW4gdGhpcyBUTFMgaW1wbGVtZW50YXRpb24sIHNwZWNpZmljYWxseSB3aGVuIGB0bHNfcnhfbXNnX3NpemVgIGlzIGNhbGxlZC4gSXQgc2VlbXMgbGlrZSBpZiB0aGF0IGZ1bmN0aW9uIGVuY291bnRlcnMgYSBwcm9ibGVtIG9uIGEgcXVldWUgdGhhdCYjMzk7cyBub3QgaW4gYSBnb29kIHN0YXRlLCBpdCYjMzk7cyBkZXNpZ25lZCB0byByZXR1cm4gYW4gZXJyb3IgbGlrZSBgLUVJTlZBTGAsIGAtRU1TR1NJWkVgLCBvciBgLUVCQURNU0dgLiBUaGUgY29kZSBpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYCBkaXJlY3RseSBwYXNzZXMgdGhpcyBlcnJvciB1cCB0aGUgY2hhaW46CgpgYGBjCgkJc3ogPSB0bHNfcnhfbXNnX3NpemUoc3RycCwgc3RycC0mZ3Q7YW5jaG9yKTsKCQlpZiAoc3ogJmx0OyAwKQoJCQlyZXR1cm4gc3o7CmBgYAoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcywgJiMzNDtHcmVhdCwgZXJyb3IgaGFuZGxpbmchIEl0JiMzOTtzIHByb3BhZ2F0ZWQgY29ycmVjdGx5LiYjMzQ7IEJ1dCwgaG9sZCBvbiBhIHNlY29uZC4uLiB3aGF0IGlmIHRoZSAqcXVldWUqIGlzIHRoZSBwcm9ibGVtPyBXaGF0IGlmIHRoZSBxdWV1ZSBpcyBtZXNzZWQgdXAg4oCTIG1heWJlIGl0JiMzOTtzIGdvdCBhIG1peCBvZiBkZWNyeXB0ZWQgYW5kIHVuLWRlY3J5cHRlZCBkYXRhLCBvciBvdmVybGFwcGluZyBza2JzPyBJbiB0aG9zZSBjYXNlcywgcmV0dXJuaW5nIGFuICplcnJvciogYW5kIGFib3J0aW5nIHRoZSBjb25uZWN0aW9uIGlzIHRoZSAqd3JvbmcqIHRoaW5nIHRvIGRvISBXZSBuZWVkIHRvIGhhbmRsZSB0aGF0IGdyYWNlZnVsbHksIGFuZCBpdCBzZWVtcyBsaWtlIHRoZSBmYWxsYmFjayBtZWNoYW5pc20gdG8gYHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSlgIGlzIHRoZSByaWdodCB0b29sIGZvciB0aGlzIGpvYi4KCkFoYSEgTm93IEkgc2VlLiBXaGVuIGB0bHNfcnhfbXNnX3NpemVgIGVuY291bnRlcnMgZ2FyYmFnZSBkYXRhIGJlY2F1c2Ugb2Ygb3ZlcmxhcHBpbmcgU0tCcywgaXQgY2FuIHJldHVybiBhbiBlcnJvciBsaWtlIGAtRUlOVkFMYCAobWF5YmUgZHVlIHRvIGEgYmFkIFRMUyB2ZXJzaW9uKSBvciBgLUVNU0dTSVpFYCAoYSBiYWQgbGVuZ3RoIGZpZWxkKS4gSWYgd2UgKmRpZG4mIzM5O3QqIGNoZWNrIHRoZSBxdWV1ZSYjMzk7cyBoZWFsdGgsIGB0bHNfc3RycF9yZWFkX3NvY2tgIHdvdWxkIGJsaW5kbHkgcmV0dXJuIHRoaXMgZXJyb3IsIHBvdGVudGlhbGx5IGNhdXNpbmcgYW4gdW5uZWNlc3NhcnkgY29ubmVjdGlvbiB0ZXJtaW5hdGlvbi4KCkJ1dCwgaWYgd2UgY2hlY2sgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCAqZmlyc3QqLCB3ZSByZWFsaXplIHRoZSBxdWV1ZSBpc24mIzM5O3QgcHJpc3RpbmUgYW5kIHRoYXQgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYSBtb3JlIHJvYnVzdCByZWFkaW5nIHN0cmF0ZWd5LiBUaGF0JiMzOTtzIHdoZXJlIGB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpYCBjb21lcyBpbiEgVGhpcyBmdW5jdGlvbiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGVhbCB3aXRoIHRoZSBtZXNzeSBxdWV1ZSBzaXR1YXRpb25zLiBNeSBtZW1vcnkgdGVsbHMgbWUgdGhhdCBpdCBwcm9iYWJseSBjb3BpZXMgdGhlIGRhdGEgaW50byBhIGNvbnRpZ3VvdXMgYnVmZmVyIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuIEkgd29uZGVyIHdoYXQgaXQgYWN0dWFsbHkgZG9lcz8gSSBuZWVkIHRvIGNoZWNrIHRoZSBjb2RlIHRoZXJlIHRvIGNvbmZpcm0gdGhpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM5MDpcdHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIHFzaG9ydClcbiAzOTE6XHR7XG4gMzkyOlx0XHRzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87XG4gMzkzOlx0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiAzOTQ6XHRcdGludCBuZWVkX3NwYywgbGVuO1xuIDM5NTpcdFxuIDM5NjpcdFx0LyogSWYgdGhlIHJidWYgaXMgc21hbGwgb3IgcmN2IHdpbmRvdyBoYXMgY29sbGFwc2VkIHRvIDAgd2UgbmVlZFxuIDM5NzpcdFx0ICogdG8gcmVhZCB0aGUgZGF0YSBvdXQuIE90aGVyd2lzZSB0aGUgY29ubmVjdGlvbiB3aWxsIHN0YWxsLlxuIDM5ODpcdFx0ICogV2l0aG91dCBwcmVzc3VyZSB0aHJlc2hvbGQgb2YgSU5UX01BWCB3aWxsIG5ldmVyIGJlIHJlYWR5LlxuIDM5OTpcdFx0ICovXG4gNDAwOlx0XHRpZiAobGlrZWx5KHFzaG9ydCBcdTAwMjZcdTAwMjYgIXRjcF9lcG9sbGluX3JlYWR5KHN0cnAtXHUwMDNlc2ssIElOVF9NQVgpKSlcbiA0MDE6XHRcdFx0cmV0dXJuIDA7XG4gNDAyOlx0XG4gNDAzOlx0XHRzaGluZm8gPSBza2Jfc2hpbmZvKHN0cnAtXHUwMDNlYW5jaG9yKTtcbiA0MDQ6XHRcbiA0MDU6XHRcdC8qIElmIHdlIGRvbiYjMzk7dCBrbm93IHRoZSBsZW5ndGggZ28gbWF4IHBsdXMgcGFnZSBmb3IgY2lwaGVyIG92ZXJoZWFkICovXG4gNDA2Olx0XHRuZWVkX3NwYyA9IHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuID86IFRMU19NQVhfUEFZTE9BRF9TSVpFICYjNDM7IFBBR0VfU0laRTtcbiA0MDc6XHRcbiA0MDg6XHRcdGZvciAobGVuID0gbmVlZF9zcGM7IGxlbiBcdTAwM2UgMDsgbGVuIC09IFBBR0VfU0laRSkge1xuIDQwOTpcdFx0XHRwYWdlID0gYWxsb2NfcGFnZShzdHJwLVx1MDAzZXNrLVx1MDAzZXNrX2FsbG9jYXRpb24pO1xuIDQxMDpcdFx0XHRpZiAoIXBhZ2UpIHtcbiA0MTE6XHRcdFx0XHR0bHNfc3RycF9mbHVzaF9hbmNob3JfY29weShzdHJwKTtcbiA0MTI6XHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiA0MTM6XHRcdFx0fVxuIDQxNDpcdFxuIDQxNTpcdFx0XHRza2JfZmlsbF9wYWdlX2Rlc2Moc3RycC1cdTAwM2VhbmNob3IsIHNoaW5mby1cdTAwM2Vucl9mcmFncyYjNDM7JiM0MzssXG4gNDE2Olx0XHRcdFx0XHQgICBwYWdlLCAwLCAwKTtcbiA0MTc6XHRcdH1cbiA0MTg6XHRcbiA0MTk6XHRcdHNoaW5mby1cdTAwM2VmcmFnX2xpc3QgPSBOVUxMO1xuIDQyMDpcdFxuIDQyMTpcdFx0c3RycC1cdTAwM2Vjb3B5X21vZGUgPSAxO1xuIDQyMjpcdFx0c3RycC1cdTAwM2VzdG0ub2Zmc2V0ID0gMDtcbiA0MjM6XHRcbiA0MjQ6XHRcdHN0cnAtXHUwMDNlYW5jaG9yLVx1MDAzZWxlbiA9IDA7XG4gNDI1Olx0XHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2VkYXRhX2xlbiA9IDA7XG4gNDI2Olx0XHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2V0cnVlc2l6ZSA9IHJvdW5kX3VwKG5lZWRfc3BjLCBQQUdFX1NJWkUpO1xuIDQyNzpcdFxuIDQyODpcdFx0dGxzX3N0cnBfcmVhZF9jb3B5aW4oc3RycCk7XG4gNDI5Olx0XG4gNDMwOlx0XHRyZXR1cm4gMDtcbiA0MzE6XHR9XG4gNDMyOlx0XG4gNDMzOlx0c3RhdGljIGJvb2wgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsXG4gNDM0Olx0XHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGxlbilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTc3ODgKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRGl2aW5nIERlZXAgaW50byB0aGUgVExTIFN0cmluZyBQYXJzZXIqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGB0bHNfc3RycF9yZWFkX2NvcHlgLCBhbmQgaXQmIzM5O3Mga2V5IGZ1bmN0aW9uYWxpdHkgaW1tZWRpYXRlbHkganVtcHMgb3V0OiBJdCBmbGlwcyB0aGUgc3RycGFyc2VyIGludG8gYGNvcHlfbW9kZSA9IDFgLiBUaGF0JiMzOTtzIHRoZSBzaWduYWwgdG8gZ2V0IHNlcmlvdXMgYWJvdXQgZGF0YSBoYW5kbGluZy4gSXQgbG9va3MgbGlrZSBpdCBoYW5kbGVzIGFsbG9jYXRpb24gb2YgcGFnZXMsIGFuZCB0aGVuIGNhbGxzIGB0bHNfc3RycF9yZWFkX2NvcHlpbihzdHJwKWAuIE5vdywgdGhpcyBpcyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBgdGxzX3N0cnBfcmVhZF9jb3B5aW5gIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGFjdHVhbGx5ICpjb3BpZXMqIHRoZSBkYXRhLCByaWdodD8gSXQmIzM5O3MgdGFraW5nIGRhdGEgZnJvbSB0aGUgVENQIHJlY2VpdmUgcXVldWUgYW5kIHB1dHRpbmcgaXQgaW50byB0aG9zZSBmcmVzaGx5IGFsbG9jYXRlZCBwYWdlcy4KClRoaXMgc3VnZ2VzdHMgdGhhdCB0aGlzIHdob2xlIGFwcHJvYWNoIGlzIGJ1aWx0IHRvIGhhbmRsZSBzcGVjaWZpYywgcG90ZW50aWFsbHkgbWVzc3kgc2NlbmFyaW9zLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgbWl4ZWQgZGVjcnlwdGVkIGFuZCBub24tZGVjcnlwdGVkIGRhdGEgaW4gdGhlIFRDUCBxdWV1ZSwgb3IgcG90ZW50aWFsbHkgb3ZlcmxhcHBpbmcgc2VxdWVuY2UgbnVtYmVycy4gU3RhbmRhcmQgYHRjcF9yZWN2X3NrYmAgbWlnaHQgbm90IGJlIHRoZSBtb3N0IGVsZWdhbnQgc29sdXRpb24gd2hlbiB5b3UgaGF2ZSB0aG9zZSBjb21wbGV4aXRpZXMsIGVzcGVjaWFsbHkgaWYgd2Ugd2VyZSByZWx5aW5nIGRpcmVjdGx5IG9uIGBmcmFnX2xpc3RgLgoKSG9sZCBvbiBhIHNlY29uZCwgdGhvdWdoLiBJIHJlbWVtYmVyIGB0Y3BfcmVjdl9za2JgIGVzc2VudGlhbGx5IHJldHVybnMgdGhlIGZpcnN0IHNrYi4gSWYgd2UmIzM5O3JlIHVzaW5nIGBjb3B5X21vZGVgIGxpa2UgdGhpcywgd2UmIzM5O3JlIGxpa2VseSBsZXZlcmFnaW5nIHNvbWV0aGluZyBtb3JlIHJvYnVzdCwgcHJvYmFibHkgYHRjcF9yZWFkX3NvY2tgIG9yIHNpbWlsYXIsIHRvIGhhbmRsZSBhbGwgdGhvc2UgaW50cmljYWNpZXMgd2l0aCBvdmVybGFwcGluZyBzZWdtZW50cyBhbmQgZ2FwcyBpbiB0aGUgZGF0YSBzdHJlYW0gcHJvcGVybHkuIFRoYXQgbWFrZXMgc2Vuc2UuIFdl4oCZcmUgYmVpbmcgcHJvYWN0aXZlLgoKUmlnaHQsIHRpbWUgdG8gemVybyBpbiBvbiBgdGxzX3N0cnBfcmVhZF9jb3B5aW5gIGl0c2VsZiBhbmQgc2VlIGV4YWN0bHkgaG93IGl0IGFjaGlldmVzIHRoaXMgY2xlYW4gY29weS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIG1lY2hhbmljcyBpbiBkZXRhaWwgdG8gcmVhbGx5IGFwcHJlY2lhdGUgdGhlIGRlc2lnbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDMyNTpcdFx0XHRpZiAodW5saWtlbHkoc3ogXHUwMDI2XHUwMDI2IHN6IFx1MDAzYyBza2ItXHUwMDNlbGVuKSkge1xuIDMyNjpcdFx0XHRcdGludCBvdmVyID0gc2tiLVx1MDAzZWxlbiAtIHN6O1xuIDMyNzpcdFxuIDMyODpcdFx0XHRcdFdBUk5fT05fT05DRShvdmVyIFx1MDAzZSBjaHVuayk7XG4gMzI5Olx0XHRcdFx0c2tiLVx1MDAzZWxlbiAtPSBvdmVyO1xuIDMzMDpcdFx0XHRcdHNrYi1cdTAwM2VkYXRhX2xlbiAtPSBvdmVyO1xuIDMzMTpcdFx0XHRcdF9fcHNrYl90cmltKG5za2IsIG5za2ItXHUwMDNlbGVuIC0gb3Zlcik7XG4gMzMyOlx0XG4gMzMzOlx0XHRcdFx0Y2h1bmsgLT0gb3ZlcjtcbiAzMzQ6XHRcdFx0fVxuIDMzNTpcdFxuIDMzNjpcdFx0XHRzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiA9IHN6O1xuIDMzNzpcdFx0fVxuIDMzODpcdFxuIDMzOTpcdFx0cmV0dXJuIGNodW5rO1xuIDM0MDpcdH1cbiAzNDE6XHRcbiAzNDI6XHRzdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbihyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IHNrX2J1ZmYgKmluX3NrYixcbiAzNDM6XHRcdFx0XHQgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaXplX3QgaW5fbGVuKVxuIDM0NDpcdHtcbiAzNDU6XHRcdHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwID0gKHN0cnVjdCB0bHNfc3RycGFyc2VyICopZGVzYy1cdTAwM2VhcmcuZGF0YTtcbiAzNDY6XHRcdHN0cnVjdCBza19idWZmICpza2I7XG4gMzQ3Olx0XHRpbnQgcmV0O1xuIDM0ODpcdFxuIDM0OTpcdFx0aWYgKHN0cnAtXHUwMDNlbXNnX3JlYWR5KVxuIDM1MDpcdFx0XHRyZXR1cm4gMDtcbiAzNTE6XHRcbiAzNTI6XHRcdHNrYiA9IHN0cnAtXHUwMDNlYW5jaG9yO1xuIDM1MzpcdFx0aWYgKCFza2ItXHUwMDNlbGVuKVxuIDM1NDpcdFx0XHRza2JfY29weV9kZWNyeXB0ZWQoc2tiLCBpbl9za2IpO1xuIDM1NTpcdFx0ZWxzZVxuIDM1NjpcdFx0XHRzdHJwLVx1MDAzZW1peGVkX2RlY3J5cHRlZCB8PSAhIXNrYl9jbXBfZGVjcnlwdGVkKHNrYiwgaW5fc2tiKTtcbiAzNTc6XHRcbiAzNTg6XHRcdGlmIChJU19FTkFCTEVEKENPTkZJR19UTFNfREVWSUNFKSBcdTAwMjZcdTAwMjYgc3RycC1cdTAwM2VtaXhlZF9kZWNyeXB0ZWQpXG4gMzU5Olx0XHRcdHJldCA9IHRsc19zdHJwX2NvcHlpbl9za2Ioc3RycCwgc2tiLCBpbl9za2IsIG9mZnNldCwgaW5fbGVuKTtcbiAzNjA6XHRcdGVsc2VcbiAzNjE6XHRcdFx0cmV0ID0gdGxzX3N0cnBfY29weWluX2ZyYWcoc3RycCwgc2tiLCBpbl9za2IsIG9mZnNldCwgaW5fbGVuKTtcbiAzNjI6XHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbiAzNjM6XHRcdFx0ZGVzYy1cdTAwM2VlcnJvciA9IHJldDtcbiAzNjQ6XHRcdFx0cmV0ID0gMDtcbiAzNjU6XHRcdH1cbiAzNjY6XHRcbiAzNjc6XHRcdGlmIChzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiBcdTAwMjZcdTAwMjYgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4gPT0gc2tiLVx1MDAzZWxlbikge1xuIDM2ODpcdFx0XHRkZXNjLVx1MDAzZWNvdW50ID0gMDtcbiAzNjk6XHRcbiAzNzA6XHRcdFx0V1JJVEVfT05DRShzdHJwLVx1MDAzZW1zZ19yZWFkeSwgMSk7XG4gMzcxOlx0XHR9XG4gMzcyOlx0XG4gMzczOlx0XHRyZXR1cm4gcmV0O1xuIDM3NDpcdH1cbiAzNzU6XHRcbiAzNzY6XHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weWluKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIDM3NzpcdHtcbiAzNzg6XHRcdHJlYWRfZGVzY3JpcHRvcl90IGRlc2M7XG4gMzc5Olx0XG4gMzgwOlx0XHRkZXNjLmFyZy5kYXRhID0gc3RycDtcbiAzODE6XHRcdGRlc2MuZXJyb3IgPSAwO1xuIDM4MjpcdFx0ZGVzYy5jb3VudCA9IDE7IC8qIGdpdmUgbW9yZSB0aGFuIG9uZSBza2IgcGVyIGNhbGwgKi9cbiAzODM6XHRcbiAzODQ6XHRcdC8qIHNrIHNob3VsZCBiZSBsb2NrZWQgaGVyZSwgc28gb2theSB0byBkbyByZWFkX3NvY2sgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTkyNjYKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA1OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzaW5nOgoKKipBbmFseXppbmcgdGhlIGB0bHNfc3RycF9yZWFkX2NvcHlpbmAgRnVuY3Rpb24qKgoKQWxyaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIEkgc2VlIGlzIHRoYXQgYHRsc19zdHJwX3JlYWRfY29weWluYCBjYWxscyBgdGNwX3JlYWRfc29ja2Agd2l0aCB0aGUgYHRsc19zdHJwX2NvcHlpbmAgZnVuY3Rpb24gYXMgYSBjYWxsYmFjay4gVGhhdCYjMzk7cyBhIGtleSBwYXJ0IG9mIHRoZSBkYXRhIGZsb3csIHVzaW5nIGB0Y3BfcmVhZF9zb2NrYCB0byByZWFkIGZyb20gdGhlIHNvY2tldCBgc3RycC0mZ3Q7c2tgIGFuZCBjb3B5IHRoZSBkYXRhIHNvbWV3aGVyZSwgbGlrZWx5IHdpdGhpbiB0aGUgVExTIGNvbnRleHQuIEJ1dCwgSSBuZWVkIHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIHdob2xlIHBpY3R1cmUuIEkmIzM5O20gZ29pbmcgdG8gZGlnIGRlZXBlciBhbmQgc2VlIHdoYXQgdGhhdCBjYWxsYmFjayBkb2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzgwOlx0XHRkZXNjLmFyZy5kYXRhID0gc3RycDtcbiAzODE6XHRcdGRlc2MuZXJyb3IgPSAwO1xuIDM4MjpcdFx0ZGVzYy5jb3VudCA9IDE7IC8qIGdpdmUgbW9yZSB0aGFuIG9uZSBza2IgcGVyIGNhbGwgKi9cbiAzODM6XHRcbiAzODQ6XHRcdC8qIHNrIHNob3VsZCBiZSBsb2NrZWQgaGVyZSwgc28gb2theSB0byBkbyByZWFkX3NvY2sgKi9cbiAzODU6XHRcdHRjcF9yZWFkX3NvY2soc3RycC1cdTAwM2VzaywgXHUwMDI2ZGVzYywgdGxzX3N0cnBfY29weWluKTtcbiAzODY6XHRcbiAzODc6XHRcdHJldHVybiBkZXNjLmVycm9yO1xuIDM4ODpcdH1cbiAzODk6XHRcbiAzOTA6XHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBxc2hvcnQpXG4gMzkxOlx0e1xuIDM5MjpcdFx0c3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqc2hpbmZvO1xuIDM5MzpcdFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gMzk0Olx0XHRpbnQgbmVlZF9zcGMsIGxlbjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTk3NjEKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxMDEwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgVnVsbmVyYWJpbGl0eSBpbiBUQ1AgUXVldWUgSGFuZGxpbmcqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiB0aGlua2luZyB0aHJvdWdoIHRoaXMgaXNzdWUuIFRoZSBjb3JlIHByb2JsZW0gbGllcyBpbiBob3cgd2UgaGFuZGxlIHBvdGVudGlhbGx5IG1hbGZvcm1lZCBUQ1AgcmVjZWl2ZSBxdWV1ZXMsIHNwZWNpZmljYWxseSB3aGVuIHRoZXkgY29udGFpbiBvdmVybGFwcywgZ2Fwcywgb3IgbWl4ZWQgZGVjcnlwdGVkIGRhdGEuIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGB0Y3BfcmVhZF9zb2NrYCBjb3JyZWN0bHkgaGFuZGxlcyBhbGwgdGhlc2UgZWRnZSBjYXNlcywgd2hpY2ggaXMgZ29vZC4gVGhlIGNydXggaXMgdGhhdCBpZiB0aGUgcXVldWUgaXNuJiMzOTt0ICYjMzQ7Y2xlYW4mIzM0OyDigJMgbWVhbmluZyBpdCBoYXMgdGhvc2UgaXNzdWVzIOKAkyB3ZSAqbXVzdCogdXNlIGB0Y3BfcmVhZF9zb2NrYCB2aWEgYGNvcHlfbW9kZWAuCgpUaGUgaXNzdWUgYXJpc2VzIGZyb20gaG93IGB0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlYCB1c2VzIGBmcmFnX2xpc3RgIGRpcmVjdGx5LiBJdCBhcHBlYXJzIHRoYXQgaWYgdGhlIHF1ZXVlIGlzIG1hbGZvcm1lZCwgd2UgY291bGQgZW5kIHVwIHJlYWRpbmcgZ2FyYmFnZSBvciBjcmFzaGluZyBpZiB3ZSBjYWxsIGB0bHNfcnhfbXNnX3NpemVgIG9uIHRoZSBtYWxmb3JtZWQgcXVldWUuICBUaGUgZnVuY3Rpb24gYHNrYl9jb3B5X2JpdHNgLCBpbiBwYXJ0aWN1bGFyLCB3b3JyaWVzIG1lLiBJdCBqdXN0IGl0ZXJhdGVzIG92ZXIgdGhlIGZyYWdzIGluIGFuIHNrYiB0aGVuIHRoZSBgZnJhZ19saXN0YCBhcyBpZiB0aGV5IGFyZSBjb250aWd1b3VzIG1lbW9yeSByZWdpb25zLiBJZiB0aGVzZSBmcmFncyBvdmVybGFwIOKAkyBhcyBjYW4gaGFwcGVuIHdpdGggcmV0cmFuc21pc3Npb25zIG9yIG91dC1vZi1vcmRlciBwYWNrZXRzIHRoYXQgaGF2ZW4mIzM5O3QgYmVlbiBjb21wbGV0ZWx5IGNvbGxhcHNlZCDigJMgYHNrYl9jb3B5X2JpdHNgIHdpbGwgc2ltcGx5IHJlYWQgdGhlbSBjb250aWd1b3VzbHksIHdoaWNoIHdpbGwgbGVhZCB0byBpbmNvcnJlY3QgZGF0YSBiZWluZyByZWFkLgoKVGhpcywgaW4gdHVybiwgY2FuIGNvbXB1dGUgYW4gaW5jb3JyZWN0IGBzemAgYW5kIHRoZW4gY2F1c2UgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UuIFNwZWNpZmljYWxseSwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgd3JvbmcgdmFsdWUgZm9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBxdWV1ZSwgb3IgY2FsY3VsYXRlZCBgc3pgLiBJZiB0aGlzIGBzemAgaXMgYSBsYXJnZSB2YWx1ZSwgYW5kIHRoZSBxdWV1ZSBhY3R1YWxseSBoYXMgYSBzbWFsbGVyIGFtb3VudCBvZiBkYXRhLCB0aGUgY29kZSB3aWxsIHRyeSB0byBpdGVyYXRlIG92ZXIgc2tiLSZndDtuZXh0IHBhc3QgdGhlIGVuZCBvZiB0aGUgZGF0YS4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBhdHRlbXB0IHRvIGRlcmVmZXJlbmNlIGEgTlVMTCBwb2ludGVyIGluIHRoZSBgVENQX1NLQl9DQihza2IpLSZndDtzZXFgIGZpZWxkLCB3aGljaCB3aWxsIHRyaWdnZXIgYSBjcmFzaC4gVGhlIGtlcm5lbCYjMzk7cyBLQVNBTiB3aWxsIGNhdGNoIHRoaXMuCgpJbml0aWFsbHksIEkgd2FzIGNvbmNlcm5lZCBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gQnV0IGBza2JfY29weV9iaXRzYCB3aWxsIG9ubHkgcmVhZCAqaW5pdGlhbGl6ZWQqIGJ5dGVzIGZyb20gdGhlIGBmcmFnX2xpc3RgLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IHdpbGwgcmVhZCB0aGUgKndyb25nKiBieXRlcywgbGVhZGluZyB0byB0aGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLCBhcyBkZXNjcmliZWQgYWJvdmUuCgpJIHdhcyBjb25zaWRlcmluZyB0aGUgY2FzZSB3aGVyZSBgc3pgIG1pZ2h0IGJlIHNtYWxsLCBidXQgdGhlIHF1ZXVlIGhhcyBvdmVybGFwcywgYnV0IHRoZW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aWxsIGRldGVjdCB0aGUgb3ZlcmxhcHMsIGFuZCByZXR1cm4gYGZhbHNlYCwgd2hpY2ggd2lsbCBjYWxsIGB0bHNfc3RycF9yZWFkX2NvcHlgIGV2ZW50dWFsbHkuIFNvIHRoaXMgd291bGRuJiMzOTt0IGJlIGEgcHJvYmxlbS4KCkhvd2V2ZXIsIEkganVzdCByZWFsaXplZCB0aGF0IHRoZSBjb2RlIGhhcyBhIGNyaXRpY2FsIGNoZWNrLiBgdGxzX3N0cnBfcmVhZF9zb2NrYCBjaGVja3MgaWYgdGhlcmUgYXJlIGVub3VnaCBieXRlcyBpbiB0aGUgcXVldWUgYmVmb3JlIGV2ZW4gY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBJZiB0aGVyZSBhcmVuJiMzOTt0IGVub3VnaCBieXRlcywgaXQgcmV0dXJucyBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggY2FsbHMgYHRsc19zdHJwX3JlYWRfY29weWluYC4gU28gaXQgZG9lc24mIzM5O3QgY3Jhc2ggaW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCEgVGhlbiB3aGF0IGlzIHRoZSBidWc/IEkgbmVlZCB0byByZS1yZWFkIHRoZSBwYXRjaC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDUyMDpcdFx0aWYgKHVubGlrZWx5KHN0cnAtXHUwMDNlY29weV9tb2RlKSlcbiA1MjE6XHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weWluKHN0cnApO1xuIDUyMjpcdFxuIDUyMzpcdFx0aWYgKGlucSBcdTAwM2Mgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pXG4gNTI0Olx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gNTI1Olx0XG4gNTI2Olx0XHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XG4gNTI3Olx0XHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG4gNTI4Olx0XHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbiA1Mjk6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuIDUzMDpcdFxuIDUzMTpcdFx0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBUTFNfSEVBREVSX1NJWkUpKVxuIDUzMjpcdFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuIDUzMzpcdFxuIDUzNDpcdFx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVx1MDAzZWFuY2hvcik7XG4gNTM1Olx0XHRcdGlmIChzeiBcdTAwM2MgMClcbiA1MzY6XHRcdFx0XHRyZXR1cm4gc3o7XG4gNTM3Olx0XG4gNTM4Olx0XHRcdHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XG4gNTM5Olx0XG4gNTQwOlx0XHRcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4gfHwgaW5xIFx1MDAzYyBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbilcbiA1NDE6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuIDU0MjpcdFx0fVxuIDU0MzpcdFxuIDU0NDpcdFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0Mzsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxuIDU0NTpcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcbiA1NDY6XHRcbiA1NDc6XHRcdFdSSVRFX09OQ0Uoc3RycC1cdTAwM2Vtc2dfcmVhZHksIDEpO1xuIDU0ODpcdFxuIDU0OTpcdFx0cmV0dXJuIDA7XG4gNTUwOlx0fVxuIDU1MTpcdFxuIDU1MjpcdC8qIFBhcnNlIHF1ZXVlZCBkYXRhLiBXaGVuIEBhbm5vdW5jZSBpcyB0cnVlIGFuZCBwYXJzaW5nIHByb2R1Y2VzIGFcbiA1NTM6XHQgKiBuZXdseS1yZWFkeSByZWNvcmQsIGZpcmUgdGhlIGNvbnN1bWVyIG5vdGlmaWNhdGlvbi4gQ2FsbGVycyB0aGF0XG4gNTU0Olx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjA3MQoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDE2MDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUTFMgQ29ubmVjdGlvbiBGYWlsdXJlIHdpdGggVENQIE92ZXJsYXBzKioKCk9rYXksIGhlcmUmIzM5O3Mgd2hhdCYjMzk7cyBoYXBwZW5pbmcuIExvb2tpbmcgYXQgdGhlIG9sZCBjb2RlLCBiZWZvcmUgdGhlIHBhdGNoLCB0aGUgbG9naWMgY2FsbHMgYHRsc19yeF9tc2dfc2l6ZWAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBUTFMgaGVhZGVyIGZyb20gdGhlIHJlY2VpdmUgcXVldWUuICBUaGUgcHJvYmxlbSBhcmlzZXMgd2hlbiB0aGVyZSBhcmUgb3ZlcmxhcHBpbmcgVENQIHNlZ21lbnRzIOKAkyBjb21tb24gd2l0aCByZXRyYW5zbWlzc2lvbnMg4oCTIGJlY2F1c2UgYHRsc19yeF9tc2dfc2l6ZWAgYXNzdW1lcyBhIGNvbnRpZ3VvdXMgYnVmZmVyLgoKU3BlY2lmaWNhbGx5LCBgdGxzX3J4X21zZ19zaXplYCB1c2VzIGBza2JfY29weV9iaXRzYC4gV2hlbiB0aGUgVENQIHJlY2VpdmUgcXVldWUgY29udGFpbnMgb3ZlcmxhcHBpbmcgU0tCcyAoU29ja2V0IEJ1ZmZlcnMpLCBgc2tiX2NvcHlfYml0c2AgbWlnaHQgcmVhZCB0aGUgKndyb25nKiBieXRlcyBmb3IgdGhlIFRMUyBoZWFkZXIuIFRoaXMgY2FuIGxlYWQgdG8gYSBjb3JydXB0ZWQgaGVhZGVyIGJlaW5nIHJlYWQuIElmIGB0bHNfcnhfbXNnX3NpemVgIGludGVycHJldHMgdGhlc2UgaW5jb3JyZWN0IGJ5dGVzIGFzIGFuIGludmFsaWQgVExTIGhlYWRlciwgaXQgY2FuIHJldHVybiBhbiBlcnJvciBjb2RlIGxpa2UgYC1FSU5WQUxgLiBUaGlzIGVycm9yIHRoZW4gYnViYmxlcyB1cCwgZXZlbnR1YWxseSBjYXVzaW5nIHRoZSBUTFMgY29ubmVjdGlvbiB0byBmYWlsIG9yIHN0YWxsLCBidXQgdGhlIHVuZGVybHlpbmcgVENQIGNvbm5lY3Rpb24gaXMgYWN0dWFsbHkgcGVyZmVjdGx5IGZpbmUuCgpUaGUgYnVnIGlzIHRoYXQgd2UmIzM5O3JlIGFib3J0aW5nIGEgVExTIGNvbm5lY3Rpb24gc3B1cmlvdXNseSB3aGVuIHRoZSBUQ1Agc3RhY2sgaXMgZG9pbmcgaXRzIGpvYiBieSBoYW5kbGluZyByZXRyYW5zbWlzc2lvbnMuIFRoZSBjb3JyZWN0IGFwcHJvYWNoIGlzIHRvIGhhbmRsZSBvdmVybGFwcGluZyBzZWdtZW50cywgd2hpY2ggaXMgY29tbW9uIGluIFRDUCBhbmQgbm90IG5lY2Vzc2FyaWx5IGluZGljYXRpdmUgb2YgYSBwcm9ibGVtLgoKVGhlIGZpeCBJJiMzOTt2ZSBpbXBsZW1lbnRlZCAoYWRkaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIGFkZHJlc3NlcyB0aGlzLiBCeSBjaGVja2luZyBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyAmIzM0O09LJiMzNDsgKmJlZm9yZSogYXR0ZW1wdGluZyB0byByZWFkIHRoZSBoZWFkZXIsIHdlIGNhbiBub3cgZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBvdmVybGFwcGluZyBzZWdtZW50cy4gSWYgdGhlIHF1ZXVlIGlzIG5vdCBPSywgd2UgY2FuIHN3aXRjaCB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggY29ycmVjdGx5IHVzZXMgYHRjcF9yZWFkX3NvY2tgIHRvIHJlYWQgdGhlIGRhdGEsIGhhbmRsaW5nIHRoZSBvdmVybGFwcGluZyBzZWdtZW50cy4KCkkgd2VudCBiYWNrIGFuZCBjaGVja2VkIGlmIHRoZXJlJiMzOTtzIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLCBidXQgaXQmIzM5O3Mgbm90IHRoZSBjYXNlLiBgc2tiX2NvcHlfYml0c2AgaXMgc2FmZS4gQWxsIHRoZSBkYXRhIGZyb20gdGhlIG5ldHdvcmsgaXMgaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIEtNU0FOIGJ1ZyBoZXJlLiBJdCYjMzk7cyBhIGxvZ2ljIGJ1ZyByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgdGhlIG92ZXJsYXBwaW5nIGRhdGEuCgpJIGFsc28gY2hlY2tlZCBpZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGNvdWxkIGNhdXNlIGFuIG91dC1vZi1ib3VuZHMgcmVhZC4gSW4gdGhlIHdoaWxlIGxvb3AsIGlmIGBsZW5gIHdoaWNoIGlzIGBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRWAgaXMgbGFyZ2VyIHRoYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZnJhZ19saXN0LCB0aGUgYHNrYmAgYmVjb21lcyBOVUxMLiBUaGVuIGRlcmVmZXJlbmNpbmcgaXQgY2F1c2VzIGEga2VybmVsIGNyYXNoLgpJbiB0aGUgbmV3IGNvZGUsIGBsZW5gIGlzIGBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRWAsIGFuZCBgaW5xYCBpcyBgdGNwX2lucShzdHJwLSZndDtzaylgLiBTaW5jZSBgaW5xYCBpcyB0aGUgc3VtIG9mIGBza2ItJmd0O2xlbmAgYW5kIHNpbmNlIHdlIGNoZWNrIGBpbnEgJmd0Oz0gVExTX0hFQURFUl9TSVpFYCBiZWZvcmUgdGhpcyBjYWxsLCBhbmQgc2luY2UgaXQgY2FsbHMgYHRsc19zdHJwX3JlYWRfY29weWAgaWYgYGlucSAmbHQ7IFRMU19IRUFERVJfU0laRWAsIGBsZW5gIGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBgZnJhZ19saXN0YCBiZWNhdXNlIGB0Y3BfaW5xYCBpcyBleGFjdGx5IHRoZSBzdW0gb2YgYHNrYi0mZ3Q7bGVuYCBpbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gVGh1cywgYGxlbmAgY2FuJiMzOTt0IGJlIGxhcmdlciB0aGFuIHRoZSBmcmFnIGxpc3QmIzM5O3MgdG90YWwgbGVuZ3RoLgoKSW4gc3VtbWFyeSwgdGhlIGtleSBpcyBwcmV2ZW50aW5nIHRoYXQgZXJyb3IgcmV0dXJuIGJ5IGNoZWNraW5nIGZvciBvdmVybGFwICpiZWZvcmUqIHJlYWRpbmcgdGhlIFRMUyBoZWFkZXIsIHRodXMgbWFpbnRhaW5pbmcgdGhlIGludGVncml0eSBvZiB0aGUgVENQIGNvbm5lY3Rpb24gYW5kIGF2b2lkaW5nIHNwdXJpb3VzIGNvbm5lY3Rpb24gZmFpbHVyZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RjcF9pbnEmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvaXB2NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2lwdjQvdGNwLmM9NjM5PWludCB0Y3BfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCBpbnQgKmthcmcpXG4tLVxubmV0L2lwdjQvdGNwLmMtNjUwLVx0XHRzbG93ID0gbG9ja19zb2NrX2Zhc3Qoc2spO1xubmV0L2lwdjQvdGNwLmM6NjUxOlx0XHRhbnN3ID0gdGNwX2lucShzayk7XG5uZXQvaXB2NC90Y3AuYy02NTItXHRcdHVubG9ja19zb2NrX2Zhc3Qoc2ssIHNsb3cpO1xuLS1cbm5ldC9pcHY0L3RjcC5jPTE4MjM9aW50IHRjcF9wZWVrX2xlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrKVxubmV0L2lwdjQvdGNwLmMtMTgyNC17XG5uZXQvaXB2NC90Y3AuYzoxODI1Olx0cmV0dXJuIHRjcF9pbnEoc29jay1cdTAwM2Vzayk7XG5uZXQvaXB2NC90Y3AuYy0xODI2LX1cbi0tXG5uZXQvaXB2NC90Y3AuYz0yMTk1PXN0YXRpYyBpbnQgdGNwX3plcm9jb3B5X3JlY2VpdmUoc3RydWN0IHNvY2sgKnNrLFxuLS1cbm5ldC9pcHY0L3RjcC5jLTIyMDktXHR1MzIgdG90YWxfYnl0ZXNfdG9fbWFwO1xubmV0L2lwdjQvdGNwLmM6MjIxMDpcdGludCBpbnEgPSB0Y3BfaW5xKHNrKTtcbm5ldC9pcHY0L3RjcC5jLTIyMTEtXHRib29sIG1tYXBfbG9ja2VkO1xuLS1cbm5ldC9pcHY0L3RjcC5jPTIzNDY9dm9pZCB0Y3BfcmVjdl90aW1lc3RhbXAoc3RydWN0IG1zZ2hkciAqbXNnLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXG4tLVxubmV0L2lwdjQvdGNwLmMtMjQxMi1cbm5ldC9pcHY0L3RjcC5jOjI0MTM6c3RhdGljIGludCB0Y3BfaW5xX2hpbnQoc3RydWN0IHNvY2sgKnNrKVxubmV0L2lwdjQvdGNwLmMtMjQxNC17XG4tLVxubmV0L2lwdjQvdGNwLmM9MjkzMD1pbnQgdGNwX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncylcbi0tXG5uZXQvaXB2NC90Y3AuYy0yOTUwLVx0XHRpZiAoKGNtc2dfZmxhZ3MgXHUwMDI2IFRDUF9DTVNHX0lOUSkgfCBtc2ctXHUwMDNlbXNnX2dldF9pbnEpIHtcbm5ldC9pcHY0L3RjcC5jOjI5NTE6XHRcdFx0bXNnLVx1MDAzZW1zZ19pbnEgPSB0Y3BfaW5xX2hpbnQoc2spO1xubmV0L2lwdjQvdGNwLmMtMjk1Mi1cdFx0XHRpZiAoY21zZ19mbGFncyBcdTAwMjYgVENQX0NNU0dfSU5RKVxuLS1cbm5ldC9pcHY0L3RjcC5jPTQ0ODE9aW50IGRvX3RjcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLFxuLS1cbm5ldC9pcHY0L3RjcC5jLTQ3OTgtemVyb2NvcHlfcmN2X2lucTpcbm5ldC9pcHY0L3RjcC5jOjQ3OTk6XHRcdHpjLmlucSA9IHRjcF9pbnFfaGludChzayk7XG5uZXQvaXB2NC90Y3AuYy00ODAwLXplcm9jb3B5X3Jjdl9vdXQ6XG4tLVxubmV0L2lwdjQvdGNwX2JwZi5jPTMzNT1zdGF0aWMgaW50IHRjcF9icGZfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCBpbnQgKmthcmcpXG4tLVxubmV0L2lwdjQvdGNwX2JwZi5jLTM2MC1cdCAgICAhUkVBRF9PTkNFKHBzb2NrLVx1MDAzZXByb2dzLnNrYl92ZXJkaWN0KSlcbm5ldC9pcHY0L3RjcF9icGYuYzozNjE6XHRcdCprYXJnICYjNDM7PSB0Y3BfaW5xKHNrKTtcbm5ldC9pcHY0L3RjcF9icGYuYy0zNjItXHRza19wc29ja19wdXQoc2ssIHBzb2NrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjUyMjkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkludmVzdGlnYXRpbmcgYHRjcF9pbnFgKioKCk9rYXksIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSYjMzk7bSB0aGlua2luZywgYmVmb3JlIEkgcHJvY2VlZCBmdXJ0aGVyLCBJIG5lZWQgdG8gbmFpbCBkb3duIGV4YWN0bHkgd2hhdCBgdGNwX2lucWAgcmVwcmVzZW50cy4gSXQmIzM5O3MgY3J1Y2lhbCB0byBoYXZlIGEgcm9jay1zb2xpZCBkZWZpbml0aW9uIGhlcmUsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggbG93LWxldmVsIG5ldHdvcmsgcGVyZm9ybWFuY2Ugb3IgZGlhZ25vc3RpY3MuIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4gSSB1bmRlcnN0YW5kIGl0cyBzcGVjaWZpYyBtZWFuaW5nIGluIHRoZSBjb250ZXh0IEkmIzM5O20gd29ya2luZyB3aXRoLCB3aGV0aGVyIHRoYXQmIzM5O3Mgd2l0aGluIHRoZSBrZXJuZWwsIGluIGEgc3BlY2lmaWMgbW9uaXRvcmluZyB0b29sLCBvciBpbiBhIHRoZW9yZXRpY2FsIGRpc2N1c3Npb24uIENvbnRleHQgaXMga2luZywgYXMgYWx3YXlzLCBidXQgdW5kZXJzdGFuZGluZyB0aGUgcHJlY2lzZSBzZW1hbnRpY3Mgb2YgYHRjcF9pbnFgIGlzIHRoZSBmb3VuZGF0aW9uLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGUgc3RhbmRhcmQgZGVmaW5pdGlvbiwgYW5kIHRoZW4gZGl2ZSBpbnRvIHRoZSByZWxldmFudCBzb3VyY2UgY29kZSBvciBkb2N1bWVudGF0aW9uIHRvIGNvbmZpcm0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2ludCB0Y3BfaW5xJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L3RjcC5oPTI3MzY9c3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfdGNwX3B1cmVfYWNrKHN0cnVjdCBza19idWZmICpza2IpXG4tLVxuaW5jbHVkZS9uZXQvdGNwLmgtMjc0MC1cbmluY2x1ZGUvbmV0L3RjcC5oOjI3NDE6c3RhdGljIGlubGluZSBpbnQgdGNwX2lucShzdHJ1Y3Qgc29jayAqc2spXG5pbmNsdWRlL25ldC90Y3AuaC0yNzQyLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjU1NTIKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQW5hbHl6aW5nIHRoZSBgdGNwX2lucWAgVmFyaWFibGUqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiAmIzM0O0xldCYjMzk7cyByZWFkIGB0Y3BfaW5xYCYjMzQ7IOKAkyB0aGF0JiMzOTtzIHRoZSBzdGFydGluZyBwb2ludC4gSSBpbW1lZGlhdGVseSBrbm93IHdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGEgdmFyaWFibGUsIGxpa2VseSB3aXRoaW4gYSBuZXR3b3JrIHN0YWNrJiMzOTtzIGltcGxlbWVudGF0aW9uLiBUaGUgYHRjcF9gIHByZWZpeCBzdHJvbmdseSBzdWdnZXN0cyBpdCYjMzk7cyByZWxhdGVkIHRvIFRDUCwgYW5kIHRoZSBgaW5xYCBzdWZmaXggcHJvYmFibHkgcG9pbnRzIHRvIHNvbWV0aGluZyBhYm91dCB0aGUgaW5jb21pbmcgcXVldWUuCgpNeSBicmFpbiYjMzk7cyBhbHJlYWR5IHN0YXJ0aW5nIHRvIGZpbGwgaW4gdGhlIGJsYW5rcy4gSXMgdGhpcyBhIGtlcm5lbC1sZXZlbCB2YXJpYWJsZT8gVXNlci1zcGFjZT8gV2hhdCBhcmNoaXRlY3R1cmUgYXJlIHdlIGRlYWxpbmcgd2l0aD8gVGhlIHNwZWNpZmljIGNvbnRleHQgd291bGQgbWFrZSBhIGh1Z2UgZGlmZmVyZW5jZSBpbiBob3cgSSBpbnRlcnByZXQgaXQuIEFyZSB3ZSBsb29raW5nIGF0IGEgcGVyLXNvY2tldCB2YWx1ZSwgYSBnbG9iYWwgc3lzdGVtIHN0YXRpc3RpYywgb3Igc29tZXRoaW5nIG1vcmUgbnVhbmNlZD8KCkkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGltcGxpY2F0aW9ucy4gYHRjcF9pbnFgIGNvdWxkIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHF1ZXVlZCBmb3IgcmVjZXB0aW9uLCB0aGUgbnVtYmVyIG9mIHBhY2tldHMsIHBlcmhhcHMgYSBjb3VudCBvZiBvdXRzdGFuZGluZyBhY2tub3dsZWRnZW1lbnRzLCBvciBldmVuIGEgbWVhc3VyZSBvZiBidWZmZXJpbmcgcHJlc3N1cmUuIEl04oCZcyBwcm9iYWJseSBhIGNyaXRpY2FsIHBlcmZvcm1hbmNlIG1ldHJpYywgcmVmbGVjdGluZyB0aGUgZWZmaWNpZW5jeSBvZiB0aGUgVENQIHJlY2VpdmUgcGF0aC4gSSYjMzk7bSBrZWVuIHRvIHNlZSB0aGUgY29kZSB3aGVyZSBpdCYjMzk7cyB1c2VkLiBBbnkgY29uZ2VzdGlvbiBjb250cm9sIG1lY2hhbmlzbXMgbWlnaHQgaGF2ZSBhIGRlcGVuZGVuY3kgb24gdGhlIGluZm9ybWF0aW9uIGl0IGNvbnRhaW5zLgoKVGhlIGNvcmUgcXVlc3Rpb24gbm93IGlzOiBXaGF0IGRvZXMgKml0KiB0ZWxsIHVzPyBXaHkgYXJlIHdlIHJlYWRpbmcgaXQ/IFdoYXQgcHJvYmxlbSBhcmUgd2UgdHJ5aW5nIHRvIHNvbHZlIG9yIHVuZGVyc3RhbmQ/IElzIHRoaXMgcGFydCBvZiBhIGRlYnVnZ2luZyBleGVyY2lzZSwgcGVyZm9ybWFuY2UgdHVuaW5nLCBvciBuZXR3b3JrIG1vbml0b3Jpbmc/IFRoZSByZWFzb25zIGZvciB0aGUgcmVhZGluZyB3aWxsIGhlYXZpbHkgaW5mbHVlbmNlIG15IGFuYWx5c2lzIG9mIGl0LiBJcyB0aGVyZSBzb21ldGhpbmcgd2UgZXhwZWN0IHRvIGZpbmQsIG9yIGFyZSB3ZSBqdXN0IGhvcGluZyB0byBvYnRhaW4gYSBiYXNlbGluZSBudW1iZXIgdG8gYmUgdXNlZCBmb3IgY29tcGFyaXNvbj8gSSYjMzk7bSBleGNpdGVkIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uIGJlY2F1c2UsIGZvciBteSBmaWVsZCwgdGhpcyB2YXJpYWJsZSBpcyBhYnNvbHV0ZWx5IHZpdGFsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L3RjcC5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjc0MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNzQxOlx0c3RhdGljIGlubGluZSBpbnQgdGNwX2lucShzdHJ1Y3Qgc29jayAqc2spXG4yNzQyOlx0e1xuMjc0MzpcdFx0c3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7XG4yNzQ0Olx0XHRpbnQgYW5zdztcbjI3NDU6XHRcbjI3NDY6XHRcdGlmICgoMSBcdTAwM2NcdTAwM2Mgc2stXHUwMDNlc2tfc3RhdGUpIFx1MDAyNiAoVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKSB7XG4yNzQ3Olx0XHRcdGFuc3cgPSAwO1xuMjc0ODpcdFx0fSBlbHNlIGlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfVVJHSU5MSU5FKSB8fFxuMjc0OTpcdFx0XHQgICAhdHAtXHUwMDNldXJnX2RhdGEgfHxcbjI3NTA6XHRcdFx0ICAgYmVmb3JlKHRwLVx1MDAzZXVyZ19zZXEsIHRwLVx1MDAzZWNvcGllZF9zZXEpIHx8XG4yNzUxOlx0XHRcdCAgICFiZWZvcmUodHAtXHUwMDNldXJnX3NlcSwgdHAtXHUwMDNlcmN2X254dCkpIHtcbjI3NTI6XHRcbjI3NTM6XHRcdFx0YW5zdyA9IHRwLVx1MDAzZXJjdl9ueHQgLSB0cC1cdTAwM2Vjb3BpZWRfc2VxO1xuMjc1NDpcdFxuMjc1NTpcdFx0XHQvKiBTdWJ0cmFjdCAxLCBpZiBGSU4gd2FzIHJlY2VpdmVkICovXG4yNzU2Olx0XHRcdGlmIChhbnN3IFx1MDAyNlx1MDAyNiBzb2NrX2ZsYWcoc2ssIFNPQ0tfRE9ORSkpXG4yNzU3Olx0XHRcdFx0YW5zdy0tO1xuMjc1ODpcdFx0fSBlbHNlIHtcbjI3NTk6XHRcdFx0YW5zdyA9IHRwLVx1MDAzZXVyZ19zZXEgLSB0cC1cdTAwM2Vjb3BpZWRfc2VxO1xuMjc2MDpcdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjMxNAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDMxNzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBJc3N1ZXMgd2l0aCBUTFMvVENQIEhhbmRsaW5nKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEl0IHNlZW1zIHdlJiMzOTtyZSBsb29raW5nIGF0IGEgc2NlbmFyaW8gd2hlcmUgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gVExTIGFuZCBUQ1AgcmVjZWl2ZSBxdWV1ZXMgbWlnaHQgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBob3cgd2UgaGFuZGxlIG92ZXJsYXBwaW5nIFRDUCBzZWdtZW50cy4KCkZpcnN0LCBgdGNwX2lucWAgcHJvdmlkZXMgdGhlICpsb2dpY2FsKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSByZWNlaXZlIHF1ZXVlLCBjb25zaWRlcmluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIHNwYWNlLiBIb3dldmVyLCB3aGVuIG92ZXJsYXBwaW5nIFNLQnMgYXJlIHByZXNlbnQsIHRoZSAqcGh5c2ljYWwqIHN1bSBvZiBgc2tiLSZndDtsZW5gIHZhbHVlcyBjYW4gYmUgbGFyZ2VyLiBUaGUgaW1wb3J0YW50IHBvaW50IGlzIGBpbnFgICh0aGUgYHRjcF9pbnFgIHZhbHVlKSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgaW4tb3JkZXIgYnl0ZXMuCgpJZiBgaW5xYCBpcyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgVExTIGhlYWRlciAoYFRMU19IRUFERVJfU0laRWApLCB3ZSBhcmUgc2FmZSB0byBiZWdpbiBvdXIgcHJvY2Vzc2luZy4gV2Uga25vdyB0aGUgc3VtIG9mIGBza2ItJmd0O2xlbmAgaXMgYXQgKmxlYXN0KiBlcXVhbCB0byBgaW5xYCwgc28gbm8gbnVsbCBgc2tiYCBpcyBleHBlY3RlZC4KCk5vdywgdGhlIG9sZCBjb2RlJiMzOTtzIGxvZ2ljIGlzIGNvbmNlcm5pbmcuIElmIHRoZSBjYWxjdWxhdGVkIG1lc3NhZ2Ugc2l6ZSBgc3pgIChkZXJpdmVkIGZyb20gdGhlIFRMUyBoZWFkZXIpIGlzIGxhcmdlciB0aGFuIGBpbnFgLCB0aGUgY29kZSBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBUaGlzIGZ1bmN0aW9uIHV0aWxpemVzIGB0Y3BfcmVhZF9zb2NrYCB3aGljaCBoYW5kbGVzIG92ZXJsYXBwaW5nIHNlZ21lbnRzIHByb3Blcmx5LiBUaGVyZWZvcmUsIGluIHRoZSAqb2xkKiBjb2RlLCB3ZSB3ZXJlICpuZXZlciogY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHdpdGggYSBzaXplIGxhcmdlciB0aGFuIHdoYXQgd2FzIGF2YWlsYWJsZS4KCldoZW4gYGlucSAmZ3Q7PSBzemAsIHdlIGNhbGwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYC4gU2luY2UgYHNrYmAgaXMgbmV2ZXIgTlVMTCAoYmVjYXVzZSB0aGUgcGh5c2ljYWwgYnl0ZXMgYXJlIGF0IGxlYXN0IHRoZSBsb2dpY2FsIGJ5dGVzKSwgdGhpcyBjb25kaXRpb24gc2hvdWxkIHdvcmsuCgpIb3dldmVyLCB0aGUgcmVhbCBwcm9ibGVtIGFyaXNlcyB3aGVuIGFuYWx5emluZyB0aGUgcHVycG9zZSBvZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBJdCBleGFtaW5lcyB0aGUgVENQIHF1ZXVlLiBUaGUga2V5IGlzIHRoZSBjb25kaXRpb24gYFRDUF9TS0JfQ0Ioc2tiKS0mZ3Q7c2VxICE9IHNlcWAuIElmIHdlIGhhdmUgb3ZlcmxhcHBpbmcgc2VnbWVudHMsIHRoaXMgY29uZGl0aW9uIHdpbGwgYmUgdHJ1ZSwgYXMgVENQIHNlcXVlbmNlIG51bWJlcnMgd2lsbCBub3QgYWxpZ24gYXMgZXhwZWN0ZWQuIFRoaXMgY2hlY2sgaXMgZGVzaWduZWQgdG8gY2F0Y2ggb3ZlcmxhcHBpbmcgc2VnbWVudHMuIElmIG92ZXJsYXBwaW5nIHNlZ21lbnRzIGFyZSBkZXRlY3RlZCwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCByZXR1cm5zIGBmYWxzZWAsIGNhdXNpbmcgYSBmYWxsYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggdXNlcyBgdGNwX3JlYWRfc29ja2AuCgpUaGUgY29yZSBsb2dpYyBvZiB0aGUgYnVnIGlzIHRoYXQgd2l0aCBvdmVybGFwcGluZyBzZWdtZW50cywgYHRsc19yeF9tc2dfc2l6ZWAgbWlnaHQgcmVhZCBnYXJiYWdlIGRhdGEgZnJvbSBvdmVybGFwcGluZyBzZWdtZW50cyB0byBkZXRlcm1pbmUgYHN6YC4gVGhpcyBsZWFkcyB0byBhIHNwdXJpb3VzIGNvbm5lY3Rpb24gZmFpbHVyZSwgYXMgdGhlIFRMUyBoZWFkZXIgbWlnaHQgYmUgY29ycnVwdGVkLgoKS0FTQU4gYW5kIEtNU0FOIGFyZW4mIzM5O3QgbGlrZWx5IHRvIGRldGVjdCBhIGJ1ZyBoZXJlLiBJdCYjMzk7cyBhIGxvZ2ljIGJ1ZyAoZnVuY3Rpb25hbCksIG5vdCBhIG1lbW9yeSBzYWZldHkgaXNzdWUuIFRoZSBjb2RlIHJlYWRzIGluaXRpYWxpemVkIGJ5dGVzLCBldmVuIGlmIHRoZSAmIzM0O2NvcnJlY3QmIzM0OyBieXRlcyBhcmUgbm90IHJlYWQuIE5vIG91dC1vZi1ib3VuZHMgYWNjZXNzIGlzIG9jY3VycmluZy4KCkEgY3JpdGljYWwgcG9pbnQ6IFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgYGxlbmAgKHRoZSBhbW91bnQgb2YgZGF0YSB3ZSAqdGhpbmsqIHdlIGhhdmUgYXZhaWxhYmxlKSBpbiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzICpsZXNzIHRoYW4gb3IgZXF1YWwgdG8qIHRoZSBzdW0gb2YgdGhlIGBza2ItJmd0O2xlbmAgdmFsdWVzLiBXZSBrbm93IHRoaXMgaXMgdHJ1ZSBiZWNhdXNlIHdlIGxpbWl0IHRoZSBgbGVuYCB2YWx1ZSB0byBiZSBubyBtb3JlIHRoYW4gYGlucWAgYnl0ZXMgKHRoZSAqYXZhaWxhYmxlKiBieXRlcykuCgpIb3dldmVyLCB3aGF0IGlmIHRoZXJlIGFyZSB6ZXJvLWxlbmd0aCBza2JzPyBXZSBoYXZlIHRvIGhhbmRsZSB0aGlzIGluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuCgpXaGF0IGlmIGFuIGBzemAgZnJvbSBhIG1hbGZvcm1lZCBxdWV1ZSBpcyBsYXJnZT8gSXQgc2VlbXMgdGhhdCBpbiB0aGlzIGNhc2Ugd2UgcmV0dXJuIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLgoKU28sIHRoZSBidWcgaXMgYSAqZnVuY3Rpb25hbCogb25lOiBzcHVyaW91cyBjb25uZWN0aW9uIGZhaWx1cmVzIGR1ZSB0byBvdmVybGFwcGluZyBUQ1Agc2VnbWVudHMuIFRoZSBvdmVybGFwcGluZyBzZWdtZW50cyBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IGJ5IHRoZSBUTFMgY29kZSAqYmVmb3JlKiBpdCB0cmllcyB0byBwYXJzZSB0aGUgVExTIGhlYWRlciBhbmQgY2FsY3VsYXRlIHRoZSBUTFMgbWVzc2FnZSBzaXplLiBUaGUgZml4IGlzIHRvIHVzZSBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgICpiZWZvcmUqIHBhcnNpbmcgdGhlIGhlYWRlci4gVGhpcyB3aWxsIGNhdXNlIHVzIHRvIGZhbGwgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCB0byByZWNvdmVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0bHNfc3RycF9jaGVja19xdWV1ZV9vayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYz0zOTA9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy00MzItXG5uZXQvdGxzL3Rsc19zdHJwLmM6NDMzOnN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxubmV0L3Rscy90bHNfc3RycC5jLTQzNC1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTUzMC1cbm5ldC90bHMvdGxzX3N0cnAuYzo1MzE6XHRcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTMyLVx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01NDMtXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTQ0Olx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0Mzsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxubmV0L3Rscy90bHNfc3RycC5jLTU0NS1cdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMwNzE4CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTMxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgVExTIFN0YWxsL0ZhaWx1cmUgQnVnKioKCk9rYXksIHNvIEkgY2FuJiMzOTt0IGRpcmVjdGx5IGBncmVwcGVyYCBmb3IgdGhlIGNvbW1pdCBtZXNzYWdlIHJlbGF0ZWQgdG8gdGhpcyBpc3N1ZSwgYXMgdGhhdCB0b29sIHdvbiYjMzk7dCBkZWx2ZSBpbnRvIHRoZSBnaXQgbG9nLiBCdXQsIEkgY2FuIHdvcmsgaXQgb3V0IGJ5IGluZmVyZW5jZS4gSXQgbG9va3MgbGlrZSB0aGUgaXNzdWUgaXMgbGlrZWx5IHJvb3RlZCBpbiBob3cgYHRsc19yeF9tc2dfc2l6ZWAgaGFuZGxlcyBwb3RlbnRpYWxseSBvdmVybGFwcGluZyBTS0JzIG9uIGEgcXVldWUuCgpIZXJlJiMzOTtzIHRoZSBjaGFpbiBvZiBldmVudHM6IElmIGB0bHNfcnhfbXNnX3NpemVgIGlzIGNhbGxlZCBvbiBhIHF1ZXVlIHdpdGggb3ZlcmxhcHBpbmcgU0tCcywgaXQgbWlnaHQgZW5kIHVwIHJlYWRpbmcgYSBjb3JydXB0ZWQgaGVhZGVyLiBUaGlzIGNvcnJ1cHRlZCBoZWFkZXIgY291bGQgY2F1c2UgaXQgdG8gcmV0dXJuIGFuIGAtRUlOVkFMYCBlcnJvciwgcGVyaGFwcyBpbmRpY2F0aW5nIGEgYmFkIHZlcnNpb24gb3Igc29tZSBvdGhlciBjb3JydXB0aW9uLiBXaGVuIGB0bHNfcnhfbXNnX3NpemVgIHJldHVybnMgYC1FSU5WQUxgLCBgdGxzX3N0cnBfcmVhZF9zb2NrYCBpbiB0dXJuIGFsc28gcmV0dXJucyBgLUVJTlZBTGAuIFRoZW4gYHRsc19zdHJwX2NoZWNrX3JjdmAgbG9naWMgaXM6CgpgYGBjCglpZiAodGxzX3N0cnBfcmVhZF9zb2NrKHN0cnApID09IC1FTk9NRU0pCgkJcXVldWVfd29yayh0bHNfc3RycF93cSwgJmFtcDtzdHJwLSZndDt3b3JrKTsKYGBgCgpUaHVzLCB0aGUgYC1FSU5WQUxgIChmcm9tIGB0bHNfc3RycF9yZWFkX3NvY2tgKSBpcyBpZ25vcmVkLCBidXQgYHN0cnAtJmd0O21zZ19yZWFkeWAgaXMgbm90IHNldCwgbGVhZGluZyB0byBlaXRoZXIgYSBjb25uZWN0aW9uIHN0YWxsIG9yIG91dHJpZ2h0IGZhaWx1cmUuIFRoaXMgaXMgZGVmaW5pdGVseSBhIGZ1bmN0aW9uYWwgYnVnLgoKTm93LCBJIG5lZWQgdG8gY2hlY2sgc29tZXRoaW5nIGltcG9ydGFudDogSXMgaXQgcG9zc2libGUgdGhhdCBgdGxzX3J4X21zZ19zaXplYCBjb3VsZCBiZSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBMZXQmIzM5O3MgdHJhY2UgaXQgdGhyb3VnaDoKCmBgYGMKCWNoYXIgaGVhZGVyW1RMU19IRUFERVJfU0laRSAmIzQzOyBUTFNfTUFYX0lWX1NJWkVdOwoJLi4uCglyZXQgPSBza2JfY29weV9iaXRzKHNrYiwgc3RycC0mZ3Q7c3RtLm9mZnNldCwgaGVhZGVyLCBwcm90LSZndDtwcmVwZW5kX3NpemUpOwoJaWYgKHJldCAmbHQ7IDApCgkJZ290byByZWFkX2ZhaWx1cmU7CmBgYAoKYHNrYl9jb3B5X2JpdHNgIGNvcGllcyBgcHJvdC0mZ3Q7cHJlcGVuZF9zaXplYCBieXRlcyBpbnRvIGBoZWFkZXJgLiBgcHJvdC0mZ3Q7cHJlcGVuZF9zaXplYCBpcyBzZXQgdG8gYFRMU19IRUFERVJfU0laRWAsIHdoaWNoIGlzIDUuIFNvLCBpdCYjMzk7cyBjb3B5aW5nIDUgYnl0ZXMgaW50byBgaGVhZGVyYC4gTm93IHdlIGFjY2VzcyBgaGVhZGVyWzBdYCB0aHJvdWdoIGBoZWFkZXJbNF1gLiBUaG9zZSA1IGJ5dGVzICphcmUqIGluaXRpYWxpemVkIGJ5IGBza2JfY29weV9iaXRzYC4gVGhlIHJlc3Qgb2YgYGhlYWRlcmAgaXMgdW5pbml0aWFsaXplZCwgYnV04oCmIFdhaXQgYSBzZWMsIGRvZXMgdGhlIHJlc3Qgb2YgYGhlYWRlcmAgKmV2ZXIqIGdldCBhY2Nlc3NlZD8gTm8sIGB0bHNfcnhfbXNnX3NpemVgIG9ubHkgdXNlcyB0aG9zZSBmaXJzdCA1IGJ5dGVzLiBTbywgbm8sIHRoaXMgaXMgbm90IGEgc291cmNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLgoKSXMgdGhpcyBgaGVhZGVyYCB2YXJpYWJsZSB1c2VkIGFueXdoZXJlIGVsc2U/IE5vLCBpdCYjMzk7cyBsb2NhbCB0byBgdGxzX3J4X21zZ19zaXplYC4KCkJ1dCwgd2hhdCBpZiBgcHJvdC0mZ3Q7cHJlcGVuZF9zaXplYCB3YXMgbGFyZ2VyIHRoYW4gNT8gTm9wZSwgaXQmIzM5O3MgYWx3YXlzIHNldCB0byA1IGZvciBib3RoIFRMUyAxLjIgYW5kIDEuMywgYW5kIGl0JiMzOTtzIHNldCBpbiBgdGxzX3NldF9zd19vZmZsb2FkYC4gQWx3YXlzIGBUTFNfSEVBREVSX1NJWkVgLiBUaGF0JiMzOTtzIHNldHRsZWQuCgpOb3csIGxldCYjMzk7cyB0dXJuIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgOiBDb3VsZCBpdCBiZSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PwoKYGBgYwoJZm9yIChsZW4gPSBuZWVkX3NwYzsgbGVuICZndDsgMDsgbGVuIC09IFBBR0VfU0laRSkgewoJCXBhZ2UgPSBhbGxvY19wYWdlKHN0cnAtJmd0O3NrLSZndDtza19hbGxvY2F0aW9uKTsKCQlpZiAoIXBhZ2UpIHsKCQkJdGxzX3N0cnBfZmx1c2hfYW5jaG9yX2NvcHkoc3RycCk7CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCgkJc2tiX2ZpbGxfcGFnZV9kZXNjKHN0cnAtJmd0O2FuY2hvciwgc2hpbmZvLSZndDtucl9mcmFncyYjNDM7JiM0MzssCgkJCQkgICBwYWdlLCAwLCAwKTsKCX0KYGBgCgpJdCBhbGxvY2F0ZXMgcGFnZXMgd2l0aCBgYWxsb2NfcGFnZWAuICpUaG9zZSogcGFnZXMgYXJlIE5PVCB6ZXJvZWQhIFRoZW4gYHRsc19zdHJwX3JlYWRfY29weWluKHN0cnApYCBpcyBjYWxsZWQuIGB0bHNfc3RycF9yZWFkX2NvcHlpbmAgdXNlcyBgdGNwX3JlYWRfc29ja2AgdG8gY29weSBkYXRhIGZyb20gdGhlIFRDUCByZWNlaXZlIHF1ZXVlIGludG8gdGhlc2UgcGFnZXMuCgpgYGBjCglzdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbihyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKCQkJCSAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBpbl9sZW4pCgl7CgkJLi4uCgkJaWYgKElTX0VOQUJMRUQoQ09ORklHX1RMU19ERVZJQ0UpICZhbXA7JmFtcDsgc3RycC0mZ3Q7bWl4ZWRfZGVjcnlwdGVkKQoJCQlyZXQgPSB0bHNfc3RycF9jb3B5aW5fc2tiKHN0cnAsIHNrYiwgaW5fc2tiLCBvZmZzZXQsIGluX2xlbik7CgkJZWxzZQoJCQlyZXQgPSB0bHNfc3RycF9jb3B5aW5fZnJhZyhzdHJwLCBza2IsIGluX3NrYiwgb2Zmc2V0LCBpbl9sZW4pOwpgYGAKCmB0bHNfc3RycF9jb3B5aW5fZnJhZ2AgdGhlbiBjb3BpZXMgZGF0YSBmcm9tIGBpbl8KCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjEwOlx0c3RhdGljIGludCB0bHNfc3RycF9jb3B5aW5fZnJhZyhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiAyMTE6XHRcdFx0XHRcdHN0cnVjdCBza19idWZmICppbl9za2IsIHVuc2lnbmVkIGludCBvZmZzZXQsXG4gMjEyOlx0XHRcdFx0XHRzaXplX3QgaW5fbGVuKVxuIDIxMzpcdHtcbiAyMTQ6XHRcdHVuc2lnbmVkIGludCBuZnJhZyA9IHNrYi1cdTAwM2VsZW4gLyBQQUdFX1NJWkU7XG4gMjE1Olx0XHRzaXplX3QgbGVuLCBjaHVuaztcbiAyMTY6XHRcdHNrYl9mcmFnX3QgKmZyYWc7XG4gMjE3Olx0XHRpbnQgc3o7XG4gMjE4Olx0XG4gMjE5Olx0XHRpZiAodW5saWtlbHkobmZyYWcgXHUwMDNlPSBza2Jfc2hpbmZvKHNrYiktXHUwMDNlbnJfZnJhZ3MpKSB7XG4gMjIwOlx0XHRcdERFQlVHX05FVF9XQVJOX09OX09OQ0UoMSk7XG4gMjIxOlx0XHRcdHJldHVybiAtRU1TR1NJWkU7XG4gMjIyOlx0XHR9XG4gMjIzOlx0XG4gMjI0Olx0XHRmcmFnID0gXHUwMDI2c2tiX3NoaW5mbyhza2IpLVx1MDAzZWZyYWdzW25mcmFnXTtcbiAyMjU6XHRcbiAyMjY6XHRcdGxlbiA9IGluX2xlbjtcbiAyMjc6XHRcdC8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIGhlYWRlciAqL1xuIDIyODpcdFx0aWYgKCFzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbikge1xuIDIyOTpcdFx0XHQvKiBBc3N1bWUgb25lIHBhZ2UgaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgaGVhZGVycyAqL1xuIDIzMDpcdFx0XHRjaHVuayA9XHRtaW5fdChzaXplX3QsIGxlbiwgUEFHRV9TSVpFIC0gc2tiX2ZyYWdfc2l6ZShmcmFnKSk7XG4gMjMxOlx0XHRcdFdBUk5fT05fT05DRShza2JfY29weV9iaXRzKGluX3NrYiwgb2Zmc2V0LFxuIDIzMjpcdFx0XHRcdFx0XHQgICBza2JfZnJhZ19hZGRyZXNzKGZyYWcpICYjNDM7XG4gMjMzOlx0XHRcdFx0XHRcdCAgIHNrYl9mcmFnX3NpemUoZnJhZyksXG4gMjM0Olx0XHRcdFx0XHRcdCAgIGNodW5rKSk7XG4gMjM1Olx0XG4gMjM2Olx0XHRcdHNrYi1cdTAwM2VsZW4gJiM0Mzs9IGNodW5rO1xuIDIzNzpcdFx0XHRza2ItXHUwMDNlZGF0YV9sZW4gJiM0Mzs9IGNodW5rO1xuIDIzODpcdFx0XHRza2JfZnJhZ19zaXplX2FkZChmcmFnLCBjaHVuayk7XG4gMjM5Olx0XG4gMjQwOlx0XHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHNrYik7XG4gMjQxOlx0XHRcdGlmIChzeiBcdTAwM2MgMClcbiAyNDI6XHRcdFx0XHRyZXR1cm4gc3o7XG4gMjQzOlx0XG4gMjQ0Olx0XHRcdC8qIFdlIG1heSBoYXZlIG92ZXItcmVhZCwgc3ogPT0gMCBpcyBndWFyYW50ZWVkIHVuZGVyLXJlYWQgKi9cbiAyNDU6XHRcdFx0aWYgKHVubGlrZWx5KHN6IFx1MDAyNlx1MDAyNiBzeiBcdTAwM2Mgc2tiLVx1MDAzZWxlbikpIHtcbiAyNDY6XHRcdFx0XHRpbnQgb3ZlciA9IHNrYi1cdTAwM2VsZW4gLSBzejtcbiAyNDc6XHRcbiAyNDg6XHRcdFx0XHRXQVJOX09OX09OQ0Uob3ZlciBcdTAwM2UgY2h1bmspO1xuIDI0OTpcdFx0XHRcdHNrYi1cdTAwM2VsZW4gLT0gb3ZlcjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM3NjIKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA1NDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUTFMgRnJhZ21lbnQgQ29weWluZyBQcm9jZXNzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgdGxzX3N0cnBfY29weWluX2ZyYWdgLCBhbmQgaXQmIzM5O3MgdXNpbmcgYHNrYl9jb3B5X2JpdHNgIHRvIGNvcHkgZGlyZWN0bHkgaW50byB0aGUgcGFnZS4gVGhhdCYjMzk7cyBhIGRpcmVjdCBjb3B5LCBhbHJpZ2h0ISBJdCBjb3BpZXMgYGNodW5rYCBieXRlcyBmcm9tIGBpbl9za2JgIGludG8gdGhlIHBhZ2UsIHNwZWNpZmljYWxseSB1c2luZyBgc2tiX2ZyYWdfYWRkcmVzcyhmcmFnKSAmIzQzOyBza2JfZnJhZ19zaXplKGZyYWcpYCBhcyB0aGUgZGVzdGluYXRpb24uIFRoZW4sIHRoZSBjb2RlIGNhbGxzIGB0bHNfcnhfbXNnX3NpemVgLgoKTm93LCBgdGxzX3J4X21zZ19zaXplYCBpcyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBJIHJlbWVtYmVyIHRoYXQgZnVuY3Rpb24gcmVhZHMgdGhlIGhlYWRlciBmcm9tIHRoZSBgc2tiYCB1c2luZyBgc2tiX2NvcHlfYml0c2AsIHNwZWNpZmljYWxseSBmcm9tIHRoZSBgc3RycC0mZ3Q7YW5jaG9yYCBTS0IsIGFuZCBzdGFydGluZyBhdCBgc3RycC0mZ3Q7c3RtLm9mZnNldGAgd2hpY2gsIGxvb2tpbmcgYmFjaywgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyBpbiBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gVGhpcyBtZWFucyBpdCB3aWxsIHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWdlLiBBbmQgc2luY2UgYHNrYmAgaXMgdGhlIGBzdHJwLSZndDthbmNob3JgLCBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZSB3YXMganVzdCBwb3B1bGF0ZWQgYnkgYHNrYl9jb3B5X2JpdHNgIGZyb20gYGluX3NrYmAsIHRoaXMgbWVhbnMgdGhlIGRhdGEgaXMgaW5pdGlhbGl6ZWQuIEkgc2VlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgaGVyZS4KCkJ1dCB3YWl0LCB3aGF0IGlmIGBjaHVua2AgaXMgKnNtYWxsZXIqIHRoYW4gYFRMU19IRUFERVJfU0laRWA/IEFoLCBJIHNlZS4gSWYgYGNodW5rYCBpcyBsZXNzIHRoYW4gYFRMU19IRUFERVJfU0laRWAsIGB0bHNfcnhfbXNnX3NpemVgIHdvdWxkIGVuY291bnRlciBhIHNpdHVhdGlvbiB3aGVyZSBpdCB0cmllcyB0byByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBgc2tiYCYjMzk7cyBkYXRhLCBhcyBgc2tiLSZndDtsZW5gIHdvdWxkIGJlIGVxdWFsIHRvIGBjaHVua2AuIFRoaXMgcmVzdWx0cyBpbiBgdGxzX3J4X21zZ19zaXplYCByZXR1cm5pbmcgemVyby4gSXQgd2lsbCBjb3JyZWN0bHkgbm90IHJlYWQgdGhlIGhlYWRlciwgYW5kIGB0bHNfc3RycF9jb3B5aW5fZnJhZ2AgcmV0dXJucyB0aGUgY29waWVkIGRhdGEgc2l6ZS4gVGhlIGNhbGxlciB0aGVuIGNhbGxzIGB0bHNfc3RycF9jb3B5aW5gIGFnYWluIHdpdGggbW9yZSBkYXRhIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBwYWdlLCB1bnRpbCB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIGZvcm0gYSBUTFMgaGVhZGVyLiBPbmNlIHRoZSBTS0IgaGFzIGF0IGxlYXN0IGBUTFNfSEVBREVSX1NJWkVgIGJ5dGVzLCBgdGxzX3J4X21zZ19zaXplYCB3aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgaGVhZGVyLiBTbyBzdGlsbCwgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCwgaXQgaXMgaGFuZGxlZCBjb3JyZWN0bHkuCgpBbmQsIHdoYXQgYWJvdXQgYHNrYl9jb3B5X2JpdHNgIGZhaWxpbmc/IEl0IGhhcyBhIGBXQVJOX09OX09OQ0VgLCBidXQgaXQgc2hvdWxkbiYjMzk7dCBmYWlsIGJlY2F1c2UgYGluX3NrYmAgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGF0IGxlYXN0IGBjaHVua2AgYnl0ZXMgc3RhcnRpbmcgYXQgYG9mZnNldGAuIEl0IHNob3VsZCBzdWNjZWVkLCBzbyBubyBpc3N1ZSB0aGVyZS4KCk92ZXJhbGwsIGNvbnNpZGVyaW5nIGFsbCB0aGUgY2FzZXMsIEkgYW0gbm90IHNlZWluZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZC4gVGhlIGNvcHkgcHJvY2VzcyBoYW5kbGVzIGNhc2VzIHdpdGggc21hbGxlciBjaHVua3MgY29ycmVjdGx5LCBhbmQgYHNrYl9jb3B5X2JpdHNgIHNob3VsZCBhbHdheXMgc3VjY2VlZC4gVGhpcyBsb29rcyBzb3VuZC4gSSB3aWxsIG1vdmUgb24gdG8gY2hlY2tpbmcgYHRsc19zdHJwX2NvcHlpbl9za2JgIG5vdy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODYsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI4NjpcdHN0YXRpYyBpbnQgdGxzX3N0cnBfY29weWluX3NrYihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiAyODc6XHRcdFx0XHQgICAgICAgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgdW5zaWduZWQgaW50IG9mZnNldCxcbiAyODg6XHRcdFx0XHQgICAgICAgc2l6ZV90IGluX2xlbilcbiAyODk6XHR7XG4gMjkwOlx0XHRzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwgKmZpcnN0LCAqbGFzdDtcbiAyOTE6XHRcdHN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNoaW5mbztcbiAyOTI6XHRcdHNpemVfdCBjaHVuaztcbiAyOTM6XHRcdGludCBzejtcbiAyOTQ6XHRcbiAyOTU6XHRcdGlmIChzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbilcbiAyOTY6XHRcdFx0Y2h1bmsgPSBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiAtIHNrYi1cdTAwM2VsZW47XG4gMjk3Olx0XHRlbHNlXG4gMjk4Olx0XHRcdGNodW5rID0gVExTX01BWF9QQVlMT0FEX1NJWkUgJiM0MzsgUEFHRV9TSVpFO1xuIDI5OTpcdFx0Y2h1bmsgPSBtaW4oY2h1bmssIGluX2xlbik7XG4gMzAwOlx0XG4gMzAxOlx0XHRuc2tiID0gdGxzX3N0cnBfc2tiX2NvcHkoc3RycCwgaW5fc2tiLCBvZmZzZXQsIGNodW5rKTtcbiAzMDI6XHRcdGlmICghbnNrYilcbiAzMDM6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMzA0Olx0XG4gMzA1Olx0XHRzaGluZm8gPSBza2Jfc2hpbmZvKHNrYik7XG4gMzA2Olx0XHRpZiAoIXNoaW5mby1cdTAwM2VmcmFnX2xpc3QpIHtcbiAzMDc6XHRcdFx0c2hpbmZvLVx1MDAzZWZyYWdfbGlzdCA9IG5za2I7XG4gMzA4Olx0XHRcdG5za2ItXHUwMDNlcHJldiA9IG5za2I7XG4gMzA5Olx0XHR9IGVsc2Uge1xuIDMxMDpcdFx0XHRmaXJzdCA9IHNoaW5mby1cdTAwM2VmcmFnX2xpc3Q7XG4gMzExOlx0XHRcdGxhc3QgPSBmaXJzdC1cdTAwM2VwcmV2O1xuIDMxMjpcdFx0XHRsYXN0LVx1MDAzZW5leHQgPSBuc2tiO1xuIDMxMzpcdFx0XHRmaXJzdC1cdTAwM2VwcmV2ID0gbnNrYjtcbiAzMTQ6XHRcdH1cbiAzMTU6XHRcbiAzMTY6XHRcdHNrYi1cdTAwM2VsZW4gJiM0Mzs9IGNodW5rO1xuIDMxNzpcdFx0c2tiLVx1MDAzZWRhdGFfbGVuICYjNDM7PSBjaHVuaztcbiAzMTg6XHRcbiAzMTk6XHRcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pIHtcbiAzMjA6XHRcdFx0c3ogPSB0bHNfcnhfbXNnX3NpemUoc3RycCwgc2tiKTtcbiAzMjE6XHRcdFx0aWYgKHN6IFx1MDAzYyAwKVxuIDMyMjpcdFx0XHRcdHJldHVybiBzejtcbiAzMjM6XHRcbiAzMjQ6XHRcdFx0LyogV2UgbWF5IGhhdmUgb3Zlci1yZWFkLCBzeiA9PSAwIGlzIGd1YXJhbnRlZWQgdW5kZXItcmVhZCAqL1xuIDMyNTpcdFx0XHRpZiAodW5saWtlbHkoc3ogXHUwMDI2XHUwMDI2IHN6IFx1MDAzYyBza2ItXHUwMDNlbGVuKSkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNTU4NQoJCQkJCQkJb3V0cHV0OiAyOTYKCQkJCQkJCXRob3VnaHRzOiAxMTE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBUTFMgUmVjZWl2ZSBRdWV1ZSBMb2dpYyBCdWcgRml4KioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhIGZ1bmN0aW9uYWwgYnVnLCBub3QgYSBtZW1vcnkgc2FmZXR5IGlzc3VlLiBUaGUgY29yZSBvZiB0aGUgcHJvYmxlbSBsaWVzIGluIGhvdyB0aGUgVExTIHN0YWNrIGhhbmRsZXMgb3ZlcmxhcHBpbmcgVENQIHNlZ21lbnRzIGluIHRoZSByZWNlaXZlIHF1ZXVlLiAgYHRsc19zdHJwX2NvcHlpbl9za2JgIHVzZXMgYHRsc19zdHJwX3NrYl9jb3B5YCB3aGljaCBhbGxvY2F0ZXMgYW5kIGNvcGllcyBkYXRhIGludG8gYSBuZXcgU0tCLCBhcHBlbmRzIGl0IHRvIGBmcmFnX2xpc3RgLCBhbmQgdGhlbiBjYWxscyBgdGxzX3J4X21zZ19zaXplYC4gIFRoZSBwcm9ibGVtIGlzIGBza2JfY29weV9iaXRzYCBpdGVyYXRpbmcgb3ZlciB0aGlzIGBmcmFnX2xpc3RgIGNvbnRhaW5pbmcgcG90ZW50aWFsbHkgb3ZlcmxhcHBpbmcgU0tCcy4gVGhpcyBvdmVybGFwIGxlYWRzIHRvIGB0bHNfcnhfbXNnX3NpemVgIHJlYWRpbmcgYSBjb3JydXB0ZWQgVExTIGhlYWRlciwgYmVjYXVzZSBgc2tiX2NvcHlfYml0c2AgYmxpbmRseSBjb3BpZXMgYml0cyBmcm9tIHRob3NlIG92ZXJsYXBwaW5nIFNLQnMsIHRodXMgcmVzdWx0aW5nIGluIGFuIGVycm9yIGFuZCBhbiBhYm9ydGVkIGNvbm5lY3Rpb24uCgpUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIGNoZWNrIHVzaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmJlZm9yZSogY2FsbGluZyBgdGxzX3J4X21zZ19zaXplYC4gVGhpcyBpcyBrZXkuIElmIHRoZSBxdWV1ZSBpcyBkZWVtZWQgJiMzNDtPSyYjMzQ7IChubyBvdmVybGFwcywgY29uc2lzdGVudCBkZWNyeXB0ZWQgc3RhdHVzKSwgdGhlIGV4aXN0aW5nIGxvZ2ljIHByb2NlZWRzLiBJZiB0aGUgcXVldWUgaXMgKm5vdCogT0ssIHRoZSBjb2RlIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weWAgd2hpY2ggbGV2ZXJhZ2VzIGB0Y3BfcmVhZF9zb2NrYCB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBvdmVybGFwcGluZyBzZWdtZW50cy4gIGB0Y3BfcmVhZF9zb2NrYCBpcyBkZXNpZ25lZCB0byBjb3JyZWN0bHkgbWFuYWdlIHRoZXNlIHNjZW5hcmlvcyBhbmQgcmVhZCB0aGUgYXBwcm9wcmlhdGUgZGF0YS4KCk5vdywgbGV0JiMzOTtzIGFkZHJlc3MgdGhlIG1lbW9yeSBzYWZldHkgY29uY2VybnM6CgoqICAgKipVbmluaXRpYWxpemVkIG1lbW9yeSByZWFkcz8qKiAgTm8uIFRoZSBkYXRhIGNvcGllZCBieSBgc2tiX2NvcHlfYml0c2AgKmlzKiBpbml0aWFsaXplZCwgYWxiZWl0IGluY29ycmVjdGx5IGR1ZSB0byB0aGUgb3ZlcmxhcC4gVGhlIGNvZGUgaXRzZWxmIGlzbiYjMzk7dCBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSB1bmluaXRpYWxpemVkIHJlZ2lvbnMgb2YgbWVtb3J5LgoqICAgKipPdXQtb2YtYm91bmRzIHJlYWRzPyoqIE5vLiBBZ2FpbiwgdGhlIHByb2JsZW0gaXMgd2l0aCB0aGUgZGF0YSBiZWluZyByZWFkLCBub3QgdGhlIGF0dGVtcHQgdG8gcmVhZCBpdCBvdXQgb2YgYm91bmRzLiBUaGUgYnVmZmVycyBpbnZvbHZlZCBhcmUgcHJvcGVybHkgYWxsb2NhdGVkLgoqICAgKipNZW1vcnkgc2FmZXR5IGlzc3VlcyBpbiBnZW5lcmFsPyoqIE5vLiBUaGUgY29yZSBvZiB0aGUgaXNzdWUgaXMgYSBsb2dpY2FsIGZsYXcgaW4gaG93IHRoZSBUTFMgbGF5ZXIgaGFuZGxlcyBvdmVybGFwcGluZyBzZWdtZW50cywgbm90IGEgbWVtb3J5IGNvcnJ1cHRpb24gdnVsbmVyYWJpbGl0eS4KKiAgICoqS01TQU4vS0FTQU4/KiogTmVpdGhlciB3b3VsZCBkZXRlY3QgYW55dGhpbmcgaGVyZSwgcHJlY2lzZWx5IGJlY2F1c2UgdGhlIGNvZGUgaXMgbm90IGRvaW5nIGFueXRoaW5nIHRoYXQgd291bGQgdHJpZ2dlciB0aG9zZSBzYW5pdGl6ZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcuCgpUaGVuIEkgY29uc2lkZXJlZCB0aGUgY2FzZSB3aGVyZSBgdGxzX3J4X21zZ19zaXplYCBjb21wdXRlZCBhIGh1Z2UgYHN6YCwgbGVhZGluZyB0byBsYXJnZSBtZW1vcnkgYWxsb2NhdGlvbnMuICBFdmVuIGlmIGB0bHNfcnhfbXNnX3NpemVgIHJlYWRzIGEgY29ycnVwdGVkIGhlYWRlciBhbmQgcmV0dXJucyBhIGh1Z2UgYHN6YCwgdGhlIHJlc3VsdGluZyBhbGxvY2F0aW9uIHZpYSBgdGxzX3N0cnBfcmVhZF9jb3B5YCBpcyBib3VuZGVkIGJ5IGBUTFNfTUFYX1BBWUxPQURfU0laRSAmIzQzOyBjaXBoZXJfb3ZlcmhlYWQgJiM0MzsgcHJvdC0mZ3Q7dGFpbF9zaXplYC4gVGhhdCYjMzk7cyBhcm91bmQgMTZLQiB3aGljaCBpcyBub3QgdW51c3VhbCwgaXQmIzM5O3MganVzdCBhIGZldyBwYWdlcywgc28gbm90IGEgbWVtb3J5IGV4aGF1c3Rpb24gcHJvYmxlbSBlaXRoZXIuCgpJZiBgc3pgIGlzIHNtYWxsIGFuZCB0aGUgY2hlY2sgZGV0ZWN0cyB0aGUgb3ZlcmxhcCwgaXQgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBgdGxzX3N0cnBfcmVhZF9jb3B5YCBhbmQgc28gYWdhaW4gbm8gY3Jhc2guCgpUaGVyZWZvcmUsIHRoZSBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG1lbW9yeSBzYWZldHkgaXNzdWVzIGF0IGFsbDsgaXQmIzM5O3MgcHVyZWx5IGEgZnVuY3Rpb25hbCBidWcgZml4LgoKVGhlcmVmb3JlLCBJJiMzOTttIGNvbmZpZGVudCBpbiBjb25jbHVkaW5nIHRoYXQgYE5lZWRzS01TQU5gIHNob3VsZCBiZSBgZmFsc2VgLgoKTGV0IG1lIHJlaXRlcmF0ZSBteSByZWFzb25pbmc6IFRoZSBwYXRjaCBhZGRzIGEgY2hlY2sgKGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIGJlZm9yZSBjYWxsaW5nIHRoZSBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYyBgdGxzX3J4X21zZ19zaXplYC4gIFRoaXMgY2hlY2sgZGV0ZWN0cyB0aGUgb3ZlcmxhcHBpbmcgc2VnbWVudHMuIElmIHRoZSBxdWV1ZSBpcyBiYWQsIGl0IGZhbGxzIGJhY2sgdG8gYSBzYWZlciBwYXRoIHVzaW5nIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBUaGVyZSBhcmUgbm8gbWVtb3J5IHNhZmV0eSBpc3N1ZXMuICBUaGUgZGF0YSByZWFkIGlzIGluaXRpYWxpemVkIGFuZCB0aGVyZSBhcmUgbm8gb3V0IG9mIGJvdW5kcyByZWFkcy4gVGhpcyBpcyBhIGxvZ2ljIGZsYXcgbm90IGEgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWUsIGFuZCBzbyBuZWl0aGVyIEtNU0FOIG5vciBLQVNBTiBzaG91bGQgYmUgZW5hYmxlZC4KCioqRmluYWwgRG91YmxlLUNoZWNrKioKCkxldCYjMzk7cyBxdWlja2x5IGNoZWNrIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuCgpUaGUgbG9vcCBpdGVyYXRlcyB0aHJvdWdoIGBza2JgcywgYW5kIGBUQ1BfU0tCX0NCKHNrYilgIGFjY2Vzc2VzIGBza2ItJmd0O2NiYC4gYHNrYi0mZ3Q7Y2JgIGlzIGluaXRpYWxpemVkIHdoZW4gdGhlIGBza2JgIGlzIHJlY2VpdmVkIGJ5IFRDUCwgc28gbm8gdW5pbml0aWFsaXplZCByZWFkcy4KCkFsc28gYHNrYl9jbXBfZGVjcnlwdGVkYCBhY2Nlc3NlcyBgc2tiLSZndDtkZWNyeXB0ZWRgLiBgZGVjcnlwdGVkYCBpcyBhIGJpdGZpZWxkIGluIGBza2JgIHRoYXQmIzM5O3MgaW5pdGlhbGl6ZWQuCgpTbyBhZ2FpbiwgZXZlcnl0aGluZyBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4gSSYjMzk7bSB2ZXJ5IGNvbmZpZGVudCBpbiB0aGlzIGFzc2Vzc21lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIHRoZSBUTFMgc3RycGFyc2VyIHdoZXJlIGB0bHNfcnhfbXNnX3NpemUoKWAgY291bGQgYmUgY2FsbGVkIG9uIGEgVENQIHJlY2VpdmUgcXVldWUgY29udGFpbmluZyBvdmVybGFwcGluZyBzZWdtZW50cyAoZS5nLiwgZHVlIHRvIHJldHJhbnNtaXNzaW9ucykuIFdoZW4gdGhpcyBoYXBwZW5zLCBgc2tiX2NvcHlfYml0cygpYCBibGluZGx5IGl0ZXJhdGVzIG92ZXIgdGhlIGBmcmFnX2xpc3RgIGFuZCBtYXkgcmVhZCBvdmVybGFwcGluZyBieXRlcywgcmVzdWx0aW5nIGluIGEgY29ycnVwdGVkIFRMUyBoZWFkZXIuIFRoaXMgY29ycnVwdGVkIGhlYWRlciBjYXVzZXMgYHRsc19yeF9tc2dfc2l6ZSgpYCB0byByZXR1cm4gYW4gZXJyb3IgKGxpa2UgYC1FSU5WQUxgKSwgd2hpY2ggc3B1cmlvdXNseSBhYm9ydHMgdGhlIFRMUyBjb25uZWN0aW9uLlxuXG5CeSBjYWxsaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9vaygpYCBiZWZvcmUgcmVhZGluZyB0aGUgaGVhZGVyLCB0aGUgY29kZSBkZXRlY3RzIG92ZXJsYXBwaW5nIHNlZ21lbnRzIG9yIG1peGVkIGRlY3J5cHRlZCBzdGF0dXMgYW5kIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weSgpYC4gVGhpcyBmYWxsYmFjayB1c2VzIGB0Y3BfcmVhZF9zb2NrKClgIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIG92ZXJsYXBzIGFuZCBjb3B5IHRoZSBsb2dpY2FsIHN0cmVhbSBpbnRvIGEgbGluZWFyIGJ1ZmZlci5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnZvbHZlZC4gVGhlIGJ5dGVzIHJlYWQgYnkgYHNrYl9jb3B5X2JpdHMoKWAgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG5ldHdvcmsgZGF0YTsgdGhleSBhcmUgc2ltcGx5IHRoZSB3cm9uZyBieXRlcyBkdWUgdG8gdGhlIG92ZXJsYXBzLiBUaGVyZWZvcmUsIEtNU0FOICh3aGljaCBkZXRlY3RzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlKSBpcyBub3QgYXBwbGljYWJsZSBoZXJlLiBTdGFuZGFyZCBLQVNBTiB3b3VsZCBhbHNvIG5vdCBkZXRlY3QgYW55dGhpbmcsIGFzIHRoZXJlIGlzIG5vIG1lbW9yeSBjb3JydXB0aW9uIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXG5cbkJ5IGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKClgIGJlZm9yZSByZWFkaW5nIHRoZSBoZWFkZXIsIHRoZSBjb2RlIGRldGVjdHMgb3ZlcmxhcHBpbmcgc2VnbWVudHMgb3IgbWl4ZWQgZGVjcnlwdGVkIHN0YXR1cyBhbmQgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5KClgLiBUaGlzIGZhbGxiYWNrIHVzZXMgYHRjcF9yZWFkX3NvY2soKWAgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgb3ZlcmxhcHMgYW5kIGNvcHkgdGhlIGxvZ2ljYWwgc3RyZWFtIGludG8gYSBsaW5lYXIgYnVmZmVyLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjI4LjkzNjE0MDA4N1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNDA2Mzc4NjE1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUTFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0bHNfc3RycF9jaGVja19yY3ZcIixcbiAgICBcInRsc19zd19yZWN2bXNnXCIsXG4gICAgXCJ0bHNfc3RycF9kYXRhX3JlYWR5XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiB0aGUgVExTIHN0cnBhcnNlciB3aGVyZSBgdGxzX3J4X21zZ19zaXplKClgIGNvdWxkIGJlIGNhbGxlZCBvbiBhIFRDUCByZWNlaXZlIHF1ZXVlIGNvbnRhaW5pbmcgb3ZlcmxhcHBpbmcgc2VnbWVudHMgKGUuZy4sIGR1ZSB0byByZXRyYW5zbWlzc2lvbnMpLiBXaGVuIHRoaXMgaGFwcGVucywgYHNrYl9jb3B5X2JpdHMoKWAgYmxpbmRseSBpdGVyYXRlcyBvdmVyIHRoZSBgZnJhZ19saXN0YCBhbmQgbWF5IHJlYWQgb3ZlcmxhcHBpbmcgYnl0ZXMsIHJlc3VsdGluZyBpbiBhIGNvcnJ1cHRlZCBUTFMgaGVhZGVyLiBUaGlzIGNvcnJ1cHRlZCBoZWFkZXIgY2F1c2VzIGB0bHNfcnhfbXNnX3NpemUoKWAgdG8gcmV0dXJuIGFuIGVycm9yIChsaWtlIGAtRUlOVkFMYCksIHdoaWNoIHNwdXJpb3VzbHkgYWJvcnRzIHRoZSBUTFMgY29ubmVjdGlvbi5cXG5cXG5CeSBjYWxsaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9vaygpYCBiZWZvcmUgcmVhZGluZyB0aGUgaGVhZGVyLCB0aGUgY29kZSBkZXRlY3RzIG92ZXJsYXBwaW5nIHNlZ21lbnRzIG9yIG1peGVkIGRlY3J5cHRlZCBzdGF0dXMgYW5kIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weSgpYC4gVGhpcyBmYWxsYmFjayB1c2VzIGB0Y3BfcmVhZF9zb2NrKClgIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIG92ZXJsYXBzIGFuZCBjb3B5IHRoZSBsb2dpY2FsIHN0cmVhbSBpbnRvIGEgbGluZWFyIGJ1ZmZlci5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIFRMUyBzdHJlYW0gcGFyc2VyIGxvZ2ljIChgdGxzX3N0cnBfcmVhZF9zb2NrYCBhbmQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCkgdG8gY29ycmVjdGx5IGNoZWNrIGlmIHRoZSByZWNlaXZlIHF1ZXVlIGhhcyBlbm91Z2ggZGF0YSBmb3IgdGhlIFRMUyBoZWFkZXIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZCBpdC4gVGhpcyBpcyBjb3JlIG5ldHdvcmsgcmVjZWl2ZSBsb2dpYyBmb3IgVExTIHNvY2tldHMgYW5kIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIGByZWN2bXNnYCBvbiBUTFMgc29ja2V0cy4gSXQgaXMgd29ydGggZnV6emluZyB0byBlbnN1cmUgdGhlIHN0cmVhbSBwYXJzZXIgaGFuZGxlcyBmcmFnbWVudGVkIG9yIHNob3J0IFRMUyByZWNvcmRzIGNvcnJlY3RseSB3aXRob3V0IG1lbW9yeSBjb3JydXB0aW9uIG9yIHN0YWxscy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6MjguOTM2MTQ3MDE3WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTkzNDQ3MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhNmIwNWI3ZTM1N2QxM2I1OTdlZjhjYjIyNmY0ZmFiNDBmZTNiOTIwXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgQXVnIDcgMjA6Mjk6MjcgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbmV0L3Rscy90bHNfc3RycC5jIGIvbmV0L3Rscy90bHNfc3RycC5jXFxuaW5kZXggNjFiMTBjNjk3ZWNjYi4uNjRkNWRlYTkwNTQwMyAxMDA2NDRcXG4tLS0gYS9uZXQvdGxzL3Rsc19zdHJwLmNcXG4rKysgYi9uZXQvdGxzL3Rsc19zdHJwLmNcXG5AQCAtNDMwLDkgKzQzMCw5IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIHFzaG9ydClcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLXN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbitzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBsZW4pXFxuIHtcXG4tXFx0dW5zaWduZWQgaW50IGxlbiA9IHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW47XFxuIFxcdHN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjtcXG4gXFx0dTMyIHNlcTtcXG4gXFxuQEAgLTUyNSw2ICs1MjUsMTIgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuIFxcbiBcXHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XFxuIFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuK1xcdFxcdGlmIChpbnEgXFx1MDAzYyBUTFNfSEVBREVSX1NJWkUpXFxuK1xcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuK1xcbitcXHRcXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBUTFNfSEVBREVSX1NJWkUpKVxcbitcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4rXFxuIFxcdFxcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXFx1MDAzZWFuY2hvcik7XFxuIFxcdFxcdGlmIChzeiBcXHUwMDNjIDApXFxuIFxcdFxcdFxcdHJldHVybiBzejtcXG5AQCAtNTM1LDcgKzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbiBcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKVxcbitcXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pKVxcbiBcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4gXFxuIFxcdFdSSVRFX09OQ0Uoc3RycC1cXHUwMDNlbXNnX3JlYWR5LCAxKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6MjkuNDM2NDE4OTNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyODAyMjYxODgxNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUTFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0bHNfc3RycF9jaGVja19yY3ZcIixcbiAgICBcInRsc19zd19yZWN2bXNnXCIsXG4gICAgXCJ0bHNfc3RycF9kYXRhX3JlYWR5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIFRMUyBzdHJlYW0gcGFyc2VyIGxvZ2ljIChgdGxzX3N0cnBfcmVhZF9zb2NrYCBhbmQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCkgdG8gY29ycmVjdGx5IGNoZWNrIGlmIHRoZSByZWNlaXZlIHF1ZXVlIGhhcyBlbm91Z2ggZGF0YSBmb3IgdGhlIFRMUyBoZWFkZXIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZCBpdC4gVGhpcyBpcyBjb3JlIG5ldHdvcmsgcmVjZWl2ZSBsb2dpYyBmb3IgVExTIHNvY2tldHMgYW5kIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIGByZWN2bXNnYCBvbiBUTFMgc29ja2V0cy4gSXQgaXMgd29ydGggZnV6emluZyB0byBlbnN1cmUgdGhlIHN0cmVhbSBwYXJzZXIgaGFuZGxlcyBmcmFnbWVudGVkIG9yIHNob3J0IFRMUyByZWNvcmRzIGNvcnJlY3RseSB3aXRob3V0IG1lbW9yeSBjb3JydXB0aW9uIG9yIHN0YWxscy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYTZiMDViN2UzNTdkMTNiNTk3ZWY4Y2IyMjZmNGZhYjQwZmUzYjkyMFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDcgMjA6Mjk6MjcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvdGxzL3Rsc19zdHJwLmMgYi9uZXQvdGxzL3Rsc19zdHJwLmNcbmluZGV4IDYxYjEwYzY5N2VjY2IuLjY0ZDVkZWE5MDU0MDMgMTAwNjQ0XG4tLS0gYS9uZXQvdGxzL3Rsc19zdHJwLmNcbisrKyBiL25ldC90bHMvdGxzX3N0cnAuY1xuQEAgLTQzMCw5ICs0MzAsOSBAQCBzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBxc2hvcnQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGJvb2wgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4rc3RhdGljIGJvb2wgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGxlbilcbiB7XG4tXHR1bnNpZ25lZCBpbnQgbGVuID0gc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW47XG4gXHRzdHJ1Y3Qgc2tfYnVmZiAqZmlyc3QsICpza2I7XG4gXHR1MzIgc2VxO1xuIFxuQEAgLTUyNSw2ICs1MjUsMTIgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gXG4gXHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XG4gXHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG4rXHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbitcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuK1xuK1x0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIFRMU19IRUFERVJfU0laRSkpXG4rXHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4rXG4gXHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXHUwMDNlYW5jaG9yKTtcbiBcdFx0aWYgKHN6IFx1MDAzYyAwKVxuIFx0XHRcdHJldHVybiBzejtcbkBAIC01MzUsNyArNTQxLDcgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gXHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcbiBcdH1cbiBcbi1cdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCkpXG4rXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSlcbiBcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4gXG4gXHRXUklURV9PTkNFKHN0cnAtXHUwMDNlbXNnX3JlYWR5LCAxKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjI5LjQzNjQyMTc5WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDU0ODU4MDMzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFRMUyBTdHJpcCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBuZXQvdGxzL3Rsc19zdHJwLmNgIGFuZCBpbW1lZGlhdGVseSwgSSBzZWUgYSBzaWduaWZpY2FudCBjaGFuZ2UgaW4gaG93IHdlJ3JlIGhhbmRsaW5nIHF1ZXVlIGNoZWNrcy4gVGhlIHByaW1hcnkgbW9kaWZpY2F0aW9uIHJldm9sdmVzIGFyb3VuZCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBJbnN0ZWFkIG9mIGNhbGN1bGF0aW5nIHRoZSBsZW5ndGggaW50ZXJuYWxseSwgaXQgbm93IGFjY2VwdHMgYSBgbGVuYCBwYXJhbWV0ZXIuIFRoaXMgaXMgaW50ZXJlc3RpbmcsIGl0IGltcGxpZXMgd2UncmUgdHJ5aW5nIHRvIGNlbnRyYWxpemUgb3Igb3B0aW1pemUgaG93IHRoaXMgbGVuZ3RoIGlzIGRldGVybWluZWQuXG5cblRoZSBvdGhlciBrZXkgY2hhbmdlIGlzIHdpdGhpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYC4gVGhlIHBhdGNoIG1vdmVzIHRoZSBjYWxsIHRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmJlZm9yZSogd2UgY2FsbCBgdGxzX3J4X21zZ19zaXplYC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBjbGVhciwgd2UgbmVlZCB0byBlbnN1cmUgdGhlIHF1ZXVlIGhhcyB0aGUgcmVzb3VyY2VzIG5lZWRlZCB0byByZWFkIHRoZSBUTFMgaGVhZGVyICpiZWZvcmUqIHdlIGV2ZW4gYXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIGhlYWRlcidzIHNpemUuIEl0J3MgYSBwcmVlbXB0aXZlIHNhZmV0eSBjaGVjay4gSWYgdGhlIHF1ZXVlIGlzbid0IHN1aXRhYmxlLCBpdCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBUaGlzIG1ha2VzIHNlbnNlLCBpdCdzIGEgZ29vZCBmYWlsLXNhZmUuXG5cblRpbWUgdG8gZGl2ZSBkZWVwZXIuIEknbGwgdXNlIGBncmVwcGVyYCB0byBsb2NhdGUgYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaW4gdGhlIGZpbGUuIEkgd2FudCB0byBzZWUgaG93IHRoZXNlIGNoYW5nZXMgYXJlIGltcGFjdGluZyB0aGUgb3ZlcmFsbCBmbG93LCBzcGVjaWZpY2FsbHkgaG93IGBsZW5gIGlzIGJlaW5nIGNhbGN1bGF0ZWQgYW5kIHBhc3NlZCwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIHNpZGUgZWZmZWN0cyB0byBiZSBhd2FyZSBvZi4gSSdsbCBuZWVkIHRvIHZlcmlmeSB0aGF0IHRoaXMgY2hhbmdlIGlzIGluZGVlZCBhbiBpbXByb3ZlbWVudCwgYW5kIGhhc24ndCBpbnRyb2R1Y2VkIGFueSB1bmludGVuZGVkIGNvbnNlcXVlbmNlcyByZWxhdGVkIHRvIHJhY2UgY29uZGl0aW9ucyBvciBidWZmZXIgb3ZlcmZsb3dzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzcwLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6MzMuOTg1MDA1NTgzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3MjIyMTk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRsc19zdHJwX3JlYWRfc29ja1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Rscy90bHNfc3RycC5jPTQ4Mz1ib29sIHRsc19zdHJwX21zZ19sb2FkKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGZvcmNlX3JlZnJlc2gpXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTExLS8qIENhbGxlZCB3aXRoIGxvY2sgaGVsZCBvbiBsb3dlciBzb2NrZXQgKi9cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTEyOnN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbm5ldC90bHMvdGxzX3N0cnAuYy01MTMte1xcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTU1Nz12b2lkIHRsc19zdHJwX2NoZWNrX3JjdihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBhbm5vdW5jZSlcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NjEtXFxubmV0L3Rscy90bHNfc3RycC5jOjU2MjpcXHRpZiAodGxzX3N0cnBfcmVhZF9zb2NrKHN0cnApID09IC1FTk9NRU0pXFxubmV0L3Rscy90bHNfc3RycC5jLTU2My1cXHRcXHRxdWV1ZV93b3JrKHRsc19zdHJwX3dxLCBcXHUwMDI2c3RycC1cXHUwMDNld29yayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjM0LjA2MjIzMzU4WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjg5MzE1MjE2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyBgdGxzX3N0cnBfcmVhZF9zb2NrYCdzIENhbGwgQ2hhaW4qKlxuXG5BbHJpZ2h0LCBzbyBgdGxzX3N0cnBfcmVhZF9zb2NrYCBpcyBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCBtZWFucyBpdHMgc2NvcGUgaXMgbGltaXRlZCwgbWFraW5nIGl0IGVhc2llciB0byByZWFzb24gYWJvdXQsIGJ1dCBhbHNvIHBvdGVudGlhbGx5IGhpZGVzIGl0cyB1c2UuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQncyB0cmFjZSBpdHMgdXNhZ2UuIEkga25vdyBpdCdzIGNhbGxlZCBieSBgdGxzX3N0cnBfY2hlY2tfcmN2YCwgd2hpY2ggaGVscHMgYSBsb3QuIEJ1dCBJIG5lZWQgdGhlIHdob2xlIHBpY3R1cmUuIFNvIHRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBzZWUgKndobyogaXMgY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcmN2YC4gRmlndXJpbmcgb3V0IHRoYXQgY2FsbGluZyBoaWVyYXJjaHkgaXMgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBmdW5jdGlvbidzIHBsYWNlIGluIHRoZSBicm9hZGVyIHN5c3RlbSBhbmQgYW55IHBvdGVudGlhbCBzaWRlIGVmZmVjdHMgb2YgaXRzIGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE4NywiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjM2Ljk1NTM4ODE2MVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3OTEzOTQ4NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0bHNfc3RycF9jaGVja19yY3ZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Rscy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Rscy90bHMuaD0xOTQ9dm9pZCB0bHNfc3RycF9kYXRhX3JlYWR5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKTtcXG5uZXQvdGxzL3Rscy5oLTE5NS1cXG5uZXQvdGxzL3Rscy5oOjE5Njp2b2lkIHRsc19zdHJwX2NoZWNrX3JjdihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBhbm5vdW5jZSk7XFxubmV0L3Rscy90bHMuaC0xOTctdm9pZCB0bHNfc3RycF9tc2dfY29uc3VtZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCk7XFxuLS1cXG5uZXQvdGxzL3Rsc19tYWluLmM9NjI3PXN0YXRpYyBpbnQgZG9fdGxzX3NldHNvY2tvcHRfY29uZihzdHJ1Y3Qgc29jayAqc2ssIHNvY2twdHJfdCBvcHR2YWwsXFxuLS1cXG5uZXQvdGxzL3Rsc19tYWluLmMtNzc0LVxcbm5ldC90bHMvdGxzX21haW4uYzo3NzU6XFx0XFx0dGxzX3N0cnBfY2hlY2tfcmN2KFxcdTAwMjZyeF9jdHgtXFx1MDAzZXN0cnAsIHRydWUpO1xcbm5ldC90bHMvdGxzX21haW4uYy03NzYtXFx0fVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTUxMj1zdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NTYtICovXFxubmV0L3Rscy90bHNfc3RycC5jOjU1Nzp2b2lkIHRsc19zdHJwX2NoZWNrX3JjdihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBhbm5vdW5jZSlcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTU4LXtcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYz01Njk9dm9pZCB0bHNfc3RycF9kYXRhX3JlYWR5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTU4Mi1cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTgzOlxcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTg0LX1cXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYz01ODY9c3RhdGljIHZvaWQgdGxzX3N0cnBfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTkxLVxcdGxvY2tfc29jayhzdHJwLVxcdTAwM2Vzayk7XFxubmV0L3Rscy90bHNfc3RycC5jOjU5MjpcXHR0bHNfc3RycF9jaGVja19yY3Yoc3RycCwgdHJ1ZSk7XFxubmV0L3Rscy90bHNfc3RycC5jLTU5My1cXHRyZWxlYXNlX3NvY2soc3RycC1cXHUwMDNlc2spO1xcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTU5Ni0vKiBSZWxlYXNlIHRoZSBjdXJyZW50IHJlY29yZCB3aXRob3V0IHRyaWdnZXJpbmcgYSBjaGVjayBmb3IgdGhlXFxubmV0L3Rscy90bHNfc3RycC5jOjU5NzogKiBuZXh0IHJlY29yZC4gQ2FsbGVycyBtdXN0IGludm9rZSB0bHNfc3RycF9jaGVja19yY3YoKSBiZWZvcmVcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTk4LSAqIHJlbGVhc2luZyB0aGUgc29ja2V0IGxvY2ssIG9yIHF1ZXVlZCBkYXRhIHdpbGwgc3RhbGwgdW50aWwgdGhlXFxuLS1cXG5uZXQvdGxzL3Rsc19zdy5jPTEwOTU9dGxzX3J4X3JlY193YWl0KHN0cnVjdCBzb2NrICpzaywgYm9vbCBub25ibG9jaywgYm9vbCByZWxlYXNlZCwgYm9vbCBoYXNfY29waWVkKVxcbi0tXFxubmV0L3Rscy90bHNfc3cuYy0xMTI0LVxcdFxcdFxcdCAqL1xcbm5ldC90bHMvdGxzX3N3LmM6MTEyNTpcXHRcXHRcXHR0bHNfc3RycF9jaGVja19yY3YoXFx1MDAyNmN0eC1cXHUwMDNlc3RycCwgZmFsc2UpO1xcbm5ldC90bHMvdGxzX3N3LmMtMTEyNi1cXHRcXHRcXHRpZiAodGxzX3N0cnBfbXNnX3JlYWR5KGN0eCkpXFxuLS1cXG5uZXQvdGxzL3Rsc19zdy5jPTE2MjQ9c3RhdGljIHZvaWQgdGxzX3J4X3JlY19kb25lKHN0cnVjdCB0bHNfc3dfY29udGV4dF9yeCAqY3R4KVxcbi0tXFxubmV0L3Rscy90bHNfc3cuYy0xNjI2LVxcdHRsc19zdHJwX21zZ19jb25zdW1lKFxcdTAwMjZjdHgtXFx1MDAzZXN0cnApO1xcbm5ldC90bHMvdGxzX3N3LmM6MTYyNzpcXHR0bHNfc3RycF9jaGVja19yY3YoXFx1MDAyNmN0eC1cXHUwMDNlc3RycCwgZmFsc2UpO1xcbm5ldC90bHMvdGxzX3N3LmMtMTYyOC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjM3LjAzNDUzMzUzOFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3NTUwNTAyNTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb24qKlxuXG5Pa2F5LCBzbyB0aGlzIGlzIGRlZmluaXRlbHkgY29yZSBUTFMgcmVjZWl2ZSBsb2dpYywgd2hpY2ggbWVhbnMgaXQncyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gR2l2ZW4gdGhlIHBhdGNoIG1vZGlmaWVzIGB0bHNfc3RycF9yZWFkX3NvY2tgLCBhbmQgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYHRsc19zdHJwX2NoZWNrX3JjdmAsIHRoYXQncyBhbiBpbW1lZGlhdGUgYXJlYSBvZiBpbnRlcmVzdC4gTm93LCBgdGxzX3N0cnBfY2hlY2tfcmN2YCBpcyBjYWxsZWQgZnJvbSBhIGhhbmRmdWwgb2Ygb3RoZXIgZnVuY3Rpb25zOiBgdGxzX3J4X3JlY193YWl0YCwgYHRsc19yeF9yZWNfZG9uZWAsIGB0bHNfc3RycF93b3JrYCwgYHRsc19zdHJwX2RhdGFfcmVhZHlgLCBhbmQgYGRvX3Rsc19zZXRzb2Nrb3B0X2NvbmZgLlxuXG5Jbml0aWFsbHksIEkgdGhvdWdodCB0aGUgcHJpbWFyeSBmb2N1cyBzaG91bGQgYmUgb24gdGhlIGNhbGxzIHRvIGB0bHNfc3RycF9jaGVja19yY3ZgLCBgdGxzX3N0cnBfZGF0YV9yZWFkeWAsIGB0bHNfcnhfcmVjX3dhaXRgLCBhbmQgYHRsc19yeF9yZWNfZG9uZWAsIGJ1dCB3YWl0LCBgdGxzX3J4X3JlY193YWl0YCBhbmQgYHRsc19yeF9yZWNfZG9uZWAgYXJlIHN0YXRpYyBmdW5jdGlvbnMuLi4gc28gdGhhdCBjb21wbGljYXRlcyB0aGluZ3MuXG5cbkxldCdzIHN0YXJ0IGJ5IGRpZ2dpbmcgaW50byBgdGxzX3N0cnBfY2hlY2tfcmN2YCBhbmQgYHRsc19zdHJwX2RhdGFfcmVhZHlgIGFuZCBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gT2gsIGFsc28sIHdoYXQgYWJvdXQgYHRsc19zdHJwX21zZ19sb2FkYD8gTWF5YmUgd2Ugc2hvdWxkIGNoZWNrIHdobyBjYWxscyBgdGxzX3N0cnBfcmVhZF9zb2NrYCB0byBzZWUgaWYgd2UgbWlzc2VkIGFueXRoaW5nLiBBaCwgYW5kIGl0IHR1cm5zIG91dCwgYHRsc19zdHJwX3JlYWRfc29ja2AgaXMgb25seSBjYWxsZWQgZnJvbSBgdGxzX3N0cnBfY2hlY2tfcmN2YC5cblxuQWxyaWdodCwgaXQgbG9va3MgbGlrZSBgdGxzX3N0cnBfY2hlY2tfcmN2YCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgc3ltYm9sIHRvIGZvY3VzIG9uIGZvciBub3cuIE5leHQsIEkgc2hvdWxkIGNoZWNrIHRoZSBLY29uZmlnIHRvIHNlZSBob3cgVExTIGlzIGNvbmZpZ3VyZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQzNTUsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6NDEuNzg5NTg3OTc0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2ODg5Mzg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUTFNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Rscy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Rscy9LY29uZmlnLTQtI1xcbm5ldC90bHMvS2NvbmZpZzo1OmNvbmZpZyBUTFNcXG5uZXQvdGxzL0tjb25maWctNi1cXHR0cmlzdGF0ZSBcXFwiVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IHN1cHBvcnRcXFwiXFxuLS1cXG5uZXQvdGxzL0tjb25maWctMTgtXFxubmV0L3Rscy9LY29uZmlnOjE5OmNvbmZpZyBUTFNfREVWSUNFXFxubmV0L3Rscy9LY29uZmlnLTIwLVxcdGJvb2wgXFxcIlRyYW5zcG9ydCBMYXllciBTZWN1cml0eSBIVyBvZmZsb2FkXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo0MS44NjY0ODE3MzFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjg4NTk4Mjk2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHByZXNlbnRlZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIGdpdmVuIG15IGV4cGVydGlzZTpcblxuKipDaGVja2luZyBUTFMgU3RyaXBwaW5nIENvbmZpZ3VyYXRpb24qKlxuXG5BbHJpZ2h0LCB0aGUgY29uZmlndXJhdGlvbiBpbiBxdWVzdGlvbiBpcyBkZWZpbml0ZWx5IHNldCB0byBUTFMuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHdpdGggcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyByZWxhdGVkIHRvIFRMUyBzdHJpcHBpbmcuIFRoZXJlZm9yZSwgbXkgbmV4dCB0aG91Z2h0IGlzIHRvIGludmVzdGlnYXRlIHRoZSBgdGxzX3N0cnBfY2hlY2tfcmN2YCBmdW5jdGlvbi4gVGhhdCdzIGEgc3Ryb25nIGluZGljYXRvci4gSXQncyBsb2NhdGVkIGluIGBuZXQvdGxzL3Rsc19zdHJwLmNgLCB3aGljaCBtYWtlcyBzZW5zZSBhcyB0aGUgbmV0IGRpcmVjdG9yeSBzdWdnZXN0cyBpdCByZWxhdGVzIHRvIG5ldHdvcmsgZnVuY3Rpb25zLiBJIHdhbnQgdG8gY2hlY2sgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBiZWNhdXNlIGl0J3MgaGlnaGx5IGxpa2VseSB0byBob2xkIHRoZSBjb3JlIGxvZ2ljIGZvciB0aGUgVExTIHN0cmlwcGluZyBjaGVjaywgcGFydGljdWxhcmx5IHJlZ2FyZGluZyBpbmNvbWluZyBkYXRhLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgdmFsaWRhdGVzIHJlY2VpdmVkIGRhdGEgaW4gdGhpcyBzcGVjaWZpYyBUTFMgY29uZmlndXJhdGlvbiB0byBpZGVudGlmeSBhbnkgcG90ZW50aWFsIHdlYWtuZXNzZXMuIEknbSBsb29raW5nIGZvciBrbm93biBieXBhc3NlcyBvciBlZGdlIGNhc2VzIGhlcmUsIEknbGwgc2VlIHdoYXQgSSBjYW4gZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTE0MCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjQ1LjE1NTA4MjEzOFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTgxNjIxMTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGxzX3N0cnBfY2hlY2tfcmN2XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90bHMvdGxzX3N0cnAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmM9NTEyPXN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTU1Ni0gKi9cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTU3OnZvaWQgdGxzX3N0cnBfY2hlY2tfcmN2KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGFubm91bmNlKVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NTgte1xcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTU2OT12b2lkIHRsc19zdHJwX2RhdGFfcmVhZHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTgyLVxcbm5ldC90bHMvdGxzX3N0cnAuYzo1ODM6XFx0dGxzX3N0cnBfY2hlY2tfcmN2KHN0cnAsIHRydWUpO1xcbm5ldC90bHMvdGxzX3N0cnAuYy01ODQtfVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTU4Nj1zdGF0aWMgdm9pZCB0bHNfc3RycF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdylcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01OTEtXFx0bG9ja19zb2NrKHN0cnAtXFx1MDAzZXNrKTtcXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTkyOlxcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTkzLVxcdHJlbGVhc2Vfc29jayhzdHJwLVxcdTAwM2Vzayk7XFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTk2LS8qIFJlbGVhc2UgdGhlIGN1cnJlbnQgcmVjb3JkIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGNoZWNrIGZvciB0aGVcXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTk3OiAqIG5leHQgcmVjb3JkLiBDYWxsZXJzIG11c3QgaW52b2tlIHRsc19zdHJwX2NoZWNrX3JjdigpIGJlZm9yZVxcbm5ldC90bHMvdGxzX3N0cnAuYy01OTgtICogcmVsZWFzaW5nIHRoZSBzb2NrZXQgbG9jaywgb3IgcXVldWVkIGRhdGEgd2lsbCBzdGFsbCB1bnRpbCB0aGVcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6NDUuMjUzMjUwODY1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMwMDE4MjQwNzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aGUgZXhwZXJ0OlxuXG4qKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWxseSBFeHBvc2VkIFRMUyBGdW5jdGlvbioqXG5cbk9rYXksIHNvIGB0bHNfc3RycF9jaGVja19yY3ZgIGlzIGVpdGhlciBleHBvcnRlZCBvciwgYXQgdGhlIHZlcnkgbGVhc3QsIG5vdCBkZWNsYXJlZCBhcyBzdGF0aWMuIFRoYXQncyBpbW1lZGlhdGVseSBpbnRlcmVzdGluZzsgaXQgbWVhbnMgaXQncyBwb3RlbnRpYWxseSBhY2Nlc3NpYmxlIG91dHNpZGUgaXRzIGN1cnJlbnQgc2NvcGUuIE15IG5leHQgc3RlcCBpcyB0byBwaW5wb2ludCBpdHMgdXNhZ2Ugd2l0aGluIHRoZSBUTFMgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgdG8gc2VlIGhvdyBpdCBmaXRzIGludG8gdGhlIGRhdGEgcmVjZWl2ZSBwYXRoLiBMZXQncyBkaWcgaW50byBgbmV0L3Rscy90bHNfc3cuY2AgYW5kIHNlYXJjaCBmb3IgdGhlIGB0bHNfc3dfcmVjdm1zZ2AgZnVuY3Rpb24uIEZpbmRpbmcgdGhhdCB3aWxsIGxpa2VseSBnaXZlIG1lIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0IGFuZCBxdWlja2x5IHJldmVhbCBob3cgYHRsc19zdHJwX2NoZWNrX3JjdmAgaXMgaW52b2tlZC4gSXQnbGwgZ2l2ZSBtZSBhIGdvb2QgdW5kZXJzdGFuZGluZyBvZiB3aGVyZSBhbmQgaG93IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhbmQgaXRzIG92ZXJhbGwgaW1wb3J0YW5jZS4gSSdtIGhvcGluZyB0aGlzIHdpbGwgcHJvdmlkZSBlbm91Z2ggY29udGV4dCBmb3IgbWUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZnVuY3Rpb24gaXMgYSBwb2ludCBvZiBjb25jZXJuLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1ODM5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6NDguMjU1MDc3MTUyWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDYxNDcyNTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGxzX3N3X3JlY3Ztc2dcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Rscy90bHNfc3cuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGxzL3Rsc19zdy5jPTE4MDA9c3RhdGljIHZvaWQgdGxzX3J4X3JlYWRlcl91bmxvY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGxzX3N3X2NvbnRleHRfcnggKmN0eClcXG4tLVxcbm5ldC90bHMvdGxzX3N3LmMtMTgwNS1cXG5uZXQvdGxzL3Rsc19zdy5jOjE4MDY6aW50IHRsc19zd19yZWN2bXNnKHN0cnVjdCBzb2NrICpzayxcXG5uZXQvdGxzL3Rsc19zdy5jLTE4MDctXFx0XFx0ICAgc3RydWN0IG1zZ2hkciAqbXNnLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo0OC4zNjEyMjg0MjhaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ1ODg2ODg3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgVExTIFNvY2tldCBSZWNlcHRpb24gVnVsbmVyYWJpbGl0aWVzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgVExTIHNvY2tldCBoYW5kbGluZywgc3BlY2lmaWNhbGx5IHRoZSByZWNlcHRpb24gcHJvY2Vzcy4gYHRsc19zd19yZWN2bXNnYCBpcyB0aGUga2V5IGZ1bmN0aW9uIGhlcmUsIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgYW5hbHlzaXMuIEFuZCBJIHNob3VsZCBhbHNvIGtlZXAgYW4gZXllIG9uIGB0bHNfc3RycF9kYXRhX3JlYWR5YCBhcyB0aGUgZGF0YS1yZWFkeSBjYWxsYmFjay5cblxuUmlnaHQsIGxldCdzIGRpdmUgaW50byBgbmV0L3Rscy90bHNfc3RycC5jYCBhbmQgdGFrZSBhIGxvb2sgYXQgYHRsc19zdHJwX3JlYWRfc29ja2AuIEl0J3Mgc3RhdGljLCBzbyBJJ2xsIG5lZWQgdG8gdHJhY2UgaXQgY2FyZWZ1bGx5LiBBaCwgaGVyZSdzIGEgcGF0Y2ggdGhhdCBhZGRyZXNzZXMgYSBidWcgd2hlcmUgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3YXMgYmVpbmcgY2FsbGVkIGluY29ycmVjdGx5LCBlaXRoZXIgd2l0aCBhbiBpbmNvcnJlY3QgbGVuZ3RoIG9yIGF0IHRoZSB3cm9uZyB0aW1lLiBUaGlzIHdvdWxkIGxlYWQgdG8gcHJvYmxlbXMgd2hlbiB0aGUgcmVjZWl2ZSBxdWV1ZSBkb2Vzbid0IGhhdmUgdGhlIGNvbXBsZXRlIFRMUyBoZWFkZXIsIHdoaWNoIHdvdWxkIGJlIGEgc2lnbmlmaWNhbnQgdnVsbmVyYWJpbGl0eSB0byBleHBsb2l0LiBUaGlzIGlzICpkZWZpbml0ZWx5KiBmdXp6aW5nIG1hdGVyaWFsLiBUaGUgcG90ZW50aWFsIGhlcmUgaXMgcXVpdGUgaW50ZXJlc3RpbmcuXG5cblRvIGFpZCB3aXRoIHRoYXQsIGxldCBtZSBub3RlIGRvd24gc29tZSBtb3JlIGZvY3VzIHN5bWJvbHMuIEkgaGF2ZTpcblxuLSAgIGB0bHNfc3RycF9jaGVja19yY3ZgXG4tICAgYHRsc19zd19yZWN2bXNnYFxuLSAgIGB0bHNfc3RycF9kYXRhX3JlYWR5YFxuXG5Hb29kLCBnb29kLiBJ4oCZbGwgbWFrZSBzdXJlIHRoZSBgVExTYCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBOb3csIGxldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgdGhhdCBtaWdodCBiZSBpbiBwbGF5LiBBbHdheXMgZ29vZCB0byBjb3ZlciBteSBiYXNlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6NjI0MCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo1Mi44MjAxMDA0MzRaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU1MDQ3NjE5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImRlcGVuZHMgb25cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Rscy9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90bHMvS2NvbmZpZz01PWNvbmZpZyBUTFNcXG5uZXQvdGxzL0tjb25maWctNi1cXHR0cmlzdGF0ZSBcXFwiVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IHN1cHBvcnRcXFwiXFxubmV0L3Rscy9LY29uZmlnOjc6XFx0ZGVwZW5kcyBvbiBJTkVUXFxubmV0L3Rscy9LY29uZmlnLTgtXFx0c2VsZWN0IENSWVBUT1xcbi0tXFxubmV0L3Rscy9LY29uZmlnPTE5PWNvbmZpZyBUTFNfREVWSUNFXFxubmV0L3Rscy9LY29uZmlnLTIwLVxcdGJvb2wgXFxcIlRyYW5zcG9ydCBMYXllciBTZWN1cml0eSBIVyBvZmZsb2FkXFxcIlxcbm5ldC90bHMvS2NvbmZpZzoyMTpcXHRkZXBlbmRzIG9uIFRMU1xcbm5ldC90bHMvS2NvbmZpZy0yMi1cXHRzZWxlY3QgU0tCX0RFQ1JZUFRFRFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo1Mi44NzUxNTIzNTNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQzMDQwMTk0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBUTFMgU3RyZWFtIFBhcnNlciBQYXRjaCoqXG5cbk9rYXksIHNvIHRoZSBnaXN0IG9mIGl0IGlzIHRoaXM6IGBJTkVUYCBpcyB0aGUgZ28tdG8sIGFuZCBgVExTYCBpcyBnb29kIGVub3VnaCBmb3Igd2hhdCB3ZSdyZSBkb2luZy4gTGV0IG1lIGJyZWFrIGRvd24gdGhlIHRoaW5raW5nIGhlcmUuXG5cblRoaXMgcGF0Y2gsIGl0J3MgbWVzc2luZyB3aXRoIHRoZSBUTFMgc3RyZWFtIHBhcnNlciwgc3BlY2lmaWNhbGx5IHRob3NlIGB0bHNfc3RycF9yZWFkX3NvY2tgIGFuZCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGZ1bmN0aW9ucy4gSXQncyBhYm91dCBtYWtpbmcgc3VyZSB0aGUgY29kZSAqYWN0dWFsbHkqIGNoZWNrcyBpZiB0aGVyZSdzIGVub3VnaCBkYXRhIGluIHRoZSByZWNlaXZlIHF1ZXVlIGJlZm9yZSB0cnlpbmcgdG8gcGFyc2UgdGhlIFRMUyBoZWFkZXIuIFRoYXQncyBjcml0aWNhbCBuZXR3b3JrIHJlY2VpdmUgbG9naWMsIHRoZSBicmVhZCBhbmQgYnV0dGVyIG9mIFRMUyBzb2NrZXRzLCBhbmQgaXQncyBzb21ldGhpbmcgdXNlcnNwYWNlIGNhbiBwb2tlIGF0IHdpdGggYHJlY3Ztc2dgIG9uIHRob3NlIFRMUyBzb2NrZXRzLiBUaGlzIGlzICpwcmltZSogZnV6emluZyBtYXRlcmlhbCwgbm8gcXVlc3Rpb24uIFdlIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlIHBhcnNlciBncmFjZWZ1bGx5IGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3Jkcy4gTm8gbWVtb3J5IGNvcnJ1cHRpb24sIG5vIHN0YWxscyDigJMgdGhhdCdzIHRoZSBuYW1lIG9mIHRoZSBnYW1lLiBXZSBhcmUgZ29pbmcgdG8gbmVlZCB0byBwcm92aWRlIHRoZXNlIHJlc3VsdHMgd2l0aCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2OTE0LCJPdXRwdXRUb2tlbnMiOjE2MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo1Ny4zMDU1NTY5NFoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzQ3ODE3NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVExTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidGxzX3N0cnBfY2hlY2tfcmN2XCIsXG4gICAgXCJ0bHNfc3dfcmVjdm1zZ1wiLFxuICAgIFwidGxzX3N0cnBfZGF0YV9yZWFkeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVExTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidGxzX3N0cnBfY2hlY2tfcmN2XCIsXG4gICAgXCJ0bHNfc3dfcmVjdm1zZ1wiLFxuICAgIFwidGxzX3N0cnBfZGF0YV9yZWFkeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjU3LjQ1OTA0MjQ1NVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg1NTQwODY4Mjk1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6NTcuNDU5NDkxNzc1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE4NTU0MDQxNDQzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXFxuXFxuQnkgY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soKWAgYmVmb3JlIHJlYWRpbmcgdGhlIGhlYWRlciwgdGhlIGNvZGUgZGV0ZWN0cyBvdmVybGFwcGluZyBzZWdtZW50cyBvciBtaXhlZCBkZWNyeXB0ZWQgc3RhdHVzIGFuZCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHkoKWAuIFRoaXMgZmFsbGJhY2sgdXNlcyBgdGNwX3JlYWRfc29jaygpYCB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBvdmVybGFwcyBhbmQgY29weSB0aGUgbG9naWNhbCBzdHJlYW0gaW50byBhIGxpbmVhciBidWZmZXIuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnZvbHZlZC4gVGhlIGJ5dGVzIHJlYWQgYnkgYHNrYl9jb3B5X2JpdHMoKWAgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG5ldHdvcmsgZGF0YTsgdGhleSBhcmUgc2ltcGx5IHRoZSB3cm9uZyBieXRlcyBkdWUgdG8gdGhlIG92ZXJsYXBzLiBUaGVyZWZvcmUsIEtNU0FOICh3aGljaCBkZXRlY3RzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlKSBpcyBub3QgYXBwbGljYWJsZSBoZXJlLiBTdGFuZGFyZCBLQVNBTiB3b3VsZCBhbHNvIG5vdCBkZXRlY3QgYW55dGhpbmcsIGFzIHRoZXJlIGlzIG5vIG1lbW9yeSBjb3JydXB0aW9uIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGE2YjA1YjdlMzU3ZDEzYjU5N2VmOGNiMjI2ZjRmYWI0MGZlM2I5MjBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyA3IDIwOjI5OjI3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3Rscy90bHNfc3RycC5jIGIvbmV0L3Rscy90bHNfc3RycC5jXG5pbmRleCA2MWIxMGM2OTdlY2NiLi42NGQ1ZGVhOTA1NDAzIDEwMDY0NFxuLS0tIGEvbmV0L3Rscy90bHNfc3RycC5jXG4rKysgYi9uZXQvdGxzL3Rsc19zdHJwLmNcbkBAIC00MzAsOSArNDMwLDkgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuK3N0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBsZW4pXG4ge1xuLVx0dW5zaWduZWQgaW50IGxlbiA9IHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuO1xuIFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0LCAqc2tiO1xuIFx0dTMyIHNlcTtcbiBcbkBAIC01MjUsNiArNTI1LDEyIEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIFxuIFx0dGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZShzdHJwLCBpbnEpO1xuIFx0aWYgKCFzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbikge1xuK1x0XHRpZiAoaW5xIFx1MDAzYyBUTFNfSEVBREVSX1NJWkUpXG4rXHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcbitcbitcdFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgKyBUTFNfSEVBREVSX1NJWkUpKVxuK1x0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuK1xuIFx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVx1MDAzZWFuY2hvcik7XG4gXHRcdGlmIChzeiBcdTAwM2MgMClcbiBcdFx0XHRyZXR1cm4gc3o7XG5AQCAtNTM1LDcgKzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gXHR9XG4gXG4tXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKVxuK1x0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgKyBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbikpXG4gXHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuIFxuIFx0V1JJVEVfT05DRShzdHJwLVx1MDAzZW1zZ19yZWFkeSwgMSk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo1Ny40NTk0OTI1NDVaIiwiU2VxIjoxOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTkwNTI0MTA5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFRMUyBTdHJlYW0gUHJvY2Vzc2luZyBQYXRjaCoqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgYWltZWQgYXQgaW1wcm92aW5nIHRoZSBoYW5kbGluZyBvZiBUTFMgc3RyZWFtIHByb2Nlc3NpbmcsIHNwZWNpZmljYWxseSBhcm91bmQgaG93IHRoZSBpbnB1dCBxdWV1ZSBpcyB2YWxpZGF0ZWQgYW5kIHJlYWQuIFRoZSBrZXkgY2hhbmdlIGlzIHRoYXQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBub3cgYWNjZXB0cyBhbiBleHBsaWNpdCBsZW5ndGggYXJndW1lbnQgKGBsZW5gKSBpbnN0ZWFkIG9mIHJlY2FsY3VsYXRpbmcgaXQgZnJvbSBgc3RycC1cdTAwM2VzdG0ub2Zmc2V0YCBhbmQgYHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuYC4gVGhpcyBpcyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IHNoaWZ0IOKAkyBpdCBhbGxvd3MgZm9yIG1vcmUgZmxleGliaWxpdHkgYW5kIHBvdGVudGlhbGx5IGF2b2lkcyByZWR1bmRhbnQgY2FsY3VsYXRpb25zIG9yIHBvc3NpYmxlIG9mZi1ieS1vbmUgZXJyb3JzIHRoYXQgbWlnaHQgYXJpc2UgZnJvbSB0aGUgaW1wbGljaXQgY2FsY3VsYXRpb24uXG5cblRoZSBvdGhlciBwb2ludCBvZiBpbnRlcmVzdCBpcyB0aGUgYWRkZWQgY2hlY2sgd2l0aGluIGB0bHNfc3RycF9yZWFkX3NvY2tgLiBUaGUgY29kZSBub3cgZXhwbGljaXRseSBhZGRyZXNzZXMgdGhlIGNhc2Ugd2hlcmUgYHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuYCBpcyB6ZXJvLiBXaGVuIHRoZSBidWZmZXIgaXMgZW1wdHksIGl0IGZpcnN0IGxvYWRzIGFuIGFuY2hvciBmcm9tIHRoZSBxdWV1ZS4gVGhlbiwgdGhlIHBhdGNoIGluc2VydHMgYWRkaXRpb25hbCBjb25kaXRpb25hbCBsb2dpYzpcblxuMS4gIElmIHRoZSBpbnB1dCBxdWV1ZSBzaXplIChgaW5xYCkgaXMgc21hbGxlciB0aGFuIGBUTFNfSEVBREVSX1NJWkVgLCBpdCBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggSSBpbmZlciBtaWdodCBoYW5kbGUgYSBzaG9ydCByZWFkIG9yIGEgc3BlY2lhbCBpbml0aWFsaXphdGlvbi5cbjIuICBJZiB0aGUgc2l6ZSBpcyBzdWZmaWNpZW50IChgaW5xYCBcdTAwM2U9IGBUTFNfSEVBREVSX1NJWkVgKSBpdCB0aGVuIGNhbGxzIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2Agd2l0aCBhIHNpemUgb2YgYHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIFRMU19IRUFERVJfU0laRWAuIFRoaXMgc2l6ZSBpcyBtb3N0IGxpa2VseSBjaGVja2luZyBpZiB0aGUgVExTIGhlYWRlciBpcyB2YWxpZCB3aXRoaW4gdGhlIHF1ZXVlLiBJZiBpdCAqaXNuJ3QqIG9rYXksIGl0IGNhbGxzIGB0bHNfc3RycF9yZWFkX2NvcHlgIGFnYWluLCB0aGlzIHRpbWUgd2l0aCBhIGBmYWxzZWAgYXJndW1lbnQuXG5cbkkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgZXhhY3RseSBgdGxzX3N0cnBfcmVhZF9jb3B5YCBkb2VzIGluIHRob3NlIGNhc2VzLiBUaGUgYHRydWVgIGFuZCBgZmFsc2VgIGFyZ3VtZW50cyBzdWdnZXN0IGRpZmZlcmVudCBiZWhhdmlvcnMsIGFuZCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRob3NlIGRpZmZlcmVuY2VzIGFyZSwgd2hpY2ggd2lsbCBwcm9iYWJseSB0ZWxsIG1lIHdoYXQncyBnb2luZyBvbiBoZXJlLiBUaGUgY2FsbCB0byBgdGxzX3J4X21zZ19zaXplYCBhZnRlciB0aGVzZSBjaGVja3MgaW1wbGllcyB0aGF0IHRoZSBjb2RlIGlzIGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBpbmNvbWluZyBUTFMgbWVzc2FnZS5cblxuVWx0aW1hdGVseSwgdGhlIGdvYWwgaXMgdG8gbWFrZSBzdXJlIHRoYXQgd2hhdGV2ZXIncyBpbiB0aGUgaW5wdXQgcXVldWUgaXMgdmFsaWQgYW5kIHNhZmUgdG8gcHJvY2VzcywgZXNwZWNpYWxseSB3aGVuIHRoZSBzdHJlYW0gbGVuZ3RoIGlzbid0IGltbWVkaWF0ZWx5IGtub3duLiBUaGUgZXhwbGljaXQgbGVuZ3RoIGFyZ3VtZW50IHRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2Agc3VnZ2VzdHMgYSBkZXNpcmUgZm9yIGdyZWF0ZXIgcHJlY2lzaW9uIGFuZCBwb3RlbnRpYWxseSBtb3JlIGVmZmljaWVudCB2YWxpZGF0aW9uLiBJIHNob3VsZCBkZWx2ZSBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjM2NywiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0NCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMwOjAzLjM2NDczNjg0MloiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA0MTQwMTk2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRsc19zdHJwX2NoZWNrX3F1ZXVlX29rXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90bHMvdGxzX3N0cnAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmM9MzkwPXN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIHFzaG9ydClcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy00MzItXFxubmV0L3Rscy90bHNfc3RycC5jOjQzMzpzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNDM0LVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTUxMj1zdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01MzAtXFxubmV0L3Rscy90bHNfc3RycC5jOjUzMTpcXHRcXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBUTFNfSEVBREVSX1NJWkUpKVxcbm5ldC90bHMvdGxzX3N0cnAuYy01MzItXFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTQzLVxcbm5ldC90bHMvdGxzX3N0cnAuYzo1NDQ6XFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ICsgc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSlcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTQ1LVxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDowMy40Njg4ODMxNjhaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDE4OTA3NTk2NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRob3NlIGZ1bmN0aW9ucywgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBhbmQgYHRsc19zdHJwX3JlYWRfc29ja2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBxdWV1ZSBhbmQgc29ja2V0IGhhbmRsaW5nIGhlcmUsIGFuZCBob3cgdGhleSByZWxhdGUgdG8gdGhlIG92ZXJhbGwgVExTL1NSUCBwcm9jZXNzLlxuXG4qKkRpdmluZyBpbnRvIFF1ZXVlIGFuZCBTb2NrZXQgSW50ZWdyaXR5KipcblxuSSdtIGltbWVkaWF0ZWx5IGZvY3VzaW5nIG9uIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuIE15IGd1dCBmZWVsaW5nIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBsaWtlbHkgZXhhbWluZXMgdGhlIHN0YXRlIG9mIGEgcXVldWUsIHByZXN1bWFibHkgcmVsYXRlZCB0byBkYXRhIGNvbWluZyBpbiBvciBnb2luZyBvdXQgb2YgdGhlIFRMUy9TUlAgY29tbXVuaWNhdGlvbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCBjb25zdGl0dXRlcyBhbiBcIm9rXCIgc3RhdGUuIElzIGl0IGNoZWNraW5nIGZvciBvdmVyZmxvdz8gVW5kZXJmbG93PyBTcGVjaWZpYyBmbGFncz8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBzaW1wbGUgRklGTyBxdWV1ZSwgb3Igc29tZXRoaW5nIG1vcmUgY29tcGxleD8gVGhlIFwib2tcIiBjb25kaXRpb24gd2lsbCBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgZXJyb3IgaGFuZGxpbmcgb3IgZmxvdyBjb250cm9sIG1lY2hhbmlzbXMgaW4gcGxhY2UuIFRoZSBuYW1pbmcgY29udmVudGlvbiBzdWdnZXN0cyBpdCBtaWdodCBiZSBzcGVjaWZpYyB0byBTZWN1cmUgUmVtb3RlIFBhc3N3b3JkLlxuXG5OZXh0LCBgdGxzX3N0cnBfcmVhZF9zb2NrYC4gVGhlIGByZWFkX3NvY2tgIHBhcnQgaXMgc3RyYWlnaHRmb3J3YXJkIOKAkyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgcmVjZWl2aW5nIGRhdGEgZnJvbSB0aGUgc29ja2V0LiBIb3dldmVyLCB0aGUgXCJTUlBcIiBwcmVmaXggc3VnZ2VzdHMgYSB2ZXJ5IHNwZWNpZmljLCBhbmQgcHJvYmFibHkgc2VjdXJpdHktc2Vuc2l0aXZlLCBvcGVyYXRpb24uIEknbSBndWVzc2luZyB0aGF0IHRoaXMgaXMgcmVsYXRlZCB0byByZWNlaXZpbmcgU1JQIGNoYWxsZW5nZSByZXNwb25zZXMsIHZlcmlmaWNhdGlvbiBkYXRhLCBvciBwZXJoYXBzIGV2ZW4gdGhlIFRMUyBoYW5kc2hha2UgaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGxhcmdlciBUTFMvU1JQIHN0YXRlIG1hY2hpbmUuIElzIGl0IGJsb2NraW5nLCBub24tYmxvY2tpbmcsIG9yIHVzaW5nIHNlbGVjdC9wb2xsPyBBcmUgdGhlcmUgc3BlY2lmaWMgZXJyb3IgY29kZXMgdG8gaGFuZGxlPyBXaGF0IGhhcHBlbnMgb24gcGFydGlhbCByZWFkcz8gV2hhdCBzZWN1cml0eSBjaGVja3MgYXJlIGhhcHBlbmluZyBoZXJlP1xuXG5NeSBwcmltYXJ5IGNvbmNlcm4gd2l0aCB0aGVzZSB0d28gZnVuY3Rpb25zIHdpbGwgYmUgdW5kZXJzdGFuZGluZyB0aGVpciBpbnRlcnBsYXkuIEhvdyBkb2VzIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaW5mbHVlbmNlIHRoZSBiZWhhdmlvciBvZiBgdGxzX3N0cnBfcmVhZF9zb2NrYD8gRG9lcyB0aGUgcXVldWUgY2hlY2sgZ2F0ZSB0aGUgcmVhZD8gRG9lcyB0aGUgcXVldWUgcmVwcmVzZW50IGEgYnVmZmVyIGZvciBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBzb2NrZXQ/IFRoZSByZWxhdGlvbnNoaXBzIGFyZSBrZXkuIEknbGwgbmVlZCB0byBjYXJlZnVsbHkgdHJhY2UgdGhlIGRhdGEgZmxvdyBhbmQgcG90ZW50aWFsIGVycm9yIGNvbmRpdGlvbnMgaW4gdGhlIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzUzMywiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMwOjA3LjY1Nzk2MTk5NFoiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4OTM5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDMwLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQzMDpcXHRcXHRyZXR1cm4gMDtcXG4gNDMxOlxcdH1cXG4gNDMyOlxcdFxcbiA0MzM6XFx0c3RhdGljIGJvb2wgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsXFxuIDQzNDpcXHRcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGxlbilcXG4gNDM1OlxcdHtcXG4gNDM2OlxcdFxcdHN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjtcXG4gNDM3OlxcdFxcdHUzMiBzZXE7XFxuIDQzODpcXHRcXG4gNDM5OlxcdFxcdGZpcnN0ID0gc2tiX3NoaW5mbyhzdHJwLVxcdTAwM2VhbmNob3IpLVxcdTAwM2VmcmFnX2xpc3Q7XFxuIDQ0MDpcXHRcXHRza2IgPSBmaXJzdDtcXG4gNDQxOlxcdFxcdHNlcSA9IFRDUF9TS0JfQ0IoZmlyc3QpLVxcdTAwM2VzZXE7XFxuIDQ0MjpcXHRcXG4gNDQzOlxcdFxcdC8qIE1ha2Ugc3VyZSB0aGVyZSdzIG5vIGR1cGxpY2F0ZSBkYXRhIGluIHRoZSBxdWV1ZSxcXG4gNDQ0OlxcdFxcdCAqIGFuZCB0aGUgZGVjcnlwdGVkIHN0YXR1cyBtYXRjaGVzLlxcbiA0NDU6XFx0XFx0ICovXFxuIDQ0NjpcXHRcXHR3aGlsZSAoc2tiLVxcdTAwM2VsZW4gXFx1MDAzYyBsZW4pIHtcXG4gNDQ3OlxcdFxcdFxcdHNlcSArPSBza2ItXFx1MDAzZWxlbjtcXG4gNDQ4OlxcdFxcdFxcdGxlbiAtPSBza2ItXFx1MDAzZWxlbjtcXG4gNDQ5OlxcdFxcdFxcdHNrYiA9IHNrYi1cXHUwMDNlbmV4dDtcXG4gNDUwOlxcdFxcbiA0NTE6XFx0XFx0XFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cXHUwMDNlc2VxICE9IHNlcSlcXG4gNDUyOlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNDUzOlxcdFxcdFxcdGlmIChza2JfY21wX2RlY3J5cHRlZChmaXJzdCwgc2tiKSlcXG4gNDU0OlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNDU1OlxcdFxcdH1cXG4gNDU2OlxcdFxcbiA0NTc6XFx0XFx0cmV0dXJuIHRydWU7XFxuIDQ1ODpcXHR9XFxuIDQ1OTpcXHRcXG4gNDYwOlxcdHN0YXRpYyB2b2lkIHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGludCBsZW4pXFxuIDQ2MTpcXHR7XFxuIDQ2MjpcXHRcXHRzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHN0cnAtXFx1MDAzZXNrKTtcXG4gNDYzOlxcdFxcdHN0cnVjdCBza19idWZmICpmaXJzdDtcXG4gNDY0OlxcdFxcdHUzMiBvZmZzZXQ7XFxuIDQ2NTpcXHRcXG4gNDY2OlxcdFxcdGZpcnN0ID0gdGNwX3JlY3Zfc2tiKHN0cnAtXFx1MDAzZXNrLCB0cC1cXHUwMDNlY29waWVkX3NlcSwgXFx1MDAyNm9mZnNldCk7XFxuIDQ2NzpcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKCFmaXJzdCkpXFxuIDQ2ODpcXHRcXHRcXHRyZXR1cm47XFxuIDQ2OTpcXHRcXG4gNDcwOlxcdFxcdC8qIEJlc3RvdyB0aGUgc3RhdGUgb250byB0aGUgYW5jaG9yICovXFxuIDQ3MTpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZWxlbiA9IG9mZnNldCArIGxlbjtcXG4gNDcyOlxcdFxcdHN0cnAtXFx1MDAzZWFuY2hvci1cXHUwMDNlZGF0YV9sZW4gPSBvZmZzZXQgKyBsZW47XFxuIDQ3MzpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZXRydWVzaXplID0gb2Zmc2V0ICsgbGVuO1xcbiA0NzQ6XFx0XFxuIDQ3NTpcXHRcXHRza2Jfc2hpbmZvKHN0cnAtXFx1MDAzZWFuY2hvciktXFx1MDAzZWZyYWdfbGlzdCA9IGZpcnN0O1xcbiA0NzY6XFx0XFxuIDQ3NzpcXHRcXHRza2JfY29weV9oZWFkZXIoc3RycC1cXHUwMDNlYW5jaG9yLCBmaXJzdCk7XFxuIDQ3ODpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZWRlc3RydWN0b3IgPSBOVUxMO1xcbiA0Nzk6XFx0XFxuIDQ4MDpcXHRcXHRzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ID0gb2Zmc2V0O1xcbiA0ODE6XFx0fVxcbiA0ODI6XFx0XFxuIDQ4MzpcXHRib29sIHRsc19zdHJwX21zZ19sb2FkKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGZvcmNlX3JlZnJlc2gpXFxuIDQ4NDpcXHR7XFxuIDQ4NTpcXHRcXHRzdHJ1Y3Qgc3RycF9tc2cgKnJ4bTtcXG4gNDg2OlxcdFxcdHN0cnVjdCB0bHNfbXNnICp0bG07XFxuIDQ4NzpcXHRcXG4gNDg4OlxcdFxcdERFQlVHX05FVF9XQVJOX09OX09OQ0UoIXN0cnAtXFx1MDAzZW1zZ19yZWFkeSk7XFxuIDQ4OTpcXHRcXHRERUJVR19ORVRfV0FSTl9PTl9PTkNFKCFzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pO1xcbiA0OTA6XFx0XFxuIDQ5MTpcXHRcXHRpZiAoIXN0cnAtXFx1MDAzZWNvcHlfbW9kZSBcXHUwMDI2XFx1MDAyNiBmb3JjZV9yZWZyZXNoKSB7XFxuIDQ5MjpcXHRcXHRcXHRpZiAodW5saWtlbHkodGNwX2lucShzdHJwLVxcdTAwM2VzaykgXFx1MDAzYyBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pKSB7XFxuIDQ5MzpcXHRcXHRcXHRcXHRXUklURV9PTkNFKHN0cnAtXFx1MDAzZW1zZ19yZWFkeSwgMCk7XFxuIDQ5NDpcXHRcXHRcXHRcXHRzdHJwLVxcdTAwM2Vtc2dfYW5ub3VuY2VkID0gMDtcXG4gNDk1OlxcdFxcdFxcdFxcdG1lbXNldChcXHUwMDI2c3RycC1cXHUwMDNlc3RtLCAwLCBzaXplb2Yoc3RycC1cXHUwMDNlc3RtKSk7XFxuIDQ5NjpcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDQ5NzpcXHRcXHRcXHR9XFxuIDQ5ODpcXHRcXG4gNDk5OlxcdFxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKTtcXG4gNTAwOlxcdFxcdH1cXG4gNTAxOlxcdFxcbiA1MDI6XFx0XFx0cnhtID0gc3RycF9tc2coc3RycC1cXHUwMDNlYW5jaG9yKTtcXG4gNTAzOlxcdFxcdHJ4bS1cXHUwMDNlZnVsbF9sZW5cXHQ9IHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbjtcXG4gNTA0OlxcdFxcdHJ4bS1cXHUwMDNlb2Zmc2V0XFx0PSBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0O1xcbiA1MDU6XFx0XFx0dGxtID0gdGxzX21zZyhzdHJwLVxcdTAwM2VhbmNob3IpO1xcbiA1MDY6XFx0XFx0dGxtLVxcdTAwM2Vjb250cm9sXFx0PSBzdHJwLVxcdTAwM2VtYXJrO1xcbiA1MDc6XFx0XFxuIDUwODpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTA5OlxcdH1cXG4gNTEwOlxcdFxcbiA1MTE6XFx0LyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIG9uIGxvd2VyIHNvY2tldCAqL1xcbiA1MTI6XFx0c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuIDUxMzpcXHR7XFxuIDUxNDpcXHRcXHRpbnQgc3osIGlucTtcXG4gNTE1OlxcdFxcbiA1MTY6XFx0XFx0aW5xID0gdGNwX2lucShzdHJwLVxcdTAwM2Vzayk7XFxuIDUxNzpcXHRcXHRpZiAoaW5xIFxcdTAwM2MgMSlcXG4gNTE4OlxcdFxcdFxcdHJldHVybiAwO1xcbiA1MTk6XFx0XFxuIDUyMDpcXHRcXHRpZiAodW5saWtlbHkoc3RycC1cXHUwMDNlY29weV9tb2RlKSlcXG4gNTIxOlxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHlpbihzdHJwKTtcXG4gNTIyOlxcdFxcbiA1MjM6XFx0XFx0aWYgKGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTI0OlxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDUyNTpcXHRcXG4gNTI2OlxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcXG4gNTI3OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDUyODpcXHRcXHRcXHRpZiAoaW5xIFxcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxcbiA1Mjk6XFx0XFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MDcuNjU4MDUyNjk0WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI4MDI2NzkzOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duLCBhc3N1bWluZyBJJ20gYW4gZXhwZXJ0IGluIHRoaXMgZmllbGQ6XG5cbioqRGl2aW5nIGludG8gYHRsc19zdHJwX3JlYWRfc29ja2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgZGlnIGludG8gdGhlIHJlc3Qgb2YgdGhpcyBgdGxzX3N0cnBfcmVhZF9zb2NrYCBmdW5jdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbXBsZXRlIG9wZXJhdGlvbmFsIGNvbnRleHQuIFRoaXMgaW5pdGlhbCBzZWN0aW9uIHByb3ZpZGVkIGEga2V5LCBidXQgSSBuZWVkIHRvIHNlZSB0aGUgZW50aXJlIHRoaW5nLiBUaGUgaGVhZGVyIHRlbGxzIG1lIHdoZXJlIHdlIGFyZSwgYnV0IEkgbmVlZCB0aGUgZnVsbCBwaWN0dXJlIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIHJlYWxseSBkb2luZywgaG93IGl0IGhhbmRsZXMgZXJyb3JzLCBhbmQgdGhlIGxvZ2ljIGZsb3cuIExldCdzIHNlZSBob3cgdGhlIHJlc3Qgb2YgaXQgaGFuZGxlcyBpdHMgY29yZSByZXNwb25zaWJpbGl0aWVzLiBUaGlzIHdpbGwgY2xhcmlmeSB0aGUgYWN0dWFsIG1lY2hhbmlzbXMgZm9yIGhhbmRsaW5nIHRoZSBzb2NrZXQgcmVhZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTUyNCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MTAuNDYwNzM0Mzc4WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNzUzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTI1LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyNTpcXHRcXG4gNTI2OlxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcXG4gNTI3OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDUyODpcXHRcXHRcXHRpZiAoaW5xIFxcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxcbiA1Mjk6XFx0XFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcXG4gNTMwOlxcdFxcbiA1MzE6XFx0XFx0XFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ICsgVExTX0hFQURFUl9TSVpFKSlcXG4gNTMyOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xcbiA1MzM6XFx0XFxuIDUzNDpcXHRcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVxcdTAwM2VhbmNob3IpO1xcbiA1MzU6XFx0XFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4gNTM2OlxcdFxcdFxcdFxcdHJldHVybiBzejtcXG4gNTM3OlxcdFxcbiA1Mzg6XFx0XFx0XFx0c3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XFxuIDUzOTpcXHRcXG4gNTQwOlxcdFxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuIHx8IGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTQxOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDU0MjpcXHRcXHR9XFxuIDU0MzpcXHRcXG4gNTQ0OlxcdFxcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbikpXFxuIDU0NTpcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4gNTQ2OlxcdFxcbiA1NDc6XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDEpO1xcbiA1NDg6XFx0XFxuIDU0OTpcXHRcXHRyZXR1cm4gMDtcXG4gNTUwOlxcdH1cXG4gNTUxOlxcdFxcbiA1NTI6XFx0LyogUGFyc2UgcXVldWVkIGRhdGEuIFdoZW4gQGFubm91bmNlIGlzIHRydWUgYW5kIHBhcnNpbmcgcHJvZHVjZXMgYVxcbiA1NTM6XFx0ICogbmV3bHktcmVhZHkgcmVjb3JkLCBmaXJlIHRoZSBjb25zdW1lciBub3RpZmljYXRpb24uIENhbGxlcnMgdGhhdFxcbiA1NTQ6XFx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxcbiA1NTU6XFx0ICogc2hvdWxkIGludm9rZSB0bHNfcnhfbXNnX21heWJlX2Fubm91bmNlKCkgZGlyZWN0bHkuXFxuIDU1NjpcXHQgKi9cXG4gNTU3OlxcdHZvaWQgdGxzX3N0cnBfY2hlY2tfcmN2KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGFubm91bmNlKVxcbiA1NTg6XFx0e1xcbiA1NTk6XFx0XFx0aWYgKHVubGlrZWx5KHN0cnAtXFx1MDAzZXN0b3BwZWQpIHx8IHN0cnAtXFx1MDAzZW1zZ19yZWFkeSlcXG4gNTYwOlxcdFxcdFxcdHJldHVybjtcXG4gNTYxOlxcdFxcbiA1NjI6XFx0XFx0aWYgKHRsc19zdHJwX3JlYWRfc29jayhzdHJwKSA9PSAtRU5PTUVNKVxcbiA1NjM6XFx0XFx0XFx0cXVldWVfd29yayh0bHNfc3RycF93cSwgXFx1MDAyNnN0cnAtXFx1MDAzZXdvcmspO1xcbiA1NjQ6XFx0XFx0ZWxzZSBpZiAoYW5ub3VuY2UgXFx1MDAyNlxcdTAwMjYgc3RycC1cXHUwMDNlbXNnX3JlYWR5KVxcbiA1NjU6XFx0XFx0XFx0dGxzX3J4X21zZ19tYXliZV9hbm5vdW5jZShzdHJwKTtcXG4gNTY2OlxcdH1cXG4gNTY3OlxcdFxcbiA1Njg6XFx0LyogTG93ZXIgc29jayBsb2NrIGhlbGQgKi9cXG4gNTY5OlxcdHZvaWQgdGxzX3N0cnBfZGF0YV9yZWFkeShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcXG4gNTcwOlxcdHtcXG4gNTcxOlxcdFxcdC8qIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIHN5bmNocm9uaXplIHdpdGggZG9fdGxzX3N0cnBfd29yay5cXG4gNTcyOlxcdFxcdCAqIGRvX3Rsc19zdHJwX3dvcmsgYWNxdWlyZXMgYSBwcm9jZXNzIGxvY2sgKGxvY2tfc29jaykgd2hlcmVhc1xcbiA1NzM6XFx0XFx0ICogdGhlIGxvY2sgaGVsZCBoZXJlIGlzIGJoX2xvY2tfc29jay4gVGhlIHR3byBsb2NrcyBjYW4gYmVcXG4gNTc0OlxcdFxcdCAqIGhlbGQgYnkgZGlmZmVyZW50IHRocmVhZHMgYXQgdGhlIHNhbWUgdGltZSwgYnV0IGJoX2xvY2tfc29ja1xcbiA1NzU6XFx0XFx0ICogYWxsb3dzIGEgdGhyZWFkIGluIEJIIGNvbnRleHQgdG8gc2FmZWx5IGNoZWNrIGlmIHRoZSBwcm9jZXNzXFxuIDU3NjpcXHRcXHQgKiBsb2NrIGlzIGhlbGQuIEluIHRoaXMgY2FzZSwgaWYgdGhlIGxvY2sgaXMgaGVsZCwgcXVldWUgd29yay5cXG4gNTc3OlxcdFxcdCAqL1xcbiA1Nzg6XFx0XFx0aWYgKHNvY2tfb3duZWRfYnlfdXNlcl9ub2NoZWNrKHN0cnAtXFx1MDAzZXNrKSkge1xcbiA1Nzk6XFx0XFx0XFx0cXVldWVfd29yayh0bHNfc3RycF93cSwgXFx1MDAyNnN0cnAtXFx1MDAzZXdvcmspO1xcbiA1ODA6XFx0XFx0XFx0cmV0dXJuO1xcbiA1ODE6XFx0XFx0fVxcbiA1ODI6XFx0XFxuIDU4MzpcXHRcXHR0bHNfc3RycF9jaGVja19yY3Yoc3RycCwgdHJ1ZSk7XFxuIDU4NDpcXHR9XFxuIDU4NTpcXHRcXG4gNTg2OlxcdHN0YXRpYyB2b2lkIHRsc19zdHJwX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3KVxcbiA1ODc6XFx0e1xcbiA1ODg6XFx0XFx0c3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAgPVxcbiA1ODk6XFx0XFx0XFx0Y29udGFpbmVyX29mKHcsIHN0cnVjdCB0bHNfc3RycGFyc2VyLCB3b3JrKTtcXG4gNTkwOlxcdFxcbiA1OTE6XFx0XFx0bG9ja19zb2NrKHN0cnAtXFx1MDAzZXNrKTtcXG4gNTkyOlxcdFxcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcXG4gNTkzOlxcdFxcdHJlbGVhc2Vfc29jayhzdHJwLVxcdTAwM2Vzayk7XFxuIDU5NDpcXHR9XFxuIDU5NTpcXHRcXG4gNTk2OlxcdC8qIFJlbGVhc2UgdGhlIGN1cnJlbnQgcmVjb3JkIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGNoZWNrIGZvciB0aGVcXG4gNTk3OlxcdCAqIG5leHQgcmVjb3JkLiBDYWxsZXJzIG11c3QgaW52b2tlIHRsc19zdHJwX2NoZWNrX3JjdigpIGJlZm9yZVxcbiA1OTg6XFx0ICogcmVsZWFzaW5nIHRoZSBzb2NrZXQgbG9jaywgb3IgcXVldWVkIGRhdGEgd2lsbCBzdGFsbCB1bnRpbCB0aGVcXG4gNTk5OlxcdCAqIG5leHQgdGxzX3N0cnBfZGF0YV9yZWFkeSgpIGV2ZW50LlxcbiA2MDA6XFx0ICovXFxuIDYwMTpcXHR2b2lkIHRsc19zdHJwX21zZ19jb25zdW1lKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbiA2MDI6XFx0e1xcbiA2MDM6XFx0XFx0V0FSTl9PTighc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKTtcXG4gNjA0OlxcdFxcbiA2MDU6XFx0XFx0aWYgKGxpa2VseSghc3RycC1cXHUwMDNlY29weV9tb2RlKSlcXG4gNjA2OlxcdFxcdFxcdHRjcF9yZWFkX2RvbmUoc3RycC1cXHUwMDNlc2ssIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbik7XFxuIDYwNzpcXHRcXHRlbHNlXFxuIDYwODpcXHRcXHRcXHR0bHNfc3RycF9mbHVzaF9hbmNob3JfY29weShzdHJwKTtcXG4gNjA5OlxcdFxcbiA2MTA6XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDApO1xcbiA2MTE6XFx0XFx0c3RycC1cXHUwMDNlbXNnX2Fubm91bmNlZCA9IDA7XFxuIDYxMjpcXHRcXHRtZW1zZXQoXFx1MDAyNnN0cnAtXFx1MDAzZXN0bSwgMCwgc2l6ZW9mKHN0cnAtXFx1MDAzZXN0bSkpO1xcbiA2MTM6XFx0fVxcbiA2MTQ6XFx0XFxuIDYxNTpcXHR2b2lkIHRsc19zdHJwX3N0b3Aoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuIDYxNjpcXHR7XFxuIDYxNzpcXHRcXHRzdHJwLVxcdTAwM2VzdG9wcGVkID0gMTtcXG4gNjE4OlxcdH1cXG4gNjE5OlxcdFxcbiA2MjA6XFx0aW50IHRsc19zdHJwX2luaXQoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBzb2NrICpzaylcXG4gNjIxOlxcdHtcXG4gNjIyOlxcdFxcdG1lbXNldChzdHJwLCAwLCBzaXplb2YoKnN0cnApKTtcXG4gNjIzOlxcdFxcbiA2MjQ6XFx0XFx0c3RycC1cXHUwMDNlc2sgPSBzaztcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MTAuNDYwODQzMTE4WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU3ODcxNzE3ODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBUTFMgU3RyZWFtIFByb2Nlc3NpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGFpbWVkIGF0IGltcHJvdmluZyBob3cgd2UgaGFuZGxlIHRoZSBUTFMgc3RyZWFtIHByb2Nlc3NpbmcuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgcmV2b2x2ZXMgYXJvdW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuICBJIHNlZSBpdCdzIG5vdyB0YWtpbmcgYW4gZXhwbGljaXQgYGxlbmAgYXJndW1lbnQsIHdoaWNoIGlzIGEgZ29vZCBwcmFjdGljZSBmb3IgY2xhcml0eS4gVGhlIGludGVudCBoZXJlIGlzIGNsZWFyLCB3ZeKAmXJlIGFkZGluZyBhIHByb2FjdGl2ZSBjaGVjayBpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYCB0byBlbnN1cmUgdGhhdCB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyB2YWxpZCAqYmVmb3JlKiB3ZSBldmVuIGNhbGwgYHRsc19yeF9tc2dfc2l6ZWAuICBUaGF0IG1ha2VzIGEgbG90IG9mIHNlbnNlOyBwcmUtZW1wdGl2ZWx5IHZhbGlkYXRpbmcgYmVmb3JlIHBvdGVudGlhbGx5IGNvc3RseSBvcGVyYXRpb25zIGlzIGEgc29saWQgZGVmZW5zaXZlIHByb2dyYW1taW5nIGFwcHJvYWNoLlxuXG5JJ20gYXNzdW1pbmcgYHRsc19yeF9tc2dfc2l6ZWAgaXMgcmVzcG9uc2libGUgZm9yIGRlY2lwaGVyaW5nIHRoZSBUTFMgaGVhZGVyIHRvIGRldGVybWluZSB0aGUgc3Vic2VxdWVudCBtZXNzYWdlIHNpemUuIFRoYXQncyBhIHJlYXNvbmFibGUgYXNzdW1wdGlvbiwgZ2l2ZW4gaXRzIG5hbWUuIFRoZSBwYXRjaCBoaWdobGlnaHRzIHRoYXQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aWxsIHJldHVybiBmYWxzZSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBtZXNzZWQtdXAgcXVldWUg4oCTIG1lYW5pbmcgbWl4ZWQgZGVjcnlwdGVkIGFuZCB1bi1kZWNyeXB0ZWQgZGF0YSwgb3IgcGVyaGFwcyBvdXQtb2Ytb3JkZXIgZGF0YSBzZWdtZW50cy4gIFRoZSBjcnVjaWFsIHBhcnQgaXMgdGhlIGZhbGxiYWNrIG1lY2hhbmlzbTogaWYgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBmYWlscywgaXQgZmFsbHMgYmFjayB0byB1c2luZyBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gIFRoaXMgaXMgYSBkZWZpbml0ZSBidWcgZml4LCBwcm90ZWN0aW5nIGFnYWluc3Qgc2l0dWF0aW9ucyB3aGVyZSBgdGxzX3J4X21zZ19zaXplYCBtaWdodCBiZSBnaXZlbiBhbiBpbnZhbGlkIG9yIGluY29uc2lzdGVudCBTS0IsIHdoaWNoIGlzIGNydWNpYWwgZm9yIHByZXZlbnRpbmcgY3Jhc2hlcyBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuXG5cbldhaXQgYSBzZWNvbmTigKYgSSBuZWVkIHRvIGNsYXJpZnkgc29tZXRoaW5nLiAgYHRsc19yeF9tc2dfc2l6ZWAgZG9lc24ndCBkaXJlY3RseSByZWFkIGZyb20gdGhlIHNvY2tldCBidWZmZXIgKGBza2JgKS4gSSBzZWVtIHRvIHJlY2FsbCBpdCByZWFkcyBmcm9tIGBzdHJwLVx1MDAzZWFuY2hvcmAuIFRoaXMgaXMgaW1wb3J0YW50LCBzbyBsZXQgbWUganVzdCB0YWtlIGEgcXVpY2sgbG9vayBhdCB0aGUgc291cmNlIGNvZGUgZm9yIGB0bHNfcnhfbXNnX3NpemVgIHRvIGNvbmZpcm0uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjczNzIsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMTksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDoxNi4yNDgwMjc2MDhaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU0MzM1OTE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRsc19yeF9tc2dfc2l6ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGxzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGxzL3Rscy5oPTE5Nz12b2lkIHRsc19zdHJwX21zZ19jb25zdW1lKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKTtcXG5uZXQvdGxzL3Rscy5oLTE5OC1cXG5uZXQvdGxzL3Rscy5oOjE5OTppbnQgdGxzX3J4X21zZ19zaXplKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTtcXG5uZXQvdGxzL3Rscy5oLTIwMC12b2lkIHRsc19yeF9tc2dfbWF5YmVfYW5ub3VuY2Uoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApO1xcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTIxMD1zdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbl9mcmFnKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTIzOS1cXG5uZXQvdGxzL3Rsc19zdHJwLmM6MjQwOlxcdFxcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHNrYik7XFxubmV0L3Rscy90bHNfc3RycC5jLTI0MS1cXHRcXHRpZiAoc3ogXFx1MDAzYyAwKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTI4Nj1zdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbl9za2Ioc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtMzE5LVxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxubmV0L3Rscy90bHNfc3RycC5jOjMyMDpcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBza2IpO1xcbm5ldC90bHMvdGxzX3N0cnAuYy0zMjEtXFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTMzLVxcbm5ldC90bHMvdGxzX3N0cnAuYzo1MzQ6XFx0XFx0c3ogPSB0bHNfcnhfbXNnX3NpemUoc3RycCwgc3RycC1cXHUwMDNlYW5jaG9yKTtcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTM1LVxcdFxcdGlmIChzeiBcXHUwMDNjIDApXFxuLS1cXG5uZXQvdGxzL3Rsc19zdy5jPTIxNzA9Ym9vbCB0bHNfc3dfc29ja19pc19yZWFkYWJsZShzdHJ1Y3Qgc29jayAqc2spXFxuLS1cXG5uZXQvdGxzL3Rsc19zdy5jLTIxNzgtXFxubmV0L3Rscy90bHNfc3cuYzoyMTc5OmludCB0bHNfcnhfbXNnX3NpemUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpXFxubmV0L3Rscy90bHNfc3cuYy0yMTgwLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MTYuMzAyNDQzMjA2WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4MjQwNTU3NzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSdyZSBteSBvd246XG5cbioqQW5hbHl6aW5nIGB0bHNfcnhfbXNnX3NpemVgKipcblxuQWxyaWdodCwgbGV0J3MgcHVsbCB1cCBhbmQgYW5hbHl6ZSB0aGlzIGB0bHNfcnhfbXNnX3NpemVgIHRoaW5nLiBJJ20gaW1tZWRpYXRlbHkgdGhpbmtpbmcsIG9rYXksIHRoaXMgbGlrZWx5IHJlbGF0ZXMgdG8gdGhlIHJlY2VwdGlvbiBzaWRlIG9mIFRMUywgcmlnaHQ/IFRoZSBzaXplIG9mIGEgcmVjZWl2ZWQgVExTIG1lc3NhZ2UuIE5vdywgdGhlIGNvbnRleHQgaXMga2V5LiBXaGF0J3MgdGhlIGVudmlyb25tZW50PyBJcyB0aGlzIGNsaWVudC1zaWRlLCBzZXJ2ZXItc2lkZSwgb3Igc29tZXRoaW5nIGVsc2U/IElzIHRoaXMgY29kZSBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgVExTIGxpYnJhcnk/IEFuZCwgbW9yZSBpbXBvcnRhbnRseSwgd2hhdCdzIHRoZSBsZXZlbCBvZiBhYnN0cmFjdGlvbiB3ZSdyZSBhdD8gQXJlIHdlIGxvb2tpbmcgYXQgYSByYXcgYnl0ZSBidWZmZXIsIG9yIGFyZSB3ZSBkZWFsaW5nIHdpdGggYSBoaWdoZXItbGV2ZWwgZGF0YSBzdHJ1Y3R1cmU/IFRoZSBkZXZpbCBpcyBhbHdheXMgaW4gdGhlIGRldGFpbHMgd2l0aCBUTFMsIGFuZCBtZXNzYWdlIHNpemluZyBpcyBhIGtub3duIGF0dGFjayB2ZWN0b3IsIHNvIEknbGwgYmUga2VlcGluZyBhIHNoYXJwIGV5ZSBvdXQgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgbGlrZSBpbnRlZ2VyIG92ZXJmbG93cyBvciByZXNvdXJjZSBleGhhdXN0aW9uIGhlcmUuIFdl4oCZbGwgYmUgY2hlY2tpbmcgaG93IHNpemUgaXMgZGV0ZXJtaW5lZCBhbmQgdXNlZCwgYW5kIHdoZXJlIHRoZSB2YWx1ZSBjYW1lIGZyb20uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg2MjEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDoyMC4xMjY1MDE2NzVaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY5MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90bHMvdGxzX3N3LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjE3OSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjE3OTpcXHRpbnQgdGxzX3J4X21zZ19zaXplKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjIxODA6XFx0e1xcbjIxODE6XFx0XFx0c3RydWN0IHRsc19jb250ZXh0ICp0bHNfY3R4ID0gdGxzX2dldF9jdHgoc3RycC1cXHUwMDNlc2spO1xcbjIxODI6XFx0XFx0c3RydWN0IHRsc19wcm90X2luZm8gKnByb3QgPSBcXHUwMDI2dGxzX2N0eC1cXHUwMDNlcHJvdF9pbmZvO1xcbjIxODM6XFx0XFx0Y2hhciBoZWFkZXJbVExTX0hFQURFUl9TSVpFICsgVExTX01BWF9JVl9TSVpFXTtcXG4yMTg0OlxcdFxcdHNpemVfdCBjaXBoZXJfb3ZlcmhlYWQ7XFxuMjE4NTpcXHRcXHRzaXplX3QgZGF0YV9sZW4gPSAwO1xcbjIxODY6XFx0XFx0aW50IHJldDtcXG4yMTg3OlxcdFxcbjIxODg6XFx0XFx0LyogVmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIGZ1bGwgVExTIGhlYWRlciwgb3Igd2FpdCBmb3IgbW9yZSBkYXRhICovXFxuMjE4OTpcXHRcXHRpZiAoc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHByb3QtXFx1MDAzZXByZXBlbmRfc2l6ZSBcXHUwMDNlIHNrYi1cXHUwMDNlbGVuKVxcbjIxOTA6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjE5MTpcXHRcXG4yMTkyOlxcdFxcdC8qIFNhbml0eS1jaGVjayBzaXplIG9mIG9uLXN0YWNrIGJ1ZmZlci4gKi9cXG4yMTkzOlxcdFxcdGlmIChXQVJOX09OKHByb3QtXFx1MDAzZXByZXBlbmRfc2l6ZSBcXHUwMDNlIHNpemVvZihoZWFkZXIpKSkge1xcbjIxOTQ6XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4yMTk1OlxcdFxcdFxcdGdvdG8gcmVhZF9mYWlsdXJlO1xcbjIxOTY6XFx0XFx0fVxcbjIxOTc6XFx0XFxuMjE5ODpcXHRcXHQvKiBMaW5lYXJpemUgaGVhZGVyIHRvIGxvY2FsIGJ1ZmZlciAqL1xcbjIxOTk6XFx0XFx0cmV0ID0gc2tiX2NvcHlfYml0cyhza2IsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQsIGhlYWRlciwgcHJvdC1cXHUwMDNlcHJlcGVuZF9zaXplKTtcXG4yMjAwOlxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjIyMDE6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIwMjpcXHRcXG4yMjAzOlxcdFxcdHN0cnAtXFx1MDAzZW1hcmsgPSBoZWFkZXJbMF07XFxuMjIwNDpcXHRcXG4yMjA1OlxcdFxcdGRhdGFfbGVuID0gKChoZWFkZXJbNF0gXFx1MDAyNiAweEZGKSB8IChoZWFkZXJbM10gXFx1MDAzY1xcdTAwM2MgOCkpO1xcbjIyMDY6XFx0XFxuMjIwNzpcXHRcXHRjaXBoZXJfb3ZlcmhlYWQgPSBwcm90LVxcdTAwM2V0YWdfc2l6ZTtcXG4yMjA4OlxcdFxcdGlmIChwcm90LVxcdTAwM2V2ZXJzaW9uICE9IFRMU18xXzNfVkVSU0lPTiBcXHUwMDI2XFx1MDAyNlxcbjIyMDk6XFx0XFx0ICAgIHByb3QtXFx1MDAzZWNpcGhlcl90eXBlICE9IFRMU19DSVBIRVJfQ0hBQ0hBMjBfUE9MWTEzMDUpXFxuMjIxMDpcXHRcXHRcXHRjaXBoZXJfb3ZlcmhlYWQgKz0gcHJvdC1cXHUwMDNlaXZfc2l6ZTtcXG4yMjExOlxcdFxcbjIyMTI6XFx0XFx0aWYgKGRhdGFfbGVuIFxcdTAwM2UgVExTX01BWF9QQVlMT0FEX1NJWkUgKyBjaXBoZXJfb3ZlcmhlYWQgK1xcbjIyMTM6XFx0XFx0ICAgIHByb3QtXFx1MDAzZXRhaWxfc2l6ZSkge1xcbjIyMTQ6XFx0XFx0XFx0cmV0ID0gLUVNU0dTSVpFO1xcbjIyMTU6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIxNjpcXHRcXHR9XFxuMjIxNzpcXHRcXHRpZiAoZGF0YV9sZW4gXFx1MDAzYyBjaXBoZXJfb3ZlcmhlYWQpIHtcXG4yMjE4OlxcdFxcdFxcdHJldCA9IC1FQkFETVNHO1xcbjIyMTk6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIyMDpcXHRcXHR9XFxuMjIyMTpcXHRcXG4yMjIyOlxcdFxcdC8qIE5vdGUgdGhhdCBib3RoIFRMUzEuMyBhbmQgVExTMS4yIHVzZSBUTFNfMV8yIHZlcnNpb24gaGVyZSAqL1xcbjIyMjM6XFx0XFx0aWYgKGhlYWRlclsxXSAhPSBUTFNfMV8yX1ZFUlNJT05fTUlOT1IgfHxcXG4yMjI0OlxcdFxcdCAgICBoZWFkZXJbMl0gIT0gVExTXzFfMl9WRVJTSU9OX01BSk9SKSB7XFxuMjIyNTpcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbjIyMjY6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIyNzpcXHRcXHR9XFxuMjIyODpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MjAuMTI2NzczMzc1WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgwMTUxNjMzNjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFRMUyBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgdGxzX3J4X21zZ19zaXplYCBmdW5jdGlvbiwgYW5kIGl0J3MgY2FsbGluZyBgc2tiX2NvcHlfYml0c2AuIFRoZSBwb3RlbnRpYWwgcHJvYmxlbSBpbW1lZGlhdGVseSBoaXRzIG1lOiBpZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzbid0IGNhbGxlZCAqYmVmb3JlKiB0aGlzIGBza2JfY29weV9iaXRzYCBjYWxsLCB0aGVuIHRoZSBTb2NrZXQgQnVmZmVyIChza2IpIGNvdWxkIGNvbnRhaW4gbWl4ZWQgb3Igb3V0LW9mLW9yZGVyIGRlY3J5cHRlZCBkYXRhLiBgc2tiX2NvcHlfYml0c2AganVzdCAqcmVhZHMqIGZyb20gdGhlIHNrYiwgc28gaXQgY2FuJ3QgYmUgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUuIEl0IGNvcGllcyBkYXRhIGZyb20gdGhlIHNvY2tldCBidWZmZXIgaW50byBgaGVhZGVyYC4gQnV0IGlmIHRoZSBza2IgaGFzIGJhZCBkYXRhLCBgc2tiX2NvcHlfYml0c2AgaXMgZ29pbmcgdG8gcmVhZCBnYXJiYWdlLlxuXG5JZiBpdCByZWFkcyBnYXJiYWdlLCB0aGF0IG1lYW5zIGl0IG1pZ2h0IGNhbGN1bGF0ZSBhIGNvbXBsZXRlbHkgaW5jb3JyZWN0IGBkYXRhX2xlbmAuIFRoZSBvcmlnaW5hbCBhbmFseXNpcyBzYWlkIGBoZWFkZXJgIGlzIGZ1bGx5IHdyaXR0ZW4gYnkgYHNrYl9jb3B5X2JpdHNgLCBvciBpdCByZXR1cm5zIGFuIGVycm9yLCBzbyBgaGVhZGVyYCB3aWxsIGJlIGluaXRpYWxpemVkIGluIGFsbCBjYXNlcy5cblxuVGhlIHJlYWwgaXNzdWUgaXMgdGhlIHRpbWluZy4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCAqdXNlZCogdG8gYmUgY2FsbGVkICphZnRlciogYHRsc19yeF9tc2dfc2l6ZWAgYW5kIHRoZSBzZXR0aW5nIG9mIGBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbmAuIFRoaXMgb3JkZXIgaXMgY3JpdGljYWwgYmVjYXVzZSBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHZlcmlmaWVzIHRoZSBxdWV1ZSdzIGludGVncml0eSBiYXNlZCBvbiBgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW5gLiBJZiB0aGUgcXVldWUgaXNuJ3QgT0ssIGl0IGNhbGxzIGB0bHNfc3RycF9yZWFkX2NvcHlgLlxuXG5TbywgYmVmb3JlIHRoaXMgcGF0Y2gsIGB0bHNfcnhfbXNnX3NpemVgIGNvdWxkIHJlYWQgZnJvbSBhIGNvcnJ1cHQgcXVldWUuIFRoYXQgd291bGQgZ2l2ZSBpdCBhIGJhZCBUTFMgaGVhZGVyIGFuZCB0aGVyZWZvcmUsIGEgd3JvbmcgYHN6YCB2YWx1ZS4gVGhlbiwgd2hlbiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzIGNhbGxlZCAqYWZ0ZXIqIHRoaXMgY2FsY3VsYXRpb24sIGl0J3MgY2hlY2tpbmcgYWdhaW5zdCBhbiBhbHJlYWR5IGluY29ycmVjdCBgZnVsbF9sZW5gLlxuXG5JZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGZhaWxzLCBpdCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBIb3dldmVyLCBldmVuIGlmIHRoZSBxdWV1ZSBpcyBiYWQsIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKm1pZ2h0KiBpdGVyYXRlIG92ZXIgdGhlIHF1ZXVlIHVwIHRvIGBsZW5gIGlmIHRoZSByZXN1bHRpbmcgYHN6YCBpcyBhIGh1Z2UgdmFsdWUuIFRoaXMgY291bGQgb3BlbiBhIG5ldyBhdmVudWUgZm9yIGF0dGFjay4gSSBuZWVkIHRvIHJlLWV4YW1pbmUgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBtb3JlIGNsb3NlbHkgdG8gYmUgc3VyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6OTcxMywiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMwOjI4LjE0MTkzOTYwOVoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTEwNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQzMyxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQzMzpcXHRzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxcbiA0MzU6XFx0e1xcbiA0MzY6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0LCAqc2tiO1xcbiA0Mzc6XFx0XFx0dTMyIHNlcTtcXG4gNDM4OlxcdFxcbiA0Mzk6XFx0XFx0Zmlyc3QgPSBza2Jfc2hpbmZvKHN0cnAtXFx1MDAzZWFuY2hvciktXFx1MDAzZWZyYWdfbGlzdDtcXG4gNDQwOlxcdFxcdHNrYiA9IGZpcnN0O1xcbiA0NDE6XFx0XFx0c2VxID0gVENQX1NLQl9DQihmaXJzdCktXFx1MDAzZXNlcTtcXG4gNDQyOlxcdFxcbiA0NDM6XFx0XFx0LyogTWFrZSBzdXJlIHRoZXJlJ3Mgbm8gZHVwbGljYXRlIGRhdGEgaW4gdGhlIHF1ZXVlLFxcbiA0NDQ6XFx0XFx0ICogYW5kIHRoZSBkZWNyeXB0ZWQgc3RhdHVzIG1hdGNoZXMuXFxuIDQ0NTpcXHRcXHQgKi9cXG4gNDQ2OlxcdFxcdHdoaWxlIChza2ItXFx1MDAzZWxlbiBcXHUwMDNjIGxlbikge1xcbiA0NDc6XFx0XFx0XFx0c2VxICs9IHNrYi1cXHUwMDNlbGVuO1xcbiA0NDg6XFx0XFx0XFx0bGVuIC09IHNrYi1cXHUwMDNlbGVuO1xcbiA0NDk6XFx0XFx0XFx0c2tiID0gc2tiLVxcdTAwM2VuZXh0O1xcbiA0NTA6XFx0XFxuIDQ1MTpcXHRcXHRcXHRpZiAoVENQX1NLQl9DQihza2IpLVxcdTAwM2VzZXEgIT0gc2VxKVxcbiA0NTI6XFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA0NTM6XFx0XFx0XFx0aWYgKHNrYl9jbXBfZGVjcnlwdGVkKGZpcnN0LCBza2IpKVxcbiA0NTQ6XFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA0NTU6XFx0XFx0fVxcbiA0NTY6XFx0XFxuIDQ1NzpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNDU4OlxcdH1cXG4gNDU5OlxcdFxcbiA0NjA6XFx0c3RhdGljIHZvaWQgdGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgaW50IGxlbilcXG4gNDYxOlxcdHtcXG4gNDYyOlxcdFxcdHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc3RycC1cXHUwMDNlc2spO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDoyOC4xNDIwOTMyOTlaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTEwNjY3MjYxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgTlVMTCBQb2ludGVyIERlcmVmZXJlbmNlIGluIHRoZSBUTFMgU3RhY2sqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIEkgc2VlIHRoaXMgbG9vcCBpdGVyYXRpbmcgdGhyb3VnaCBhbiBgc2tiYCBmcmFnX2xpc3QuIFRoZSBjb3JlIGNvbmNlcm4gaGVyZSBpcyB0aGF0IGlmIHRoZSBgbGVuYCB2YWx1ZSBpcyBleGNlc3NpdmVseSBsYXJnZSwgbGlrZWx5IGR1ZSB0byBhIGdhcmJhZ2UgdmFsdWUgZnJvbSB0aGUgYHN6YCBjYWxjdWxhdGlvbiwgdGhlIGBza2JgIHBvaW50ZXIgY291bGQgYmVjb21lIE5VTEwgYmVmb3JlIGBsZW5gIGlzIGZ1bGx5IGNvbnN1bWVkLiBTcGVjaWZpY2FsbHksIGluc2lkZSB0aGUgbG9vcCwgaWYgd2UgZXhoYXVzdCB0aGUgZnJhZ19saXN0IGFuZCBgc2tiYCBiZWNvbWVzIE5VTEwgYmVmb3JlIGBsZW5gIGlzIHplcm8sIHRoZW4gdGhlIHN1YnNlcXVlbnQgYWNjZXNzIHRvIGBUQ1BfU0tCX0NCKHNrYilgIHdpbGwgcmVzdWx0IGluIGEgZGVyZWZlcmVuY2Ugb2YgYSBOVUxMIHBvaW50ZXIsIGxlYWRpbmcgdG8gYSBjcmFzaCDigJMgYSBjbGFzc2ljIGFuZCByZWFkaWx5IGRldGVjdGFibGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGJ1Zy4gS0FTQU4gd291bGQgZGVmaW5pdGVseSBmbGFnIHRoaXMsIG9yIHdlJ2QgZ2V0IGEga2VybmVsIG9vcHMuXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMgdG8gY29uc2lkZXIgaWYgdGhpcyByZWxhdGVzIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBidXQgdGhlbiBJIHJlbWVtYmVyZWQgdGhhdCBgc2tiX2NvcHlfYml0c2AgaW5pdGlhbGl6ZXMgdGhlIGBoZWFkZXJgLiBTbywgaXQncyBub3QgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBjcnV4IG9mIHRoZSBpc3N1ZSBhcHBlYXJzIHRvIGJlIHRoYXQgYHRsc19yeF9tc2dfc2l6ZWAgaXMgcmVhZGluZyBhIG1hbGZvcm1lZCBxdWV1ZSwgb2J0YWlucyBhIGdhcmJhZ2UgbGVuZ3RoIGFuZCB0aGVuIHRoYXQgZ2FyYmFnZSBsZW5ndGggZ2V0cyB1c2VkIGJ5IGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIHdoaWNoIHRoZW4gaXRlcmF0ZXMgb3ZlciB0aGUgZnJhZ19saXN0IHBvdGVudGlhbGx5IGRlcmVmZXJlbmNpbmcgYSBOVUxMIHBvaW50ZXIuXG5cbkJ1dCB3YWl0LCBpcyBgbGVuYCAqZ3VhcmFudGVlZCogdG8gYmUgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGZyYWdfbGlzdD8gTGV0J3MgdHJhY2UgaXQgYmFjay4gYHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWVgIHNldHMgYHN0cnAtXHUwMDNlYW5jaG9yLVx1MDAzZWxlbmAgdG8gYG9mZnNldCArIGxlbmAsIHdoZXJlIGBsZW5gIGlzIGBpbnFgLiBIb3dldmVyLCBgc3pgIGNhbiBiZSBhcyBsYXJnZSBhcyBgVExTX01BWF9QQVlMT0FEX1NJWkUgKyBjaXBoZXJfb3ZlcmhlYWQgKyBwcm90LVx1MDAzZXRhaWxfc2l6ZWAsIHdoaWNoIGlzIGFyb3VuZCAxNktCLlxuXG5Ob3csIGxldCdzIGxvb2sgYXQgYHRsc19zdHJwX3JlYWRfc29ja2AuIElmIGBpbnFgIGlzIHNtYWxsZXIgdGhhbiBgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW5gLCB0aGVuIHRoZSBjb2RlIHJldHVybnMgYHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKWAgKmJlZm9yZSogY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBTbywgdGhlIHZ1bG5lcmFibGUgY2FzZSBpcyBwcmVjaXNlbHkgd2hlbiBgaW5xYCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIGBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbmAsIGluIG90aGVyIHdvcmRzIHdlIGNhbiBnZXQgYSBsYXJnZXIgbGVuZ3RoIGNhbGN1bGF0ZWQsIGFuZCB0aGVuIGl0IGlzIHBhc3NlZCBpbnRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuIE5lZWQgdG8gbG9vayBhdCBgdGxzX3N0cnBfcmVhZF9zb2NrYCBhZ2FpbiBhbmQgY29uZmlybSB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTI2OCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMwOjM3LjI0ODc2ODk1NloiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjc3NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUyNSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyNTpcXHRcXG4gNTI2OlxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcXG4gNTI3OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDUyODpcXHRcXHRcXHRpZiAoaW5xIFxcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxcbiA1Mjk6XFx0XFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcXG4gNTMwOlxcdFxcbiA1MzE6XFx0XFx0XFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ICsgVExTX0hFQURFUl9TSVpFKSlcXG4gNTMyOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xcbiA1MzM6XFx0XFxuIDUzNDpcXHRcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVxcdTAwM2VhbmNob3IpO1xcbiA1MzU6XFx0XFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4gNTM2OlxcdFxcdFxcdFxcdHJldHVybiBzejtcXG4gNTM3OlxcdFxcbiA1Mzg6XFx0XFx0XFx0c3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XFxuIDUzOTpcXHRcXG4gNTQwOlxcdFxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuIHx8IGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTQxOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDU0MjpcXHRcXHR9XFxuIDU0MzpcXHRcXG4gNTQ0OlxcdFxcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbikpXFxuIDU0NTpcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4gNTQ2OlxcdFxcbiA1NDc6XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDEpO1xcbiA1NDg6XFx0XFxuIDU0OTpcXHRcXHRyZXR1cm4gMDtcXG4gNTUwOlxcdH1cXG4gNTUxOlxcdFxcbiA1NTI6XFx0LyogUGFyc2UgcXVldWVkIGRhdGEuIFdoZW4gQGFubm91bmNlIGlzIHRydWUgYW5kIHBhcnNpbmcgcHJvZHVjZXMgYVxcbiA1NTM6XFx0ICogbmV3bHktcmVhZHkgcmVjb3JkLCBmaXJlIHRoZSBjb25zdW1lciBub3RpZmljYXRpb24uIENhbGxlcnMgdGhhdFxcbiA1NTQ6XFx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDozNy4yNDg5MzkwODZaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTY2MzE5NDk0MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGB0bHNfc3RycF9yZWFkX3NvY2tgIGFuZCBRdWV1ZSBJbnRlZ3JpdHkqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEluIGB0bHNfc3RycF9yZWFkX3NvY2tgLCBJJ20gbG9va2luZyBhdCBob3cgd2UncmUgaGFuZGxpbmcgZGF0YSByZWNlcHRpb24sIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBUTFMgc3RyZWFtLiBUaGUgY3JpdGljYWwgcGFydCBpcyB0aGF0IGNvbmRpdGlvbmFsIGJsb2NrOlxuXG5gYGBjXG5cdFx0aWYgKCFzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiB8fCBpbnEgXHUwMDNjIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKVxuXHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcblx0fVxuXG5cdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxuXHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuYGBgXG5cbkVzc2VudGlhbGx5LCBpZiB3ZSBoYXZlbid0IGRldGVybWluZWQgdGhlIGZ1bGwgbWVzc2FnZSBsZW5ndGggeWV0IChgIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuYCkgb3IgaWYgdGhlIGF2YWlsYWJsZSBkYXRhIGluIHRoZSByZWNlaXZlIHF1ZXVlIChgaW5xYCkgaXMgbGVzcyB0aGFuIHRoZSBleHBlY3RlZCBmdWxsIGxlbmd0aCwgd2UgZmFsbCBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBIb3dldmVyLCB0aGUgY3JpdGljYWwgcG9pbnQgaXMgdGhlIHNlY29uZCBjb25kaXRpb24uIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaXMgb25seSBjYWxsZWQgaWYgYGlucSBcdTAwM2U9IHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuYC4gVGhpcyBtZWFucyB0aGUgY29kZSBhc3N1bWVzIHRoYXQgaWYgd2UgaGF2ZSBlbm91Z2ggKnRvdGFsKiBkYXRhLCB3ZSBjYW4gcHJvY2VlZC5cblxuTm93LCBpZiBgaW5xYCB0cnVseSByZXByZXNlbnRzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGZyYWdfbGlzdCAod2hpY2ggaXMgcG9wdWxhdGVkIHZpYSBgdGNwX3JlY3Zfc2tiYCksIHRoZW4gdGhlIGBza2ItXHUwMDNlbmV4dGAgcG9pbnRlciAqc2hvdWxkKiBuZXZlciBiZSBOVUxMIGluc2lkZSBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLCBwcm92aWRlZCB0aGUgY29uZGl0aW9uIGlzIGBpbnEgXHUwMDNlPSBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbmAsIGJlY2F1c2UgdGhlIHRvdGFsIG9mIHRoZSBza2IncyBsZW4gd2lsbCBiZSBhdCBsZWFzdCBgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW5gLlxuXG5Ib3dldmVyLCBgdGNwX3JlY3Zfc2tiYCByZXR1cm5zIG9ubHkgdGhlIGZpcnN0IFNLQiwgd2hpY2ggaXMgdGhlbiBsaW5rZWQgdmlhIGBza2ItXHUwMDNlbmV4dGAuIElmIHRoZSB0b3RhbCBzdW0gb2YgYHNrYi1cdTAwM2VsZW5gIG9mIGFsbCBza2JzIGlzIGF0IGxlYXN0IGBsZW5gLCB0aGVuIGBza2JgIHdpbGwgbm90IGJlIE5VTEwgYWZ0ZXIgdGhlIGl0ZXJhdGlvbi5cblxuSSBuZWVkIHRvIGNvbmZpcm0gaWYgYGlucWAgdHJ1bHkgcmVmbGVjdHMgdGhlIHN1bSBvZiBhbGwgYHNrYi1cdTAwM2VsZW5gIHZhbHVlcyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSwgYXMgdGhlIGNoZWNrIGluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgZGVwZW5kcyBvbiB0aGlzLiBCYXNlZCBvbiBob3cgYHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWVgIGlzIGRlZmluZWQ6XG5cbmBgYGNcblx0Zmlyc3QgPSB0Y3BfcmVjdl9za2Ioc3RycC1cdTAwM2VzaywgdHAtXHUwMDNlY29waWVkX3NlcSwgXHUwMDI2b2Zmc2V0KTtcblx0aWYgKFdBUk5fT05fT05DRSghZmlyc3QpKVxuXHRcdHJldHVybjtcblxuXHQvKiBCZXN0b3cgdGhlIHN0YXRlIG9udG8gdGhlIGFuY2hvciAqL1xuXHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2VsZW4gPSBvZmZzZXQgKyBsZW47XG5cdHN0cnAtXHUwMDNlYW5jaG9yLVx1MDAzZWRhdGFfbGVuID0gb2Zmc2V0ICsgbGVuO1xuXHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2V0cnVlc2l6ZSA9IG9mZnNldCArIGxlbjtcblxuXHRza2Jfc2hpbmZvKHN0cnAtXHUwMDNlYW5jaG9yKS1cdTAwM2VmcmFnX2xpc3QgPSBmaXJzdDtcbmBgYFxuXG5gdGNwX3JlY3Zfc2tiYCBhbmQgYHRjcF9pbnFgIHdvcmsgdG9nZXRoZXIgdG8gKmd1YXJhbnRlZSogdGhhdCBgaW5xYCByZXByZXNlbnRzIHRoZSB0b3RhbCBhbW91bnQgb2YgYXZhaWxhYmxlIGRhdGEsIGFsdGhvdWdoIG9ubHkgdGhlIGZpcnN0IFNLQiBpcyBpbW1lZGlhdGVseSBsaW5rZWQuXG5cbk15IGNvbmNlcm4gc3RlbXMgZnJvbSBhIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5IGluIGhvdyBgdGxzX3J4X21zZ19zaXplYCBoYW5kbGVzIGZyYWdtZW50ZWQsIHBvdGVudGlhbGx5IG1hbGZvcm1lZCwgVENQIGRhdGEgd2l0aGluIHRoZSBgZnJhZ19saXN0YCBzdHJ1Y3R1cmUuIFRoZSBmdW5jdGlvbiByZWFkcyB0aGUgbWVzc2FnZSBzaXplIHVzaW5nIGBza2JfY29weV9iaXRzYCwgc3RhcnRpbmcgZnJvbSBhIGtub3duIG9mZnNldCB3aXRoaW4gdGhlIGBzdHJwLVx1MDAzZWFuY2hvcmAgU0tCLiBIb3dldmVyLCBpZiB0aGUgVENQIHJlY2VpdmUgcXVldWUgaXMgY29ycnVwdGVkLCB3aXRoIG91dC1vZi1vcmRlciwgb3ZlcmxhcHBpbmcgb3IgbWlzc2luZyBza2JzLCBgc2tiX2NvcHlfYml0c2AgbWF5IHJlYWQgdGhlIHdyb25nIGJpdHMsIGJhc2VkIG9uIGluY29ycmVjdCBhc3N1bXB0aW9ucyBhYm91dCBkYXRhIGNvbnRpZ3VpdHkgd2l0aGluIHRoZSBgZnJhZ19saXN0YC5cblxuVGhlIFRDUCByZWNlaXZlIHF1ZXVlIGNvbnRhaW5zICppbi1vcmRlciogc2ticy5cblxuQnV0LCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGNoZWNrcyBgVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcSAhPSBzZXFgLiBJcyB0aGlzIGNvcnJlY3Q/IElzIGl0IGNoZWNraW5nIGZvciAqZW5jcnlwdGVkKiBkYXRhIGluIHRoZSByZWNlaXZlIHF1ZXVlP1xuXG5gYGBjXG5cdFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VzZXEgIT0gc2VxKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdGlmIChza2JfY21wX2RlY3J5cHRlZChmaXJzdCwgc2tiKSlcblx0XHRcdHJldHVybiBmYWxzZTtcbmBgYFxuXG5JZiBgVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcSAhPSBzZXFgLCBpdCBtZWFucyBkYXRhIGlzIG91dC1vZi1vcmRlciwgb3IgcG9zc2libHkgdGhlcmUgaXMgYSBnYXAuIE92ZXJsYXBwaW5nIHNrYnMgYXJlIHBvc3NpYmxlLCBhbmQgYHNrYl9jb3B5X2JpdHNgICp3aWxsKiByZWFkIHRoZSB3cm9uZyBieXRlcyBmcm9tIHRoZXNlIGZyYWdtZW50cy4gSXQgbWF5IHJlYWQgZnJvbSBvdmVybGFwcGluZyBkYXRhLCBsZWFkaW5nIHRvIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9uLiBJZiB0aGUgc2l6ZSBpcyBpbmNvcnJlY3QsIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgbWlnaHQgdGhlbiBmYWlsLlxuXG5UaGUgcGF0Y2gncyBpbnRyb2R1Y3Rpb24gb2YgdGhlIGBpZiAoaW5xXG5cbiIsIklucHV0VG9rZW5zIjoxMjk1OCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNjQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDo1My44ODA4OTA1MzNaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcxNTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90bHMvdGxzX3N3LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjE3OSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjE3OTpcXHRpbnQgdGxzX3J4X21zZ19zaXplKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjIxODA6XFx0e1xcbjIxODE6XFx0XFx0c3RydWN0IHRsc19jb250ZXh0ICp0bHNfY3R4ID0gdGxzX2dldF9jdHgoc3RycC1cXHUwMDNlc2spO1xcbjIxODI6XFx0XFx0c3RydWN0IHRsc19wcm90X2luZm8gKnByb3QgPSBcXHUwMDI2dGxzX2N0eC1cXHUwMDNlcHJvdF9pbmZvO1xcbjIxODM6XFx0XFx0Y2hhciBoZWFkZXJbVExTX0hFQURFUl9TSVpFICsgVExTX01BWF9JVl9TSVpFXTtcXG4yMTg0OlxcdFxcdHNpemVfdCBjaXBoZXJfb3ZlcmhlYWQ7XFxuMjE4NTpcXHRcXHRzaXplX3QgZGF0YV9sZW4gPSAwO1xcbjIxODY6XFx0XFx0aW50IHJldDtcXG4yMTg3OlxcdFxcbjIxODg6XFx0XFx0LyogVmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIGZ1bGwgVExTIGhlYWRlciwgb3Igd2FpdCBmb3IgbW9yZSBkYXRhICovXFxuMjE4OTpcXHRcXHRpZiAoc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHByb3QtXFx1MDAzZXByZXBlbmRfc2l6ZSBcXHUwMDNlIHNrYi1cXHUwMDNlbGVuKVxcbjIxOTA6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjE5MTpcXHRcXG4yMTkyOlxcdFxcdC8qIFNhbml0eS1jaGVjayBzaXplIG9mIG9uLXN0YWNrIGJ1ZmZlci4gKi9cXG4yMTkzOlxcdFxcdGlmIChXQVJOX09OKHByb3QtXFx1MDAzZXByZXBlbmRfc2l6ZSBcXHUwMDNlIHNpemVvZihoZWFkZXIpKSkge1xcbjIxOTQ6XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4yMTk1OlxcdFxcdFxcdGdvdG8gcmVhZF9mYWlsdXJlO1xcbjIxOTY6XFx0XFx0fVxcbjIxOTc6XFx0XFxuMjE5ODpcXHRcXHQvKiBMaW5lYXJpemUgaGVhZGVyIHRvIGxvY2FsIGJ1ZmZlciAqL1xcbjIxOTk6XFx0XFx0cmV0ID0gc2tiX2NvcHlfYml0cyhza2IsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQsIGhlYWRlciwgcHJvdC1cXHUwMDNlcHJlcGVuZF9zaXplKTtcXG4yMjAwOlxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjIyMDE6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIwMjpcXHRcXG4yMjAzOlxcdFxcdHN0cnAtXFx1MDAzZW1hcmsgPSBoZWFkZXJbMF07XFxuMjIwNDpcXHRcXG4yMjA1OlxcdFxcdGRhdGFfbGVuID0gKChoZWFkZXJbNF0gXFx1MDAyNiAweEZGKSB8IChoZWFkZXJbM10gXFx1MDAzY1xcdTAwM2MgOCkpO1xcbjIyMDY6XFx0XFxuMjIwNzpcXHRcXHRjaXBoZXJfb3ZlcmhlYWQgPSBwcm90LVxcdTAwM2V0YWdfc2l6ZTtcXG4yMjA4OlxcdFxcdGlmIChwcm90LVxcdTAwM2V2ZXJzaW9uICE9IFRMU18xXzNfVkVSU0lPTiBcXHUwMDI2XFx1MDAyNlxcbjIyMDk6XFx0XFx0ICAgIHByb3QtXFx1MDAzZWNpcGhlcl90eXBlICE9IFRMU19DSVBIRVJfQ0hBQ0hBMjBfUE9MWTEzMDUpXFxuMjIxMDpcXHRcXHRcXHRjaXBoZXJfb3ZlcmhlYWQgKz0gcHJvdC1cXHUwMDNlaXZfc2l6ZTtcXG4yMjExOlxcdFxcbjIyMTI6XFx0XFx0aWYgKGRhdGFfbGVuIFxcdTAwM2UgVExTX01BWF9QQVlMT0FEX1NJWkUgKyBjaXBoZXJfb3ZlcmhlYWQgK1xcbjIyMTM6XFx0XFx0ICAgIHByb3QtXFx1MDAzZXRhaWxfc2l6ZSkge1xcbjIyMTQ6XFx0XFx0XFx0cmV0ID0gLUVNU0dTSVpFO1xcbjIyMTU6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIxNjpcXHRcXHR9XFxuMjIxNzpcXHRcXHRpZiAoZGF0YV9sZW4gXFx1MDAzYyBjaXBoZXJfb3ZlcmhlYWQpIHtcXG4yMjE4OlxcdFxcdFxcdHJldCA9IC1FQkFETVNHO1xcbjIyMTk6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIyMDpcXHRcXHR9XFxuMjIyMTpcXHRcXG4yMjIyOlxcdFxcdC8qIE5vdGUgdGhhdCBib3RoIFRMUzEuMyBhbmQgVExTMS4yIHVzZSBUTFNfMV8yIHZlcnNpb24gaGVyZSAqL1xcbjIyMjM6XFx0XFx0aWYgKGhlYWRlclsxXSAhPSBUTFNfMV8yX1ZFUlNJT05fTUlOT1IgfHxcXG4yMjI0OlxcdFxcdCAgICBoZWFkZXJbMl0gIT0gVExTXzFfMl9WRVJTSU9OX01BSk9SKSB7XFxuMjIyNTpcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbjIyMjY6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIyNzpcXHRcXHR9XFxuMjIyODpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6NTMuODgxMDYzODg0WiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgwMTM5ODk2MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgUmVhc29uaW5nIG9uIHRoZSBUTFMgUlggTWVzc2FnZSBTaXplIGFuZCBRdWV1ZSBWYWxpZGl0eSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyB3ZSBoYW5kbGUgbWVzc2FnZSBzaXplcyBpbiB0aGlzIFRMUyBpbXBsZW1lbnRhdGlvbiwgc3BlY2lmaWNhbGx5IHdoZW4gYHRsc19yeF9tc2dfc2l6ZWAgaXMgY2FsbGVkLiBJdCBzZWVtcyBsaWtlIGlmIHRoYXQgZnVuY3Rpb24gZW5jb3VudGVycyBhIHByb2JsZW0gb24gYSBxdWV1ZSB0aGF0J3Mgbm90IGluIGEgZ29vZCBzdGF0ZSwgaXQncyBkZXNpZ25lZCB0byByZXR1cm4gYW4gZXJyb3IgbGlrZSBgLUVJTlZBTGAsIGAtRU1TR1NJWkVgLCBvciBgLUVCQURNU0dgLiBUaGUgY29kZSBpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYCBkaXJlY3RseSBwYXNzZXMgdGhpcyBlcnJvciB1cCB0aGUgY2hhaW46XG5cbmBgYGNcblx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVx1MDAzZWFuY2hvcik7XG5cdFx0aWYgKHN6IFx1MDAzYyAwKVxuXHRcdFx0cmV0dXJuIHN6O1xuYGBgXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMsIFwiR3JlYXQsIGVycm9yIGhhbmRsaW5nISBJdCdzIHByb3BhZ2F0ZWQgY29ycmVjdGx5LlwiIEJ1dCwgaG9sZCBvbiBhIHNlY29uZC4uLiB3aGF0IGlmIHRoZSAqcXVldWUqIGlzIHRoZSBwcm9ibGVtPyBXaGF0IGlmIHRoZSBxdWV1ZSBpcyBtZXNzZWQgdXAg4oCTIG1heWJlIGl0J3MgZ290IGEgbWl4IG9mIGRlY3J5cHRlZCBhbmQgdW4tZGVjcnlwdGVkIGRhdGEsIG9yIG92ZXJsYXBwaW5nIHNrYnM/IEluIHRob3NlIGNhc2VzLCByZXR1cm5pbmcgYW4gKmVycm9yKiBhbmQgYWJvcnRpbmcgdGhlIGNvbm5lY3Rpb24gaXMgdGhlICp3cm9uZyogdGhpbmcgdG8gZG8hIFdlIG5lZWQgdG8gaGFuZGxlIHRoYXQgZ3JhY2VmdWxseSwgYW5kIGl0IHNlZW1zIGxpa2UgdGhlIGZhbGxiYWNrIG1lY2hhbmlzbSB0byBgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKWAgaXMgdGhlIHJpZ2h0IHRvb2wgZm9yIHRoaXMgam9iLlxuXG5BaGEhIE5vdyBJIHNlZS4gV2hlbiBgdGxzX3J4X21zZ19zaXplYCBlbmNvdW50ZXJzIGdhcmJhZ2UgZGF0YSBiZWNhdXNlIG9mIG92ZXJsYXBwaW5nIFNLQnMsIGl0IGNhbiByZXR1cm4gYW4gZXJyb3IgbGlrZSBgLUVJTlZBTGAgKG1heWJlIGR1ZSB0byBhIGJhZCBUTFMgdmVyc2lvbikgb3IgYC1FTVNHU0laRWAgKGEgYmFkIGxlbmd0aCBmaWVsZCkuIElmIHdlICpkaWRuJ3QqIGNoZWNrIHRoZSBxdWV1ZSdzIGhlYWx0aCwgYHRsc19zdHJwX3JlYWRfc29ja2Agd291bGQgYmxpbmRseSByZXR1cm4gdGhpcyBlcnJvciwgcG90ZW50aWFsbHkgY2F1c2luZyBhbiB1bm5lY2Vzc2FyeSBjb25uZWN0aW9uIHRlcm1pbmF0aW9uLlxuXG5CdXQsIGlmIHdlIGNoZWNrIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmZpcnN0Kiwgd2UgcmVhbGl6ZSB0aGUgcXVldWUgaXNuJ3QgcHJpc3RpbmUgYW5kIHRoYXQgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYSBtb3JlIHJvYnVzdCByZWFkaW5nIHN0cmF0ZWd5LiBUaGF0J3Mgd2hlcmUgYHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSlgIGNvbWVzIGluISBUaGlzIGZ1bmN0aW9uIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZWFsIHdpdGggdGhlIG1lc3N5IHF1ZXVlIHNpdHVhdGlvbnMuIE15IG1lbW9yeSB0ZWxscyBtZSB0aGF0IGl0IHByb2JhYmx5IGNvcGllcyB0aGUgZGF0YSBpbnRvIGEgY29udGlndW91cyBidWZmZXIgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gSSB3b25kZXIgd2hhdCBpdCBhY3R1YWxseSBkb2VzPyBJIG5lZWQgdG8gY2hlY2sgdGhlIGNvZGUgdGhlcmUgdG8gY29uZmlybSB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjIwMiwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM0MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjAxLjg5NTA1NjgxOFoiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTkxNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM5MCxcbiAgXCJMaW5lQ291bnRcIjogNDVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDM5MDpcXHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBxc2hvcnQpXFxuIDM5MTpcXHR7XFxuIDM5MjpcXHRcXHRzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87XFxuIDM5MzpcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gMzk0OlxcdFxcdGludCBuZWVkX3NwYywgbGVuO1xcbiAzOTU6XFx0XFxuIDM5NjpcXHRcXHQvKiBJZiB0aGUgcmJ1ZiBpcyBzbWFsbCBvciByY3Ygd2luZG93IGhhcyBjb2xsYXBzZWQgdG8gMCB3ZSBuZWVkXFxuIDM5NzpcXHRcXHQgKiB0byByZWFkIHRoZSBkYXRhIG91dC4gT3RoZXJ3aXNlIHRoZSBjb25uZWN0aW9uIHdpbGwgc3RhbGwuXFxuIDM5ODpcXHRcXHQgKiBXaXRob3V0IHByZXNzdXJlIHRocmVzaG9sZCBvZiBJTlRfTUFYIHdpbGwgbmV2ZXIgYmUgcmVhZHkuXFxuIDM5OTpcXHRcXHQgKi9cXG4gNDAwOlxcdFxcdGlmIChsaWtlbHkocXNob3J0IFxcdTAwMjZcXHUwMDI2ICF0Y3BfZXBvbGxpbl9yZWFkeShzdHJwLVxcdTAwM2VzaywgSU5UX01BWCkpKVxcbiA0MDE6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDQwMjpcXHRcXG4gNDAzOlxcdFxcdHNoaW5mbyA9IHNrYl9zaGluZm8oc3RycC1cXHUwMDNlYW5jaG9yKTtcXG4gNDA0OlxcdFxcbiA0MDU6XFx0XFx0LyogSWYgd2UgZG9uJ3Qga25vdyB0aGUgbGVuZ3RoIGdvIG1heCBwbHVzIHBhZ2UgZm9yIGNpcGhlciBvdmVyaGVhZCAqL1xcbiA0MDY6XFx0XFx0bmVlZF9zcGMgPSBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4gPzogVExTX01BWF9QQVlMT0FEX1NJWkUgKyBQQUdFX1NJWkU7XFxuIDQwNzpcXHRcXG4gNDA4OlxcdFxcdGZvciAobGVuID0gbmVlZF9zcGM7IGxlbiBcXHUwMDNlIDA7IGxlbiAtPSBQQUdFX1NJWkUpIHtcXG4gNDA5OlxcdFxcdFxcdHBhZ2UgPSBhbGxvY19wYWdlKHN0cnAtXFx1MDAzZXNrLVxcdTAwM2Vza19hbGxvY2F0aW9uKTtcXG4gNDEwOlxcdFxcdFxcdGlmICghcGFnZSkge1xcbiA0MTE6XFx0XFx0XFx0XFx0dGxzX3N0cnBfZmx1c2hfYW5jaG9yX2NvcHkoc3RycCk7XFxuIDQxMjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gNDEzOlxcdFxcdFxcdH1cXG4gNDE0OlxcdFxcbiA0MTU6XFx0XFx0XFx0c2tiX2ZpbGxfcGFnZV9kZXNjKHN0cnAtXFx1MDAzZWFuY2hvciwgc2hpbmZvLVxcdTAwM2Vucl9mcmFncysrLFxcbiA0MTY6XFx0XFx0XFx0XFx0XFx0ICAgcGFnZSwgMCwgMCk7XFxuIDQxNzpcXHRcXHR9XFxuIDQxODpcXHRcXG4gNDE5OlxcdFxcdHNoaW5mby1cXHUwMDNlZnJhZ19saXN0ID0gTlVMTDtcXG4gNDIwOlxcdFxcbiA0MjE6XFx0XFx0c3RycC1cXHUwMDNlY29weV9tb2RlID0gMTtcXG4gNDIyOlxcdFxcdHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgPSAwO1xcbiA0MjM6XFx0XFxuIDQyNDpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZWxlbiA9IDA7XFxuIDQyNTpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZWRhdGFfbGVuID0gMDtcXG4gNDI2OlxcdFxcdHN0cnAtXFx1MDAzZWFuY2hvci1cXHUwMDNldHJ1ZXNpemUgPSByb3VuZF91cChuZWVkX3NwYywgUEFHRV9TSVpFKTtcXG4gNDI3OlxcdFxcbiA0Mjg6XFx0XFx0dGxzX3N0cnBfcmVhZF9jb3B5aW4oc3RycCk7XFxuIDQyOTpcXHRcXG4gNDMwOlxcdFxcdHJldHVybiAwO1xcbiA0MzE6XFx0fVxcbiA0MzI6XFx0XFxuIDQzMzpcXHRzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMTowMS44OTUyMTgzNzhaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTk3MTk0MTcyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEaXZpbmcgRGVlcCBpbnRvIHRoZSBUTFMgU3RyaW5nIFBhcnNlcioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGB0bHNfc3RycF9yZWFkX2NvcHlgLCBhbmQgaXQncyBrZXkgZnVuY3Rpb25hbGl0eSBpbW1lZGlhdGVseSBqdW1wcyBvdXQ6IEl0IGZsaXBzIHRoZSBzdHJwYXJzZXIgaW50byBgY29weV9tb2RlID0gMWAuIFRoYXQncyB0aGUgc2lnbmFsIHRvIGdldCBzZXJpb3VzIGFib3V0IGRhdGEgaGFuZGxpbmcuIEl0IGxvb2tzIGxpa2UgaXQgaGFuZGxlcyBhbGxvY2F0aW9uIG9mIHBhZ2VzLCBhbmQgdGhlbiBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5aW4oc3RycClgLiBOb3csIHRoaXMgaXMgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4gYHRsc19zdHJwX3JlYWRfY29weWluYCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBhY3R1YWxseSAqY29waWVzKiB0aGUgZGF0YSwgcmlnaHQ/IEl0J3MgdGFraW5nIGRhdGEgZnJvbSB0aGUgVENQIHJlY2VpdmUgcXVldWUgYW5kIHB1dHRpbmcgaXQgaW50byB0aG9zZSBmcmVzaGx5IGFsbG9jYXRlZCBwYWdlcy5cblxuVGhpcyBzdWdnZXN0cyB0aGF0IHRoaXMgd2hvbGUgYXBwcm9hY2ggaXMgYnVpbHQgdG8gaGFuZGxlIHNwZWNpZmljLCBwb3RlbnRpYWxseSBtZXNzeSBzY2VuYXJpb3MuIFNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IG1peGVkIGRlY3J5cHRlZCBhbmQgbm9uLWRlY3J5cHRlZCBkYXRhIGluIHRoZSBUQ1AgcXVldWUsIG9yIHBvdGVudGlhbGx5IG92ZXJsYXBwaW5nIHNlcXVlbmNlIG51bWJlcnMuIFN0YW5kYXJkIGB0Y3BfcmVjdl9za2JgIG1pZ2h0IG5vdCBiZSB0aGUgbW9zdCBlbGVnYW50IHNvbHV0aW9uIHdoZW4geW91IGhhdmUgdGhvc2UgY29tcGxleGl0aWVzLCBlc3BlY2lhbGx5IGlmIHdlIHdlcmUgcmVseWluZyBkaXJlY3RseSBvbiBgZnJhZ19saXN0YC5cblxuSG9sZCBvbiBhIHNlY29uZCwgdGhvdWdoLiBJIHJlbWVtYmVyIGB0Y3BfcmVjdl9za2JgIGVzc2VudGlhbGx5IHJldHVybnMgdGhlIGZpcnN0IHNrYi4gSWYgd2UncmUgdXNpbmcgYGNvcHlfbW9kZWAgbGlrZSB0aGlzLCB3ZSdyZSBsaWtlbHkgbGV2ZXJhZ2luZyBzb21ldGhpbmcgbW9yZSByb2J1c3QsIHByb2JhYmx5IGB0Y3BfcmVhZF9zb2NrYCBvciBzaW1pbGFyLCB0byBoYW5kbGUgYWxsIHRob3NlIGludHJpY2FjaWVzIHdpdGggb3ZlcmxhcHBpbmcgc2VnbWVudHMgYW5kIGdhcHMgaW4gdGhlIGRhdGEgc3RyZWFtIHByb3Blcmx5LiBUaGF0IG1ha2VzIHNlbnNlLiBXZeKAmXJlIGJlaW5nIHByb2FjdGl2ZS5cblxuUmlnaHQsIHRpbWUgdG8gemVybyBpbiBvbiBgdGxzX3N0cnBfcmVhZF9jb3B5aW5gIGl0c2VsZiBhbmQgc2VlIGV4YWN0bHkgaG93IGl0IGFjaGlldmVzIHRoaXMgY2xlYW4gY29weS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIG1lY2hhbmljcyBpbiBkZXRhaWwgdG8gcmVhbGx5IGFwcHJlY2lhdGUgdGhlIGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc3ODgsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMTowNy44NjcxNjMxNzJaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA0NTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90bHMvdGxzX3N0cnAuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMjUsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzMjU6XFx0XFx0XFx0aWYgKHVubGlrZWx5KHN6IFxcdTAwMjZcXHUwMDI2IHN6IFxcdTAwM2Mgc2tiLVxcdTAwM2VsZW4pKSB7XFxuIDMyNjpcXHRcXHRcXHRcXHRpbnQgb3ZlciA9IHNrYi1cXHUwMDNlbGVuIC0gc3o7XFxuIDMyNzpcXHRcXG4gMzI4OlxcdFxcdFxcdFxcdFdBUk5fT05fT05DRShvdmVyIFxcdTAwM2UgY2h1bmspO1xcbiAzMjk6XFx0XFx0XFx0XFx0c2tiLVxcdTAwM2VsZW4gLT0gb3ZlcjtcXG4gMzMwOlxcdFxcdFxcdFxcdHNrYi1cXHUwMDNlZGF0YV9sZW4gLT0gb3ZlcjtcXG4gMzMxOlxcdFxcdFxcdFxcdF9fcHNrYl90cmltKG5za2IsIG5za2ItXFx1MDAzZWxlbiAtIG92ZXIpO1xcbiAzMzI6XFx0XFxuIDMzMzpcXHRcXHRcXHRcXHRjaHVuayAtPSBvdmVyO1xcbiAzMzQ6XFx0XFx0XFx0fVxcbiAzMzU6XFx0XFxuIDMzNjpcXHRcXHRcXHRzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4gPSBzejtcXG4gMzM3OlxcdFxcdH1cXG4gMzM4OlxcdFxcbiAzMzk6XFx0XFx0cmV0dXJuIGNodW5rO1xcbiAzNDA6XFx0fVxcbiAzNDE6XFx0XFxuIDM0MjpcXHRzdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbihyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IHNrX2J1ZmYgKmluX3NrYixcXG4gMzQzOlxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBpbl9sZW4pXFxuIDM0NDpcXHR7XFxuIDM0NTpcXHRcXHRzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCA9IChzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqKWRlc2MtXFx1MDAzZWFyZy5kYXRhO1xcbiAzNDY6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcXG4gMzQ3OlxcdFxcdGludCByZXQ7XFxuIDM0ODpcXHRcXG4gMzQ5OlxcdFxcdGlmIChzdHJwLVxcdTAwM2Vtc2dfcmVhZHkpXFxuIDM1MDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMzUxOlxcdFxcbiAzNTI6XFx0XFx0c2tiID0gc3RycC1cXHUwMDNlYW5jaG9yO1xcbiAzNTM6XFx0XFx0aWYgKCFza2ItXFx1MDAzZWxlbilcXG4gMzU0OlxcdFxcdFxcdHNrYl9jb3B5X2RlY3J5cHRlZChza2IsIGluX3NrYik7XFxuIDM1NTpcXHRcXHRlbHNlXFxuIDM1NjpcXHRcXHRcXHRzdHJwLVxcdTAwM2VtaXhlZF9kZWNyeXB0ZWQgfD0gISFza2JfY21wX2RlY3J5cHRlZChza2IsIGluX3NrYik7XFxuIDM1NzpcXHRcXG4gMzU4OlxcdFxcdGlmIChJU19FTkFCTEVEKENPTkZJR19UTFNfREVWSUNFKSBcXHUwMDI2XFx1MDAyNiBzdHJwLVxcdTAwM2VtaXhlZF9kZWNyeXB0ZWQpXFxuIDM1OTpcXHRcXHRcXHRyZXQgPSB0bHNfc3RycF9jb3B5aW5fc2tiKHN0cnAsIHNrYiwgaW5fc2tiLCBvZmZzZXQsIGluX2xlbik7XFxuIDM2MDpcXHRcXHRlbHNlXFxuIDM2MTpcXHRcXHRcXHRyZXQgPSB0bHNfc3RycF9jb3B5aW5fZnJhZyhzdHJwLCBza2IsIGluX3NrYiwgb2Zmc2V0LCBpbl9sZW4pO1xcbiAzNjI6XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApIHtcXG4gMzYzOlxcdFxcdFxcdGRlc2MtXFx1MDAzZWVycm9yID0gcmV0O1xcbiAzNjQ6XFx0XFx0XFx0cmV0ID0gMDtcXG4gMzY1OlxcdFxcdH1cXG4gMzY2OlxcdFxcbiAzNjc6XFx0XFx0aWYgKHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbiBcXHUwMDI2XFx1MDAyNiBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4gPT0gc2tiLVxcdTAwM2VsZW4pIHtcXG4gMzY4OlxcdFxcdFxcdGRlc2MtXFx1MDAzZWNvdW50ID0gMDtcXG4gMzY5OlxcdFxcbiAzNzA6XFx0XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDEpO1xcbiAzNzE6XFx0XFx0fVxcbiAzNzI6XFx0XFxuIDM3MzpcXHRcXHRyZXR1cm4gcmV0O1xcbiAzNzQ6XFx0fVxcbiAzNzU6XFx0XFxuIDM3NjpcXHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weWluKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbiAzNzc6XFx0e1xcbiAzNzg6XFx0XFx0cmVhZF9kZXNjcmlwdG9yX3QgZGVzYztcXG4gMzc5OlxcdFxcbiAzODA6XFx0XFx0ZGVzYy5hcmcuZGF0YSA9IHN0cnA7XFxuIDM4MTpcXHRcXHRkZXNjLmVycm9yID0gMDtcXG4gMzgyOlxcdFxcdGRlc2MuY291bnQgPSAxOyAvKiBnaXZlIG1vcmUgdGhhbiBvbmUgc2tiIHBlciBjYWxsICovXFxuIDM4MzpcXHRcXG4gMzg0OlxcdFxcdC8qIHNrIHNob3VsZCBiZSBsb2NrZWQgaGVyZSwgc28gb2theSB0byBkbyByZWFkX3NvY2sgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6MDcuODY3Mjc3MTEyWiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0ODIyMTM5NzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzaW5nOlxuXG4qKkFuYWx5emluZyB0aGUgYHRsc19zdHJwX3JlYWRfY29weWluYCBGdW5jdGlvbioqXG5cbkFscmlnaHQsIHNvIHRoZSBmaXJzdCB0aGluZyBJIHNlZSBpcyB0aGF0IGB0bHNfc3RycF9yZWFkX2NvcHlpbmAgY2FsbHMgYHRjcF9yZWFkX3NvY2tgIHdpdGggdGhlIGB0bHNfc3RycF9jb3B5aW5gIGZ1bmN0aW9uIGFzIGEgY2FsbGJhY2suIFRoYXQncyBhIGtleSBwYXJ0IG9mIHRoZSBkYXRhIGZsb3csIHVzaW5nIGB0Y3BfcmVhZF9zb2NrYCB0byByZWFkIGZyb20gdGhlIHNvY2tldCBgc3RycC1cdTAwM2Vza2AgYW5kIGNvcHkgdGhlIGRhdGEgc29tZXdoZXJlLCBsaWtlbHkgd2l0aGluIHRoZSBUTFMgY29udGV4dC4gQnV0LCBJIG5lZWQgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gdG8gdW5kZXJzdGFuZCB0aGUgd2hvbGUgcGljdHVyZS4gSSdtIGdvaW5nIHRvIGRpZyBkZWVwZXIgYW5kIHNlZSB3aGF0IHRoYXQgY2FsbGJhY2sgZG9lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkyNjYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjExLjM0OTQ5Mzk4MloiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDYzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM4MCxcbiAgXCJMaW5lQ291bnRcIjogMTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDM4MDpcXHRcXHRkZXNjLmFyZy5kYXRhID0gc3RycDtcXG4gMzgxOlxcdFxcdGRlc2MuZXJyb3IgPSAwO1xcbiAzODI6XFx0XFx0ZGVzYy5jb3VudCA9IDE7IC8qIGdpdmUgbW9yZSB0aGFuIG9uZSBza2IgcGVyIGNhbGwgKi9cXG4gMzgzOlxcdFxcbiAzODQ6XFx0XFx0Lyogc2sgc2hvdWxkIGJlIGxvY2tlZCBoZXJlLCBzbyBva2F5IHRvIGRvIHJlYWRfc29jayAqL1xcbiAzODU6XFx0XFx0dGNwX3JlYWRfc29jayhzdHJwLVxcdTAwM2VzaywgXFx1MDAyNmRlc2MsIHRsc19zdHJwX2NvcHlpbik7XFxuIDM4NjpcXHRcXG4gMzg3OlxcdFxcdHJldHVybiBkZXNjLmVycm9yO1xcbiAzODg6XFx0fVxcbiAzODk6XFx0XFxuIDM5MDpcXHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBxc2hvcnQpXFxuIDM5MTpcXHR7XFxuIDM5MjpcXHRcXHRzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87XFxuIDM5MzpcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gMzk0OlxcdFxcdGludCBuZWVkX3NwYywgbGVuO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMToxMS4zNDk2NDIxOTJaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTI3NzU1NzY0MjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBWdWxuZXJhYmlsaXR5IGluIFRDUCBRdWV1ZSBIYW5kbGluZyoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiB0aGlua2luZyB0aHJvdWdoIHRoaXMgaXNzdWUuIFRoZSBjb3JlIHByb2JsZW0gbGllcyBpbiBob3cgd2UgaGFuZGxlIHBvdGVudGlhbGx5IG1hbGZvcm1lZCBUQ1AgcmVjZWl2ZSBxdWV1ZXMsIHNwZWNpZmljYWxseSB3aGVuIHRoZXkgY29udGFpbiBvdmVybGFwcywgZ2Fwcywgb3IgbWl4ZWQgZGVjcnlwdGVkIGRhdGEuIEkndmUgY29uZmlybWVkIHRoYXQgYHRjcF9yZWFkX3NvY2tgIGNvcnJlY3RseSBoYW5kbGVzIGFsbCB0aGVzZSBlZGdlIGNhc2VzLCB3aGljaCBpcyBnb29kLiBUaGUgY3J1eCBpcyB0aGF0IGlmIHRoZSBxdWV1ZSBpc24ndCBcImNsZWFuXCIg4oCTIG1lYW5pbmcgaXQgaGFzIHRob3NlIGlzc3VlcyDigJMgd2UgKm11c3QqIHVzZSBgdGNwX3JlYWRfc29ja2AgdmlhIGBjb3B5X21vZGVgLlxuXG5UaGUgaXNzdWUgYXJpc2VzIGZyb20gaG93IGB0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlYCB1c2VzIGBmcmFnX2xpc3RgIGRpcmVjdGx5LiBJdCBhcHBlYXJzIHRoYXQgaWYgdGhlIHF1ZXVlIGlzIG1hbGZvcm1lZCwgd2UgY291bGQgZW5kIHVwIHJlYWRpbmcgZ2FyYmFnZSBvciBjcmFzaGluZyBpZiB3ZSBjYWxsIGB0bHNfcnhfbXNnX3NpemVgIG9uIHRoZSBtYWxmb3JtZWQgcXVldWUuICBUaGUgZnVuY3Rpb24gYHNrYl9jb3B5X2JpdHNgLCBpbiBwYXJ0aWN1bGFyLCB3b3JyaWVzIG1lLiBJdCBqdXN0IGl0ZXJhdGVzIG92ZXIgdGhlIGZyYWdzIGluIGFuIHNrYiB0aGVuIHRoZSBgZnJhZ19saXN0YCBhcyBpZiB0aGV5IGFyZSBjb250aWd1b3VzIG1lbW9yeSByZWdpb25zLiBJZiB0aGVzZSBmcmFncyBvdmVybGFwIOKAkyBhcyBjYW4gaGFwcGVuIHdpdGggcmV0cmFuc21pc3Npb25zIG9yIG91dC1vZi1vcmRlciBwYWNrZXRzIHRoYXQgaGF2ZW4ndCBiZWVuIGNvbXBsZXRlbHkgY29sbGFwc2VkIOKAkyBgc2tiX2NvcHlfYml0c2Agd2lsbCBzaW1wbHkgcmVhZCB0aGVtIGNvbnRpZ3VvdXNseSwgd2hpY2ggd2lsbCBsZWFkIHRvIGluY29ycmVjdCBkYXRhIGJlaW5nIHJlYWQuXG5cblRoaXMsIGluIHR1cm4sIGNhbiBjb21wdXRlIGFuIGluY29ycmVjdCBgc3pgIGFuZCB0aGVuIGNhdXNlIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLiBTcGVjaWZpY2FsbHksIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2Agd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHdyb25nIHZhbHVlIGZvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgcXVldWUsIG9yIGNhbGN1bGF0ZWQgYHN6YC4gSWYgdGhpcyBgc3pgIGlzIGEgbGFyZ2UgdmFsdWUsIGFuZCB0aGUgcXVldWUgYWN0dWFsbHkgaGFzIGEgc21hbGxlciBhbW91bnQgb2YgZGF0YSwgdGhlIGNvZGUgd2lsbCB0cnkgdG8gaXRlcmF0ZSBvdmVyIHNrYi1cdTAwM2VuZXh0IHBhc3QgdGhlIGVuZCBvZiB0aGUgZGF0YS4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBhdHRlbXB0IHRvIGRlcmVmZXJlbmNlIGEgTlVMTCBwb2ludGVyIGluIHRoZSBgVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcWAgZmllbGQsIHdoaWNoIHdpbGwgdHJpZ2dlciBhIGNyYXNoLiBUaGUga2VybmVsJ3MgS0FTQU4gd2lsbCBjYXRjaCB0aGlzLlxuXG5Jbml0aWFsbHksIEkgd2FzIGNvbmNlcm5lZCBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gQnV0IGBza2JfY29weV9iaXRzYCB3aWxsIG9ubHkgcmVhZCAqaW5pdGlhbGl6ZWQqIGJ5dGVzIGZyb20gdGhlIGBmcmFnX2xpc3RgLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IHdpbGwgcmVhZCB0aGUgKndyb25nKiBieXRlcywgbGVhZGluZyB0byB0aGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cbkkgd2FzIGNvbnNpZGVyaW5nIHRoZSBjYXNlIHdoZXJlIGBzemAgbWlnaHQgYmUgc21hbGwsIGJ1dCB0aGUgcXVldWUgaGFzIG92ZXJsYXBzLCBidXQgdGhlbiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHdpbGwgZGV0ZWN0IHRoZSBvdmVybGFwcywgYW5kIHJldHVybiBgZmFsc2VgLCB3aGljaCB3aWxsIGNhbGwgYHRsc19zdHJwX3JlYWRfY29weWAgZXZlbnR1YWxseS4gU28gdGhpcyB3b3VsZG4ndCBiZSBhIHByb2JsZW0uXG5cbkhvd2V2ZXIsIEkganVzdCByZWFsaXplZCB0aGF0IHRoZSBjb2RlIGhhcyBhIGNyaXRpY2FsIGNoZWNrLiBgdGxzX3N0cnBfcmVhZF9zb2NrYCBjaGVja3MgaWYgdGhlcmUgYXJlIGVub3VnaCBieXRlcyBpbiB0aGUgcXVldWUgYmVmb3JlIGV2ZW4gY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBJZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGJ5dGVzLCBpdCByZXR1cm5zIGB0bHNfc3RycF9yZWFkX2NvcHlgLCB3aGljaCBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5aW5gLiBTbyBpdCBkb2Vzbid0IGNyYXNoIGluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AhIFRoZW4gd2hhdCBpcyB0aGUgYnVnPyBJIG5lZWQgdG8gcmUtcmVhZCB0aGUgcGF0Y2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NzYxLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAxMCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjI0LjEyNTIyMzQ4M1oiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjg3MTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUyMCxcbiAgXCJMaW5lQ291bnRcIjogMzVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyMDpcXHRcXHRpZiAodW5saWtlbHkoc3RycC1cXHUwMDNlY29weV9tb2RlKSlcXG4gNTIxOlxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHlpbihzdHJwKTtcXG4gNTIyOlxcdFxcbiA1MjM6XFx0XFx0aWYgKGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTI0OlxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDUyNTpcXHRcXG4gNTI2OlxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcXG4gNTI3OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDUyODpcXHRcXHRcXHRpZiAoaW5xIFxcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxcbiA1Mjk6XFx0XFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcXG4gNTMwOlxcdFxcbiA1MzE6XFx0XFx0XFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ICsgVExTX0hFQURFUl9TSVpFKSlcXG4gNTMyOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xcbiA1MzM6XFx0XFxuIDUzNDpcXHRcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVxcdTAwM2VhbmNob3IpO1xcbiA1MzU6XFx0XFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4gNTM2OlxcdFxcdFxcdFxcdHJldHVybiBzejtcXG4gNTM3OlxcdFxcbiA1Mzg6XFx0XFx0XFx0c3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XFxuIDUzOTpcXHRcXG4gNTQwOlxcdFxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuIHx8IGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTQxOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDU0MjpcXHRcXHR9XFxuIDU0MzpcXHRcXG4gNTQ0OlxcdFxcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbikpXFxuIDU0NTpcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4gNTQ2OlxcdFxcbiA1NDc6XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDEpO1xcbiA1NDg6XFx0XFxuIDU0OTpcXHRcXHRyZXR1cm4gMDtcXG4gNTUwOlxcdH1cXG4gNTUxOlxcdFxcbiA1NTI6XFx0LyogUGFyc2UgcXVldWVkIGRhdGEuIFdoZW4gQGFubm91bmNlIGlzIHRydWUgYW5kIHBhcnNpbmcgcHJvZHVjZXMgYVxcbiA1NTM6XFx0ICogbmV3bHktcmVhZHkgcmVjb3JkLCBmaXJlIHRoZSBjb25zdW1lciBub3RpZmljYXRpb24uIENhbGxlcnMgdGhhdFxcbiA1NTQ6XFx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMToyNC4xMjUzOTUwMTJaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTk0MjE3MzgxODEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBUTFMgQ29ubmVjdGlvbiBGYWlsdXJlIHdpdGggVENQIE92ZXJsYXBzKipcblxuT2theSwgaGVyZSdzIHdoYXQncyBoYXBwZW5pbmcuIExvb2tpbmcgYXQgdGhlIG9sZCBjb2RlLCBiZWZvcmUgdGhlIHBhdGNoLCB0aGUgbG9naWMgY2FsbHMgYHRsc19yeF9tc2dfc2l6ZWAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBUTFMgaGVhZGVyIGZyb20gdGhlIHJlY2VpdmUgcXVldWUuICBUaGUgcHJvYmxlbSBhcmlzZXMgd2hlbiB0aGVyZSBhcmUgb3ZlcmxhcHBpbmcgVENQIHNlZ21lbnRzIOKAkyBjb21tb24gd2l0aCByZXRyYW5zbWlzc2lvbnMg4oCTIGJlY2F1c2UgYHRsc19yeF9tc2dfc2l6ZWAgYXNzdW1lcyBhIGNvbnRpZ3VvdXMgYnVmZmVyLlxuXG5TcGVjaWZpY2FsbHksIGB0bHNfcnhfbXNnX3NpemVgIHVzZXMgYHNrYl9jb3B5X2JpdHNgLiBXaGVuIHRoZSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWlucyBvdmVybGFwcGluZyBTS0JzIChTb2NrZXQgQnVmZmVycyksIGBza2JfY29weV9iaXRzYCBtaWdodCByZWFkIHRoZSAqd3JvbmcqIGJ5dGVzIGZvciB0aGUgVExTIGhlYWRlci4gVGhpcyBjYW4gbGVhZCB0byBhIGNvcnJ1cHRlZCBoZWFkZXIgYmVpbmcgcmVhZC4gSWYgYHRsc19yeF9tc2dfc2l6ZWAgaW50ZXJwcmV0cyB0aGVzZSBpbmNvcnJlY3QgYnl0ZXMgYXMgYW4gaW52YWxpZCBUTFMgaGVhZGVyLCBpdCBjYW4gcmV0dXJuIGFuIGVycm9yIGNvZGUgbGlrZSBgLUVJTlZBTGAuIFRoaXMgZXJyb3IgdGhlbiBidWJibGVzIHVwLCBldmVudHVhbGx5IGNhdXNpbmcgdGhlIFRMUyBjb25uZWN0aW9uIHRvIGZhaWwgb3Igc3RhbGwsIGJ1dCB0aGUgdW5kZXJseWluZyBUQ1AgY29ubmVjdGlvbiBpcyBhY3R1YWxseSBwZXJmZWN0bHkgZmluZS5cblxuVGhlIGJ1ZyBpcyB0aGF0IHdlJ3JlIGFib3J0aW5nIGEgVExTIGNvbm5lY3Rpb24gc3B1cmlvdXNseSB3aGVuIHRoZSBUQ1Agc3RhY2sgaXMgZG9pbmcgaXRzIGpvYiBieSBoYW5kbGluZyByZXRyYW5zbWlzc2lvbnMuIFRoZSBjb3JyZWN0IGFwcHJvYWNoIGlzIHRvIGhhbmRsZSBvdmVybGFwcGluZyBzZWdtZW50cywgd2hpY2ggaXMgY29tbW9uIGluIFRDUCBhbmQgbm90IG5lY2Vzc2FyaWx5IGluZGljYXRpdmUgb2YgYSBwcm9ibGVtLlxuXG5UaGUgZml4IEkndmUgaW1wbGVtZW50ZWQgKGFkZGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgKSBhZGRyZXNzZXMgdGhpcy4gQnkgY2hlY2tpbmcgaWYgdGhlIHJlY2VpdmUgcXVldWUgaXMgXCJPS1wiICpiZWZvcmUqIGF0dGVtcHRpbmcgdG8gcmVhZCB0aGUgaGVhZGVyLCB3ZSBjYW4gbm93IGRldGVjdCB0aGUgcHJlc2VuY2Ugb2Ygb3ZlcmxhcHBpbmcgc2VnbWVudHMuIElmIHRoZSBxdWV1ZSBpcyBub3QgT0ssIHdlIGNhbiBzd2l0Y2ggdG8gYHRsc19zdHJwX3JlYWRfY29weWAsIHdoaWNoIGNvcnJlY3RseSB1c2VzIGB0Y3BfcmVhZF9zb2NrYCB0byByZWFkIHRoZSBkYXRhLCBoYW5kbGluZyB0aGUgb3ZlcmxhcHBpbmcgc2VnbWVudHMuXG5cbkkgd2VudCBiYWNrIGFuZCBjaGVja2VkIGlmIHRoZXJlJ3MgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUsIGJ1dCBpdCdzIG5vdCB0aGUgY2FzZS4gYHNrYl9jb3B5X2JpdHNgIGlzIHNhZmUuIEFsbCB0aGUgZGF0YSBmcm9tIHRoZSBuZXR3b3JrIGlzIGluaXRpYWxpemVkLiBUaGVyZSBpcyBubyBLTVNBTiBidWcgaGVyZS4gSXQncyBhIGxvZ2ljIGJ1ZyByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgdGhlIG92ZXJsYXBwaW5nIGRhdGEuXG5cbkkgYWxzbyBjaGVja2VkIGlmIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgY291bGQgY2F1c2UgYW4gb3V0LW9mLWJvdW5kcyByZWFkLiBJbiB0aGUgd2hpbGUgbG9vcCwgaWYgYGxlbmAgd2hpY2ggaXMgYHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIFRMU19IRUFERVJfU0laRWAgaXMgbGFyZ2VyIHRoYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZnJhZ19saXN0LCB0aGUgYHNrYmAgYmVjb21lcyBOVUxMLiBUaGVuIGRlcmVmZXJlbmNpbmcgaXQgY2F1c2VzIGEga2VybmVsIGNyYXNoLlxuSW4gdGhlIG5ldyBjb2RlLCBgbGVuYCBpcyBgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICsgVExTX0hFQURFUl9TSVpFYCwgYW5kIGBpbnFgIGlzIGB0Y3BfaW5xKHN0cnAtXHUwMDNlc2spYC4gU2luY2UgYGlucWAgaXMgdGhlIHN1bSBvZiBgc2tiLVx1MDAzZWxlbmAgYW5kIHNpbmNlIHdlIGNoZWNrIGBpbnEgXHUwMDNlPSBUTFNfSEVBREVSX1NJWkVgIGJlZm9yZSB0aGlzIGNhbGwsIGFuZCBzaW5jZSBpdCBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5YCBpZiBgaW5xIFx1MDAzYyBUTFNfSEVBREVSX1NJWkVgLCBgbGVuYCBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgYGZyYWdfbGlzdGAgYmVjYXVzZSBgdGNwX2lucWAgaXMgZXhhY3RseSB0aGUgc3VtIG9mIGBza2ItXHUwMDNlbGVuYCBpbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gVGh1cywgYGxlbmAgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gdGhlIGZyYWcgbGlzdCdzIHRvdGFsIGxlbmd0aC5cblxuSW4gc3VtbWFyeSwgdGhlIGtleSBpcyBwcmV2ZW50aW5nIHRoYXQgZXJyb3IgcmV0dXJuIGJ5IGNoZWNraW5nIGZvciBvdmVybGFwICpiZWZvcmUqIHJlYWRpbmcgdGhlIFRMUyBoZWFkZXIsIHRodXMgbWFpbnRhaW5pbmcgdGhlIGludGVncml0eSBvZiB0aGUgVENQIGNvbm5lY3Rpb24gYW5kIGF2b2lkaW5nIHNwdXJpb3VzIGNvbm5lY3Rpb24gZmFpbHVyZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMDcxLCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYwNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjQzLjU0NzEzNzExNFoiLCJTZXEiOjQ0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU3NzgzNzg0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRjcF9pbnFcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2lwdjQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9pcHY0L3RjcC5jPTYzOT1pbnQgdGNwX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgaW50ICprYXJnKVxcbi0tXFxubmV0L2lwdjQvdGNwLmMtNjUwLVxcdFxcdHNsb3cgPSBsb2NrX3NvY2tfZmFzdChzayk7XFxubmV0L2lwdjQvdGNwLmM6NjUxOlxcdFxcdGFuc3cgPSB0Y3BfaW5xKHNrKTtcXG5uZXQvaXB2NC90Y3AuYy02NTItXFx0XFx0dW5sb2NrX3NvY2tfZmFzdChzaywgc2xvdyk7XFxuLS1cXG5uZXQvaXB2NC90Y3AuYz0xODIzPWludCB0Y3BfcGVla19sZW4oc3RydWN0IHNvY2tldCAqc29jaylcXG5uZXQvaXB2NC90Y3AuYy0xODI0LXtcXG5uZXQvaXB2NC90Y3AuYzoxODI1OlxcdHJldHVybiB0Y3BfaW5xKHNvY2stXFx1MDAzZXNrKTtcXG5uZXQvaXB2NC90Y3AuYy0xODI2LX1cXG4tLVxcbm5ldC9pcHY0L3RjcC5jPTIxOTU9c3RhdGljIGludCB0Y3BfemVyb2NvcHlfcmVjZWl2ZShzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvaXB2NC90Y3AuYy0yMjA5LVxcdHUzMiB0b3RhbF9ieXRlc190b19tYXA7XFxubmV0L2lwdjQvdGNwLmM6MjIxMDpcXHRpbnQgaW5xID0gdGNwX2lucShzayk7XFxubmV0L2lwdjQvdGNwLmMtMjIxMS1cXHRib29sIG1tYXBfbG9ja2VkO1xcbi0tXFxubmV0L2lwdjQvdGNwLmM9MjM0Nj12b2lkIHRjcF9yZWN2X3RpbWVzdGFtcChzdHJ1Y3QgbXNnaGRyICptc2csIGNvbnN0IHN0cnVjdCBzb2NrICpzayxcXG4tLVxcbm5ldC9pcHY0L3RjcC5jLTI0MTItXFxubmV0L2lwdjQvdGNwLmM6MjQxMzpzdGF0aWMgaW50IHRjcF9pbnFfaGludChzdHJ1Y3Qgc29jayAqc2spXFxubmV0L2lwdjQvdGNwLmMtMjQxNC17XFxuLS1cXG5uZXQvaXB2NC90Y3AuYz0yOTMwPWludCB0Y3BfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKVxcbi0tXFxubmV0L2lwdjQvdGNwLmMtMjk1MC1cXHRcXHRpZiAoKGNtc2dfZmxhZ3MgXFx1MDAyNiBUQ1BfQ01TR19JTlEpIHwgbXNnLVxcdTAwM2Vtc2dfZ2V0X2lucSkge1xcbm5ldC9pcHY0L3RjcC5jOjI5NTE6XFx0XFx0XFx0bXNnLVxcdTAwM2Vtc2dfaW5xID0gdGNwX2lucV9oaW50KHNrKTtcXG5uZXQvaXB2NC90Y3AuYy0yOTUyLVxcdFxcdFxcdGlmIChjbXNnX2ZsYWdzIFxcdTAwMjYgVENQX0NNU0dfSU5RKVxcbi0tXFxubmV0L2lwdjQvdGNwLmM9NDQ4MT1pbnQgZG9fdGNwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsXFxuLS1cXG5uZXQvaXB2NC90Y3AuYy00Nzk4LXplcm9jb3B5X3Jjdl9pbnE6XFxubmV0L2lwdjQvdGNwLmM6NDc5OTpcXHRcXHR6Yy5pbnEgPSB0Y3BfaW5xX2hpbnQoc2spO1xcbm5ldC9pcHY0L3RjcC5jLTQ4MDAtemVyb2NvcHlfcmN2X291dDpcXG4tLVxcbm5ldC9pcHY0L3RjcF9icGYuYz0zMzU9c3RhdGljIGludCB0Y3BfYnBmX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgaW50ICprYXJnKVxcbi0tXFxubmV0L2lwdjQvdGNwX2JwZi5jLTM2MC1cXHQgICAgIVJFQURfT05DRShwc29jay1cXHUwMDNlcHJvZ3Muc2tiX3ZlcmRpY3QpKVxcbm5ldC9pcHY0L3RjcF9icGYuYzozNjE6XFx0XFx0KmthcmcgKz0gdGNwX2lucShzayk7XFxubmV0L2lwdjQvdGNwX2JwZi5jLTM2Mi1cXHRza19wc29ja19wdXQoc2ssIHBzb2NrKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6NDQuMDA0OTI2NTc4WiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI4NTY3MzkxNTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSW52ZXN0aWdhdGluZyBgdGNwX2lucWAqKlxuXG5Pa2F5LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSdtIHRoaW5raW5nLCBiZWZvcmUgSSBwcm9jZWVkIGZ1cnRoZXIsIEkgbmVlZCB0byBuYWlsIGRvd24gZXhhY3RseSB3aGF0IGB0Y3BfaW5xYCByZXByZXNlbnRzLiBJdCdzIGNydWNpYWwgdG8gaGF2ZSBhIHJvY2stc29saWQgZGVmaW5pdGlvbiBoZXJlLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIGxvdy1sZXZlbCBuZXR3b3JrIHBlcmZvcm1hbmNlIG9yIGRpYWdub3N0aWNzLiBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluIEkgdW5kZXJzdGFuZCBpdHMgc3BlY2lmaWMgbWVhbmluZyBpbiB0aGUgY29udGV4dCBJJ20gd29ya2luZyB3aXRoLCB3aGV0aGVyIHRoYXQncyB3aXRoaW4gdGhlIGtlcm5lbCwgaW4gYSBzcGVjaWZpYyBtb25pdG9yaW5nIHRvb2wsIG9yIGluIGEgdGhlb3JldGljYWwgZGlzY3Vzc2lvbi4gQ29udGV4dCBpcyBraW5nLCBhcyBhbHdheXMsIGJ1dCB1bmRlcnN0YW5kaW5nIHRoZSBwcmVjaXNlIHNlbWFudGljcyBvZiBgdGNwX2lucWAgaXMgdGhlIGZvdW5kYXRpb24uIExldCdzIHN0YXJ0IHdpdGggdGhlIHN0YW5kYXJkIGRlZmluaXRpb24sIGFuZCB0aGVuIGRpdmUgaW50byB0aGUgcmVsZXZhbnQgc291cmNlIGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0byBjb25maXJtLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTIyOSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjQ2Ljg2MTY2ODI0WiIsIlNlcSI6NDYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NzI0NzQ1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpbnQgdGNwX2lucVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL25ldC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9uZXQvdGNwLmg9MjczNj1zdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF90Y3BfcHVyZV9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbmluY2x1ZGUvbmV0L3RjcC5oLTI3NDAtXFxuaW5jbHVkZS9uZXQvdGNwLmg6Mjc0MTpzdGF0aWMgaW5saW5lIGludCB0Y3BfaW5xKHN0cnVjdCBzb2NrICpzaylcXG5pbmNsdWRlL25ldC90Y3AuaC0yNzQyLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6NDYuOTQ4OTIxMTU3WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQwMDk0Mjc4ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIGB0Y3BfaW5xYCBWYXJpYWJsZSoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzLiBcIkxldCdzIHJlYWQgYHRjcF9pbnFgXCIg4oCTIHRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIEkgaW1tZWRpYXRlbHkga25vdyB3ZSdyZSB0YWxraW5nIGFib3V0IGEgdmFyaWFibGUsIGxpa2VseSB3aXRoaW4gYSBuZXR3b3JrIHN0YWNrJ3MgaW1wbGVtZW50YXRpb24uIFRoZSBgdGNwX2AgcHJlZml4IHN0cm9uZ2x5IHN1Z2dlc3RzIGl0J3MgcmVsYXRlZCB0byBUQ1AsIGFuZCB0aGUgYGlucWAgc3VmZml4IHByb2JhYmx5IHBvaW50cyB0byBzb21ldGhpbmcgYWJvdXQgdGhlIGluY29taW5nIHF1ZXVlLlxuXG5NeSBicmFpbidzIGFscmVhZHkgc3RhcnRpbmcgdG8gZmlsbCBpbiB0aGUgYmxhbmtzLiBJcyB0aGlzIGEga2VybmVsLWxldmVsIHZhcmlhYmxlPyBVc2VyLXNwYWNlPyBXaGF0IGFyY2hpdGVjdHVyZSBhcmUgd2UgZGVhbGluZyB3aXRoPyBUaGUgc3BlY2lmaWMgY29udGV4dCB3b3VsZCBtYWtlIGEgaHVnZSBkaWZmZXJlbmNlIGluIGhvdyBJIGludGVycHJldCBpdC4gQXJlIHdlIGxvb2tpbmcgYXQgYSBwZXItc29ja2V0IHZhbHVlLCBhIGdsb2JhbCBzeXN0ZW0gc3RhdGlzdGljLCBvciBzb21ldGhpbmcgbW9yZSBudWFuY2VkP1xuXG5JJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGltcGxpY2F0aW9ucy4gYHRjcF9pbnFgIGNvdWxkIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHF1ZXVlZCBmb3IgcmVjZXB0aW9uLCB0aGUgbnVtYmVyIG9mIHBhY2tldHMsIHBlcmhhcHMgYSBjb3VudCBvZiBvdXRzdGFuZGluZyBhY2tub3dsZWRnZW1lbnRzLCBvciBldmVuIGEgbWVhc3VyZSBvZiBidWZmZXJpbmcgcHJlc3N1cmUuIEl04oCZcyBwcm9iYWJseSBhIGNyaXRpY2FsIHBlcmZvcm1hbmNlIG1ldHJpYywgcmVmbGVjdGluZyB0aGUgZWZmaWNpZW5jeSBvZiB0aGUgVENQIHJlY2VpdmUgcGF0aC4gSSdtIGtlZW4gdG8gc2VlIHRoZSBjb2RlIHdoZXJlIGl0J3MgdXNlZC4gQW55IGNvbmdlc3Rpb24gY29udHJvbCBtZWNoYW5pc21zIG1pZ2h0IGhhdmUgYSBkZXBlbmRlbmN5IG9uIHRoZSBpbmZvcm1hdGlvbiBpdCBjb250YWlucy5cblxuVGhlIGNvcmUgcXVlc3Rpb24gbm93IGlzOiBXaGF0IGRvZXMgKml0KiB0ZWxsIHVzPyBXaHkgYXJlIHdlIHJlYWRpbmcgaXQ/IFdoYXQgcHJvYmxlbSBhcmUgd2UgdHJ5aW5nIHRvIHNvbHZlIG9yIHVuZGVyc3RhbmQ/IElzIHRoaXMgcGFydCBvZiBhIGRlYnVnZ2luZyBleGVyY2lzZSwgcGVyZm9ybWFuY2UgdHVuaW5nLCBvciBuZXR3b3JrIG1vbml0b3Jpbmc/IFRoZSByZWFzb25zIGZvciB0aGUgcmVhZGluZyB3aWxsIGhlYXZpbHkgaW5mbHVlbmNlIG15IGFuYWx5c2lzIG9mIGl0LiBJcyB0aGVyZSBzb21ldGhpbmcgd2UgZXhwZWN0IHRvIGZpbmQsIG9yIGFyZSB3ZSBqdXN0IGhvcGluZyB0byBvYnRhaW4gYSBiYXNlbGluZSBudW1iZXIgdG8gYmUgdXNlZCBmb3IgY29tcGFyaXNvbj8gSSdtIGV4Y2l0ZWQgdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gYmVjYXVzZSwgZm9yIG15IGZpZWxkLCB0aGlzIHZhcmlhYmxlIGlzIGFic29sdXRlbHkgdml0YWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1NTUyLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6NTAuOTU4MzUxMTU5WiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0Nzc0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL25ldC90Y3AuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAyNzQxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNzQxOlxcdHN0YXRpYyBpbmxpbmUgaW50IHRjcF9pbnEoc3RydWN0IHNvY2sgKnNrKVxcbjI3NDI6XFx0e1xcbjI3NDM6XFx0XFx0c3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7XFxuMjc0NDpcXHRcXHRpbnQgYW5zdztcXG4yNzQ1OlxcdFxcbjI3NDY6XFx0XFx0aWYgKCgxIFxcdTAwM2NcXHUwMDNjIHNrLVxcdTAwM2Vza19zdGF0ZSkgXFx1MDAyNiAoVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKSB7XFxuMjc0NzpcXHRcXHRcXHRhbnN3ID0gMDtcXG4yNzQ4OlxcdFxcdH0gZWxzZSBpZiAoc29ja19mbGFnKHNrLCBTT0NLX1VSR0lOTElORSkgfHxcXG4yNzQ5OlxcdFxcdFxcdCAgICF0cC1cXHUwMDNldXJnX2RhdGEgfHxcXG4yNzUwOlxcdFxcdFxcdCAgIGJlZm9yZSh0cC1cXHUwMDNldXJnX3NlcSwgdHAtXFx1MDAzZWNvcGllZF9zZXEpIHx8XFxuMjc1MTpcXHRcXHRcXHQgICAhYmVmb3JlKHRwLVxcdTAwM2V1cmdfc2VxLCB0cC1cXHUwMDNlcmN2X254dCkpIHtcXG4yNzUyOlxcdFxcbjI3NTM6XFx0XFx0XFx0YW5zdyA9IHRwLVxcdTAwM2VyY3Zfbnh0IC0gdHAtXFx1MDAzZWNvcGllZF9zZXE7XFxuMjc1NDpcXHRcXG4yNzU1OlxcdFxcdFxcdC8qIFN1YnRyYWN0IDEsIGlmIEZJTiB3YXMgcmVjZWl2ZWQgKi9cXG4yNzU2OlxcdFxcdFxcdGlmIChhbnN3IFxcdTAwMjZcXHUwMDI2IHNvY2tfZmxhZyhzaywgU09DS19ET05FKSlcXG4yNzU3OlxcdFxcdFxcdFxcdGFuc3ctLTtcXG4yNzU4OlxcdFxcdH0gZWxzZSB7XFxuMjc1OTpcXHRcXHRcXHRhbnN3ID0gdHAtXFx1MDAzZXVyZ19zZXEgLSB0cC1cXHUwMDNlY29waWVkX3NlcTtcXG4yNzYwOlxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6NTAuOTU4NTAwMTI5WiIsIlNlcSI6NDksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMwMDQwOTg4MzQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBQb3RlbnRpYWwgSXNzdWVzIHdpdGggVExTL1RDUCBIYW5kbGluZyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gSXQgc2VlbXMgd2UncmUgbG9va2luZyBhdCBhIHNjZW5hcmlvIHdoZXJlIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIFRMUyBhbmQgVENQIHJlY2VpdmUgcXVldWVzIG1pZ2h0IGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gaG93IHdlIGhhbmRsZSBvdmVybGFwcGluZyBUQ1Agc2VnbWVudHMuXG5cbkZpcnN0LCBgdGNwX2lucWAgcHJvdmlkZXMgdGhlICpsb2dpY2FsKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSByZWNlaXZlIHF1ZXVlLCBjb25zaWRlcmluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIHNwYWNlLiBIb3dldmVyLCB3aGVuIG92ZXJsYXBwaW5nIFNLQnMgYXJlIHByZXNlbnQsIHRoZSAqcGh5c2ljYWwqIHN1bSBvZiBgc2tiLVx1MDAzZWxlbmAgdmFsdWVzIGNhbiBiZSBsYXJnZXIuIFRoZSBpbXBvcnRhbnQgcG9pbnQgaXMgYGlucWAgKHRoZSBgdGNwX2lucWAgdmFsdWUpIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBpbi1vcmRlciBieXRlcy5cblxuSWYgYGlucWAgaXMgYXQgbGVhc3QgdGhlIHNpemUgb2YgdGhlIFRMUyBoZWFkZXIgKGBUTFNfSEVBREVSX1NJWkVgKSwgd2UgYXJlIHNhZmUgdG8gYmVnaW4gb3VyIHByb2Nlc3NpbmcuIFdlIGtub3cgdGhlIHN1bSBvZiBgc2tiLVx1MDAzZWxlbmAgaXMgYXQgKmxlYXN0KiBlcXVhbCB0byBgaW5xYCwgc28gbm8gbnVsbCBgc2tiYCBpcyBleHBlY3RlZC5cblxuTm93LCB0aGUgb2xkIGNvZGUncyBsb2dpYyBpcyBjb25jZXJuaW5nLiBJZiB0aGUgY2FsY3VsYXRlZCBtZXNzYWdlIHNpemUgYHN6YCAoZGVyaXZlZCBmcm9tIHRoZSBUTFMgaGVhZGVyKSBpcyBsYXJnZXIgdGhhbiBgaW5xYCwgdGhlIGNvZGUgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gVGhpcyBmdW5jdGlvbiB1dGlsaXplcyBgdGNwX3JlYWRfc29ja2Agd2hpY2ggaGFuZGxlcyBvdmVybGFwcGluZyBzZWdtZW50cyBwcm9wZXJseS4gVGhlcmVmb3JlLCBpbiB0aGUgKm9sZCogY29kZSwgd2Ugd2VyZSAqbmV2ZXIqIGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aXRoIGEgc2l6ZSBsYXJnZXIgdGhhbiB3aGF0IHdhcyBhdmFpbGFibGUuXG5cbldoZW4gYGlucSBcdTAwM2U9IHN6YCwgd2UgY2FsbCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBTaW5jZSBgc2tiYCBpcyBuZXZlciBOVUxMIChiZWNhdXNlIHRoZSBwaHlzaWNhbCBieXRlcyBhcmUgYXQgbGVhc3QgdGhlIGxvZ2ljYWwgYnl0ZXMpLCB0aGlzIGNvbmRpdGlvbiBzaG91bGQgd29yay5cblxuSG93ZXZlciwgdGhlIHJlYWwgcHJvYmxlbSBhcmlzZXMgd2hlbiBhbmFseXppbmcgdGhlIHB1cnBvc2Ugb2YgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYC4gSXQgZXhhbWluZXMgdGhlIFRDUCBxdWV1ZS4gVGhlIGtleSBpcyB0aGUgY29uZGl0aW9uIGBUQ1BfU0tCX0NCKHNrYiktXHUwMDNlc2VxICE9IHNlcWAuIElmIHdlIGhhdmUgb3ZlcmxhcHBpbmcgc2VnbWVudHMsIHRoaXMgY29uZGl0aW9uIHdpbGwgYmUgdHJ1ZSwgYXMgVENQIHNlcXVlbmNlIG51bWJlcnMgd2lsbCBub3QgYWxpZ24gYXMgZXhwZWN0ZWQuIFRoaXMgY2hlY2sgaXMgZGVzaWduZWQgdG8gY2F0Y2ggb3ZlcmxhcHBpbmcgc2VnbWVudHMuIElmIG92ZXJsYXBwaW5nIHNlZ21lbnRzIGFyZSBkZXRlY3RlZCwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCByZXR1cm5zIGBmYWxzZWAsIGNhdXNpbmcgYSBmYWxsYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggdXNlcyBgdGNwX3JlYWRfc29ja2AuXG5cblRoZSBjb3JlIGxvZ2ljIG9mIHRoZSBidWcgaXMgdGhhdCB3aXRoIG92ZXJsYXBwaW5nIHNlZ21lbnRzLCBgdGxzX3J4X21zZ19zaXplYCBtaWdodCByZWFkIGdhcmJhZ2UgZGF0YSBmcm9tIG92ZXJsYXBwaW5nIHNlZ21lbnRzIHRvIGRldGVybWluZSBgc3pgLiBUaGlzIGxlYWRzIHRvIGEgc3B1cmlvdXMgY29ubmVjdGlvbiBmYWlsdXJlLCBhcyB0aGUgVExTIGhlYWRlciBtaWdodCBiZSBjb3JydXB0ZWQuXG5cbktBU0FOIGFuZCBLTVNBTiBhcmVuJ3QgbGlrZWx5IHRvIGRldGVjdCBhIGJ1ZyBoZXJlLiBJdCdzIGEgbG9naWMgYnVnIChmdW5jdGlvbmFsKSwgbm90IGEgbWVtb3J5IHNhZmV0eSBpc3N1ZS4gVGhlIGNvZGUgcmVhZHMgaW5pdGlhbGl6ZWQgYnl0ZXMsIGV2ZW4gaWYgdGhlIFwiY29ycmVjdFwiIGJ5dGVzIGFyZSBub3QgcmVhZC4gTm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3MgaXMgb2NjdXJyaW5nLlxuXG5BIGNyaXRpY2FsIHBvaW50OiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGBsZW5gICh0aGUgYW1vdW50IG9mIGRhdGEgd2UgKnRoaW5rKiB3ZSBoYXZlIGF2YWlsYWJsZSkgaW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBpcyAqbGVzcyB0aGFuIG9yIGVxdWFsIHRvKiB0aGUgc3VtIG9mIHRoZSBgc2tiLVx1MDAzZWxlbmAgdmFsdWVzLiBXZSBrbm93IHRoaXMgaXMgdHJ1ZSBiZWNhdXNlIHdlIGxpbWl0IHRoZSBgbGVuYCB2YWx1ZSB0byBiZSBubyBtb3JlIHRoYW4gYGlucWAgYnl0ZXMgKHRoZSAqYXZhaWxhYmxlKiBieXRlcykuXG5cbkhvd2V2ZXIsIHdoYXQgaWYgdGhlcmUgYXJlIHplcm8tbGVuZ3RoIHNrYnM/IFdlIGhhdmUgdG8gaGFuZGxlIHRoaXMgaW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYC5cblxuV2hhdCBpZiBhbiBgc3pgIGZyb20gYSBtYWxmb3JtZWQgcXVldWUgaXMgbGFyZ2U/IEl0IHNlZW1zIHRoYXQgaW4gdGhpcyBjYXNlIHdlIHJldHVybiB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YC5cblxuU28sIHRoZSBidWcgaXMgYSAqZnVuY3Rpb25hbCogb25lOiBzcHVyaW91cyBjb25uZWN0aW9uIGZhaWx1cmVzIGR1ZSB0byBvdmVybGFwcGluZyBUQ1Agc2VnbWVudHMuIFRoZSBvdmVybGFwcGluZyBzZWdtZW50cyBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IGJ5IHRoZSBUTFMgY29kZSAqYmVmb3JlKiBpdCB0cmllcyB0byBwYXJzZSB0aGUgVExTIGhlYWRlciBhbmQgY2FsY3VsYXRlIHRoZSBUTFMgbWVzc2FnZSBzaXplLiBUaGUgZml4IGlzIHRvIHVzZSBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgICpiZWZvcmUqIHBhcnNpbmcgdGhlIGhlYWRlci4gVGhpcyB3aWxsIGNhdXNlIHVzIHRvIGZhbGwgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCB0byByZWNvdmVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjMxNCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxNzcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMjoyMC45OTk0OTMyNzVaIiwiU2VxIjo1MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY4MzY1NDQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRsc19zdHJwX2NoZWNrX3F1ZXVlX29rXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90bHMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90bHMvdGxzX3N0cnAuYz0zOTA9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTQzMi1cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NDMzOnN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxcbm5ldC90bHMvdGxzX3N0cnAuYy00MzQtXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBsZW4pXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmM9NTEyPXN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTUzMC1cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTMxOlxcdFxcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIFRMU19IRUFERVJfU0laRSkpXFxubmV0L3Rscy90bHNfc3RycC5jLTUzMi1cXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NDMtXFxubmV0L3Rscy90bHNfc3RycC5jOjU0NDpcXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pKVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NDUtXFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMyOjIxLjA2Nzg2NDg4M1oiLCJTZXEiOjUxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTMxODA5MzM0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgVExTIFN0YWxsL0ZhaWx1cmUgQnVnKipcblxuT2theSwgc28gSSBjYW4ndCBkaXJlY3RseSBgZ3JlcHBlcmAgZm9yIHRoZSBjb21taXQgbWVzc2FnZSByZWxhdGVkIHRvIHRoaXMgaXNzdWUsIGFzIHRoYXQgdG9vbCB3b24ndCBkZWx2ZSBpbnRvIHRoZSBnaXQgbG9nLiBCdXQsIEkgY2FuIHdvcmsgaXQgb3V0IGJ5IGluZmVyZW5jZS4gSXQgbG9va3MgbGlrZSB0aGUgaXNzdWUgaXMgbGlrZWx5IHJvb3RlZCBpbiBob3cgYHRsc19yeF9tc2dfc2l6ZWAgaGFuZGxlcyBwb3RlbnRpYWxseSBvdmVybGFwcGluZyBTS0JzIG9uIGEgcXVldWUuXG5cbkhlcmUncyB0aGUgY2hhaW4gb2YgZXZlbnRzOiBJZiBgdGxzX3J4X21zZ19zaXplYCBpcyBjYWxsZWQgb24gYSBxdWV1ZSB3aXRoIG92ZXJsYXBwaW5nIFNLQnMsIGl0IG1pZ2h0IGVuZCB1cCByZWFkaW5nIGEgY29ycnVwdGVkIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNvdWxkIGNhdXNlIGl0IHRvIHJldHVybiBhbiBgLUVJTlZBTGAgZXJyb3IsIHBlcmhhcHMgaW5kaWNhdGluZyBhIGJhZCB2ZXJzaW9uIG9yIHNvbWUgb3RoZXIgY29ycnVwdGlvbi4gV2hlbiBgdGxzX3J4X21zZ19zaXplYCByZXR1cm5zIGAtRUlOVkFMYCwgYHRsc19zdHJwX3JlYWRfc29ja2AgaW4gdHVybiBhbHNvIHJldHVybnMgYC1FSU5WQUxgLiBUaGVuIGB0bHNfc3RycF9jaGVja19yY3ZgIGxvZ2ljIGlzOlxuXG5gYGBjXG5cdGlmICh0bHNfc3RycF9yZWFkX3NvY2soc3RycCkgPT0gLUVOT01FTSlcblx0XHRxdWV1ZV93b3JrKHRsc19zdHJwX3dxLCBcdTAwMjZzdHJwLVx1MDAzZXdvcmspO1xuYGBgXG5cblRodXMsIHRoZSBgLUVJTlZBTGAgKGZyb20gYHRsc19zdHJwX3JlYWRfc29ja2ApIGlzIGlnbm9yZWQsIGJ1dCBgc3RycC1cdTAwM2Vtc2dfcmVhZHlgIGlzIG5vdCBzZXQsIGxlYWRpbmcgdG8gZWl0aGVyIGEgY29ubmVjdGlvbiBzdGFsbCBvciBvdXRyaWdodCBmYWlsdXJlLiBUaGlzIGlzIGRlZmluaXRlbHkgYSBmdW5jdGlvbmFsIGJ1Zy5cblxuTm93LCBJIG5lZWQgdG8gY2hlY2sgc29tZXRoaW5nIGltcG9ydGFudDogSXMgaXQgcG9zc2libGUgdGhhdCBgdGxzX3J4X21zZ19zaXplYCBjb3VsZCBiZSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBMZXQncyB0cmFjZSBpdCB0aHJvdWdoOlxuXG5gYGBjXG5cdGNoYXIgaGVhZGVyW1RMU19IRUFERVJfU0laRSArIFRMU19NQVhfSVZfU0laRV07XG5cdC4uLlxuXHRyZXQgPSBza2JfY29weV9iaXRzKHNrYiwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0LCBoZWFkZXIsIHByb3QtXHUwMDNlcHJlcGVuZF9zaXplKTtcblx0aWYgKHJldCBcdTAwM2MgMClcblx0XHRnb3RvIHJlYWRfZmFpbHVyZTtcbmBgYFxuXG5gc2tiX2NvcHlfYml0c2AgY29waWVzIGBwcm90LVx1MDAzZXByZXBlbmRfc2l6ZWAgYnl0ZXMgaW50byBgaGVhZGVyYC4gYHByb3QtXHUwMDNlcHJlcGVuZF9zaXplYCBpcyBzZXQgdG8gYFRMU19IRUFERVJfU0laRWAsIHdoaWNoIGlzIDUuIFNvLCBpdCdzIGNvcHlpbmcgNSBieXRlcyBpbnRvIGBoZWFkZXJgLiBOb3cgd2UgYWNjZXNzIGBoZWFkZXJbMF1gIHRocm91Z2ggYGhlYWRlcls0XWAuIFRob3NlIDUgYnl0ZXMgKmFyZSogaW5pdGlhbGl6ZWQgYnkgYHNrYl9jb3B5X2JpdHNgLiBUaGUgcmVzdCBvZiBgaGVhZGVyYCBpcyB1bmluaXRpYWxpemVkLCBidXTigKYgV2FpdCBhIHNlYywgZG9lcyB0aGUgcmVzdCBvZiBgaGVhZGVyYCAqZXZlciogZ2V0IGFjY2Vzc2VkPyBObywgYHRsc19yeF9tc2dfc2l6ZWAgb25seSB1c2VzIHRob3NlIGZpcnN0IDUgYnl0ZXMuIFNvLCBubywgdGhpcyBpcyBub3QgYSBzb3VyY2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuXG5cbklzIHRoaXMgYGhlYWRlcmAgdmFyaWFibGUgdXNlZCBhbnl3aGVyZSBlbHNlPyBObywgaXQncyBsb2NhbCB0byBgdGxzX3J4X21zZ19zaXplYC5cblxuQnV0LCB3aGF0IGlmIGBwcm90LVx1MDAzZXByZXBlbmRfc2l6ZWAgd2FzIGxhcmdlciB0aGFuIDU/IE5vcGUsIGl0J3MgYWx3YXlzIHNldCB0byA1IGZvciBib3RoIFRMUyAxLjIgYW5kIDEuMywgYW5kIGl0J3Mgc2V0IGluIGB0bHNfc2V0X3N3X29mZmxvYWRgLiBBbHdheXMgYFRMU19IRUFERVJfU0laRWAuIFRoYXQncyBzZXR0bGVkLlxuXG5Ob3csIGxldCdzIHR1cm4gdG8gYHRsc19zdHJwX3JlYWRfY29weWA6IENvdWxkIGl0IGJlIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnk/XG5cbmBgYGNcblx0Zm9yIChsZW4gPSBuZWVkX3NwYzsgbGVuIFx1MDAzZSAwOyBsZW4gLT0gUEFHRV9TSVpFKSB7XG5cdFx0cGFnZSA9IGFsbG9jX3BhZ2Uoc3RycC1cdTAwM2Vzay1cdTAwM2Vza19hbGxvY2F0aW9uKTtcblx0XHRpZiAoIXBhZ2UpIHtcblx0XHRcdHRsc19zdHJwX2ZsdXNoX2FuY2hvcl9jb3B5KHN0cnApO1xuXHRcdFx0cmV0dXJuIC1FTk9NRU07XG5cdFx0fVxuXG5cdFx0c2tiX2ZpbGxfcGFnZV9kZXNjKHN0cnAtXHUwMDNlYW5jaG9yLCBzaGluZm8tXHUwMDNlbnJfZnJhZ3MrKyxcblx0XHRcdFx0ICAgcGFnZSwgMCwgMCk7XG5cdH1cbmBgYFxuXG5JdCBhbGxvY2F0ZXMgcGFnZXMgd2l0aCBgYWxsb2NfcGFnZWAuICpUaG9zZSogcGFnZXMgYXJlIE5PVCB6ZXJvZWQhIFRoZW4gYHRsc19zdHJwX3JlYWRfY29weWluKHN0cnApYCBpcyBjYWxsZWQuIGB0bHNfc3RycF9yZWFkX2NvcHlpbmAgdXNlcyBgdGNwX3JlYWRfc29ja2AgdG8gY29weSBkYXRhIGZyb20gdGhlIFRDUCByZWNlaXZlIHF1ZXVlIGludG8gdGhlc2UgcGFnZXMuXG5cbmBgYGNcblx0c3RhdGljIGludCB0bHNfc3RycF9jb3B5aW4ocmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBza19idWZmICppbl9za2IsXG5cdFx0XHRcdCAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBpbl9sZW4pXG5cdHtcblx0XHQuLi5cblx0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfVExTX0RFVklDRSkgXHUwMDI2XHUwMDI2IHN0cnAtXHUwMDNlbWl4ZWRfZGVjcnlwdGVkKVxuXHRcdFx0cmV0ID0gdGxzX3N0cnBfY29weWluX3NrYihzdHJwLCBza2IsIGluX3NrYiwgb2Zmc2V0LCBpbl9sZW4pO1xuXHRcdGVsc2Vcblx0XHRcdHJldCA9IHRsc19zdHJwX2NvcHlpbl9mcmFnKHN0cnAsIHNrYiwgaW5fc2tiLCBvZmZzZXQsIGluX2xlbik7XG5gYGBcblxuYHRsc19zdHJwX2NvcHlpbl9mcmFnYCB0aGVuIGNvcGllcyBkYXRhIGZyb20gYGluX1xuXG4iLCJJbnB1dFRva2VucyI6MzA3MTgsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMyOjM2LjM4NTk2MTI1NVoiLCJTZXEiOjUyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NjcyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjEwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjEwOlxcdHN0YXRpYyBpbnQgdGxzX3N0cnBfY29weWluX2ZyYWcoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IsXFxuIDIxMTpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LFxcbiAyMTI6XFx0XFx0XFx0XFx0XFx0c2l6ZV90IGluX2xlbilcXG4gMjEzOlxcdHtcXG4gMjE0OlxcdFxcdHVuc2lnbmVkIGludCBuZnJhZyA9IHNrYi1cXHUwMDNlbGVuIC8gUEFHRV9TSVpFO1xcbiAyMTU6XFx0XFx0c2l6ZV90IGxlbiwgY2h1bms7XFxuIDIxNjpcXHRcXHRza2JfZnJhZ190ICpmcmFnO1xcbiAyMTc6XFx0XFx0aW50IHN6O1xcbiAyMTg6XFx0XFxuIDIxOTpcXHRcXHRpZiAodW5saWtlbHkobmZyYWcgXFx1MDAzZT0gc2tiX3NoaW5mbyhza2IpLVxcdTAwM2Vucl9mcmFncykpIHtcXG4gMjIwOlxcdFxcdFxcdERFQlVHX05FVF9XQVJOX09OX09OQ0UoMSk7XFxuIDIyMTpcXHRcXHRcXHRyZXR1cm4gLUVNU0dTSVpFO1xcbiAyMjI6XFx0XFx0fVxcbiAyMjM6XFx0XFxuIDIyNDpcXHRcXHRmcmFnID0gXFx1MDAyNnNrYl9zaGluZm8oc2tiKS1cXHUwMDNlZnJhZ3NbbmZyYWddO1xcbiAyMjU6XFx0XFxuIDIyNjpcXHRcXHRsZW4gPSBpbl9sZW47XFxuIDIyNzpcXHRcXHQvKiBGaXJzdCBtYWtlIHN1cmUgd2UgZ290IHRoZSBoZWFkZXIgKi9cXG4gMjI4OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDIyOTpcXHRcXHRcXHQvKiBBc3N1bWUgb25lIHBhZ2UgaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgaGVhZGVycyAqL1xcbiAyMzA6XFx0XFx0XFx0Y2h1bmsgPVxcdG1pbl90KHNpemVfdCwgbGVuLCBQQUdFX1NJWkUgLSBza2JfZnJhZ19zaXplKGZyYWcpKTtcXG4gMjMxOlxcdFxcdFxcdFdBUk5fT05fT05DRShza2JfY29weV9iaXRzKGluX3NrYiwgb2Zmc2V0LFxcbiAyMzI6XFx0XFx0XFx0XFx0XFx0XFx0ICAgc2tiX2ZyYWdfYWRkcmVzcyhmcmFnKSArXFxuIDIzMzpcXHRcXHRcXHRcXHRcXHRcXHQgICBza2JfZnJhZ19zaXplKGZyYWcpLFxcbiAyMzQ6XFx0XFx0XFx0XFx0XFx0XFx0ICAgY2h1bmspKTtcXG4gMjM1OlxcdFxcbiAyMzY6XFx0XFx0XFx0c2tiLVxcdTAwM2VsZW4gKz0gY2h1bms7XFxuIDIzNzpcXHRcXHRcXHRza2ItXFx1MDAzZWRhdGFfbGVuICs9IGNodW5rO1xcbiAyMzg6XFx0XFx0XFx0c2tiX2ZyYWdfc2l6ZV9hZGQoZnJhZywgY2h1bmspO1xcbiAyMzk6XFx0XFxuIDI0MDpcXHRcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBza2IpO1xcbiAyNDE6XFx0XFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4gMjQyOlxcdFxcdFxcdFxcdHJldHVybiBzejtcXG4gMjQzOlxcdFxcbiAyNDQ6XFx0XFx0XFx0LyogV2UgbWF5IGhhdmUgb3Zlci1yZWFkLCBzeiA9PSAwIGlzIGd1YXJhbnRlZWQgdW5kZXItcmVhZCAqL1xcbiAyNDU6XFx0XFx0XFx0aWYgKHVubGlrZWx5KHN6IFxcdTAwMjZcXHUwMDI2IHN6IFxcdTAwM2Mgc2tiLVxcdTAwM2VsZW4pKSB7XFxuIDI0NjpcXHRcXHRcXHRcXHRpbnQgb3ZlciA9IHNrYi1cXHUwMDNlbGVuIC0gc3o7XFxuIDI0NzpcXHRcXG4gMjQ4OlxcdFxcdFxcdFxcdFdBUk5fT05fT05DRShvdmVyIFxcdTAwM2UgY2h1bmspO1xcbiAyNDk6XFx0XFx0XFx0XFx0c2tiLVxcdTAwM2VsZW4gLT0gb3ZlcjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzI6MzYuMzg2MDQ5MTM1WiIsIlNlcSI6NTMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjk0ODEzNzM2NDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBUTFMgRnJhZ21lbnQgQ29weWluZyBQcm9jZXNzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYHRsc19zdHJwX2NvcHlpbl9mcmFnYCwgYW5kIGl0J3MgdXNpbmcgYHNrYl9jb3B5X2JpdHNgIHRvIGNvcHkgZGlyZWN0bHkgaW50byB0aGUgcGFnZS4gVGhhdCdzIGEgZGlyZWN0IGNvcHksIGFscmlnaHQhIEl0IGNvcGllcyBgY2h1bmtgIGJ5dGVzIGZyb20gYGluX3NrYmAgaW50byB0aGUgcGFnZSwgc3BlY2lmaWNhbGx5IHVzaW5nIGBza2JfZnJhZ19hZGRyZXNzKGZyYWcpICsgc2tiX2ZyYWdfc2l6ZShmcmFnKWAgYXMgdGhlIGRlc3RpbmF0aW9uLiBUaGVuLCB0aGUgY29kZSBjYWxscyBgdGxzX3J4X21zZ19zaXplYC5cblxuTm93LCBgdGxzX3J4X21zZ19zaXplYCBpcyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBJIHJlbWVtYmVyIHRoYXQgZnVuY3Rpb24gcmVhZHMgdGhlIGhlYWRlciBmcm9tIHRoZSBgc2tiYCB1c2luZyBgc2tiX2NvcHlfYml0c2AsIHNwZWNpZmljYWxseSBmcm9tIHRoZSBgc3RycC1cdTAwM2VhbmNob3JgIFNLQiwgYW5kIHN0YXJ0aW5nIGF0IGBzdHJwLVx1MDAzZXN0bS5vZmZzZXRgIHdoaWNoLCBsb29raW5nIGJhY2ssIGlzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gYHRsc19zdHJwX3JlYWRfY29weWAuIFRoaXMgbWVhbnMgaXQgd2lsbCByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZS4gQW5kIHNpbmNlIGBza2JgIGlzIHRoZSBgc3RycC1cdTAwM2VhbmNob3JgLCBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZSB3YXMganVzdCBwb3B1bGF0ZWQgYnkgYHNrYl9jb3B5X2JpdHNgIGZyb20gYGluX3NrYmAsIHRoaXMgbWVhbnMgdGhlIGRhdGEgaXMgaW5pdGlhbGl6ZWQuIEkgc2VlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgaGVyZS5cblxuQnV0IHdhaXQsIHdoYXQgaWYgYGNodW5rYCBpcyAqc21hbGxlciogdGhhbiBgVExTX0hFQURFUl9TSVpFYD8gQWgsIEkgc2VlLiBJZiBgY2h1bmtgIGlzIGxlc3MgdGhhbiBgVExTX0hFQURFUl9TSVpFYCwgYHRsc19yeF9tc2dfc2l6ZWAgd291bGQgZW5jb3VudGVyIGEgc2l0dWF0aW9uIHdoZXJlIGl0IHRyaWVzIHRvIHJlYWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGBza2JgJ3MgZGF0YSwgYXMgYHNrYi1cdTAwM2VsZW5gIHdvdWxkIGJlIGVxdWFsIHRvIGBjaHVua2AuIFRoaXMgcmVzdWx0cyBpbiBgdGxzX3J4X21zZ19zaXplYCByZXR1cm5pbmcgemVyby4gSXQgd2lsbCBjb3JyZWN0bHkgbm90IHJlYWQgdGhlIGhlYWRlciwgYW5kIGB0bHNfc3RycF9jb3B5aW5fZnJhZ2AgcmV0dXJucyB0aGUgY29waWVkIGRhdGEgc2l6ZS4gVGhlIGNhbGxlciB0aGVuIGNhbGxzIGB0bHNfc3RycF9jb3B5aW5gIGFnYWluIHdpdGggbW9yZSBkYXRhIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBwYWdlLCB1bnRpbCB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIGZvcm0gYSBUTFMgaGVhZGVyLiBPbmNlIHRoZSBTS0IgaGFzIGF0IGxlYXN0IGBUTFNfSEVBREVSX1NJWkVgIGJ5dGVzLCBgdGxzX3J4X21zZ19zaXplYCB3aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgaGVhZGVyLiBTbyBzdGlsbCwgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCwgaXQgaXMgaGFuZGxlZCBjb3JyZWN0bHkuXG5cbkFuZCwgd2hhdCBhYm91dCBgc2tiX2NvcHlfYml0c2AgZmFpbGluZz8gSXQgaGFzIGEgYFdBUk5fT05fT05DRWAsIGJ1dCBpdCBzaG91bGRuJ3QgZmFpbCBiZWNhdXNlIGBpbl9za2JgIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhdCBsZWFzdCBgY2h1bmtgIGJ5dGVzIHN0YXJ0aW5nIGF0IGBvZmZzZXRgLiBJdCBzaG91bGQgc3VjY2VlZCwgc28gbm8gaXNzdWUgdGhlcmUuXG5cbk92ZXJhbGwsIGNvbnNpZGVyaW5nIGFsbCB0aGUgY2FzZXMsIEkgYW0gbm90IHNlZWluZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZC4gVGhlIGNvcHkgcHJvY2VzcyBoYW5kbGVzIGNhc2VzIHdpdGggc21hbGxlciBjaHVua3MgY29ycmVjdGx5LCBhbmQgYHNrYl9jb3B5X2JpdHNgIHNob3VsZCBhbHdheXMgc3VjY2VlZC4gVGhpcyBsb29rcyBzb3VuZC4gSSB3aWxsIG1vdmUgb24gdG8gY2hlY2tpbmcgYHRsc19zdHJwX2NvcHlpbl9za2JgIG5vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzM3NjIsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMjo0NS44Njc0MjU5MTlaIiwiU2VxIjo1NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTg3MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI4NixcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI4NjpcXHRzdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbl9za2Ioc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IsXFxuIDI4NzpcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgdW5zaWduZWQgaW50IG9mZnNldCxcXG4gMjg4OlxcdFxcdFxcdFxcdCAgICAgICBzaXplX3QgaW5fbGVuKVxcbiAyODk6XFx0e1xcbiAyOTA6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKm5za2IsICpmaXJzdCwgKmxhc3Q7XFxuIDI5MTpcXHRcXHRzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87XFxuIDI5MjpcXHRcXHRzaXplX3QgY2h1bms7XFxuIDI5MzpcXHRcXHRpbnQgc3o7XFxuIDI5NDpcXHRcXG4gMjk1OlxcdFxcdGlmIChzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pXFxuIDI5NjpcXHRcXHRcXHRjaHVuayA9IHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbiAtIHNrYi1cXHUwMDNlbGVuO1xcbiAyOTc6XFx0XFx0ZWxzZVxcbiAyOTg6XFx0XFx0XFx0Y2h1bmsgPSBUTFNfTUFYX1BBWUxPQURfU0laRSArIFBBR0VfU0laRTtcXG4gMjk5OlxcdFxcdGNodW5rID0gbWluKGNodW5rLCBpbl9sZW4pO1xcbiAzMDA6XFx0XFxuIDMwMTpcXHRcXHRuc2tiID0gdGxzX3N0cnBfc2tiX2NvcHkoc3RycCwgaW5fc2tiLCBvZmZzZXQsIGNodW5rKTtcXG4gMzAyOlxcdFxcdGlmICghbnNrYilcXG4gMzAzOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAzMDQ6XFx0XFxuIDMwNTpcXHRcXHRzaGluZm8gPSBza2Jfc2hpbmZvKHNrYik7XFxuIDMwNjpcXHRcXHRpZiAoIXNoaW5mby1cXHUwMDNlZnJhZ19saXN0KSB7XFxuIDMwNzpcXHRcXHRcXHRzaGluZm8tXFx1MDAzZWZyYWdfbGlzdCA9IG5za2I7XFxuIDMwODpcXHRcXHRcXHRuc2tiLVxcdTAwM2VwcmV2ID0gbnNrYjtcXG4gMzA5OlxcdFxcdH0gZWxzZSB7XFxuIDMxMDpcXHRcXHRcXHRmaXJzdCA9IHNoaW5mby1cXHUwMDNlZnJhZ19saXN0O1xcbiAzMTE6XFx0XFx0XFx0bGFzdCA9IGZpcnN0LVxcdTAwM2VwcmV2O1xcbiAzMTI6XFx0XFx0XFx0bGFzdC1cXHUwMDNlbmV4dCA9IG5za2I7XFxuIDMxMzpcXHRcXHRcXHRmaXJzdC1cXHUwMDNlcHJldiA9IG5za2I7XFxuIDMxNDpcXHRcXHR9XFxuIDMxNTpcXHRcXG4gMzE2OlxcdFxcdHNrYi1cXHUwMDNlbGVuICs9IGNodW5rO1xcbiAzMTc6XFx0XFx0c2tiLVxcdTAwM2VkYXRhX2xlbiArPSBjaHVuaztcXG4gMzE4OlxcdFxcbiAzMTk6XFx0XFx0aWYgKCFzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pIHtcXG4gMzIwOlxcdFxcdFxcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHNrYik7XFxuIDMyMTpcXHRcXHRcXHRpZiAoc3ogXFx1MDAzYyAwKVxcbiAzMjI6XFx0XFx0XFx0XFx0cmV0dXJuIHN6O1xcbiAzMjM6XFx0XFxuIDMyNDpcXHRcXHRcXHQvKiBXZSBtYXkgaGF2ZSBvdmVyLXJlYWQsIHN6ID09IDAgaXMgZ3VhcmFudGVlZCB1bmRlci1yZWFkICovXFxuIDMyNTpcXHRcXHRcXHRpZiAodW5saWtlbHkoc3ogXFx1MDAyNlxcdTAwMjYgc3ogXFx1MDAzYyBza2ItXFx1MDAzZWxlbikpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzI6NDUuODY3NTI1ODE5WiIsIlNlcSI6NTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3MTMyMzQ1MzIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIHRoZSBUTFMgUmVjZWl2ZSBRdWV1ZSBMb2dpYyBCdWcgRml4KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIHBhdGNoIGlzIGFkZHJlc3NpbmcgYSBmdW5jdGlvbmFsIGJ1Zywgbm90IGEgbWVtb3J5IHNhZmV0eSBpc3N1ZS4gVGhlIGNvcmUgb2YgdGhlIHByb2JsZW0gbGllcyBpbiBob3cgdGhlIFRMUyBzdGFjayBoYW5kbGVzIG92ZXJsYXBwaW5nIFRDUCBzZWdtZW50cyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gIGB0bHNfc3RycF9jb3B5aW5fc2tiYCB1c2VzIGB0bHNfc3RycF9za2JfY29weWAgd2hpY2ggYWxsb2NhdGVzIGFuZCBjb3BpZXMgZGF0YSBpbnRvIGEgbmV3IFNLQiwgYXBwZW5kcyBpdCB0byBgZnJhZ19saXN0YCwgYW5kIHRoZW4gY2FsbHMgYHRsc19yeF9tc2dfc2l6ZWAuICBUaGUgcHJvYmxlbSBpcyBgc2tiX2NvcHlfYml0c2AgaXRlcmF0aW5nIG92ZXIgdGhpcyBgZnJhZ19saXN0YCBjb250YWluaW5nIHBvdGVudGlhbGx5IG92ZXJsYXBwaW5nIFNLQnMuIFRoaXMgb3ZlcmxhcCBsZWFkcyB0byBgdGxzX3J4X21zZ19zaXplYCByZWFkaW5nIGEgY29ycnVwdGVkIFRMUyBoZWFkZXIsIGJlY2F1c2UgYHNrYl9jb3B5X2JpdHNgIGJsaW5kbHkgY29waWVzIGJpdHMgZnJvbSB0aG9zZSBvdmVybGFwcGluZyBTS0JzLCB0aHVzIHJlc3VsdGluZyBpbiBhbiBlcnJvciBhbmQgYW4gYWJvcnRlZCBjb25uZWN0aW9uLlxuXG5UaGUgcGF0Y2ggaW50cm9kdWNlcyBhIGNoZWNrIHVzaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmJlZm9yZSogY2FsbGluZyBgdGxzX3J4X21zZ19zaXplYC4gVGhpcyBpcyBrZXkuIElmIHRoZSBxdWV1ZSBpcyBkZWVtZWQgXCJPS1wiIChubyBvdmVybGFwcywgY29uc2lzdGVudCBkZWNyeXB0ZWQgc3RhdHVzKSwgdGhlIGV4aXN0aW5nIGxvZ2ljIHByb2NlZWRzLiBJZiB0aGUgcXVldWUgaXMgKm5vdCogT0ssIHRoZSBjb2RlIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weWAgd2hpY2ggbGV2ZXJhZ2VzIGB0Y3BfcmVhZF9zb2NrYCB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBvdmVybGFwcGluZyBzZWdtZW50cy4gIGB0Y3BfcmVhZF9zb2NrYCBpcyBkZXNpZ25lZCB0byBjb3JyZWN0bHkgbWFuYWdlIHRoZXNlIHNjZW5hcmlvcyBhbmQgcmVhZCB0aGUgYXBwcm9wcmlhdGUgZGF0YS5cblxuTm93LCBsZXQncyBhZGRyZXNzIHRoZSBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zOlxuXG4qICAgKipVbmluaXRpYWxpemVkIG1lbW9yeSByZWFkcz8qKiAgTm8uIFRoZSBkYXRhIGNvcGllZCBieSBgc2tiX2NvcHlfYml0c2AgKmlzKiBpbml0aWFsaXplZCwgYWxiZWl0IGluY29ycmVjdGx5IGR1ZSB0byB0aGUgb3ZlcmxhcC4gVGhlIGNvZGUgaXRzZWxmIGlzbid0IGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHVuaW5pdGlhbGl6ZWQgcmVnaW9ucyBvZiBtZW1vcnkuXG4qICAgKipPdXQtb2YtYm91bmRzIHJlYWRzPyoqIE5vLiBBZ2FpbiwgdGhlIHByb2JsZW0gaXMgd2l0aCB0aGUgZGF0YSBiZWluZyByZWFkLCBub3QgdGhlIGF0dGVtcHQgdG8gcmVhZCBpdCBvdXQgb2YgYm91bmRzLiBUaGUgYnVmZmVycyBpbnZvbHZlZCBhcmUgcHJvcGVybHkgYWxsb2NhdGVkLlxuKiAgICoqTWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW4gZ2VuZXJhbD8qKiBOby4gVGhlIGNvcmUgb2YgdGhlIGlzc3VlIGlzIGEgbG9naWNhbCBmbGF3IGluIGhvdyB0aGUgVExTIGxheWVyIGhhbmRsZXMgb3ZlcmxhcHBpbmcgc2VnbWVudHMsIG5vdCBhIG1lbW9yeSBjb3JydXB0aW9uIHZ1bG5lcmFiaWxpdHkuXG4qICAgKipLTVNBTi9LQVNBTj8qKiBOZWl0aGVyIHdvdWxkIGRldGVjdCBhbnl0aGluZyBoZXJlLCBwcmVjaXNlbHkgYmVjYXVzZSB0aGUgY29kZSBpcyBub3QgZG9pbmcgYW55dGhpbmcgdGhhdCB3b3VsZCB0cmlnZ2VyIHRob3NlIHNhbml0aXplcnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1Zy5cblxuVGhlbiBJIGNvbnNpZGVyZWQgdGhlIGNhc2Ugd2hlcmUgYHRsc19yeF9tc2dfc2l6ZWAgY29tcHV0ZWQgYSBodWdlIGBzemAsIGxlYWRpbmcgdG8gbGFyZ2UgbWVtb3J5IGFsbG9jYXRpb25zLiAgRXZlbiBpZiBgdGxzX3J4X21zZ19zaXplYCByZWFkcyBhIGNvcnJ1cHRlZCBoZWFkZXIgYW5kIHJldHVybnMgYSBodWdlIGBzemAsIHRoZSByZXN1bHRpbmcgYWxsb2NhdGlvbiB2aWEgYHRsc19zdHJwX3JlYWRfY29weWAgaXMgYm91bmRlZCBieSBgVExTX01BWF9QQVlMT0FEX1NJWkUgKyBjaXBoZXJfb3ZlcmhlYWQgKyBwcm90LVx1MDAzZXRhaWxfc2l6ZWAuIFRoYXQncyBhcm91bmQgMTZLQiB3aGljaCBpcyBub3QgdW51c3VhbCwgaXQncyBqdXN0IGEgZmV3IHBhZ2VzLCBzbyBub3QgYSBtZW1vcnkgZXhoYXVzdGlvbiBwcm9ibGVtIGVpdGhlci5cblxuSWYgYHN6YCBpcyBzbWFsbCBhbmQgdGhlIGNoZWNrIGRldGVjdHMgdGhlIG92ZXJsYXAsIGl0IHRoZW4gZmFsbHMgYmFjayB0byB0aGUgYHRsc19zdHJwX3JlYWRfY29weWAgYW5kIHNvIGFnYWluIG5vIGNyYXNoLlxuXG5UaGVyZWZvcmUsIHRoZSBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBhbnkgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgYXQgYWxsOyBpdCdzIHB1cmVseSBhIGZ1bmN0aW9uYWwgYnVnIGZpeC5cblxuVGhlcmVmb3JlLCBJJ20gY29uZmlkZW50IGluIGNvbmNsdWRpbmcgdGhhdCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIGBmYWxzZWAuXG5cbkxldCBtZSByZWl0ZXJhdGUgbXkgcmVhc29uaW5nOiBUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIChgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgKSBiZWZvcmUgY2FsbGluZyB0aGUgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMgYHRsc19yeF9tc2dfc2l6ZWAuICBUaGlzIGNoZWNrIGRldGVjdHMgdGhlIG92ZXJsYXBwaW5nIHNlZ21lbnRzLiBJZiB0aGUgcXVldWUgaXMgYmFkLCBpdCBmYWxscyBiYWNrIHRvIGEgc2FmZXIgcGF0aCB1c2luZyBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gVGhlcmUgYXJlIG5vIG1lbW9yeSBzYWZldHkgaXNzdWVzLiAgVGhlIGRhdGEgcmVhZCBpcyBpbml0aWFsaXplZCBhbmQgdGhlcmUgYXJlIG5vIG91dCBvZiBib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBsb2dpYyBmbGF3IG5vdCBhIG1lbW9yeSBjb3JydXB0aW9uIGlzc3VlLCBhbmQgc28gbmVpdGhlciBLTVNBTiBub3IgS0FTQU4gc2hvdWxkIGJlIGVuYWJsZWQuXG5cbioqRmluYWwgRG91YmxlLUNoZWNrKipcblxuTGV0J3MgcXVpY2tseSBjaGVjayBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLlxuXG5UaGUgbG9vcCBpdGVyYXRlcyB0aHJvdWdoIGBza2JgcywgYW5kIGBUQ1BfU0tCX0NCKHNrYilgIGFjY2Vzc2VzIGBza2ItXHUwMDNlY2JgLiBgc2tiLVx1MDAzZWNiYCBpcyBpbml0aWFsaXplZCB3aGVuIHRoZSBgc2tiYCBpcyByZWNlaXZlZCBieSBUQ1AsIHNvIG5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMuXG5cbkFsc28gYHNrYl9jbXBfZGVjcnlwdGVkYCBhY2Nlc3NlcyBgc2tiLVx1MDAzZWRlY3J5cHRlZGAuIGBkZWNyeXB0ZWRgIGlzIGEgYml0ZmllbGQgaW4gYHNrYmAgdGhhdCdzIGluaXRpYWxpemVkLlxuXG5TbyBhZ2FpbiwgZXZlcnl0aGluZyBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4gSSdtIHZlcnkgY29uZmlkZW50IGluIHRoaXMgYXNzZXNzbWVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzU1ODUsIk91dHB1dFRva2VucyI6Mjk2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTExOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMzOjAyLjk5OTg3NDMyWiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjkzNzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiB0aGUgVExTIHN0cnBhcnNlciB3aGVyZSBgdGxzX3J4X21zZ19zaXplKClgIGNvdWxkIGJlIGNhbGxlZCBvbiBhIFRDUCByZWNlaXZlIHF1ZXVlIGNvbnRhaW5pbmcgb3ZlcmxhcHBpbmcgc2VnbWVudHMgKGUuZy4sIGR1ZSB0byByZXRyYW5zbWlzc2lvbnMpLiBXaGVuIHRoaXMgaGFwcGVucywgYHNrYl9jb3B5X2JpdHMoKWAgYmxpbmRseSBpdGVyYXRlcyBvdmVyIHRoZSBgZnJhZ19saXN0YCBhbmQgbWF5IHJlYWQgb3ZlcmxhcHBpbmcgYnl0ZXMsIHJlc3VsdGluZyBpbiBhIGNvcnJ1cHRlZCBUTFMgaGVhZGVyLiBUaGlzIGNvcnJ1cHRlZCBoZWFkZXIgY2F1c2VzIGB0bHNfcnhfbXNnX3NpemUoKWAgdG8gcmV0dXJuIGFuIGVycm9yIChsaWtlIGAtRUlOVkFMYCksIHdoaWNoIHNwdXJpb3VzbHkgYWJvcnRzIHRoZSBUTFMgY29ubmVjdGlvbi5cXG5cXG5CeSBjYWxsaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9vaygpYCBiZWZvcmUgcmVhZGluZyB0aGUgaGVhZGVyLCB0aGUgY29kZSBkZXRlY3RzIG92ZXJsYXBwaW5nIHNlZ21lbnRzIG9yIG1peGVkIGRlY3J5cHRlZCBzdGF0dXMgYW5kIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weSgpYC4gVGhpcyBmYWxsYmFjayB1c2VzIGB0Y3BfcmVhZF9zb2NrKClgIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIG92ZXJsYXBzIGFuZCBjb3B5IHRoZSBsb2dpY2FsIHN0cmVhbSBpbnRvIGEgbGluZWFyIGJ1ZmZlci5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXFxuXFxuQnkgY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soKWAgYmVmb3JlIHJlYWRpbmcgdGhlIGhlYWRlciwgdGhlIGNvZGUgZGV0ZWN0cyBvdmVybGFwcGluZyBzZWdtZW50cyBvciBtaXhlZCBkZWNyeXB0ZWQgc3RhdHVzIGFuZCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHkoKWAuIFRoaXMgZmFsbGJhY2sgdXNlcyBgdGNwX3JlYWRfc29jaygpYCB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBvdmVybGFwcyBhbmQgY29weSB0aGUgbG9naWNhbCBzdHJlYW0gaW50byBhIGxpbmVhciBidWZmZXIuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnZvbHZlZC4gVGhlIGJ5dGVzIHJlYWQgYnkgYHNrYl9jb3B5X2JpdHMoKWAgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG5ldHdvcmsgZGF0YTsgdGhleSBhcmUgc2ltcGx5IHRoZSB3cm9uZyBieXRlcyBkdWUgdG8gdGhlIG92ZXJsYXBzLiBUaGVyZWZvcmUsIEtNU0FOICh3aGljaCBkZXRlY3RzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlKSBpcyBub3QgYXBwbGljYWJsZSBoZXJlLiBTdGFuZGFyZCBLQVNBTiB3b3VsZCBhbHNvIG5vdCBkZXRlY3QgYW55dGhpbmcsIGFzIHRoZXJlIGlzIG5vIG1lbW9yeSBjb3JydXB0aW9uIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowjbqks[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-07 20:05:16 +0000 UTC FinishedAt: 2026-08-07 20:33:04 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "594d905195024b228c962627ae5ae7c17bd582a4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TLS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "594d905195024b228c962627ae5ae7c17bd582a4", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TLS" ], "series_id": "a8897df4-2b76-41d6-be86-9a70a926932e" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "tls_strp_check_rcv", "tls_sw_recvmsg", "tls_strp_data_ready" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RMUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3Rsc19zdHJwX2NoZWNrX3JjdiYjMzQ7LAogICAgJiMzNDt0bHNfc3dfcmVjdm1zZyYjMzQ7LAogICAgJiMzNDt0bHNfc3RycF9kYXRhX3JlYWR5JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXG5cbkJ5IGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKClgIGJlZm9yZSByZWFkaW5nIHRoZSBoZWFkZXIsIHRoZSBjb2RlIGRldGVjdHMgb3ZlcmxhcHBpbmcgc2VnbWVudHMgb3IgbWl4ZWQgZGVjcnlwdGVkIHN0YXR1cyBhbmQgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5KClgLiBUaGlzIGZhbGxiYWNrIHVzZXMgYHRjcF9yZWFkX3NvY2soKWAgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgb3ZlcmxhcHMgYW5kIGNvcHkgdGhlIGxvZ2ljYWwgc3RyZWFtIGludG8gYSBsaW5lYXIgYnVmZmVyLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBhNmIwNWI3ZTM1N2QxM2I1OTdlZjhjYjIyNmY0ZmFiNDBmZTNiOTIwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBBdWcgNyAyMDoyOToyNyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvdGxzL3Rsc19zdHJwLmMgYi9uZXQvdGxzL3Rsc19zdHJwLmNcbmluZGV4IDYxYjEwYzY5N2VjY2IuLjY0ZDVkZWE5MDU0MDMgMTAwNjQ0XG4tLS0gYS9uZXQvdGxzL3Rsc19zdHJwLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC90bHMvdGxzX3N0cnAuY1xuQEAgLTQzMCw5ICYjNDM7NDMwLDkgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuJiM0MztzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGxlbilcbiB7XG4tXHR1bnNpZ25lZCBpbnQgbGVuID0gc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuO1xuIFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0LCAqc2tiO1xuIFx0dTMyIHNlcTtcbiBcbkBAIC01MjUsNiAmIzQzOzUyNSwxMiBAQCBzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcbiBcbiBcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcbiBcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pIHtcbiYjNDM7XHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbiYjNDM7XHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBUTFNfSEVBREVSX1NJWkUpKVxuJiM0MztcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcbiYjNDM7XG4gXHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXHUwMDNlYW5jaG9yKTtcbiBcdFx0aWYgKHN6IFx1MDAzYyAwKVxuIFx0XHRcdHJldHVybiBzejtcbkBAIC01MzUsNyAmIzQzOzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gXHR9XG4gXG4tXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKVxuJiM0MztcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSlcbiBcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4gXG4gXHRXUklURV9PTkNFKHN0cnAtXHUwMDNlbXNnX3JlYWR5LCAxKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VExTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dGxzX3N0cnBfY2hlY2tfcmN2JiMzNDssCiAgICAmIzM0O3Rsc19zd19yZWN2bXNnJiMzNDssCiAgICAmIzM0O3Rsc19zdHJwX2RhdGFfcmVhZHkmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIFRMUyBzdHJlYW0gcGFyc2VyIGxvZ2ljIChgdGxzX3N0cnBfcmVhZF9zb2NrYCBhbmQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCkgdG8gY29ycmVjdGx5IGNoZWNrIGlmIHRoZSByZWNlaXZlIHF1ZXVlIGhhcyBlbm91Z2ggZGF0YSBmb3IgdGhlIFRMUyBoZWFkZXIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZCBpdC4gVGhpcyBpcyBjb3JlIG5ldHdvcmsgcmVjZWl2ZSBsb2dpYyBmb3IgVExTIHNvY2tldHMgYW5kIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIGByZWN2bXNnYCBvbiBUTFMgc29ja2V0cy4gSXQgaXMgd29ydGggZnV6emluZyB0byBlbnN1cmUgdGhlIHN0cmVhbSBwYXJzZXIgaGFuZGxlcyBmcmFnbWVudGVkIG9yIHNob3J0IFRMUyByZWNvcmRzIGNvcnJlY3RseSB3aXRob3V0IG1lbW9yeSBjb3JydXB0aW9uIG9yIHN0YWxscy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGE2YjA1YjdlMzU3ZDEzYjU5N2VmOGNiMjI2ZjRmYWI0MGZlM2I5MjAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDIwOjI5OjI3IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L3Rscy90bHNfc3RycC5jIGIvbmV0L3Rscy90bHNfc3RycC5jCmluZGV4IDYxYjEwYzY5N2VjY2IuLjY0ZDVkZWE5MDU0MDMgMTAwNjQ0Ci0tLSBhL25ldC90bHMvdGxzX3N0cnAuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvdGxzL3Rsc19zdHJwLmMKQEAgLTQzMCw5ICYjNDM7NDMwLDkgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCkKJiM0MztzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JdW5zaWduZWQgaW50IGxlbiA9IHN0cnAtJmd0O3N0bS5vZmZzZXQgJiM0Mzsgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuOwogCXN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjsKIAl1MzIgc2VxOwogCkBAIC01MjUsNiAmIzQzOzUyNSwxMiBAQCBzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCkKIAogCXRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTsKIAlpZiAoIXN0cnAtJmd0O3N0bS5mdWxsX2xlbikgewomIzQzOwkJaWYgKGlucSAmbHQ7IFRMU19IRUFERVJfU0laRSkKJiM0MzsJCQlyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpOwomIzQzOwomIzQzOwkJaWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpCiYjNDM7CQkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CiYjNDM7CiAJCXN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtJmd0O2FuY2hvcik7CiAJCWlmIChzeiAmbHQ7IDApCiAJCQlyZXR1cm4gc3o7CkBAIC01MzUsNyAmIzQzOzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKQogCQkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTsKIAl9CiAKLQlpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKQomIzQzOwlpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtJmd0O3N0bS5vZmZzZXQgJiM0Mzsgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuKSkKIAkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CiAKIAlXUklURV9PTkNFKHN0cnAtJmd0O21zZ19yZWFkeSwgMSk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNzAKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxNzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUTFMgU3RyaXAgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBuZXQvdGxzL3Rsc19zdHJwLmNgIGFuZCBpbW1lZGlhdGVseSwgSSBzZWUgYSBzaWduaWZpY2FudCBjaGFuZ2UgaW4gaG93IHdlJiMzOTtyZSBoYW5kbGluZyBxdWV1ZSBjaGVja3MuIFRoZSBwcmltYXJ5IG1vZGlmaWNhdGlvbiByZXZvbHZlcyBhcm91bmQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgbGVuZ3RoIGludGVybmFsbHksIGl0IG5vdyBhY2NlcHRzIGEgYGxlbmAgcGFyYW1ldGVyLiBUaGlzIGlzIGludGVyZXN0aW5nLCBpdCBpbXBsaWVzIHdlJiMzOTtyZSB0cnlpbmcgdG8gY2VudHJhbGl6ZSBvciBvcHRpbWl6ZSBob3cgdGhpcyBsZW5ndGggaXMgZGV0ZXJtaW5lZC4KClRoZSBvdGhlciBrZXkgY2hhbmdlIGlzIHdpdGhpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYC4gVGhlIHBhdGNoIG1vdmVzIHRoZSBjYWxsIHRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmJlZm9yZSogd2UgY2FsbCBgdGxzX3J4X21zZ19zaXplYC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBjbGVhciwgd2UgbmVlZCB0byBlbnN1cmUgdGhlIHF1ZXVlIGhhcyB0aGUgcmVzb3VyY2VzIG5lZWRlZCB0byByZWFkIHRoZSBUTFMgaGVhZGVyICpiZWZvcmUqIHdlIGV2ZW4gYXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIGhlYWRlciYjMzk7cyBzaXplLiBJdCYjMzk7cyBhIHByZWVtcHRpdmUgc2FmZXR5IGNoZWNrLiBJZiB0aGUgcXVldWUgaXNuJiMzOTt0IHN1aXRhYmxlLCBpdCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBUaGlzIG1ha2VzIHNlbnNlLCBpdCYjMzk7cyBhIGdvb2QgZmFpbC1zYWZlLgoKVGltZSB0byBkaXZlIGRlZXBlci4gSSYjMzk7bGwgdXNlIGBncmVwcGVyYCB0byBsb2NhdGUgYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaW4gdGhlIGZpbGUuIEkgd2FudCB0byBzZWUgaG93IHRoZXNlIGNoYW5nZXMgYXJlIGltcGFjdGluZyB0aGUgb3ZlcmFsbCBmbG93LCBzcGVjaWZpY2FsbHkgaG93IGBsZW5gIGlzIGJlaW5nIGNhbGN1bGF0ZWQgYW5kIHBhc3NlZCwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIHNpZGUgZWZmZWN0cyB0byBiZSBhd2FyZSBvZi4gSSYjMzk7bGwgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIGNoYW5nZSBpcyBpbmRlZWQgYW4gaW1wcm92ZW1lbnQsIGFuZCBoYXNuJiMzOTt0IGludHJvZHVjZWQgYW55IHVuaW50ZW5kZWQgY29uc2VxdWVuY2VzIHJlbGF0ZWQgdG8gcmFjZSBjb25kaXRpb25zIG9yIGJ1ZmZlciBvdmVyZmxvd3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGxzX3N0cnBfcmVhZF9zb2NrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3RycC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYz00ODM9Ym9vbCB0bHNfc3RycF9tc2dfbG9hZChzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBmb3JjZV9yZWZyZXNoKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01MTEtLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIG9uIGxvd2VyIHNvY2tldCAqL1xubmV0L3Rscy90bHNfc3RycC5jOjUxMjpzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcbm5ldC90bHMvdGxzX3N0cnAuYy01MTMte1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01NTc9dm9pZCB0bHNfc3RycF9jaGVja19yY3Yoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgYW5ub3VuY2UpXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTU2MS1cbm5ldC90bHMvdGxzX3N0cnAuYzo1NjI6XHRpZiAodGxzX3N0cnBfcmVhZF9zb2NrKHN0cnApID09IC1FTk9NRU0pXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTYzLVx0XHRxdWV1ZV93b3JrKHRsc19zdHJwX3dxLCBcdTAwMjZzdHJwLVx1MDAzZXdvcmspO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMxODcKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBgdGxzX3N0cnBfcmVhZF9zb2NrYCYjMzk7cyBDYWxsIENoYWluKioKCkFscmlnaHQsIHNvIGB0bHNfc3RycF9yZWFkX3NvY2tgIGlzIGEgc3RhdGljIGZ1bmN0aW9uLiBUaGF0IG1lYW5zIGl0cyBzY29wZSBpcyBsaW1pdGVkLCBtYWtpbmcgaXQgZWFzaWVyIHRvIHJlYXNvbiBhYm91dCwgYnV0IGFsc28gcG90ZW50aWFsbHkgaGlkZXMgaXRzIHVzZS4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGxldCYjMzk7cyB0cmFjZSBpdHMgdXNhZ2UuIEkga25vdyBpdCYjMzk7cyBjYWxsZWQgYnkgYHRsc19zdHJwX2NoZWNrX3JjdmAsIHdoaWNoIGhlbHBzIGEgbG90LiBCdXQgSSBuZWVkIHRoZSB3aG9sZSBwaWN0dXJlLiBTbyB0aGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gc2VlICp3aG8qIGlzIGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3JjdmAuIEZpZ3VyaW5nIG91dCB0aGF0IGNhbGxpbmcgaGllcmFyY2h5IGlzIHRoZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgZnVuY3Rpb24mIzM5O3MgcGxhY2UgaW4gdGhlIGJyb2FkZXIgc3lzdGVtIGFuZCBhbnkgcG90ZW50aWFsIHNpZGUgZWZmZWN0cyBvZiBpdHMgZGVzaWduLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Rsc19zdHJwX2NoZWNrX3JjdiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzLmg9MTk0PXZvaWQgdGxzX3N0cnBfZGF0YV9yZWFkeShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCk7XG5uZXQvdGxzL3Rscy5oLTE5NS1cbm5ldC90bHMvdGxzLmg6MTk2OnZvaWQgdGxzX3N0cnBfY2hlY2tfcmN2KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGFubm91bmNlKTtcbm5ldC90bHMvdGxzLmgtMTk3LXZvaWQgdGxzX3N0cnBfbXNnX2NvbnN1bWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApO1xuLS1cbm5ldC90bHMvdGxzX21haW4uYz02Mjc9c3RhdGljIGludCBkb190bHNfc2V0c29ja29wdF9jb25mKHN0cnVjdCBzb2NrICpzaywgc29ja3B0cl90IG9wdHZhbCxcbi0tXG5uZXQvdGxzL3Rsc19tYWluLmMtNzc0LVxubmV0L3Rscy90bHNfbWFpbi5jOjc3NTpcdFx0dGxzX3N0cnBfY2hlY2tfcmN2KFx1MDAyNnJ4X2N0eC1cdTAwM2VzdHJwLCB0cnVlKTtcbm5ldC90bHMvdGxzX21haW4uYy03NzYtXHR9XG4tLVxubmV0L3Rscy90bHNfc3RycC5jPTUxMj1zdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcbi0tXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTU2LSAqL1xubmV0L3Rscy90bHNfc3RycC5jOjU1Nzp2b2lkIHRsc19zdHJwX2NoZWNrX3JjdihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBhbm5vdW5jZSlcbm5ldC90bHMvdGxzX3N0cnAuYy01NTgte1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01Njk9dm9pZCB0bHNfc3RycF9kYXRhX3JlYWR5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01ODItXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTgzOlx0dGxzX3N0cnBfY2hlY2tfcmN2KHN0cnAsIHRydWUpO1xubmV0L3Rscy90bHNfc3RycC5jLTU4NC19XG4tLVxubmV0L3Rscy90bHNfc3RycC5jPTU4Nj1zdGF0aWMgdm9pZCB0bHNfc3RycF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdylcbi0tXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTkxLVx0bG9ja19zb2NrKHN0cnAtXHUwMDNlc2spO1xubmV0L3Rscy90bHNfc3RycC5jOjU5MjpcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcbm5ldC90bHMvdGxzX3N0cnAuYy01OTMtXHRyZWxlYXNlX3NvY2soc3RycC1cdTAwM2Vzayk7XG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTU5Ni0vKiBSZWxlYXNlIHRoZSBjdXJyZW50IHJlY29yZCB3aXRob3V0IHRyaWdnZXJpbmcgYSBjaGVjayBmb3IgdGhlXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTk3OiAqIG5leHQgcmVjb3JkLiBDYWxsZXJzIG11c3QgaW52b2tlIHRsc19zdHJwX2NoZWNrX3JjdigpIGJlZm9yZVxubmV0L3Rscy90bHNfc3RycC5jLTU5OC0gKiByZWxlYXNpbmcgdGhlIHNvY2tldCBsb2NrLCBvciBxdWV1ZWQgZGF0YSB3aWxsIHN0YWxsIHVudGlsIHRoZVxuLS1cbm5ldC90bHMvdGxzX3N3LmM9MTA5NT10bHNfcnhfcmVjX3dhaXQoc3RydWN0IHNvY2sgKnNrLCBib29sIG5vbmJsb2NrLCBib29sIHJlbGVhc2VkLCBib29sIGhhc19jb3BpZWQpXG4tLVxubmV0L3Rscy90bHNfc3cuYy0xMTI0LVx0XHRcdCAqL1xubmV0L3Rscy90bHNfc3cuYzoxMTI1Olx0XHRcdHRsc19zdHJwX2NoZWNrX3JjdihcdTAwMjZjdHgtXHUwMDNlc3RycCwgZmFsc2UpO1xubmV0L3Rscy90bHNfc3cuYy0xMTI2LVx0XHRcdGlmICh0bHNfc3RycF9tc2dfcmVhZHkoY3R4KSlcbi0tXG5uZXQvdGxzL3Rsc19zdy5jPTE2MjQ9c3RhdGljIHZvaWQgdGxzX3J4X3JlY19kb25lKHN0cnVjdCB0bHNfc3dfY29udGV4dF9yeCAqY3R4KVxuLS1cbm5ldC90bHMvdGxzX3N3LmMtMTYyNi1cdHRsc19zdHJwX21zZ19jb25zdW1lKFx1MDAyNmN0eC1cdTAwM2VzdHJwKTtcbm5ldC90bHMvdGxzX3N3LmM6MTYyNzpcdHRsc19zdHJwX2NoZWNrX3JjdihcdTAwMjZjdHgtXHUwMDNlc3RycCwgZmFsc2UpO1xubmV0L3Rscy90bHNfc3cuYy0xNjI4LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MzU1CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMjc3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKioKCk9rYXksIHNvIHRoaXMgaXMgZGVmaW5pdGVseSBjb3JlIFRMUyByZWNlaXZlIGxvZ2ljLCB3aGljaCBtZWFucyBpdCYjMzk7cyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gR2l2ZW4gdGhlIHBhdGNoIG1vZGlmaWVzIGB0bHNfc3RycF9yZWFkX3NvY2tgLCBhbmQgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYHRsc19zdHJwX2NoZWNrX3JjdmAsIHRoYXQmIzM5O3MgYW4gaW1tZWRpYXRlIGFyZWEgb2YgaW50ZXJlc3QuIE5vdywgYHRsc19zdHJwX2NoZWNrX3JjdmAgaXMgY2FsbGVkIGZyb20gYSBoYW5kZnVsIG9mIG90aGVyIGZ1bmN0aW9uczogYHRsc19yeF9yZWNfd2FpdGAsIGB0bHNfcnhfcmVjX2RvbmVgLCBgdGxzX3N0cnBfd29ya2AsIGB0bHNfc3RycF9kYXRhX3JlYWR5YCwgYW5kIGBkb190bHNfc2V0c29ja29wdF9jb25mYC4KCkluaXRpYWxseSwgSSB0aG91Z2h0IHRoZSBwcmltYXJ5IGZvY3VzIHNob3VsZCBiZSBvbiB0aGUgY2FsbHMgdG8gYHRsc19zdHJwX2NoZWNrX3JjdmAsIGB0bHNfc3RycF9kYXRhX3JlYWR5YCwgYHRsc19yeF9yZWNfd2FpdGAsIGFuZCBgdGxzX3J4X3JlY19kb25lYCwgYnV0IHdhaXQsIGB0bHNfcnhfcmVjX3dhaXRgIGFuZCBgdGxzX3J4X3JlY19kb25lYCBhcmUgc3RhdGljIGZ1bmN0aW9ucy4uLiBzbyB0aGF0IGNvbXBsaWNhdGVzIHRoaW5ncy4KCkxldCYjMzk7cyBzdGFydCBieSBkaWdnaW5nIGludG8gYHRsc19zdHJwX2NoZWNrX3JjdmAgYW5kIGB0bHNfc3RycF9kYXRhX3JlYWR5YCBhbmQgc2VlIHdoYXQgd2UgY2FuIGZpbmQuIE9oLCBhbHNvLCB3aGF0IGFib3V0IGB0bHNfc3RycF9tc2dfbG9hZGA/IE1heWJlIHdlIHNob3VsZCBjaGVjayB3aG8gY2FsbHMgYHRsc19zdHJwX3JlYWRfc29ja2AgdG8gc2VlIGlmIHdlIG1pc3NlZCBhbnl0aGluZy4gQWgsIGFuZCBpdCB0dXJucyBvdXQsIGB0bHNfc3RycF9yZWFkX3NvY2tgIGlzIG9ubHkgY2FsbGVkIGZyb20gYHRsc19zdHJwX2NoZWNrX3JjdmAuCgpBbHJpZ2h0LCBpdCBsb29rcyBsaWtlIGB0bHNfc3RycF9jaGVja19yY3ZgIGlzIHRoZSBtb3N0IGltcG9ydGFudCBzeW1ib2wgdG8gZm9jdXMgb24gZm9yIG5vdy4gTmV4dCwgSSBzaG91bGQgY2hlY2sgdGhlIEtjb25maWcgdG8gc2VlIGhvdyBUTFMgaXMgY29uZmlndXJlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgVExTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3Rscy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3Rscy9LY29uZmlnLTQtI1xubmV0L3Rscy9LY29uZmlnOjU6Y29uZmlnIFRMU1xubmV0L3Rscy9LY29uZmlnLTYtXHR0cmlzdGF0ZSBcJiMzNDtUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgc3VwcG9ydFwmIzM0O1xuLS1cbm5ldC90bHMvS2NvbmZpZy0xOC1cbm5ldC90bHMvS2NvbmZpZzoxOTpjb25maWcgVExTX0RFVklDRVxubmV0L3Rscy9LY29uZmlnLTIwLVx0Ym9vbCBcJiMzNDtUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgSFcgb2ZmbG9hZFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUxNDAKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgcHJlc2VudGVkIGFzIG15IG93biBtZW50YWwgcHJvY2VzcywgZ2l2ZW4gbXkgZXhwZXJ0aXNlOgoKKipDaGVja2luZyBUTFMgU3RyaXBwaW5nIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgdGhlIGNvbmZpZ3VyYXRpb24gaW4gcXVlc3Rpb24gaXMgZGVmaW5pdGVseSBzZXQgdG8gVExTLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB3aXRoIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgcmVsYXRlZCB0byBUTFMgc3RyaXBwaW5nLiBUaGVyZWZvcmUsIG15IG5leHQgdGhvdWdodCBpcyB0byBpbnZlc3RpZ2F0ZSB0aGUgYHRsc19zdHJwX2NoZWNrX3JjdmAgZnVuY3Rpb24uIFRoYXQmIzM5O3MgYSBzdHJvbmcgaW5kaWNhdG9yLiBJdCYjMzk7cyBsb2NhdGVkIGluIGBuZXQvdGxzL3Rsc19zdHJwLmNgLCB3aGljaCBtYWtlcyBzZW5zZSBhcyB0aGUgbmV0IGRpcmVjdG9yeSBzdWdnZXN0cyBpdCByZWxhdGVzIHRvIG5ldHdvcmsgZnVuY3Rpb25zLiBJIHdhbnQgdG8gY2hlY2sgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBiZWNhdXNlIGl0JiMzOTtzIGhpZ2hseSBsaWtlbHkgdG8gaG9sZCB0aGUgY29yZSBsb2dpYyBmb3IgdGhlIFRMUyBzdHJpcHBpbmcgY2hlY2ssIHBhcnRpY3VsYXJseSByZWdhcmRpbmcgaW5jb21pbmcgZGF0YS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IHZhbGlkYXRlcyByZWNlaXZlZCBkYXRhIGluIHRoaXMgc3BlY2lmaWMgVExTIGNvbmZpZ3VyYXRpb24gdG8gaWRlbnRpZnkgYW55IHBvdGVudGlhbCB3ZWFrbmVzc2VzLiBJJiMzOTttIGxvb2tpbmcgZm9yIGtub3duIGJ5cGFzc2VzIG9yIGVkZ2UgY2FzZXMgaGVyZSwgSSYjMzk7bGwgc2VlIHdoYXQgSSBjYW4gZmluZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dGxzX3N0cnBfY2hlY2tfcmN2JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3RycC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTU1Ni0gKi9cbm5ldC90bHMvdGxzX3N0cnAuYzo1NTc6dm9pZCB0bHNfc3RycF9jaGVja19yY3Yoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgYW5ub3VuY2UpXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTU4LXtcbi0tXG5uZXQvdGxzL3Rsc19zdHJwLmM9NTY5PXZvaWQgdGxzX3N0cnBfZGF0YV9yZWFkeShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcbi0tXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTgyLVxubmV0L3Rscy90bHNfc3RycC5jOjU4MzpcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcbm5ldC90bHMvdGxzX3N0cnAuYy01ODQtfVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01ODY9c3RhdGljIHZvaWQgdGxzX3N0cnBfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTU5MS1cdGxvY2tfc29jayhzdHJwLVx1MDAzZXNrKTtcbm5ldC90bHMvdGxzX3N0cnAuYzo1OTI6XHR0bHNfc3RycF9jaGVja19yY3Yoc3RycCwgdHJ1ZSk7XG5uZXQvdGxzL3Rsc19zdHJwLmMtNTkzLVx0cmVsZWFzZV9zb2NrKHN0cnAtXHUwMDNlc2spO1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01OTYtLyogUmVsZWFzZSB0aGUgY3VycmVudCByZWNvcmQgd2l0aG91dCB0cmlnZ2VyaW5nIGEgY2hlY2sgZm9yIHRoZVxubmV0L3Rscy90bHNfc3RycC5jOjU5NzogKiBuZXh0IHJlY29yZC4gQ2FsbGVycyBtdXN0IGludm9rZSB0bHNfc3RycF9jaGVja19yY3YoKSBiZWZvcmVcbm5ldC90bHMvdGxzX3N0cnAuYy01OTgtICogcmVsZWFzaW5nIHRoZSBzb2NrZXQgbG9jaywgb3IgcXVldWVkIGRhdGEgd2lsbCBzdGFsbCB1bnRpbCB0aGVcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTgzOQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRoZSBleHBlcnQ6CgoqKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWxseSBFeHBvc2VkIFRMUyBGdW5jdGlvbioqCgpPa2F5LCBzbyBgdGxzX3N0cnBfY2hlY2tfcmN2YCBpcyBlaXRoZXIgZXhwb3J0ZWQgb3IsIGF0IHRoZSB2ZXJ5IGxlYXN0LCBub3QgZGVjbGFyZWQgYXMgc3RhdGljLiBUaGF0JiMzOTtzIGltbWVkaWF0ZWx5IGludGVyZXN0aW5nOyBpdCBtZWFucyBpdCYjMzk7cyBwb3RlbnRpYWxseSBhY2Nlc3NpYmxlIG91dHNpZGUgaXRzIGN1cnJlbnQgc2NvcGUuIE15IG5leHQgc3RlcCBpcyB0byBwaW5wb2ludCBpdHMgdXNhZ2Ugd2l0aGluIHRoZSBUTFMgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgdG8gc2VlIGhvdyBpdCBmaXRzIGludG8gdGhlIGRhdGEgcmVjZWl2ZSBwYXRoLiBMZXQmIzM5O3MgZGlnIGludG8gYG5ldC90bHMvdGxzX3N3LmNgIGFuZCBzZWFyY2ggZm9yIHRoZSBgdGxzX3N3X3JlY3Ztc2dgIGZ1bmN0aW9uLiBGaW5kaW5nIHRoYXQgd2lsbCBsaWtlbHkgZ2l2ZSBtZSB0aGUgc3Vycm91bmRpbmcgY29udGV4dCBhbmQgcXVpY2tseSByZXZlYWwgaG93IGB0bHNfc3RycF9jaGVja19yY3ZgIGlzIGludm9rZWQuIEl0JiMzOTtsbCBnaXZlIG1lIGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIHdoZXJlIGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFuZCBpdHMgb3ZlcmFsbCBpbXBvcnRhbmNlLiBJJiMzOTttIGhvcGluZyB0aGlzIHdpbGwgcHJvdmlkZSBlbm91Z2ggY29udGV4dCBmb3IgbWUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZnVuY3Rpb24gaXMgYSBwb2ludCBvZiBjb25jZXJuLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0bHNfc3dfcmVjdm1zZyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N3LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3cuYz0xODAwPXN0YXRpYyB2b2lkIHRsc19yeF9yZWFkZXJfdW5sb2NrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRsc19zd19jb250ZXh0X3J4ICpjdHgpXG4tLVxubmV0L3Rscy90bHNfc3cuYy0xODA1LVxubmV0L3Rscy90bHNfc3cuYzoxODA2OmludCB0bHNfc3dfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssXG5uZXQvdGxzL3Rsc19zdy5jLTE4MDctXHRcdCAgIHN0cnVjdCBtc2doZHIgKm1zZyxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjI0MAoJCQkJCQkJb3V0cHV0OiAyOAoJCQkJCQkJdGhvdWdodHM6IDE5MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgVExTIFNvY2tldCBSZWNlcHRpb24gVnVsbmVyYWJpbGl0aWVzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBUTFMgc29ja2V0IGhhbmRsaW5nLCBzcGVjaWZpY2FsbHkgdGhlIHJlY2VwdGlvbiBwcm9jZXNzLiBgdGxzX3N3X3JlY3Ztc2dgIGlzIHRoZSBrZXkgZnVuY3Rpb24gaGVyZSwgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBhbmFseXNpcy4gQW5kIEkgc2hvdWxkIGFsc28ga2VlcCBhbiBleWUgb24gYHRsc19zdHJwX2RhdGFfcmVhZHlgIGFzIHRoZSBkYXRhLXJlYWR5IGNhbGxiYWNrLgoKUmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gYG5ldC90bHMvdGxzX3N0cnAuY2AgYW5kIHRha2UgYSBsb29rIGF0IGB0bHNfc3RycF9yZWFkX3NvY2tgLiBJdCYjMzk7cyBzdGF0aWMsIHNvIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgaXQgY2FyZWZ1bGx5LiBBaCwgaGVyZSYjMzk7cyBhIHBhdGNoIHRoYXQgYWRkcmVzc2VzIGEgYnVnIHdoZXJlIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2Agd2FzIGJlaW5nIGNhbGxlZCBpbmNvcnJlY3RseSwgZWl0aGVyIHdpdGggYW4gaW5jb3JyZWN0IGxlbmd0aCBvciBhdCB0aGUgd3JvbmcgdGltZS4gVGhpcyB3b3VsZCBsZWFkIHRvIHByb2JsZW1zIHdoZW4gdGhlIHJlY2VpdmUgcXVldWUgZG9lc24mIzM5O3QgaGF2ZSB0aGUgY29tcGxldGUgVExTIGhlYWRlciwgd2hpY2ggd291bGQgYmUgYSBzaWduaWZpY2FudCB2dWxuZXJhYmlsaXR5IHRvIGV4cGxvaXQuIFRoaXMgaXMgKmRlZmluaXRlbHkqIGZ1enppbmcgbWF0ZXJpYWwuIFRoZSBwb3RlbnRpYWwgaGVyZSBpcyBxdWl0ZSBpbnRlcmVzdGluZy4KClRvIGFpZCB3aXRoIHRoYXQsIGxldCBtZSBub3RlIGRvd24gc29tZSBtb3JlIGZvY3VzIHN5bWJvbHMuIEkgaGF2ZToKCi0gICBgdGxzX3N0cnBfY2hlY2tfcmN2YAotICAgYHRsc19zd19yZWN2bXNnYAotICAgYHRsc19zdHJwX2RhdGFfcmVhZHlgCgpHb29kLCBnb29kLiBJ4oCZbGwgbWFrZSBzdXJlIHRoZSBgVExTYCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBOb3csIGxldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgdGhhdCBtaWdodCBiZSBpbiBwbGF5LiBBbHdheXMgZ29vZCB0byBjb3ZlciBteSBiYXNlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdGxzL0tjb25maWc9NT1jb25maWcgVExTXG5uZXQvdGxzL0tjb25maWctNi1cdHRyaXN0YXRlIFwmIzM0O1RyYW5zcG9ydCBMYXllciBTZWN1cml0eSBzdXBwb3J0XCYjMzQ7XG5uZXQvdGxzL0tjb25maWc6NzpcdGRlcGVuZHMgb24gSU5FVFxubmV0L3Rscy9LY29uZmlnLTgtXHRzZWxlY3QgQ1JZUFRPXG4tLVxubmV0L3Rscy9LY29uZmlnPTE5PWNvbmZpZyBUTFNfREVWSUNFXG5uZXQvdGxzL0tjb25maWctMjAtXHRib29sIFwmIzM0O1RyYW5zcG9ydCBMYXllciBTZWN1cml0eSBIVyBvZmZsb2FkXCYjMzQ7XG5uZXQvdGxzL0tjb25maWc6MjE6XHRkZXBlbmRzIG9uIFRMU1xubmV0L3Rscy9LY29uZmlnLTIyLVx0c2VsZWN0IFNLQl9ERUNSWVBURURcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjkxNAoJCQkJCQkJb3V0cHV0OiAxNjMKCQkJCQkJCXRob3VnaHRzOiAxMzUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgVExTIFN0cmVhbSBQYXJzZXIgUGF0Y2gqKgoKT2theSwgc28gdGhlIGdpc3Qgb2YgaXQgaXMgdGhpczogYElORVRgIGlzIHRoZSBnby10bywgYW5kIGBUTFNgIGlzIGdvb2QgZW5vdWdoIGZvciB3aGF0IHdlJiMzOTtyZSBkb2luZy4gTGV0IG1lIGJyZWFrIGRvd24gdGhlIHRoaW5raW5nIGhlcmUuCgpUaGlzIHBhdGNoLCBpdCYjMzk7cyBtZXNzaW5nIHdpdGggdGhlIFRMUyBzdHJlYW0gcGFyc2VyLCBzcGVjaWZpY2FsbHkgdGhvc2UgYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgZnVuY3Rpb25zLiBJdCYjMzk7cyBhYm91dCBtYWtpbmcgc3VyZSB0aGUgY29kZSAqYWN0dWFsbHkqIGNoZWNrcyBpZiB0aGVyZSYjMzk7cyBlbm91Z2ggZGF0YSBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBiZWZvcmUgdHJ5aW5nIHRvIHBhcnNlIHRoZSBUTFMgaGVhZGVyLiBUaGF0JiMzOTtzIGNyaXRpY2FsIG5ldHdvcmsgcmVjZWl2ZSBsb2dpYywgdGhlIGJyZWFkIGFuZCBidXR0ZXIgb2YgVExTIHNvY2tldHMsIGFuZCBpdCYjMzk7cyBzb21ldGhpbmcgdXNlcnNwYWNlIGNhbiBwb2tlIGF0IHdpdGggYHJlY3Ztc2dgIG9uIHRob3NlIFRMUyBzb2NrZXRzLiBUaGlzIGlzICpwcmltZSogZnV6emluZyBtYXRlcmlhbCwgbm8gcXVlc3Rpb24uIFdlIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlIHBhcnNlciBncmFjZWZ1bGx5IGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3Jkcy4gTm8gbWVtb3J5IGNvcnJ1cHRpb24sIG5vIHN0YWxscyDigJMgdGhhdCYjMzk7cyB0aGUgbmFtZSBvZiB0aGUgZ2FtZS4gV2UgYXJlIGdvaW5nIHRvIG5lZWQgdG8gcHJvdmlkZSB0aGVzZSByZXN1bHRzIHdpdGggYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RMUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3Rsc19zdHJwX2NoZWNrX3JjdiYjMzQ7LAogICAgJiMzNDt0bHNfc3dfcmVjdm1zZyYjMzQ7LAogICAgJiMzNDt0bHNfc3RycF9kYXRhX3JlYWR5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RMUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3Rsc19zdHJwX2NoZWNrX3JjdiYjMzQ7LAogICAgJiMzNDt0bHNfc3dfcmVjdm1zZyYjMzQ7LAogICAgJiMzNDt0bHNfc3RycF9kYXRhX3JlYWR5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjI5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjNtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6Mjk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXG5cbkJ5IGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKClgIGJlZm9yZSByZWFkaW5nIHRoZSBoZWFkZXIsIHRoZSBjb2RlIGRldGVjdHMgb3ZlcmxhcHBpbmcgc2VnbWVudHMgb3IgbWl4ZWQgZGVjcnlwdGVkIHN0YXR1cyBhbmQgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5KClgLiBUaGlzIGZhbGxiYWNrIHVzZXMgYHRjcF9yZWFkX3NvY2soKWAgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgb3ZlcmxhcHMgYW5kIGNvcHkgdGhlIGxvZ2ljYWwgc3RyZWFtIGludG8gYSBsaW5lYXIgYnVmZmVyLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGE2YjA1YjdlMzU3ZDEzYjU5N2VmOGNiMjI2ZjRmYWI0MGZlM2I5MjAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIEF1ZyA3IDIwOjI5OjI3IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbmV0L3Rscy90bHNfc3RycC5jIGIvbmV0L3Rscy90bHNfc3RycC5jCmluZGV4IDYxYjEwYzY5N2VjY2IuLjY0ZDVkZWE5MDU0MDMgMTAwNjQ0Ci0tLSBhL25ldC90bHMvdGxzX3N0cnAuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvdGxzL3Rsc19zdHJwLmMKQEAgLTQzMCw5ICYjNDM7NDMwLDkgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCkKJiM0MztzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JdW5zaWduZWQgaW50IGxlbiA9IHN0cnAtJmd0O3N0bS5vZmZzZXQgJiM0Mzsgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuOwogCXN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjsKIAl1MzIgc2VxOwogCkBAIC01MjUsNiAmIzQzOzUyNSwxMiBAQCBzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCkKIAogCXRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTsKIAlpZiAoIXN0cnAtJmd0O3N0bS5mdWxsX2xlbikgewomIzQzOwkJaWYgKGlucSAmbHQ7IFRMU19IRUFERVJfU0laRSkKJiM0MzsJCQlyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpOwomIzQzOwomIzQzOwkJaWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpCiYjNDM7CQkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CiYjNDM7CiAJCXN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtJmd0O2FuY2hvcik7CiAJCWlmIChzeiAmbHQ7IDApCiAJCQlyZXR1cm4gc3o7CkBAIC01MzUsNyAmIzQzOzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKQogCQkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTsKIAl9CiAKLQlpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKQomIzQzOwlpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtJmd0O3N0bS5vZmZzZXQgJiM0Mzsgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuKSkKIAkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CiAKIAlXUklURV9PTkNFKHN0cnAtJmd0O21zZ19yZWFkeSwgMSk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzY3CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMjQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgVExTIFN0cmVhbSBQcm9jZXNzaW5nIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgYWltZWQgYXQgaW1wcm92aW5nIHRoZSBoYW5kbGluZyBvZiBUTFMgc3RyZWFtIHByb2Nlc3NpbmcsIHNwZWNpZmljYWxseSBhcm91bmQgaG93IHRoZSBpbnB1dCBxdWV1ZSBpcyB2YWxpZGF0ZWQgYW5kIHJlYWQuIFRoZSBrZXkgY2hhbmdlIGlzIHRoYXQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBub3cgYWNjZXB0cyBhbiBleHBsaWNpdCBsZW5ndGggYXJndW1lbnQgKGBsZW5gKSBpbnN0ZWFkIG9mIHJlY2FsY3VsYXRpbmcgaXQgZnJvbSBgc3RycC0mZ3Q7c3RtLm9mZnNldGAgYW5kIGBzdHJwLSZndDtzdG0uZnVsbF9sZW5gLiBUaGlzIGlzIGEgc3VidGxlIGJ1dCBpbXBvcnRhbnQgc2hpZnQg4oCTIGl0IGFsbG93cyBmb3IgbW9yZSBmbGV4aWJpbGl0eSBhbmQgcG90ZW50aWFsbHkgYXZvaWRzIHJlZHVuZGFudCBjYWxjdWxhdGlvbnMgb3IgcG9zc2libGUgb2ZmLWJ5LW9uZSBlcnJvcnMgdGhhdCBtaWdodCBhcmlzZSBmcm9tIHRoZSBpbXBsaWNpdCBjYWxjdWxhdGlvbi4KClRoZSBvdGhlciBwb2ludCBvZiBpbnRlcmVzdCBpcyB0aGUgYWRkZWQgY2hlY2sgd2l0aGluIGB0bHNfc3RycF9yZWFkX3NvY2tgLiBUaGUgY29kZSBub3cgZXhwbGljaXRseSBhZGRyZXNzZXMgdGhlIGNhc2Ugd2hlcmUgYHN0cnAtJmd0O3N0bS5mdWxsX2xlbmAgaXMgemVyby4gV2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5LCBpdCBmaXJzdCBsb2FkcyBhbiBhbmNob3IgZnJvbSB0aGUgcXVldWUuIFRoZW4sIHRoZSBwYXRjaCBpbnNlcnRzIGFkZGl0aW9uYWwgY29uZGl0aW9uYWwgbG9naWM6CgoxLiAgSWYgdGhlIGlucHV0IHF1ZXVlIHNpemUgKGBpbnFgKSBpcyBzbWFsbGVyIHRoYW4gYFRMU19IRUFERVJfU0laRWAsIGl0IGNhbGxzIGB0bHNfc3RycF9yZWFkX2NvcHlgLCB3aGljaCBJIGluZmVyIG1pZ2h0IGhhbmRsZSBhIHNob3J0IHJlYWQgb3IgYSBzcGVjaWFsIGluaXRpYWxpemF0aW9uLgoyLiAgSWYgdGhlIHNpemUgaXMgc3VmZmljaWVudCAoYGlucWAgJmd0Oz0gYFRMU19IRUFERVJfU0laRWApIGl0IHRoZW4gY2FsbHMgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aXRoIGEgc2l6ZSBvZiBgc3RycC0mZ3Q7c3RtLm9mZnNldCAmIzQzOyBUTFNfSEVBREVSX1NJWkVgLiBUaGlzIHNpemUgaXMgbW9zdCBsaWtlbHkgY2hlY2tpbmcgaWYgdGhlIFRMUyBoZWFkZXIgaXMgdmFsaWQgd2l0aGluIHRoZSBxdWV1ZS4gSWYgaXQgKmlzbiYjMzk7dCogb2theSwgaXQgY2FsbHMgYHRsc19zdHJwX3JlYWRfY29weWAgYWdhaW4sIHRoaXMgdGltZSB3aXRoIGEgYGZhbHNlYCBhcmd1bWVudC4KCkkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgZXhhY3RseSBgdGxzX3N0cnBfcmVhZF9jb3B5YCBkb2VzIGluIHRob3NlIGNhc2VzLiBUaGUgYHRydWVgIGFuZCBgZmFsc2VgIGFyZ3VtZW50cyBzdWdnZXN0IGRpZmZlcmVudCBiZWhhdmlvcnMsIGFuZCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRob3NlIGRpZmZlcmVuY2VzIGFyZSwgd2hpY2ggd2lsbCBwcm9iYWJseSB0ZWxsIG1lIHdoYXQmIzM5O3MgZ29pbmcgb24gaGVyZS4gVGhlIGNhbGwgdG8gYHRsc19yeF9tc2dfc2l6ZWAgYWZ0ZXIgdGhlc2UgY2hlY2tzIGltcGxpZXMgdGhhdCB0aGUgY29kZSBpcyBhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgaW5jb21pbmcgVExTIG1lc3NhZ2UuCgpVbHRpbWF0ZWx5LCB0aGUgZ29hbCBpcyB0byBtYWtlIHN1cmUgdGhhdCB3aGF0ZXZlciYjMzk7cyBpbiB0aGUgaW5wdXQgcXVldWUgaXMgdmFsaWQgYW5kIHNhZmUgdG8gcHJvY2VzcywgZXNwZWNpYWxseSB3aGVuIHRoZSBzdHJlYW0gbGVuZ3RoIGlzbiYjMzk7dCBpbW1lZGlhdGVseSBrbm93bi4gVGhlIGV4cGxpY2l0IGxlbmd0aCBhcmd1bWVudCB0byBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHN1Z2dlc3RzIGEgZGVzaXJlIGZvciBncmVhdGVyIHByZWNpc2lvbiBhbmQgcG90ZW50aWFsbHkgbW9yZSBlZmZpY2llbnQgdmFsaWRhdGlvbi4gSSBzaG91bGQgZGVsdmUgaW50byB0aGUgaW1wbGVtZW50YXRpb24gb2YgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjaGFuZ2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Rsc19zdHJwX2NoZWNrX3F1ZXVlX29rJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3RycC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYz0zOTA9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy00MzItXG5uZXQvdGxzL3Rsc19zdHJwLmM6NDMzOnN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxubmV0L3Rscy90bHNfc3RycC5jLTQzNC1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTUzMC1cbm5ldC90bHMvdGxzX3N0cnAuYzo1MzE6XHRcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTMyLVx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01NDMtXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTQ0Olx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0Mzsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxubmV0L3Rscy90bHNfc3RycC5jLTU0NS1cdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM1MzMKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aG9zZSBmdW5jdGlvbnMsIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgYW5kIGB0bHNfc3RycF9yZWFkX3NvY2tgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgcXVldWUgYW5kIHNvY2tldCBoYW5kbGluZyBoZXJlLCBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIHRoZSBvdmVyYWxsIFRMUy9TUlAgcHJvY2Vzcy4KCioqRGl2aW5nIGludG8gUXVldWUgYW5kIFNvY2tldCBJbnRlZ3JpdHkqKgoKSSYjMzk7bSBpbW1lZGlhdGVseSBmb2N1c2luZyBvbiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gbGlrZWx5IGV4YW1pbmVzIHRoZSBzdGF0ZSBvZiBhIHF1ZXVlLCBwcmVzdW1hYmx5IHJlbGF0ZWQgdG8gZGF0YSBjb21pbmcgaW4gb3IgZ29pbmcgb3V0IG9mIHRoZSBUTFMvU1JQIGNvbW11bmljYXRpb24uIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgY29uc3RpdHV0ZXMgYW4gJiMzNDtvayYjMzQ7IHN0YXRlLiBJcyBpdCBjaGVja2luZyBmb3Igb3ZlcmZsb3c/IFVuZGVyZmxvdz8gU3BlY2lmaWMgZmxhZ3M/IEFyZSB3ZSB0YWxraW5nIGFib3V0IGEgc2ltcGxlIEZJRk8gcXVldWUsIG9yIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/IFRoZSAmIzM0O29rJiMzNDsgY29uZGl0aW9uIHdpbGwgYmUga2V5IHRvIHVuZGVyc3RhbmRpbmcgdGhlIGVycm9yIGhhbmRsaW5nIG9yIGZsb3cgY29udHJvbCBtZWNoYW5pc21zIGluIHBsYWNlLiBUaGUgbmFtaW5nIGNvbnZlbnRpb24gc3VnZ2VzdHMgaXQgbWlnaHQgYmUgc3BlY2lmaWMgdG8gU2VjdXJlIFJlbW90ZSBQYXNzd29yZC4KCk5leHQsIGB0bHNfc3RycF9yZWFkX3NvY2tgLiBUaGUgYHJlYWRfc29ja2AgcGFydCBpcyBzdHJhaWdodGZvcndhcmQg4oCTIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgZGF0YSBmcm9tIHRoZSBzb2NrZXQuIEhvd2V2ZXIsIHRoZSAmIzM0O1NSUCYjMzQ7IHByZWZpeCBzdWdnZXN0cyBhIHZlcnkgc3BlY2lmaWMsIGFuZCBwcm9iYWJseSBzZWN1cml0eS1zZW5zaXRpdmUsIG9wZXJhdGlvbi4gSSYjMzk7bSBndWVzc2luZyB0aGF0IHRoaXMgaXMgcmVsYXRlZCB0byByZWNlaXZpbmcgU1JQIGNoYWxsZW5nZSByZXNwb25zZXMsIHZlcmlmaWNhdGlvbiBkYXRhLCBvciBwZXJoYXBzIGV2ZW4gdGhlIFRMUyBoYW5kc2hha2UgaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGxhcmdlciBUTFMvU1JQIHN0YXRlIG1hY2hpbmUuIElzIGl0IGJsb2NraW5nLCBub24tYmxvY2tpbmcsIG9yIHVzaW5nIHNlbGVjdC9wb2xsPyBBcmUgdGhlcmUgc3BlY2lmaWMgZXJyb3IgY29kZXMgdG8gaGFuZGxlPyBXaGF0IGhhcHBlbnMgb24gcGFydGlhbCByZWFkcz8gV2hhdCBzZWN1cml0eSBjaGVja3MgYXJlIGhhcHBlbmluZyBoZXJlPwoKTXkgcHJpbWFyeSBjb25jZXJuIHdpdGggdGhlc2UgdHdvIGZ1bmN0aW9ucyB3aWxsIGJlIHVuZGVyc3RhbmRpbmcgdGhlaXIgaW50ZXJwbGF5LiBIb3cgZG9lcyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGluZmx1ZW5jZSB0aGUgYmVoYXZpb3Igb2YgYHRsc19zdHJwX3JlYWRfc29ja2A/IERvZXMgdGhlIHF1ZXVlIGNoZWNrIGdhdGUgdGhlIHJlYWQ/IERvZXMgdGhlIHF1ZXVlIHJlcHJlc2VudCBhIGJ1ZmZlciBmb3IgZGF0YSByZWNlaXZlZCBieSB0aGUgc29ja2V0PyBUaGUgcmVsYXRpb25zaGlwcyBhcmUga2V5LiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSB0cmFjZSB0aGUgZGF0YSBmbG93IGFuZCBwb3RlbnRpYWwgZXJyb3IgY29uZGl0aW9ucyBpbiB0aGUgc3lzdGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQzMDpcdFx0cmV0dXJuIDA7XG4gNDMxOlx0fVxuIDQzMjpcdFxuIDQzMzpcdHN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxuIDQzNDpcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBsZW4pXG4gNDM1Olx0e1xuIDQzNjpcdFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0LCAqc2tiO1xuIDQzNzpcdFx0dTMyIHNlcTtcbiA0Mzg6XHRcbiA0Mzk6XHRcdGZpcnN0ID0gc2tiX3NoaW5mbyhzdHJwLVx1MDAzZWFuY2hvciktXHUwMDNlZnJhZ19saXN0O1xuIDQ0MDpcdFx0c2tiID0gZmlyc3Q7XG4gNDQxOlx0XHRzZXEgPSBUQ1BfU0tCX0NCKGZpcnN0KS1cdTAwM2VzZXE7XG4gNDQyOlx0XG4gNDQzOlx0XHQvKiBNYWtlIHN1cmUgdGhlcmUmIzM5O3Mgbm8gZHVwbGljYXRlIGRhdGEgaW4gdGhlIHF1ZXVlLFxuIDQ0NDpcdFx0ICogYW5kIHRoZSBkZWNyeXB0ZWQgc3RhdHVzIG1hdGNoZXMuXG4gNDQ1Olx0XHQgKi9cbiA0NDY6XHRcdHdoaWxlIChza2ItXHUwMDNlbGVuIFx1MDAzYyBsZW4pIHtcbiA0NDc6XHRcdFx0c2VxICYjNDM7PSBza2ItXHUwMDNlbGVuO1xuIDQ0ODpcdFx0XHRsZW4gLT0gc2tiLVx1MDAzZWxlbjtcbiA0NDk6XHRcdFx0c2tiID0gc2tiLVx1MDAzZW5leHQ7XG4gNDUwOlx0XG4gNDUxOlx0XHRcdGlmIChUQ1BfU0tCX0NCKHNrYiktXHUwMDNlc2VxICE9IHNlcSlcbiA0NTI6XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gNDUzOlx0XHRcdGlmIChza2JfY21wX2RlY3J5cHRlZChmaXJzdCwgc2tiKSlcbiA0NTQ6XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gNDU1Olx0XHR9XG4gNDU2Olx0XG4gNDU3Olx0XHRyZXR1cm4gdHJ1ZTtcbiA0NTg6XHR9XG4gNDU5Olx0XG4gNDYwOlx0c3RhdGljIHZvaWQgdGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgaW50IGxlbilcbiA0NjE6XHR7XG4gNDYyOlx0XHRzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHN0cnAtXHUwMDNlc2spO1xuIDQ2MzpcdFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0O1xuIDQ2NDpcdFx0dTMyIG9mZnNldDtcbiA0NjU6XHRcbiA0NjY6XHRcdGZpcnN0ID0gdGNwX3JlY3Zfc2tiKHN0cnAtXHUwMDNlc2ssIHRwLVx1MDAzZWNvcGllZF9zZXEsIFx1MDAyNm9mZnNldCk7XG4gNDY3Olx0XHRpZiAoV0FSTl9PTl9PTkNFKCFmaXJzdCkpXG4gNDY4Olx0XHRcdHJldHVybjtcbiA0Njk6XHRcbiA0NzA6XHRcdC8qIEJlc3RvdyB0aGUgc3RhdGUgb250byB0aGUgYW5jaG9yICovXG4gNDcxOlx0XHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2VsZW4gPSBvZmZzZXQgJiM0MzsgbGVuO1xuIDQ3MjpcdFx0c3RycC1cdTAwM2VhbmNob3ItXHUwMDNlZGF0YV9sZW4gPSBvZmZzZXQgJiM0MzsgbGVuO1xuIDQ3MzpcdFx0c3RycC1cdTAwM2VhbmNob3ItXHUwMDNldHJ1ZXNpemUgPSBvZmZzZXQgJiM0MzsgbGVuO1xuIDQ3NDpcdFxuIDQ3NTpcdFx0c2tiX3NoaW5mbyhzdHJwLVx1MDAzZWFuY2hvciktXHUwMDNlZnJhZ19saXN0ID0gZmlyc3Q7XG4gNDc2Olx0XG4gNDc3Olx0XHRza2JfY29weV9oZWFkZXIoc3RycC1cdTAwM2VhbmNob3IsIGZpcnN0KTtcbiA0Nzg6XHRcdHN0cnAtXHUwMDNlYW5jaG9yLVx1MDAzZWRlc3RydWN0b3IgPSBOVUxMO1xuIDQ3OTpcdFxuIDQ4MDpcdFx0c3RycC1cdTAwM2VzdG0ub2Zmc2V0ID0gb2Zmc2V0O1xuIDQ4MTpcdH1cbiA0ODI6XHRcbiA0ODM6XHRib29sIHRsc19zdHJwX21zZ19sb2FkKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGZvcmNlX3JlZnJlc2gpXG4gNDg0Olx0e1xuIDQ4NTpcdFx0c3RydWN0IHN0cnBfbXNnICpyeG07XG4gNDg2Olx0XHRzdHJ1Y3QgdGxzX21zZyAqdGxtO1xuIDQ4NzpcdFxuIDQ4ODpcdFx0REVCVUdfTkVUX1dBUk5fT05fT05DRSghc3RycC1cdTAwM2Vtc2dfcmVhZHkpO1xuIDQ4OTpcdFx0REVCVUdfTkVUX1dBUk5fT05fT05DRSghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pO1xuIDQ5MDpcdFxuIDQ5MTpcdFx0aWYgKCFzdHJwLVx1MDAzZWNvcHlfbW9kZSBcdTAwMjZcdTAwMjYgZm9yY2VfcmVmcmVzaCkge1xuIDQ5MjpcdFx0XHRpZiAodW5saWtlbHkodGNwX2lucShzdHJwLVx1MDAzZXNrKSBcdTAwM2Mgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKSB7XG4gNDkzOlx0XHRcdFx0V1JJVEVfT05DRShzdHJwLVx1MDAzZW1zZ19yZWFkeSwgMCk7XG4gNDk0Olx0XHRcdFx0c3RycC1cdTAwM2Vtc2dfYW5ub3VuY2VkID0gMDtcbiA0OTU6XHRcdFx0XHRtZW1zZXQoXHUwMDI2c3RycC1cdTAwM2VzdG0sIDAsIHNpemVvZihzdHJwLVx1MDAzZXN0bSkpO1xuIDQ5NjpcdFx0XHRcdHJldHVybiBmYWxzZTtcbiA0OTc6XHRcdFx0fVxuIDQ5ODpcdFxuIDQ5OTpcdFx0XHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKTtcbiA1MDA6XHRcdH1cbiA1MDE6XHRcbiA1MDI6XHRcdHJ4bSA9IHN0cnBfbXNnKHN0cnAtXHUwMDNlYW5jaG9yKTtcbiA1MDM6XHRcdHJ4bS1cdTAwM2VmdWxsX2xlblx0PSBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbjtcbiA1MDQ6XHRcdHJ4bS1cdTAwM2VvZmZzZXRcdD0gc3RycC1cdTAwM2VzdG0ub2Zmc2V0O1xuIDUwNTpcdFx0dGxtID0gdGxzX21zZyhzdHJwLVx1MDAzZWFuY2hvcik7XG4gNTA2Olx0XHR0bG0tXHUwMDNlY29udHJvbFx0PSBzdHJwLVx1MDAzZW1hcms7XG4gNTA3Olx0XG4gNTA4Olx0XHRyZXR1cm4gdHJ1ZTtcbiA1MDk6XHR9XG4gNTEwOlx0XG4gNTExOlx0LyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIG9uIGxvd2VyIHNvY2tldCAqL1xuIDUxMjpcdHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIDUxMzpcdHtcbiA1MTQ6XHRcdGludCBzeiwgaW5xO1xuIDUxNTpcdFxuIDUxNjpcdFx0aW5xID0gdGNwX2lucShzdHJwLVx1MDAzZXNrKTtcbiA1MTc6XHRcdGlmIChpbnEgXHUwMDNjIDEpXG4gNTE4Olx0XHRcdHJldHVybiAwO1xuIDUxOTpcdFxuIDUyMDpcdFx0aWYgKHVubGlrZWx5KHN0cnAtXHUwMDNlY29weV9tb2RlKSlcbiA1MjE6XHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weWluKHN0cnApO1xuIDUyMjpcdFxuIDUyMzpcdFx0aWYgKGlucSBcdTAwM2Mgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pXG4gNTI0Olx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gNTI1Olx0XG4gNTI2Olx0XHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XG4gNTI3Olx0XHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG4gNTI4Olx0XHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbiA1Mjk6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NTI0CgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93biwgYXNzdW1pbmcgSSYjMzk7bSBhbiBleHBlcnQgaW4gdGhpcyBmaWVsZDoKCioqRGl2aW5nIGludG8gYHRsc19zdHJwX3JlYWRfc29ja2AqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCBkaWcgaW50byB0aGUgcmVzdCBvZiB0aGlzIGB0bHNfc3RycF9yZWFkX3NvY2tgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29tcGxldGUgb3BlcmF0aW9uYWwgY29udGV4dC4gVGhpcyBpbml0aWFsIHNlY3Rpb24gcHJvdmlkZWQgYSBrZXksIGJ1dCBJIG5lZWQgdG8gc2VlIHRoZSBlbnRpcmUgdGhpbmcuIFRoZSBoZWFkZXIgdGVsbHMgbWUgd2hlcmUgd2UgYXJlLCBidXQgSSBuZWVkIHRoZSBmdWxsIHBpY3R1cmUgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IGRvaW5nLCBob3cgaXQgaGFuZGxlcyBlcnJvcnMsIGFuZCB0aGUgbG9naWMgZmxvdy4gTGV0JiMzOTtzIHNlZSBob3cgdGhlIHJlc3Qgb2YgaXQgaGFuZGxlcyBpdHMgY29yZSByZXNwb25zaWJpbGl0aWVzLiBUaGlzIHdpbGwgY2xhcmlmeSB0aGUgYWN0dWFsIG1lY2hhbmlzbXMgZm9yIGhhbmRsaW5nIHRoZSBzb2NrZXQgcmVhZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1MjU6XHRcbiA1MjY6XHRcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcbiA1Mjc6XHRcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pIHtcbiA1Mjg6XHRcdFx0aWYgKGlucSBcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxuIDUyOTpcdFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gNTMwOlx0XG4gNTMxOlx0XHRcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpXG4gNTMyOlx0XHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4gNTMzOlx0XG4gNTM0Olx0XHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXHUwMDNlYW5jaG9yKTtcbiA1MzU6XHRcdFx0aWYgKHN6IFx1MDAzYyAwKVxuIDUzNjpcdFx0XHRcdHJldHVybiBzejtcbiA1Mzc6XHRcbiA1Mzg6XHRcdFx0c3RycC1cdTAwM2VzdG0uZnVsbF9sZW4gPSBzejtcbiA1Mzk6XHRcbiA1NDA6XHRcdFx0aWYgKCFzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiB8fCBpbnEgXHUwMDNjIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKVxuIDU0MTpcdFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gNTQyOlx0XHR9XG4gNTQzOlx0XG4gNTQ0Olx0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbikpXG4gNTQ1Olx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuIDU0NjpcdFxuIDU0NzpcdFx0V1JJVEVfT05DRShzdHJwLVx1MDAzZW1zZ19yZWFkeSwgMSk7XG4gNTQ4Olx0XG4gNTQ5Olx0XHRyZXR1cm4gMDtcbiA1NTA6XHR9XG4gNTUxOlx0XG4gNTUyOlx0LyogUGFyc2UgcXVldWVkIGRhdGEuIFdoZW4gQGFubm91bmNlIGlzIHRydWUgYW5kIHBhcnNpbmcgcHJvZHVjZXMgYVxuIDU1MzpcdCAqIG5ld2x5LXJlYWR5IHJlY29yZCwgZmlyZSB0aGUgY29uc3VtZXIgbm90aWZpY2F0aW9uLiBDYWxsZXJzIHRoYXRcbiA1NTQ6XHQgKiBuZWVkIHRvIG5vdGlmeSBhIHdhaXRlciBhYm91dCBhIHJlY29yZCBwYXJzZWQgYnkgYW5vdGhlciBwYXRoXG4gNTU1Olx0ICogc2hvdWxkIGludm9rZSB0bHNfcnhfbXNnX21heWJlX2Fubm91bmNlKCkgZGlyZWN0bHkuXG4gNTU2Olx0ICovXG4gNTU3Olx0dm9pZCB0bHNfc3RycF9jaGVja19yY3Yoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgYW5ub3VuY2UpXG4gNTU4Olx0e1xuIDU1OTpcdFx0aWYgKHVubGlrZWx5KHN0cnAtXHUwMDNlc3RvcHBlZCkgfHwgc3RycC1cdTAwM2Vtc2dfcmVhZHkpXG4gNTYwOlx0XHRcdHJldHVybjtcbiA1NjE6XHRcbiA1NjI6XHRcdGlmICh0bHNfc3RycF9yZWFkX3NvY2soc3RycCkgPT0gLUVOT01FTSlcbiA1NjM6XHRcdFx0cXVldWVfd29yayh0bHNfc3RycF93cSwgXHUwMDI2c3RycC1cdTAwM2V3b3JrKTtcbiA1NjQ6XHRcdGVsc2UgaWYgKGFubm91bmNlIFx1MDAyNlx1MDAyNiBzdHJwLVx1MDAzZW1zZ19yZWFkeSlcbiA1NjU6XHRcdFx0dGxzX3J4X21zZ19tYXliZV9hbm5vdW5jZShzdHJwKTtcbiA1NjY6XHR9XG4gNTY3Olx0XG4gNTY4Olx0LyogTG93ZXIgc29jayBsb2NrIGhlbGQgKi9cbiA1Njk6XHR2b2lkIHRsc19zdHJwX2RhdGFfcmVhZHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gNTcwOlx0e1xuIDU3MTpcdFx0LyogVGhpcyBjaGVjayBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUgd2l0aCBkb190bHNfc3RycF93b3JrLlxuIDU3MjpcdFx0ICogZG9fdGxzX3N0cnBfd29yayBhY3F1aXJlcyBhIHByb2Nlc3MgbG9jayAobG9ja19zb2NrKSB3aGVyZWFzXG4gNTczOlx0XHQgKiB0aGUgbG9jayBoZWxkIGhlcmUgaXMgYmhfbG9ja19zb2NrLiBUaGUgdHdvIGxvY2tzIGNhbiBiZVxuIDU3NDpcdFx0ICogaGVsZCBieSBkaWZmZXJlbnQgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLCBidXQgYmhfbG9ja19zb2NrXG4gNTc1Olx0XHQgKiBhbGxvd3MgYSB0aHJlYWQgaW4gQkggY29udGV4dCB0byBzYWZlbHkgY2hlY2sgaWYgdGhlIHByb2Nlc3NcbiA1NzY6XHRcdCAqIGxvY2sgaXMgaGVsZC4gSW4gdGhpcyBjYXNlLCBpZiB0aGUgbG9jayBpcyBoZWxkLCBxdWV1ZSB3b3JrLlxuIDU3NzpcdFx0ICovXG4gNTc4Olx0XHRpZiAoc29ja19vd25lZF9ieV91c2VyX25vY2hlY2soc3RycC1cdTAwM2VzaykpIHtcbiA1Nzk6XHRcdFx0cXVldWVfd29yayh0bHNfc3RycF93cSwgXHUwMDI2c3RycC1cdTAwM2V3b3JrKTtcbiA1ODA6XHRcdFx0cmV0dXJuO1xuIDU4MTpcdFx0fVxuIDU4MjpcdFxuIDU4MzpcdFx0dGxzX3N0cnBfY2hlY2tfcmN2KHN0cnAsIHRydWUpO1xuIDU4NDpcdH1cbiA1ODU6XHRcbiA1ODY6XHRzdGF0aWMgdm9pZCB0bHNfc3RycF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdylcbiA1ODc6XHR7XG4gNTg4Olx0XHRzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCA9XG4gNTg5Olx0XHRcdGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgdGxzX3N0cnBhcnNlciwgd29yayk7XG4gNTkwOlx0XG4gNTkxOlx0XHRsb2NrX3NvY2soc3RycC1cdTAwM2Vzayk7XG4gNTkyOlx0XHR0bHNfc3RycF9jaGVja19yY3Yoc3RycCwgdHJ1ZSk7XG4gNTkzOlx0XHRyZWxlYXNlX3NvY2soc3RycC1cdTAwM2Vzayk7XG4gNTk0Olx0fVxuIDU5NTpcdFxuIDU5NjpcdC8qIFJlbGVhc2UgdGhlIGN1cnJlbnQgcmVjb3JkIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGNoZWNrIGZvciB0aGVcbiA1OTc6XHQgKiBuZXh0IHJlY29yZC4gQ2FsbGVycyBtdXN0IGludm9rZSB0bHNfc3RycF9jaGVja19yY3YoKSBiZWZvcmVcbiA1OTg6XHQgKiByZWxlYXNpbmcgdGhlIHNvY2tldCBsb2NrLCBvciBxdWV1ZWQgZGF0YSB3aWxsIHN0YWxsIHVudGlsIHRoZVxuIDU5OTpcdCAqIG5leHQgdGxzX3N0cnBfZGF0YV9yZWFkeSgpIGV2ZW50LlxuIDYwMDpcdCAqL1xuIDYwMTpcdHZvaWQgdGxzX3N0cnBfbXNnX2NvbnN1bWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gNjAyOlx0e1xuIDYwMzpcdFx0V0FSTl9PTighc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pO1xuIDYwNDpcdFxuIDYwNTpcdFx0aWYgKGxpa2VseSghc3RycC1cdTAwM2Vjb3B5X21vZGUpKVxuIDYwNjpcdFx0XHR0Y3BfcmVhZF9kb25lKHN0cnAtXHUwMDNlc2ssIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKTtcbiA2MDc6XHRcdGVsc2VcbiA2MDg6XHRcdFx0dGxzX3N0cnBfZmx1c2hfYW5jaG9yX2NvcHkoc3RycCk7XG4gNjA5Olx0XG4gNjEwOlx0XHRXUklURV9PTkNFKHN0cnAtXHUwMDNlbXNnX3JlYWR5LCAwKTtcbiA2MTE6XHRcdHN0cnAtXHUwMDNlbXNnX2Fubm91bmNlZCA9IDA7XG4gNjEyOlx0XHRtZW1zZXQoXHUwMDI2c3RycC1cdTAwM2VzdG0sIDAsIHNpemVvZihzdHJwLVx1MDAzZXN0bSkpO1xuIDYxMzpcdH1cbiA2MTQ6XHRcbiA2MTU6XHR2b2lkIHRsc19zdHJwX3N0b3Aoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gNjE2Olx0e1xuIDYxNzpcdFx0c3RycC1cdTAwM2VzdG9wcGVkID0gMTtcbiA2MTg6XHR9XG4gNjE5Olx0XG4gNjIwOlx0aW50IHRsc19zdHJwX2luaXQoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBzb2NrICpzaylcbiA2MjE6XHR7XG4gNjIyOlx0XHRtZW1zZXQoc3RycCwgMCwgc2l6ZW9mKCpzdHJwKSk7XG4gNjIzOlx0XG4gNjI0Olx0XHRzdHJwLVx1MDAzZXNrID0gc2s7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDczNzIKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAyMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUTFMgU3RyZWFtIFByb2Nlc3NpbmcgUGF0Y2gqKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyBhaW1lZCBhdCBpbXByb3ZpbmcgaG93IHdlIGhhbmRsZSB0aGUgVExTIHN0cmVhbSBwcm9jZXNzaW5nLiBUaGUgY29yZSBvZiB0aGUgY2hhbmdlIHJldm9sdmVzIGFyb3VuZCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiAgSSBzZWUgaXQmIzM5O3Mgbm93IHRha2luZyBhbiBleHBsaWNpdCBgbGVuYCBhcmd1bWVudCwgd2hpY2ggaXMgYSBnb29kIHByYWN0aWNlIGZvciBjbGFyaXR5LiBUaGUgaW50ZW50IGhlcmUgaXMgY2xlYXIsIHdl4oCZcmUgYWRkaW5nIGEgcHJvYWN0aXZlIGNoZWNrIGluIGB0bHNfc3RycF9yZWFkX3NvY2tgIHRvIGVuc3VyZSB0aGF0IHRoZSByZWNlaXZlIHF1ZXVlIGlzIHZhbGlkICpiZWZvcmUqIHdlIGV2ZW4gY2FsbCBgdGxzX3J4X21zZ19zaXplYC4gIFRoYXQgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2U7IHByZS1lbXB0aXZlbHkgdmFsaWRhdGluZyBiZWZvcmUgcG90ZW50aWFsbHkgY29zdGx5IG9wZXJhdGlvbnMgaXMgYSBzb2xpZCBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcgYXBwcm9hY2guCgpJJiMzOTttIGFzc3VtaW5nIGB0bHNfcnhfbXNnX3NpemVgIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNpcGhlcmluZyB0aGUgVExTIGhlYWRlciB0byBkZXRlcm1pbmUgdGhlIHN1YnNlcXVlbnQgbWVzc2FnZSBzaXplLiBUaGF0JiMzOTtzIGEgcmVhc29uYWJsZSBhc3N1bXB0aW9uLCBnaXZlbiBpdHMgbmFtZS4gVGhlIHBhdGNoIGhpZ2hsaWdodHMgdGhhdCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHdpbGwgcmV0dXJuIGZhbHNlIGlmIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYSBtZXNzZWQtdXAgcXVldWUg4oCTIG1lYW5pbmcgbWl4ZWQgZGVjcnlwdGVkIGFuZCB1bi1kZWNyeXB0ZWQgZGF0YSwgb3IgcGVyaGFwcyBvdXQtb2Ytb3JkZXIgZGF0YSBzZWdtZW50cy4gIFRoZSBjcnVjaWFsIHBhcnQgaXMgdGhlIGZhbGxiYWNrIG1lY2hhbmlzbTogaWYgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBmYWlscywgaXQgZmFsbHMgYmFjayB0byB1c2luZyBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gIFRoaXMgaXMgYSBkZWZpbml0ZSBidWcgZml4LCBwcm90ZWN0aW5nIGFnYWluc3Qgc2l0dWF0aW9ucyB3aGVyZSBgdGxzX3J4X21zZ19zaXplYCBtaWdodCBiZSBnaXZlbiBhbiBpbnZhbGlkIG9yIGluY29uc2lzdGVudCBTS0IsIHdoaWNoIGlzIGNydWNpYWwgZm9yIHByZXZlbnRpbmcgY3Jhc2hlcyBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuCgpXYWl0IGEgc2Vjb25k4oCmIEkgbmVlZCB0byBjbGFyaWZ5IHNvbWV0aGluZy4gIGB0bHNfcnhfbXNnX3NpemVgIGRvZXNuJiMzOTt0IGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgc29ja2V0IGJ1ZmZlciAoYHNrYmApLiBJIHNlZW0gdG8gcmVjYWxsIGl0IHJlYWRzIGZyb20gYHN0cnAtJmd0O2FuY2hvcmAuIFRoaXMgaXMgaW1wb3J0YW50LCBzbyBsZXQgbWUganVzdCB0YWtlIGEgcXVpY2sgbG9vayBhdCB0aGUgc291cmNlIGNvZGUgZm9yIGB0bHNfcnhfbXNnX3NpemVgIHRvIGNvbmZpcm0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Rsc19yeF9tc2dfc2l6ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzLmg9MTk3PXZvaWQgdGxzX3N0cnBfbXNnX2NvbnN1bWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApO1xubmV0L3Rscy90bHMuaC0xOTgtXG5uZXQvdGxzL3Rscy5oOjE5OTppbnQgdGxzX3J4X21zZ19zaXplKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTtcbm5ldC90bHMvdGxzLmgtMjAwLXZvaWQgdGxzX3J4X21zZ19tYXliZV9hbm5vdW5jZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCk7XG4tLVxubmV0L3Rscy90bHNfc3RycC5jPTIxMD1zdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbl9mcmFnKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy0yMzktXG5uZXQvdGxzL3Rsc19zdHJwLmM6MjQwOlx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBza2IpO1xubmV0L3Rscy90bHNfc3RycC5jLTI0MS1cdFx0aWYgKHN6IFx1MDAzYyAwKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz0yODY9c3RhdGljIGludCB0bHNfc3RycF9jb3B5aW5fc2tiKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy0zMTktXHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG5uZXQvdGxzL3Rsc19zdHJwLmM6MzIwOlx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBza2IpO1xubmV0L3Rscy90bHNfc3RycC5jLTMyMS1cdFx0aWYgKHN6IFx1MDAzYyAwKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTUzMy1cbm5ldC90bHMvdGxzX3N0cnAuYzo1MzQ6XHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXHUwMDNlYW5jaG9yKTtcbm5ldC90bHMvdGxzX3N0cnAuYy01MzUtXHRcdGlmIChzeiBcdTAwM2MgMClcbi0tXG5uZXQvdGxzL3Rsc19zdy5jPTIxNzA9Ym9vbCB0bHNfc3dfc29ja19pc19yZWFkYWJsZShzdHJ1Y3Qgc29jayAqc2spXG4tLVxubmV0L3Rscy90bHNfc3cuYy0yMTc4LVxubmV0L3Rscy90bHNfc3cuYzoyMTc5OmludCB0bHNfcnhfbXNnX3NpemUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvdGxzL3Rsc19zdy5jLTIxODAte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NjIxCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5JiMzOTtyZSBteSBvd246CgoqKkFuYWx5emluZyBgdGxzX3J4X21zZ19zaXplYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgcHVsbCB1cCBhbmQgYW5hbHl6ZSB0aGlzIGB0bHNfcnhfbXNnX3NpemVgIHRoaW5nLiBJJiMzOTttIGltbWVkaWF0ZWx5IHRoaW5raW5nLCBva2F5LCB0aGlzIGxpa2VseSByZWxhdGVzIHRvIHRoZSByZWNlcHRpb24gc2lkZSBvZiBUTFMsIHJpZ2h0PyBUaGUgc2l6ZSBvZiBhIHJlY2VpdmVkIFRMUyBtZXNzYWdlLiBOb3csIHRoZSBjb250ZXh0IGlzIGtleS4gV2hhdCYjMzk7cyB0aGUgZW52aXJvbm1lbnQ/IElzIHRoaXMgY2xpZW50LXNpZGUsIHNlcnZlci1zaWRlLCBvciBzb21ldGhpbmcgZWxzZT8gSXMgdGhpcyBjb2RlIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBUTFMgbGlicmFyeT8gQW5kLCBtb3JlIGltcG9ydGFudGx5LCB3aGF0JiMzOTtzIHRoZSBsZXZlbCBvZiBhYnN0cmFjdGlvbiB3ZSYjMzk7cmUgYXQ/IEFyZSB3ZSBsb29raW5nIGF0IGEgcmF3IGJ5dGUgYnVmZmVyLCBvciBhcmUgd2UgZGVhbGluZyB3aXRoIGEgaGlnaGVyLWxldmVsIGRhdGEgc3RydWN0dXJlPyBUaGUgZGV2aWwgaXMgYWx3YXlzIGluIHRoZSBkZXRhaWxzIHdpdGggVExTLCBhbmQgbWVzc2FnZSBzaXppbmcgaXMgYSBrbm93biBhdHRhY2sgdmVjdG9yLCBzbyBJJiMzOTtsbCBiZSBrZWVwaW5nIGEgc2hhcnAgZXllIG91dCBmb3IgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyBsaWtlIGludGVnZXIgb3ZlcmZsb3dzIG9yIHJlc291cmNlIGV4aGF1c3Rpb24gaGVyZS4gV2XigJlsbCBiZSBjaGVja2luZyBob3cgc2l6ZSBpcyBkZXRlcm1pbmVkIGFuZCB1c2VkLCBhbmQgd2hlcmUgdGhlIHZhbHVlIGNhbWUgZnJvbS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjE3OSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMTc5Olx0aW50IHRsc19yeF9tc2dfc2l6ZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYilcbjIxODA6XHR7XG4yMTgxOlx0XHRzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHggPSB0bHNfZ2V0X2N0eChzdHJwLVx1MDAzZXNrKTtcbjIxODI6XHRcdHN0cnVjdCB0bHNfcHJvdF9pbmZvICpwcm90ID0gXHUwMDI2dGxzX2N0eC1cdTAwM2Vwcm90X2luZm87XG4yMTgzOlx0XHRjaGFyIGhlYWRlcltUTFNfSEVBREVSX1NJWkUgJiM0MzsgVExTX01BWF9JVl9TSVpFXTtcbjIxODQ6XHRcdHNpemVfdCBjaXBoZXJfb3ZlcmhlYWQ7XG4yMTg1Olx0XHRzaXplX3QgZGF0YV9sZW4gPSAwO1xuMjE4NjpcdFx0aW50IHJldDtcbjIxODc6XHRcbjIxODg6XHRcdC8qIFZlcmlmeSB0aGF0IHdlIGhhdmUgYSBmdWxsIFRMUyBoZWFkZXIsIG9yIHdhaXQgZm9yIG1vcmUgZGF0YSAqL1xuMjE4OTpcdFx0aWYgKHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBwcm90LVx1MDAzZXByZXBlbmRfc2l6ZSBcdTAwM2Ugc2tiLVx1MDAzZWxlbilcbjIxOTA6XHRcdFx0cmV0dXJuIDA7XG4yMTkxOlx0XG4yMTkyOlx0XHQvKiBTYW5pdHktY2hlY2sgc2l6ZSBvZiBvbi1zdGFjayBidWZmZXIuICovXG4yMTkzOlx0XHRpZiAoV0FSTl9PTihwcm90LVx1MDAzZXByZXBlbmRfc2l6ZSBcdTAwM2Ugc2l6ZW9mKGhlYWRlcikpKSB7XG4yMTk0Olx0XHRcdHJldCA9IC1FSU5WQUw7XG4yMTk1Olx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjE5NjpcdFx0fVxuMjE5NzpcdFxuMjE5ODpcdFx0LyogTGluZWFyaXplIGhlYWRlciB0byBsb2NhbCBidWZmZXIgKi9cbjIxOTk6XHRcdHJldCA9IHNrYl9jb3B5X2JpdHMoc2tiLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQsIGhlYWRlciwgcHJvdC1cdTAwM2VwcmVwZW5kX3NpemUpO1xuMjIwMDpcdFx0aWYgKHJldCBcdTAwM2MgMClcbjIyMDE6XHRcdFx0Z290byByZWFkX2ZhaWx1cmU7XG4yMjAyOlx0XG4yMjAzOlx0XHRzdHJwLVx1MDAzZW1hcmsgPSBoZWFkZXJbMF07XG4yMjA0Olx0XG4yMjA1Olx0XHRkYXRhX2xlbiA9ICgoaGVhZGVyWzRdIFx1MDAyNiAweEZGKSB8IChoZWFkZXJbM10gXHUwMDNjXHUwMDNjIDgpKTtcbjIyMDY6XHRcbjIyMDc6XHRcdGNpcGhlcl9vdmVyaGVhZCA9IHByb3QtXHUwMDNldGFnX3NpemU7XG4yMjA4Olx0XHRpZiAocHJvdC1cdTAwM2V2ZXJzaW9uICE9IFRMU18xXzNfVkVSU0lPTiBcdTAwMjZcdTAwMjZcbjIyMDk6XHRcdCAgICBwcm90LVx1MDAzZWNpcGhlcl90eXBlICE9IFRMU19DSVBIRVJfQ0hBQ0hBMjBfUE9MWTEzMDUpXG4yMjEwOlx0XHRcdGNpcGhlcl9vdmVyaGVhZCAmIzQzOz0gcHJvdC1cdTAwM2Vpdl9zaXplO1xuMjIxMTpcdFxuMjIxMjpcdFx0aWYgKGRhdGFfbGVuIFx1MDAzZSBUTFNfTUFYX1BBWUxPQURfU0laRSAmIzQzOyBjaXBoZXJfb3ZlcmhlYWQgJiM0MztcbjIyMTM6XHRcdCAgICBwcm90LVx1MDAzZXRhaWxfc2l6ZSkge1xuMjIxNDpcdFx0XHRyZXQgPSAtRU1TR1NJWkU7XG4yMjE1Olx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjIxNjpcdFx0fVxuMjIxNzpcdFx0aWYgKGRhdGFfbGVuIFx1MDAzYyBjaXBoZXJfb3ZlcmhlYWQpIHtcbjIyMTg6XHRcdFx0cmV0ID0gLUVCQURNU0c7XG4yMjE5Olx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjIyMDpcdFx0fVxuMjIyMTpcdFxuMjIyMjpcdFx0LyogTm90ZSB0aGF0IGJvdGggVExTMS4zIGFuZCBUTFMxLjIgdXNlIFRMU18xXzIgdmVyc2lvbiBoZXJlICovXG4yMjIzOlx0XHRpZiAoaGVhZGVyWzFdICE9IFRMU18xXzJfVkVSU0lPTl9NSU5PUiB8fFxuMjIyNDpcdFx0ICAgIGhlYWRlclsyXSAhPSBUTFNfMV8yX1ZFUlNJT05fTUFKT1IpIHtcbjIyMjU6XHRcdFx0cmV0ID0gLUVJTlZBTDtcbjIyMjY6XHRcdFx0Z290byByZWFkX2ZhaWx1cmU7XG4yMjI3Olx0XHR9XG4yMjI4Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk3MTMKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA1NTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFRMUyBWdWxuZXJhYmlsaXR5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGB0bHNfcnhfbXNnX3NpemVgIGZ1bmN0aW9uLCBhbmQgaXQmIzM5O3MgY2FsbGluZyBgc2tiX2NvcHlfYml0c2AuIFRoZSBwb3RlbnRpYWwgcHJvYmxlbSBpbW1lZGlhdGVseSBoaXRzIG1lOiBpZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzbiYjMzk7dCBjYWxsZWQgKmJlZm9yZSogdGhpcyBgc2tiX2NvcHlfYml0c2AgY2FsbCwgdGhlbiB0aGUgU29ja2V0IEJ1ZmZlciAoc2tiKSBjb3VsZCBjb250YWluIG1peGVkIG9yIG91dC1vZi1vcmRlciBkZWNyeXB0ZWQgZGF0YS4gYHNrYl9jb3B5X2JpdHNgIGp1c3QgKnJlYWRzKiBmcm9tIHRoZSBza2IsIHNvIGl0IGNhbiYjMzk7dCBiZSBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZS4gSXQgY29waWVzIGRhdGEgZnJvbSB0aGUgc29ja2V0IGJ1ZmZlciBpbnRvIGBoZWFkZXJgLiBCdXQgaWYgdGhlIHNrYiBoYXMgYmFkIGRhdGEsIGBza2JfY29weV9iaXRzYCBpcyBnb2luZyB0byByZWFkIGdhcmJhZ2UuCgpJZiBpdCByZWFkcyBnYXJiYWdlLCB0aGF0IG1lYW5zIGl0IG1pZ2h0IGNhbGN1bGF0ZSBhIGNvbXBsZXRlbHkgaW5jb3JyZWN0IGBkYXRhX2xlbmAuIFRoZSBvcmlnaW5hbCBhbmFseXNpcyBzYWlkIGBoZWFkZXJgIGlzIGZ1bGx5IHdyaXR0ZW4gYnkgYHNrYl9jb3B5X2JpdHNgLCBvciBpdCByZXR1cm5zIGFuIGVycm9yLCBzbyBgaGVhZGVyYCB3aWxsIGJlIGluaXRpYWxpemVkIGluIGFsbCBjYXNlcy4KClRoZSByZWFsIGlzc3VlIGlzIHRoZSB0aW1pbmcuIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKnVzZWQqIHRvIGJlIGNhbGxlZCAqYWZ0ZXIqIGB0bHNfcnhfbXNnX3NpemVgIGFuZCB0aGUgc2V0dGluZyBvZiBgc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuYC4gVGhpcyBvcmRlciBpcyBjcml0aWNhbCBiZWNhdXNlIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgdmVyaWZpZXMgdGhlIHF1ZXVlJiMzOTtzIGludGVncml0eSBiYXNlZCBvbiBgc3RycC0mZ3Q7c3RtLm9mZnNldCAmIzQzOyBzdHJwLSZndDtzdG0uZnVsbF9sZW5gLiBJZiB0aGUgcXVldWUgaXNuJiMzOTt0IE9LLCBpdCBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5YC4KClNvLCBiZWZvcmUgdGhpcyBwYXRjaCwgYHRsc19yeF9tc2dfc2l6ZWAgY291bGQgcmVhZCBmcm9tIGEgY29ycnVwdCBxdWV1ZS4gVGhhdCB3b3VsZCBnaXZlIGl0IGEgYmFkIFRMUyBoZWFkZXIgYW5kIHRoZXJlZm9yZSwgYSB3cm9uZyBgc3pgIHZhbHVlLiBUaGVuLCB3aGVuIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaXMgY2FsbGVkICphZnRlciogdGhpcyBjYWxjdWxhdGlvbiwgaXQmIzM5O3MgY2hlY2tpbmcgYWdhaW5zdCBhbiBhbHJlYWR5IGluY29ycmVjdCBgZnVsbF9sZW5gLgoKSWYgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBmYWlscywgaXQgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gSG93ZXZlciwgZXZlbiBpZiB0aGUgcXVldWUgaXMgYmFkLCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgICptaWdodCogaXRlcmF0ZSBvdmVyIHRoZSBxdWV1ZSB1cCB0byBgbGVuYCBpZiB0aGUgcmVzdWx0aW5nIGBzemAgaXMgYSBodWdlIHZhbHVlLiBUaGlzIGNvdWxkIG9wZW4gYSBuZXcgYXZlbnVlIGZvciBhdHRhY2suIEkgbmVlZCB0byByZS1leGFtaW5lIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgbW9yZSBjbG9zZWx5IHRvIGJlIHN1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3RycC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDMzLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MzM6XHRzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcbiA0MzQ6XHRcdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxuIDQzNTpcdHtcbiA0MzY6XHRcdHN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjtcbiA0Mzc6XHRcdHUzMiBzZXE7XG4gNDM4Olx0XG4gNDM5Olx0XHRmaXJzdCA9IHNrYl9zaGluZm8oc3RycC1cdTAwM2VhbmNob3IpLVx1MDAzZWZyYWdfbGlzdDtcbiA0NDA6XHRcdHNrYiA9IGZpcnN0O1xuIDQ0MTpcdFx0c2VxID0gVENQX1NLQl9DQihmaXJzdCktXHUwMDNlc2VxO1xuIDQ0MjpcdFxuIDQ0MzpcdFx0LyogTWFrZSBzdXJlIHRoZXJlJiMzOTtzIG5vIGR1cGxpY2F0ZSBkYXRhIGluIHRoZSBxdWV1ZSxcbiA0NDQ6XHRcdCAqIGFuZCB0aGUgZGVjcnlwdGVkIHN0YXR1cyBtYXRjaGVzLlxuIDQ0NTpcdFx0ICovXG4gNDQ2Olx0XHR3aGlsZSAoc2tiLVx1MDAzZWxlbiBcdTAwM2MgbGVuKSB7XG4gNDQ3Olx0XHRcdHNlcSAmIzQzOz0gc2tiLVx1MDAzZWxlbjtcbiA0NDg6XHRcdFx0bGVuIC09IHNrYi1cdTAwM2VsZW47XG4gNDQ5Olx0XHRcdHNrYiA9IHNrYi1cdTAwM2VuZXh0O1xuIDQ1MDpcdFxuIDQ1MTpcdFx0XHRpZiAoVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcSAhPSBzZXEpXG4gNDUyOlx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDQ1MzpcdFx0XHRpZiAoc2tiX2NtcF9kZWNyeXB0ZWQoZmlyc3QsIHNrYikpXG4gNDU0Olx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDQ1NTpcdFx0fVxuIDQ1NjpcdFxuIDQ1NzpcdFx0cmV0dXJuIHRydWU7XG4gNDU4Olx0fVxuIDQ1OTpcdFxuIDQ2MDpcdHN0YXRpYyB2b2lkIHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGludCBsZW4pXG4gNDYxOlx0e1xuIDQ2MjpcdFx0c3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzdHJwLVx1MDAzZXNrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEyNjgKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA1OTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIE5VTEwgUG9pbnRlciBEZXJlZmVyZW5jZSBpbiB0aGUgVExTIFN0YWNrKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIEkgc2VlIHRoaXMgbG9vcCBpdGVyYXRpbmcgdGhyb3VnaCBhbiBgc2tiYCBmcmFnX2xpc3QuIFRoZSBjb3JlIGNvbmNlcm4gaGVyZSBpcyB0aGF0IGlmIHRoZSBgbGVuYCB2YWx1ZSBpcyBleGNlc3NpdmVseSBsYXJnZSwgbGlrZWx5IGR1ZSB0byBhIGdhcmJhZ2UgdmFsdWUgZnJvbSB0aGUgYHN6YCBjYWxjdWxhdGlvbiwgdGhlIGBza2JgIHBvaW50ZXIgY291bGQgYmVjb21lIE5VTEwgYmVmb3JlIGBsZW5gIGlzIGZ1bGx5IGNvbnN1bWVkLiBTcGVjaWZpY2FsbHksIGluc2lkZSB0aGUgbG9vcCwgaWYgd2UgZXhoYXVzdCB0aGUgZnJhZ19saXN0IGFuZCBgc2tiYCBiZWNvbWVzIE5VTEwgYmVmb3JlIGBsZW5gIGlzIHplcm8sIHRoZW4gdGhlIHN1YnNlcXVlbnQgYWNjZXNzIHRvIGBUQ1BfU0tCX0NCKHNrYilgIHdpbGwgcmVzdWx0IGluIGEgZGVyZWZlcmVuY2Ugb2YgYSBOVUxMIHBvaW50ZXIsIGxlYWRpbmcgdG8gYSBjcmFzaCDigJMgYSBjbGFzc2ljIGFuZCByZWFkaWx5IGRldGVjdGFibGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGJ1Zy4gS0FTQU4gd291bGQgZGVmaW5pdGVseSBmbGFnIHRoaXMsIG9yIHdlJiMzOTtkIGdldCBhIGtlcm5lbCBvb3BzLgoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0byBjb25zaWRlciBpZiB0aGlzIHJlbGF0ZXMgdG8gdW5pbml0aWFsaXplZCBtZW1vcnksIGJ1dCB0aGVuIEkgcmVtZW1iZXJlZCB0aGF0IGBza2JfY29weV9iaXRzYCBpbml0aWFsaXplcyB0aGUgYGhlYWRlcmAuIFNvLCBpdCYjMzk7cyBub3QgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBjcnV4IG9mIHRoZSBpc3N1ZSBhcHBlYXJzIHRvIGJlIHRoYXQgYHRsc19yeF9tc2dfc2l6ZWAgaXMgcmVhZGluZyBhIG1hbGZvcm1lZCBxdWV1ZSwgb2J0YWlucyBhIGdhcmJhZ2UgbGVuZ3RoIGFuZCB0aGVuIHRoYXQgZ2FyYmFnZSBsZW5ndGggZ2V0cyB1c2VkIGJ5IGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIHdoaWNoIHRoZW4gaXRlcmF0ZXMgb3ZlciB0aGUgZnJhZ19saXN0IHBvdGVudGlhbGx5IGRlcmVmZXJlbmNpbmcgYSBOVUxMIHBvaW50ZXIuCgpCdXQgd2FpdCwgaXMgYGxlbmAgKmd1YXJhbnRlZWQqIHRvIGJlIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBmcmFnX2xpc3Q/IExldCYjMzk7cyB0cmFjZSBpdCBiYWNrLiBgdGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZWAgc2V0cyBgc3RycC0mZ3Q7YW5jaG9yLSZndDtsZW5gIHRvIGBvZmZzZXQgJiM0MzsgbGVuYCwgd2hlcmUgYGxlbmAgaXMgYGlucWAuIEhvd2V2ZXIsIGBzemAgY2FuIGJlIGFzIGxhcmdlIGFzIGBUTFNfTUFYX1BBWUxPQURfU0laRSAmIzQzOyBjaXBoZXJfb3ZlcmhlYWQgJiM0MzsgcHJvdC0mZ3Q7dGFpbF9zaXplYCwgd2hpY2ggaXMgYXJvdW5kIDE2S0IuCgpOb3csIGxldCYjMzk7cyBsb29rIGF0IGB0bHNfc3RycF9yZWFkX3NvY2tgLiBJZiBgaW5xYCBpcyBzbWFsbGVyIHRoYW4gYHN0cnAtJmd0O3N0bS5mdWxsX2xlbmAsIHRoZW4gdGhlIGNvZGUgcmV0dXJucyBgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpYCAqYmVmb3JlKiBjYWxsaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuIFNvLCB0aGUgdnVsbmVyYWJsZSBjYXNlIGlzIHByZWNpc2VseSB3aGVuIGBpbnFgIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gYHN0cnAtJmd0O3N0bS5mdWxsX2xlbmAsIGluIG90aGVyIHdvcmRzIHdlIGNhbiBnZXQgYSBsYXJnZXIgbGVuZ3RoIGNhbGN1bGF0ZWQsIGFuZCB0aGVuIGl0IGlzIHBhc3NlZCBpbnRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuIE5lZWQgdG8gbG9vayBhdCBgdGxzX3N0cnBfcmVhZF9zb2NrYCBhZ2FpbiBhbmQgY29uZmlybSB0aGlzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDUyNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTI1Olx0XG4gNTI2Olx0XHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XG4gNTI3Olx0XHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG4gNTI4Olx0XHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbiA1Mjk6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuIDUzMDpcdFxuIDUzMTpcdFx0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBUTFNfSEVBREVSX1NJWkUpKVxuIDUzMjpcdFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuIDUzMzpcdFxuIDUzNDpcdFx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVx1MDAzZWFuY2hvcik7XG4gNTM1Olx0XHRcdGlmIChzeiBcdTAwM2MgMClcbiA1MzY6XHRcdFx0XHRyZXR1cm4gc3o7XG4gNTM3Olx0XG4gNTM4Olx0XHRcdHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XG4gNTM5Olx0XG4gNTQwOlx0XHRcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4gfHwgaW5xIFx1MDAzYyBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbilcbiA1NDE6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuIDU0MjpcdFx0fVxuIDU0MzpcdFxuIDU0NDpcdFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0Mzsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxuIDU0NTpcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcbiA1NDY6XHRcbiA1NDc6XHRcdFdSSVRFX09OQ0Uoc3RycC1cdTAwM2Vtc2dfcmVhZHksIDEpO1xuIDU0ODpcdFxuIDU0OTpcdFx0cmV0dXJuIDA7XG4gNTUwOlx0fVxuIDU1MTpcdFxuIDU1MjpcdC8qIFBhcnNlIHF1ZXVlZCBkYXRhLiBXaGVuIEBhbm5vdW5jZSBpcyB0cnVlIGFuZCBwYXJzaW5nIHByb2R1Y2VzIGFcbiA1NTM6XHQgKiBuZXdseS1yZWFkeSByZWNvcmQsIGZpcmUgdGhlIGNvbnN1bWVyIG5vdGlmaWNhdGlvbi4gQ2FsbGVycyB0aGF0XG4gNTU0Olx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjk1OAoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDEzNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGB0bHNfc3RycF9yZWFkX3NvY2tgIGFuZCBRdWV1ZSBJbnRlZ3JpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSW4gYHRsc19zdHJwX3JlYWRfc29ja2AsIEkmIzM5O20gbG9va2luZyBhdCBob3cgd2UmIzM5O3JlIGhhbmRsaW5nIGRhdGEgcmVjZXB0aW9uLCBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgVExTIHN0cmVhbS4gVGhlIGNyaXRpY2FsIHBhcnQgaXMgdGhhdCBjb25kaXRpb25hbCBibG9jazoKCmBgYGMKCQlpZiAoIXN0cnAtJmd0O3N0bS5mdWxsX2xlbiB8fCBpbnEgJmx0OyBzdHJwLSZndDtzdG0uZnVsbF9sZW4pCgkJCXJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7Cgl9CgoJaWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IHN0cnAtJmd0O3N0bS5mdWxsX2xlbikpCgkJcmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7CmBgYAoKRXNzZW50aWFsbHksIGlmIHdlIGhhdmVuJiMzOTt0IGRldGVybWluZWQgdGhlIGZ1bGwgbWVzc2FnZSBsZW5ndGggeWV0IChgIXN0cnAtJmd0O3N0bS5mdWxsX2xlbmApIG9yIGlmIHRoZSBhdmFpbGFibGUgZGF0YSBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSAoYGlucWApIGlzIGxlc3MgdGhhbiB0aGUgZXhwZWN0ZWQgZnVsbCBsZW5ndGgsIHdlIGZhbGwgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gSG93ZXZlciwgdGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoZSBzZWNvbmQgY29uZGl0aW9uLiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzIG9ubHkgY2FsbGVkIGlmIGBpbnEgJmd0Oz0gc3RycC0mZ3Q7c3RtLmZ1bGxfbGVuYC4gVGhpcyBtZWFucyB0aGUgY29kZSBhc3N1bWVzIHRoYXQgaWYgd2UgaGF2ZSBlbm91Z2ggKnRvdGFsKiBkYXRhLCB3ZSBjYW4gcHJvY2VlZC4KCk5vdywgaWYgYGlucWAgdHJ1bHkgcmVwcmVzZW50cyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBmcmFnX2xpc3QgKHdoaWNoIGlzIHBvcHVsYXRlZCB2aWEgYHRjcF9yZWN2X3NrYmApLCB0aGVuIHRoZSBgc2tiLSZndDtuZXh0YCBwb2ludGVyICpzaG91bGQqIG5ldmVyIGJlIE5VTEwgaW5zaWRlIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIHByb3ZpZGVkIHRoZSBjb25kaXRpb24gaXMgYGlucSAmZ3Q7PSBzdHJwLSZndDtzdG0uZnVsbF9sZW5gLCBiZWNhdXNlIHRoZSB0b3RhbCBvZiB0aGUgc2tiJiMzOTtzIGxlbiB3aWxsIGJlIGF0IGxlYXN0IGBzdHJwLSZndDtzdG0uZnVsbF9sZW5gLgoKSG93ZXZlciwgYHRjcF9yZWN2X3NrYmAgcmV0dXJucyBvbmx5IHRoZSBmaXJzdCBTS0IsIHdoaWNoIGlzIHRoZW4gbGlua2VkIHZpYSBgc2tiLSZndDtuZXh0YC4gSWYgdGhlIHRvdGFsIHN1bSBvZiBgc2tiLSZndDtsZW5gIG9mIGFsbCBza2JzIGlzIGF0IGxlYXN0IGBsZW5gLCB0aGVuIGBza2JgIHdpbGwgbm90IGJlIE5VTEwgYWZ0ZXIgdGhlIGl0ZXJhdGlvbi4KCkkgbmVlZCB0byBjb25maXJtIGlmIGBpbnFgIHRydWx5IHJlZmxlY3RzIHRoZSBzdW0gb2YgYWxsIGBza2ItJmd0O2xlbmAgdmFsdWVzIGluIHRoZSByZWNlaXZlIHF1ZXVlLCBhcyB0aGUgY2hlY2sgaW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBkZXBlbmRzIG9uIHRoaXMuIEJhc2VkIG9uIGhvdyBgdGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZWAgaXMgZGVmaW5lZDoKCmBgYGMKCWZpcnN0ID0gdGNwX3JlY3Zfc2tiKHN0cnAtJmd0O3NrLCB0cC0mZ3Q7Y29waWVkX3NlcSwgJmFtcDtvZmZzZXQpOwoJaWYgKFdBUk5fT05fT05DRSghZmlyc3QpKQoJCXJldHVybjsKCgkvKiBCZXN0b3cgdGhlIHN0YXRlIG9udG8gdGhlIGFuY2hvciAqLwoJc3RycC0mZ3Q7YW5jaG9yLSZndDtsZW4gPSBvZmZzZXQgJiM0MzsgbGVuOwoJc3RycC0mZ3Q7YW5jaG9yLSZndDtkYXRhX2xlbiA9IG9mZnNldCAmIzQzOyBsZW47CglzdHJwLSZndDthbmNob3ItJmd0O3RydWVzaXplID0gb2Zmc2V0ICYjNDM7IGxlbjsKCglza2Jfc2hpbmZvKHN0cnAtJmd0O2FuY2hvciktJmd0O2ZyYWdfbGlzdCA9IGZpcnN0OwpgYGAKCmB0Y3BfcmVjdl9za2JgIGFuZCBgdGNwX2lucWAgd29yayB0b2dldGhlciB0byAqZ3VhcmFudGVlKiB0aGF0IGBpbnFgIHJlcHJlc2VudHMgdGhlIHRvdGFsIGFtb3VudCBvZiBhdmFpbGFibGUgZGF0YSwgYWx0aG91Z2ggb25seSB0aGUgZmlyc3QgU0tCIGlzIGltbWVkaWF0ZWx5IGxpbmtlZC4KCk15IGNvbmNlcm4gc3RlbXMgZnJvbSBhIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5IGluIGhvdyBgdGxzX3J4X21zZ19zaXplYCBoYW5kbGVzIGZyYWdtZW50ZWQsIHBvdGVudGlhbGx5IG1hbGZvcm1lZCwgVENQIGRhdGEgd2l0aGluIHRoZSBgZnJhZ19saXN0YCBzdHJ1Y3R1cmUuIFRoZSBmdW5jdGlvbiByZWFkcyB0aGUgbWVzc2FnZSBzaXplIHVzaW5nIGBza2JfY29weV9iaXRzYCwgc3RhcnRpbmcgZnJvbSBhIGtub3duIG9mZnNldCB3aXRoaW4gdGhlIGBzdHJwLSZndDthbmNob3JgIFNLQi4gSG93ZXZlciwgaWYgdGhlIFRDUCByZWNlaXZlIHF1ZXVlIGlzIGNvcnJ1cHRlZCwgd2l0aCBvdXQtb2Ytb3JkZXIsIG92ZXJsYXBwaW5nIG9yIG1pc3Npbmcgc2ticywgYHNrYl9jb3B5X2JpdHNgIG1heSByZWFkIHRoZSB3cm9uZyBiaXRzLCBiYXNlZCBvbiBpbmNvcnJlY3QgYXNzdW1wdGlvbnMgYWJvdXQgZGF0YSBjb250aWd1aXR5IHdpdGhpbiB0aGUgYGZyYWdfbGlzdGAuCgpUaGUgVENQIHJlY2VpdmUgcXVldWUgY29udGFpbnMgKmluLW9yZGVyKiBza2JzLgoKQnV0LCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGNoZWNrcyBgVENQX1NLQl9DQihza2IpLSZndDtzZXEgIT0gc2VxYC4gSXMgdGhpcyBjb3JyZWN0PyBJcyBpdCBjaGVja2luZyBmb3IgKmVuY3J5cHRlZCogZGF0YSBpbiB0aGUgcmVjZWl2ZSBxdWV1ZT8KCmBgYGMKCQlpZiAoVENQX1NLQl9DQihza2IpLSZndDtzZXEgIT0gc2VxKQoJCQlyZXR1cm4gZmFsc2U7CgkJaWYgKHNrYl9jbXBfZGVjcnlwdGVkKGZpcnN0LCBza2IpKQoJCQlyZXR1cm4gZmFsc2U7CmBgYAoKSWYgYFRDUF9TS0JfQ0Ioc2tiKS0mZ3Q7c2VxICE9IHNlcWAsIGl0IG1lYW5zIGRhdGEgaXMgb3V0LW9mLW9yZGVyLCBvciBwb3NzaWJseSB0aGVyZSBpcyBhIGdhcC4gT3ZlcmxhcHBpbmcgc2ticyBhcmUgcG9zc2libGUsIGFuZCBgc2tiX2NvcHlfYml0c2AgKndpbGwqIHJlYWQgdGhlIHdyb25nIGJ5dGVzIGZyb20gdGhlc2UgZnJhZ21lbnRzLiBJdCBtYXkgcmVhZCBmcm9tIG92ZXJsYXBwaW5nIGRhdGEsIGxlYWRpbmcgdG8gaW5jb3JyZWN0IHNpemUgY2FsY3VsYXRpb24uIElmIHRoZSBzaXplIGlzIGluY29ycmVjdCwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBtaWdodCB0aGVuIGZhaWwuCgpUaGUgcGF0Y2gmIzM5O3MgaW50cm9kdWN0aW9uIG9mIHRoZSBgaWYgKGlucQoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3Rscy90bHNfc3cuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIxNzksCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjE3OTpcdGludCB0bHNfcnhfbXNnX3NpemUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpXG4yMTgwOlx0e1xuMjE4MTpcdFx0c3RydWN0IHRsc19jb250ZXh0ICp0bHNfY3R4ID0gdGxzX2dldF9jdHgoc3RycC1cdTAwM2Vzayk7XG4yMTgyOlx0XHRzdHJ1Y3QgdGxzX3Byb3RfaW5mbyAqcHJvdCA9IFx1MDAyNnRsc19jdHgtXHUwMDNlcHJvdF9pbmZvO1xuMjE4MzpcdFx0Y2hhciBoZWFkZXJbVExTX0hFQURFUl9TSVpFICYjNDM7IFRMU19NQVhfSVZfU0laRV07XG4yMTg0Olx0XHRzaXplX3QgY2lwaGVyX292ZXJoZWFkO1xuMjE4NTpcdFx0c2l6ZV90IGRhdGFfbGVuID0gMDtcbjIxODY6XHRcdGludCByZXQ7XG4yMTg3Olx0XG4yMTg4Olx0XHQvKiBWZXJpZnkgdGhhdCB3ZSBoYXZlIGEgZnVsbCBUTFMgaGVhZGVyLCBvciB3YWl0IGZvciBtb3JlIGRhdGEgKi9cbjIxODk6XHRcdGlmIChzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0MzsgcHJvdC1cdTAwM2VwcmVwZW5kX3NpemUgXHUwMDNlIHNrYi1cdTAwM2VsZW4pXG4yMTkwOlx0XHRcdHJldHVybiAwO1xuMjE5MTpcdFxuMjE5MjpcdFx0LyogU2FuaXR5LWNoZWNrIHNpemUgb2Ygb24tc3RhY2sgYnVmZmVyLiAqL1xuMjE5MzpcdFx0aWYgKFdBUk5fT04ocHJvdC1cdTAwM2VwcmVwZW5kX3NpemUgXHUwMDNlIHNpemVvZihoZWFkZXIpKSkge1xuMjE5NDpcdFx0XHRyZXQgPSAtRUlOVkFMO1xuMjE5NTpcdFx0XHRnb3RvIHJlYWRfZmFpbHVyZTtcbjIxOTY6XHRcdH1cbjIxOTc6XHRcbjIxOTg6XHRcdC8qIExpbmVhcml6ZSBoZWFkZXIgdG8gbG9jYWwgYnVmZmVyICovXG4yMTk5Olx0XHRyZXQgPSBza2JfY29weV9iaXRzKHNrYiwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0LCBoZWFkZXIsIHByb3QtXHUwMDNlcHJlcGVuZF9zaXplKTtcbjIyMDA6XHRcdGlmIChyZXQgXHUwMDNjIDApXG4yMjAxOlx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjIwMjpcdFxuMjIwMzpcdFx0c3RycC1cdTAwM2VtYXJrID0gaGVhZGVyWzBdO1xuMjIwNDpcdFxuMjIwNTpcdFx0ZGF0YV9sZW4gPSAoKGhlYWRlcls0XSBcdTAwMjYgMHhGRikgfCAoaGVhZGVyWzNdIFx1MDAzY1x1MDAzYyA4KSk7XG4yMjA2Olx0XG4yMjA3Olx0XHRjaXBoZXJfb3ZlcmhlYWQgPSBwcm90LVx1MDAzZXRhZ19zaXplO1xuMjIwODpcdFx0aWYgKHByb3QtXHUwMDNldmVyc2lvbiAhPSBUTFNfMV8zX1ZFUlNJT04gXHUwMDI2XHUwMDI2XG4yMjA5Olx0XHQgICAgcHJvdC1cdTAwM2VjaXBoZXJfdHlwZSAhPSBUTFNfQ0lQSEVSX0NIQUNIQTIwX1BPTFkxMzA1KVxuMjIxMDpcdFx0XHRjaXBoZXJfb3ZlcmhlYWQgJiM0Mzs9IHByb3QtXHUwMDNlaXZfc2l6ZTtcbjIyMTE6XHRcbjIyMTI6XHRcdGlmIChkYXRhX2xlbiBcdTAwM2UgVExTX01BWF9QQVlMT0FEX1NJWkUgJiM0MzsgY2lwaGVyX292ZXJoZWFkICYjNDM7XG4yMjEzOlx0XHQgICAgcHJvdC1cdTAwM2V0YWlsX3NpemUpIHtcbjIyMTQ6XHRcdFx0cmV0ID0gLUVNU0dTSVpFO1xuMjIxNTpcdFx0XHRnb3RvIHJlYWRfZmFpbHVyZTtcbjIyMTY6XHRcdH1cbjIyMTc6XHRcdGlmIChkYXRhX2xlbiBcdTAwM2MgY2lwaGVyX292ZXJoZWFkKSB7XG4yMjE4Olx0XHRcdHJldCA9IC1FQkFETVNHO1xuMjIxOTpcdFx0XHRnb3RvIHJlYWRfZmFpbHVyZTtcbjIyMjA6XHRcdH1cbjIyMjE6XHRcbjIyMjI6XHRcdC8qIE5vdGUgdGhhdCBib3RoIFRMUzEuMyBhbmQgVExTMS4yIHVzZSBUTFNfMV8yIHZlcnNpb24gaGVyZSAqL1xuMjIyMzpcdFx0aWYgKGhlYWRlclsxXSAhPSBUTFNfMV8yX1ZFUlNJT05fTUlOT1IgfHxcbjIyMjQ6XHRcdCAgICBoZWFkZXJbMl0gIT0gVExTXzFfMl9WRVJTSU9OX01BSk9SKSB7XG4yMjI1Olx0XHRcdHJldCA9IC1FSU5WQUw7XG4yMjI2Olx0XHRcdGdvdG8gcmVhZF9mYWlsdXJlO1xuMjIyNzpcdFx0fVxuMjIyODpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjIwMgoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDM0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBSZWFzb25pbmcgb24gdGhlIFRMUyBSWCBNZXNzYWdlIFNpemUgYW5kIFF1ZXVlIFZhbGlkaXR5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgd2UgaGFuZGxlIG1lc3NhZ2Ugc2l6ZXMgaW4gdGhpcyBUTFMgaW1wbGVtZW50YXRpb24sIHNwZWNpZmljYWxseSB3aGVuIGB0bHNfcnhfbXNnX3NpemVgIGlzIGNhbGxlZC4gSXQgc2VlbXMgbGlrZSBpZiB0aGF0IGZ1bmN0aW9uIGVuY291bnRlcnMgYSBwcm9ibGVtIG9uIGEgcXVldWUgdGhhdCYjMzk7cyBub3QgaW4gYSBnb29kIHN0YXRlLCBpdCYjMzk7cyBkZXNpZ25lZCB0byByZXR1cm4gYW4gZXJyb3IgbGlrZSBgLUVJTlZBTGAsIGAtRU1TR1NJWkVgLCBvciBgLUVCQURNU0dgLiBUaGUgY29kZSBpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYCBkaXJlY3RseSBwYXNzZXMgdGhpcyBlcnJvciB1cCB0aGUgY2hhaW46CgpgYGBjCgkJc3ogPSB0bHNfcnhfbXNnX3NpemUoc3RycCwgc3RycC0mZ3Q7YW5jaG9yKTsKCQlpZiAoc3ogJmx0OyAwKQoJCQlyZXR1cm4gc3o7CmBgYAoKTXkgaW5pdGlhbCB0aG91Z2h0IHdhcywgJiMzNDtHcmVhdCwgZXJyb3IgaGFuZGxpbmchIEl0JiMzOTtzIHByb3BhZ2F0ZWQgY29ycmVjdGx5LiYjMzQ7IEJ1dCwgaG9sZCBvbiBhIHNlY29uZC4uLiB3aGF0IGlmIHRoZSAqcXVldWUqIGlzIHRoZSBwcm9ibGVtPyBXaGF0IGlmIHRoZSBxdWV1ZSBpcyBtZXNzZWQgdXAg4oCTIG1heWJlIGl0JiMzOTtzIGdvdCBhIG1peCBvZiBkZWNyeXB0ZWQgYW5kIHVuLWRlY3J5cHRlZCBkYXRhLCBvciBvdmVybGFwcGluZyBza2JzPyBJbiB0aG9zZSBjYXNlcywgcmV0dXJuaW5nIGFuICplcnJvciogYW5kIGFib3J0aW5nIHRoZSBjb25uZWN0aW9uIGlzIHRoZSAqd3JvbmcqIHRoaW5nIHRvIGRvISBXZSBuZWVkIHRvIGhhbmRsZSB0aGF0IGdyYWNlZnVsbHksIGFuZCBpdCBzZWVtcyBsaWtlIHRoZSBmYWxsYmFjayBtZWNoYW5pc20gdG8gYHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSlgIGlzIHRoZSByaWdodCB0b29sIGZvciB0aGlzIGpvYi4KCkFoYSEgTm93IEkgc2VlLiBXaGVuIGB0bHNfcnhfbXNnX3NpemVgIGVuY291bnRlcnMgZ2FyYmFnZSBkYXRhIGJlY2F1c2Ugb2Ygb3ZlcmxhcHBpbmcgU0tCcywgaXQgY2FuIHJldHVybiBhbiBlcnJvciBsaWtlIGAtRUlOVkFMYCAobWF5YmUgZHVlIHRvIGEgYmFkIFRMUyB2ZXJzaW9uKSBvciBgLUVNU0dTSVpFYCAoYSBiYWQgbGVuZ3RoIGZpZWxkKS4gSWYgd2UgKmRpZG4mIzM5O3QqIGNoZWNrIHRoZSBxdWV1ZSYjMzk7cyBoZWFsdGgsIGB0bHNfc3RycF9yZWFkX3NvY2tgIHdvdWxkIGJsaW5kbHkgcmV0dXJuIHRoaXMgZXJyb3IsIHBvdGVudGlhbGx5IGNhdXNpbmcgYW4gdW5uZWNlc3NhcnkgY29ubmVjdGlvbiB0ZXJtaW5hdGlvbi4KCkJ1dCwgaWYgd2UgY2hlY2sgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCAqZmlyc3QqLCB3ZSByZWFsaXplIHRoZSBxdWV1ZSBpc24mIzM5O3QgcHJpc3RpbmUgYW5kIHRoYXQgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYSBtb3JlIHJvYnVzdCByZWFkaW5nIHN0cmF0ZWd5LiBUaGF0JiMzOTtzIHdoZXJlIGB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpYCBjb21lcyBpbiEgVGhpcyBmdW5jdGlvbiBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gZGVhbCB3aXRoIHRoZSBtZXNzeSBxdWV1ZSBzaXR1YXRpb25zLiBNeSBtZW1vcnkgdGVsbHMgbWUgdGhhdCBpdCBwcm9iYWJseSBjb3BpZXMgdGhlIGRhdGEgaW50byBhIGNvbnRpZ3VvdXMgYnVmZmVyIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuIEkgd29uZGVyIHdoYXQgaXQgYWN0dWFsbHkgZG9lcz8gSSBuZWVkIHRvIGNoZWNrIHRoZSBjb2RlIHRoZXJlIHRvIGNvbmZpcm0gdGhpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM5MDpcdHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIHFzaG9ydClcbiAzOTE6XHR7XG4gMzkyOlx0XHRzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87XG4gMzkzOlx0XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiAzOTQ6XHRcdGludCBuZWVkX3NwYywgbGVuO1xuIDM5NTpcdFxuIDM5NjpcdFx0LyogSWYgdGhlIHJidWYgaXMgc21hbGwgb3IgcmN2IHdpbmRvdyBoYXMgY29sbGFwc2VkIHRvIDAgd2UgbmVlZFxuIDM5NzpcdFx0ICogdG8gcmVhZCB0aGUgZGF0YSBvdXQuIE90aGVyd2lzZSB0aGUgY29ubmVjdGlvbiB3aWxsIHN0YWxsLlxuIDM5ODpcdFx0ICogV2l0aG91dCBwcmVzc3VyZSB0aHJlc2hvbGQgb2YgSU5UX01BWCB3aWxsIG5ldmVyIGJlIHJlYWR5LlxuIDM5OTpcdFx0ICovXG4gNDAwOlx0XHRpZiAobGlrZWx5KHFzaG9ydCBcdTAwMjZcdTAwMjYgIXRjcF9lcG9sbGluX3JlYWR5KHN0cnAtXHUwMDNlc2ssIElOVF9NQVgpKSlcbiA0MDE6XHRcdFx0cmV0dXJuIDA7XG4gNDAyOlx0XG4gNDAzOlx0XHRzaGluZm8gPSBza2Jfc2hpbmZvKHN0cnAtXHUwMDNlYW5jaG9yKTtcbiA0MDQ6XHRcbiA0MDU6XHRcdC8qIElmIHdlIGRvbiYjMzk7dCBrbm93IHRoZSBsZW5ndGggZ28gbWF4IHBsdXMgcGFnZSBmb3IgY2lwaGVyIG92ZXJoZWFkICovXG4gNDA2Olx0XHRuZWVkX3NwYyA9IHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuID86IFRMU19NQVhfUEFZTE9BRF9TSVpFICYjNDM7IFBBR0VfU0laRTtcbiA0MDc6XHRcbiA0MDg6XHRcdGZvciAobGVuID0gbmVlZF9zcGM7IGxlbiBcdTAwM2UgMDsgbGVuIC09IFBBR0VfU0laRSkge1xuIDQwOTpcdFx0XHRwYWdlID0gYWxsb2NfcGFnZShzdHJwLVx1MDAzZXNrLVx1MDAzZXNrX2FsbG9jYXRpb24pO1xuIDQxMDpcdFx0XHRpZiAoIXBhZ2UpIHtcbiA0MTE6XHRcdFx0XHR0bHNfc3RycF9mbHVzaF9hbmNob3JfY29weShzdHJwKTtcbiA0MTI6XHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiA0MTM6XHRcdFx0fVxuIDQxNDpcdFxuIDQxNTpcdFx0XHRza2JfZmlsbF9wYWdlX2Rlc2Moc3RycC1cdTAwM2VhbmNob3IsIHNoaW5mby1cdTAwM2Vucl9mcmFncyYjNDM7JiM0MzssXG4gNDE2Olx0XHRcdFx0XHQgICBwYWdlLCAwLCAwKTtcbiA0MTc6XHRcdH1cbiA0MTg6XHRcbiA0MTk6XHRcdHNoaW5mby1cdTAwM2VmcmFnX2xpc3QgPSBOVUxMO1xuIDQyMDpcdFxuIDQyMTpcdFx0c3RycC1cdTAwM2Vjb3B5X21vZGUgPSAxO1xuIDQyMjpcdFx0c3RycC1cdTAwM2VzdG0ub2Zmc2V0ID0gMDtcbiA0MjM6XHRcbiA0MjQ6XHRcdHN0cnAtXHUwMDNlYW5jaG9yLVx1MDAzZWxlbiA9IDA7XG4gNDI1Olx0XHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2VkYXRhX2xlbiA9IDA7XG4gNDI2Olx0XHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2V0cnVlc2l6ZSA9IHJvdW5kX3VwKG5lZWRfc3BjLCBQQUdFX1NJWkUpO1xuIDQyNzpcdFxuIDQyODpcdFx0dGxzX3N0cnBfcmVhZF9jb3B5aW4oc3RycCk7XG4gNDI5Olx0XG4gNDMwOlx0XHRyZXR1cm4gMDtcbiA0MzE6XHR9XG4gNDMyOlx0XG4gNDMzOlx0c3RhdGljIGJvb2wgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsXG4gNDM0Olx0XHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGxlbilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTc3ODgKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRGl2aW5nIERlZXAgaW50byB0aGUgVExTIFN0cmluZyBQYXJzZXIqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGB0bHNfc3RycF9yZWFkX2NvcHlgLCBhbmQgaXQmIzM5O3Mga2V5IGZ1bmN0aW9uYWxpdHkgaW1tZWRpYXRlbHkganVtcHMgb3V0OiBJdCBmbGlwcyB0aGUgc3RycGFyc2VyIGludG8gYGNvcHlfbW9kZSA9IDFgLiBUaGF0JiMzOTtzIHRoZSBzaWduYWwgdG8gZ2V0IHNlcmlvdXMgYWJvdXQgZGF0YSBoYW5kbGluZy4gSXQgbG9va3MgbGlrZSBpdCBoYW5kbGVzIGFsbG9jYXRpb24gb2YgcGFnZXMsIGFuZCB0aGVuIGNhbGxzIGB0bHNfc3RycF9yZWFkX2NvcHlpbihzdHJwKWAuIE5vdywgdGhpcyBpcyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBgdGxzX3N0cnBfcmVhZF9jb3B5aW5gIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGFjdHVhbGx5ICpjb3BpZXMqIHRoZSBkYXRhLCByaWdodD8gSXQmIzM5O3MgdGFraW5nIGRhdGEgZnJvbSB0aGUgVENQIHJlY2VpdmUgcXVldWUgYW5kIHB1dHRpbmcgaXQgaW50byB0aG9zZSBmcmVzaGx5IGFsbG9jYXRlZCBwYWdlcy4KClRoaXMgc3VnZ2VzdHMgdGhhdCB0aGlzIHdob2xlIGFwcHJvYWNoIGlzIGJ1aWx0IHRvIGhhbmRsZSBzcGVjaWZpYywgcG90ZW50aWFsbHkgbWVzc3kgc2NlbmFyaW9zLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgbWl4ZWQgZGVjcnlwdGVkIGFuZCBub24tZGVjcnlwdGVkIGRhdGEgaW4gdGhlIFRDUCBxdWV1ZSwgb3IgcG90ZW50aWFsbHkgb3ZlcmxhcHBpbmcgc2VxdWVuY2UgbnVtYmVycy4gU3RhbmRhcmQgYHRjcF9yZWN2X3NrYmAgbWlnaHQgbm90IGJlIHRoZSBtb3N0IGVsZWdhbnQgc29sdXRpb24gd2hlbiB5b3UgaGF2ZSB0aG9zZSBjb21wbGV4aXRpZXMsIGVzcGVjaWFsbHkgaWYgd2Ugd2VyZSByZWx5aW5nIGRpcmVjdGx5IG9uIGBmcmFnX2xpc3RgLgoKSG9sZCBvbiBhIHNlY29uZCwgdGhvdWdoLiBJIHJlbWVtYmVyIGB0Y3BfcmVjdl9za2JgIGVzc2VudGlhbGx5IHJldHVybnMgdGhlIGZpcnN0IHNrYi4gSWYgd2UmIzM5O3JlIHVzaW5nIGBjb3B5X21vZGVgIGxpa2UgdGhpcywgd2UmIzM5O3JlIGxpa2VseSBsZXZlcmFnaW5nIHNvbWV0aGluZyBtb3JlIHJvYnVzdCwgcHJvYmFibHkgYHRjcF9yZWFkX3NvY2tgIG9yIHNpbWlsYXIsIHRvIGhhbmRsZSBhbGwgdGhvc2UgaW50cmljYWNpZXMgd2l0aCBvdmVybGFwcGluZyBzZWdtZW50cyBhbmQgZ2FwcyBpbiB0aGUgZGF0YSBzdHJlYW0gcHJvcGVybHkuIFRoYXQgbWFrZXMgc2Vuc2UuIFdl4oCZcmUgYmVpbmcgcHJvYWN0aXZlLgoKUmlnaHQsIHRpbWUgdG8gemVybyBpbiBvbiBgdGxzX3N0cnBfcmVhZF9jb3B5aW5gIGl0c2VsZiBhbmQgc2VlIGV4YWN0bHkgaG93IGl0IGFjaGlldmVzIHRoaXMgY2xlYW4gY29weS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIG1lY2hhbmljcyBpbiBkZXRhaWwgdG8gcmVhbGx5IGFwcHJlY2lhdGUgdGhlIGRlc2lnbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDMyNTpcdFx0XHRpZiAodW5saWtlbHkoc3ogXHUwMDI2XHUwMDI2IHN6IFx1MDAzYyBza2ItXHUwMDNlbGVuKSkge1xuIDMyNjpcdFx0XHRcdGludCBvdmVyID0gc2tiLVx1MDAzZWxlbiAtIHN6O1xuIDMyNzpcdFxuIDMyODpcdFx0XHRcdFdBUk5fT05fT05DRShvdmVyIFx1MDAzZSBjaHVuayk7XG4gMzI5Olx0XHRcdFx0c2tiLVx1MDAzZWxlbiAtPSBvdmVyO1xuIDMzMDpcdFx0XHRcdHNrYi1cdTAwM2VkYXRhX2xlbiAtPSBvdmVyO1xuIDMzMTpcdFx0XHRcdF9fcHNrYl90cmltKG5za2IsIG5za2ItXHUwMDNlbGVuIC0gb3Zlcik7XG4gMzMyOlx0XG4gMzMzOlx0XHRcdFx0Y2h1bmsgLT0gb3ZlcjtcbiAzMzQ6XHRcdFx0fVxuIDMzNTpcdFxuIDMzNjpcdFx0XHRzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiA9IHN6O1xuIDMzNzpcdFx0fVxuIDMzODpcdFxuIDMzOTpcdFx0cmV0dXJuIGNodW5rO1xuIDM0MDpcdH1cbiAzNDE6XHRcbiAzNDI6XHRzdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbihyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IHNrX2J1ZmYgKmluX3NrYixcbiAzNDM6XHRcdFx0XHQgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaXplX3QgaW5fbGVuKVxuIDM0NDpcdHtcbiAzNDU6XHRcdHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwID0gKHN0cnVjdCB0bHNfc3RycGFyc2VyICopZGVzYy1cdTAwM2VhcmcuZGF0YTtcbiAzNDY6XHRcdHN0cnVjdCBza19idWZmICpza2I7XG4gMzQ3Olx0XHRpbnQgcmV0O1xuIDM0ODpcdFxuIDM0OTpcdFx0aWYgKHN0cnAtXHUwMDNlbXNnX3JlYWR5KVxuIDM1MDpcdFx0XHRyZXR1cm4gMDtcbiAzNTE6XHRcbiAzNTI6XHRcdHNrYiA9IHN0cnAtXHUwMDNlYW5jaG9yO1xuIDM1MzpcdFx0aWYgKCFza2ItXHUwMDNlbGVuKVxuIDM1NDpcdFx0XHRza2JfY29weV9kZWNyeXB0ZWQoc2tiLCBpbl9za2IpO1xuIDM1NTpcdFx0ZWxzZVxuIDM1NjpcdFx0XHRzdHJwLVx1MDAzZW1peGVkX2RlY3J5cHRlZCB8PSAhIXNrYl9jbXBfZGVjcnlwdGVkKHNrYiwgaW5fc2tiKTtcbiAzNTc6XHRcbiAzNTg6XHRcdGlmIChJU19FTkFCTEVEKENPTkZJR19UTFNfREVWSUNFKSBcdTAwMjZcdTAwMjYgc3RycC1cdTAwM2VtaXhlZF9kZWNyeXB0ZWQpXG4gMzU5Olx0XHRcdHJldCA9IHRsc19zdHJwX2NvcHlpbl9za2Ioc3RycCwgc2tiLCBpbl9za2IsIG9mZnNldCwgaW5fbGVuKTtcbiAzNjA6XHRcdGVsc2VcbiAzNjE6XHRcdFx0cmV0ID0gdGxzX3N0cnBfY29weWluX2ZyYWcoc3RycCwgc2tiLCBpbl9za2IsIG9mZnNldCwgaW5fbGVuKTtcbiAzNjI6XHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbiAzNjM6XHRcdFx0ZGVzYy1cdTAwM2VlcnJvciA9IHJldDtcbiAzNjQ6XHRcdFx0cmV0ID0gMDtcbiAzNjU6XHRcdH1cbiAzNjY6XHRcbiAzNjc6XHRcdGlmIChzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiBcdTAwMjZcdTAwMjYgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4gPT0gc2tiLVx1MDAzZWxlbikge1xuIDM2ODpcdFx0XHRkZXNjLVx1MDAzZWNvdW50ID0gMDtcbiAzNjk6XHRcbiAzNzA6XHRcdFx0V1JJVEVfT05DRShzdHJwLVx1MDAzZW1zZ19yZWFkeSwgMSk7XG4gMzcxOlx0XHR9XG4gMzcyOlx0XG4gMzczOlx0XHRyZXR1cm4gcmV0O1xuIDM3NDpcdH1cbiAzNzU6XHRcbiAzNzY6XHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weWluKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIDM3NzpcdHtcbiAzNzg6XHRcdHJlYWRfZGVzY3JpcHRvcl90IGRlc2M7XG4gMzc5Olx0XG4gMzgwOlx0XHRkZXNjLmFyZy5kYXRhID0gc3RycDtcbiAzODE6XHRcdGRlc2MuZXJyb3IgPSAwO1xuIDM4MjpcdFx0ZGVzYy5jb3VudCA9IDE7IC8qIGdpdmUgbW9yZSB0aGFuIG9uZSBza2IgcGVyIGNhbGwgKi9cbiAzODM6XHRcbiAzODQ6XHRcdC8qIHNrIHNob3VsZCBiZSBsb2NrZWQgaGVyZSwgc28gb2theSB0byBkbyByZWFkX3NvY2sgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTkyNjYKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA1OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzaW5nOgoKKipBbmFseXppbmcgdGhlIGB0bHNfc3RycF9yZWFkX2NvcHlpbmAgRnVuY3Rpb24qKgoKQWxyaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIEkgc2VlIGlzIHRoYXQgYHRsc19zdHJwX3JlYWRfY29weWluYCBjYWxscyBgdGNwX3JlYWRfc29ja2Agd2l0aCB0aGUgYHRsc19zdHJwX2NvcHlpbmAgZnVuY3Rpb24gYXMgYSBjYWxsYmFjay4gVGhhdCYjMzk7cyBhIGtleSBwYXJ0IG9mIHRoZSBkYXRhIGZsb3csIHVzaW5nIGB0Y3BfcmVhZF9zb2NrYCB0byByZWFkIGZyb20gdGhlIHNvY2tldCBgc3RycC0mZ3Q7c2tgIGFuZCBjb3B5IHRoZSBkYXRhIHNvbWV3aGVyZSwgbGlrZWx5IHdpdGhpbiB0aGUgVExTIGNvbnRleHQuIEJ1dCwgSSBuZWVkIHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIHdob2xlIHBpY3R1cmUuIEkmIzM5O20gZ29pbmcgdG8gZGlnIGRlZXBlciBhbmQgc2VlIHdoYXQgdGhhdCBjYWxsYmFjayBkb2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzgwOlx0XHRkZXNjLmFyZy5kYXRhID0gc3RycDtcbiAzODE6XHRcdGRlc2MuZXJyb3IgPSAwO1xuIDM4MjpcdFx0ZGVzYy5jb3VudCA9IDE7IC8qIGdpdmUgbW9yZSB0aGFuIG9uZSBza2IgcGVyIGNhbGwgKi9cbiAzODM6XHRcbiAzODQ6XHRcdC8qIHNrIHNob3VsZCBiZSBsb2NrZWQgaGVyZSwgc28gb2theSB0byBkbyByZWFkX3NvY2sgKi9cbiAzODU6XHRcdHRjcF9yZWFkX3NvY2soc3RycC1cdTAwM2VzaywgXHUwMDI2ZGVzYywgdGxzX3N0cnBfY29weWluKTtcbiAzODY6XHRcbiAzODc6XHRcdHJldHVybiBkZXNjLmVycm9yO1xuIDM4ODpcdH1cbiAzODk6XHRcbiAzOTA6XHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBxc2hvcnQpXG4gMzkxOlx0e1xuIDM5MjpcdFx0c3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqc2hpbmZvO1xuIDM5MzpcdFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gMzk0Olx0XHRpbnQgbmVlZF9zcGMsIGxlbjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTk3NjEKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAxMDEwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgVnVsbmVyYWJpbGl0eSBpbiBUQ1AgUXVldWUgSGFuZGxpbmcqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiB0aGlua2luZyB0aHJvdWdoIHRoaXMgaXNzdWUuIFRoZSBjb3JlIHByb2JsZW0gbGllcyBpbiBob3cgd2UgaGFuZGxlIHBvdGVudGlhbGx5IG1hbGZvcm1lZCBUQ1AgcmVjZWl2ZSBxdWV1ZXMsIHNwZWNpZmljYWxseSB3aGVuIHRoZXkgY29udGFpbiBvdmVybGFwcywgZ2Fwcywgb3IgbWl4ZWQgZGVjcnlwdGVkIGRhdGEuIEkmIzM5O3ZlIGNvbmZpcm1lZCB0aGF0IGB0Y3BfcmVhZF9zb2NrYCBjb3JyZWN0bHkgaGFuZGxlcyBhbGwgdGhlc2UgZWRnZSBjYXNlcywgd2hpY2ggaXMgZ29vZC4gVGhlIGNydXggaXMgdGhhdCBpZiB0aGUgcXVldWUgaXNuJiMzOTt0ICYjMzQ7Y2xlYW4mIzM0OyDigJMgbWVhbmluZyBpdCBoYXMgdGhvc2UgaXNzdWVzIOKAkyB3ZSAqbXVzdCogdXNlIGB0Y3BfcmVhZF9zb2NrYCB2aWEgYGNvcHlfbW9kZWAuCgpUaGUgaXNzdWUgYXJpc2VzIGZyb20gaG93IGB0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlYCB1c2VzIGBmcmFnX2xpc3RgIGRpcmVjdGx5LiBJdCBhcHBlYXJzIHRoYXQgaWYgdGhlIHF1ZXVlIGlzIG1hbGZvcm1lZCwgd2UgY291bGQgZW5kIHVwIHJlYWRpbmcgZ2FyYmFnZSBvciBjcmFzaGluZyBpZiB3ZSBjYWxsIGB0bHNfcnhfbXNnX3NpemVgIG9uIHRoZSBtYWxmb3JtZWQgcXVldWUuICBUaGUgZnVuY3Rpb24gYHNrYl9jb3B5X2JpdHNgLCBpbiBwYXJ0aWN1bGFyLCB3b3JyaWVzIG1lLiBJdCBqdXN0IGl0ZXJhdGVzIG92ZXIgdGhlIGZyYWdzIGluIGFuIHNrYiB0aGVuIHRoZSBgZnJhZ19saXN0YCBhcyBpZiB0aGV5IGFyZSBjb250aWd1b3VzIG1lbW9yeSByZWdpb25zLiBJZiB0aGVzZSBmcmFncyBvdmVybGFwIOKAkyBhcyBjYW4gaGFwcGVuIHdpdGggcmV0cmFuc21pc3Npb25zIG9yIG91dC1vZi1vcmRlciBwYWNrZXRzIHRoYXQgaGF2ZW4mIzM5O3QgYmVlbiBjb21wbGV0ZWx5IGNvbGxhcHNlZCDigJMgYHNrYl9jb3B5X2JpdHNgIHdpbGwgc2ltcGx5IHJlYWQgdGhlbSBjb250aWd1b3VzbHksIHdoaWNoIHdpbGwgbGVhZCB0byBpbmNvcnJlY3QgZGF0YSBiZWluZyByZWFkLgoKVGhpcywgaW4gdHVybiwgY2FuIGNvbXB1dGUgYW4gaW5jb3JyZWN0IGBzemAgYW5kIHRoZW4gY2F1c2UgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UuIFNwZWNpZmljYWxseSwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgd3JvbmcgdmFsdWUgZm9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBxdWV1ZSwgb3IgY2FsY3VsYXRlZCBgc3pgLiBJZiB0aGlzIGBzemAgaXMgYSBsYXJnZSB2YWx1ZSwgYW5kIHRoZSBxdWV1ZSBhY3R1YWxseSBoYXMgYSBzbWFsbGVyIGFtb3VudCBvZiBkYXRhLCB0aGUgY29kZSB3aWxsIHRyeSB0byBpdGVyYXRlIG92ZXIgc2tiLSZndDtuZXh0IHBhc3QgdGhlIGVuZCBvZiB0aGUgZGF0YS4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBhdHRlbXB0IHRvIGRlcmVmZXJlbmNlIGEgTlVMTCBwb2ludGVyIGluIHRoZSBgVENQX1NLQl9DQihza2IpLSZndDtzZXFgIGZpZWxkLCB3aGljaCB3aWxsIHRyaWdnZXIgYSBjcmFzaC4gVGhlIGtlcm5lbCYjMzk7cyBLQVNBTiB3aWxsIGNhdGNoIHRoaXMuCgpJbml0aWFsbHksIEkgd2FzIGNvbmNlcm5lZCBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gQnV0IGBza2JfY29weV9iaXRzYCB3aWxsIG9ubHkgcmVhZCAqaW5pdGlhbGl6ZWQqIGJ5dGVzIGZyb20gdGhlIGBmcmFnX2xpc3RgLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IHdpbGwgcmVhZCB0aGUgKndyb25nKiBieXRlcywgbGVhZGluZyB0byB0aGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLCBhcyBkZXNjcmliZWQgYWJvdmUuCgpJIHdhcyBjb25zaWRlcmluZyB0aGUgY2FzZSB3aGVyZSBgc3pgIG1pZ2h0IGJlIHNtYWxsLCBidXQgdGhlIHF1ZXVlIGhhcyBvdmVybGFwcywgYnV0IHRoZW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aWxsIGRldGVjdCB0aGUgb3ZlcmxhcHMsIGFuZCByZXR1cm4gYGZhbHNlYCwgd2hpY2ggd2lsbCBjYWxsIGB0bHNfc3RycF9yZWFkX2NvcHlgIGV2ZW50dWFsbHkuIFNvIHRoaXMgd291bGRuJiMzOTt0IGJlIGEgcHJvYmxlbS4KCkhvd2V2ZXIsIEkganVzdCByZWFsaXplZCB0aGF0IHRoZSBjb2RlIGhhcyBhIGNyaXRpY2FsIGNoZWNrLiBgdGxzX3N0cnBfcmVhZF9zb2NrYCBjaGVja3MgaWYgdGhlcmUgYXJlIGVub3VnaCBieXRlcyBpbiB0aGUgcXVldWUgYmVmb3JlIGV2ZW4gY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBJZiB0aGVyZSBhcmVuJiMzOTt0IGVub3VnaCBieXRlcywgaXQgcmV0dXJucyBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggY2FsbHMgYHRsc19zdHJwX3JlYWRfY29weWluYC4gU28gaXQgZG9lc24mIzM5O3QgY3Jhc2ggaW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCEgVGhlbiB3aGF0IGlzIHRoZSBidWc/IEkgbmVlZCB0byByZS1yZWFkIHRoZSBwYXRjaC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDUyMDpcdFx0aWYgKHVubGlrZWx5KHN0cnAtXHUwMDNlY29weV9tb2RlKSlcbiA1MjE6XHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weWluKHN0cnApO1xuIDUyMjpcdFxuIDUyMzpcdFx0aWYgKGlucSBcdTAwM2Mgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pXG4gNTI0Olx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gNTI1Olx0XG4gNTI2Olx0XHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XG4gNTI3Olx0XHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG4gNTI4Olx0XHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbiA1Mjk6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuIDUzMDpcdFxuIDUzMTpcdFx0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCAmIzQzOyBUTFNfSEVBREVSX1NJWkUpKVxuIDUzMjpcdFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuIDUzMzpcdFxuIDUzNDpcdFx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVx1MDAzZWFuY2hvcik7XG4gNTM1Olx0XHRcdGlmIChzeiBcdTAwM2MgMClcbiA1MzY6XHRcdFx0XHRyZXR1cm4gc3o7XG4gNTM3Olx0XG4gNTM4Olx0XHRcdHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XG4gNTM5Olx0XG4gNTQwOlx0XHRcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4gfHwgaW5xIFx1MDAzYyBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbilcbiA1NDE6XHRcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuIDU0MjpcdFx0fVxuIDU0MzpcdFxuIDU0NDpcdFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0Mzsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxuIDU0NTpcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcbiA1NDY6XHRcbiA1NDc6XHRcdFdSSVRFX09OQ0Uoc3RycC1cdTAwM2Vtc2dfcmVhZHksIDEpO1xuIDU0ODpcdFxuIDU0OTpcdFx0cmV0dXJuIDA7XG4gNTUwOlx0fVxuIDU1MTpcdFxuIDU1MjpcdC8qIFBhcnNlIHF1ZXVlZCBkYXRhLiBXaGVuIEBhbm5vdW5jZSBpcyB0cnVlIGFuZCBwYXJzaW5nIHByb2R1Y2VzIGFcbiA1NTM6XHQgKiBuZXdseS1yZWFkeSByZWNvcmQsIGZpcmUgdGhlIGNvbnN1bWVyIG5vdGlmaWNhdGlvbi4gQ2FsbGVycyB0aGF0XG4gNTU0Olx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjA3MQoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDE2MDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUTFMgQ29ubmVjdGlvbiBGYWlsdXJlIHdpdGggVENQIE92ZXJsYXBzKioKCk9rYXksIGhlcmUmIzM5O3Mgd2hhdCYjMzk7cyBoYXBwZW5pbmcuIExvb2tpbmcgYXQgdGhlIG9sZCBjb2RlLCBiZWZvcmUgdGhlIHBhdGNoLCB0aGUgbG9naWMgY2FsbHMgYHRsc19yeF9tc2dfc2l6ZWAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBUTFMgaGVhZGVyIGZyb20gdGhlIHJlY2VpdmUgcXVldWUuICBUaGUgcHJvYmxlbSBhcmlzZXMgd2hlbiB0aGVyZSBhcmUgb3ZlcmxhcHBpbmcgVENQIHNlZ21lbnRzIOKAkyBjb21tb24gd2l0aCByZXRyYW5zbWlzc2lvbnMg4oCTIGJlY2F1c2UgYHRsc19yeF9tc2dfc2l6ZWAgYXNzdW1lcyBhIGNvbnRpZ3VvdXMgYnVmZmVyLgoKU3BlY2lmaWNhbGx5LCBgdGxzX3J4X21zZ19zaXplYCB1c2VzIGBza2JfY29weV9iaXRzYC4gV2hlbiB0aGUgVENQIHJlY2VpdmUgcXVldWUgY29udGFpbnMgb3ZlcmxhcHBpbmcgU0tCcyAoU29ja2V0IEJ1ZmZlcnMpLCBgc2tiX2NvcHlfYml0c2AgbWlnaHQgcmVhZCB0aGUgKndyb25nKiBieXRlcyBmb3IgdGhlIFRMUyBoZWFkZXIuIFRoaXMgY2FuIGxlYWQgdG8gYSBjb3JydXB0ZWQgaGVhZGVyIGJlaW5nIHJlYWQuIElmIGB0bHNfcnhfbXNnX3NpemVgIGludGVycHJldHMgdGhlc2UgaW5jb3JyZWN0IGJ5dGVzIGFzIGFuIGludmFsaWQgVExTIGhlYWRlciwgaXQgY2FuIHJldHVybiBhbiBlcnJvciBjb2RlIGxpa2UgYC1FSU5WQUxgLiBUaGlzIGVycm9yIHRoZW4gYnViYmxlcyB1cCwgZXZlbnR1YWxseSBjYXVzaW5nIHRoZSBUTFMgY29ubmVjdGlvbiB0byBmYWlsIG9yIHN0YWxsLCBidXQgdGhlIHVuZGVybHlpbmcgVENQIGNvbm5lY3Rpb24gaXMgYWN0dWFsbHkgcGVyZmVjdGx5IGZpbmUuCgpUaGUgYnVnIGlzIHRoYXQgd2UmIzM5O3JlIGFib3J0aW5nIGEgVExTIGNvbm5lY3Rpb24gc3B1cmlvdXNseSB3aGVuIHRoZSBUQ1Agc3RhY2sgaXMgZG9pbmcgaXRzIGpvYiBieSBoYW5kbGluZyByZXRyYW5zbWlzc2lvbnMuIFRoZSBjb3JyZWN0IGFwcHJvYWNoIGlzIHRvIGhhbmRsZSBvdmVybGFwcGluZyBzZWdtZW50cywgd2hpY2ggaXMgY29tbW9uIGluIFRDUCBhbmQgbm90IG5lY2Vzc2FyaWx5IGluZGljYXRpdmUgb2YgYSBwcm9ibGVtLgoKVGhlIGZpeCBJJiMzOTt2ZSBpbXBsZW1lbnRlZCAoYWRkaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIGFkZHJlc3NlcyB0aGlzLiBCeSBjaGVja2luZyBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyAmIzM0O09LJiMzNDsgKmJlZm9yZSogYXR0ZW1wdGluZyB0byByZWFkIHRoZSBoZWFkZXIsIHdlIGNhbiBub3cgZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBvdmVybGFwcGluZyBzZWdtZW50cy4gSWYgdGhlIHF1ZXVlIGlzIG5vdCBPSywgd2UgY2FuIHN3aXRjaCB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggY29ycmVjdGx5IHVzZXMgYHRjcF9yZWFkX3NvY2tgIHRvIHJlYWQgdGhlIGRhdGEsIGhhbmRsaW5nIHRoZSBvdmVybGFwcGluZyBzZWdtZW50cy4KCkkgd2VudCBiYWNrIGFuZCBjaGVja2VkIGlmIHRoZXJlJiMzOTtzIGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLCBidXQgaXQmIzM5O3Mgbm90IHRoZSBjYXNlLiBgc2tiX2NvcHlfYml0c2AgaXMgc2FmZS4gQWxsIHRoZSBkYXRhIGZyb20gdGhlIG5ldHdvcmsgaXMgaW5pdGlhbGl6ZWQuIFRoZXJlIGlzIG5vIEtNU0FOIGJ1ZyBoZXJlLiBJdCYjMzk7cyBhIGxvZ2ljIGJ1ZyByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgdGhlIG92ZXJsYXBwaW5nIGRhdGEuCgpJIGFsc28gY2hlY2tlZCBpZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGNvdWxkIGNhdXNlIGFuIG91dC1vZi1ib3VuZHMgcmVhZC4gSW4gdGhlIHdoaWxlIGxvb3AsIGlmIGBsZW5gIHdoaWNoIGlzIGBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRWAgaXMgbGFyZ2VyIHRoYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZnJhZ19saXN0LCB0aGUgYHNrYmAgYmVjb21lcyBOVUxMLiBUaGVuIGRlcmVmZXJlbmNpbmcgaXQgY2F1c2VzIGEga2VybmVsIGNyYXNoLgpJbiB0aGUgbmV3IGNvZGUsIGBsZW5gIGlzIGBzdHJwLSZndDtzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRWAsIGFuZCBgaW5xYCBpcyBgdGNwX2lucShzdHJwLSZndDtzaylgLiBTaW5jZSBgaW5xYCBpcyB0aGUgc3VtIG9mIGBza2ItJmd0O2xlbmAgYW5kIHNpbmNlIHdlIGNoZWNrIGBpbnEgJmd0Oz0gVExTX0hFQURFUl9TSVpFYCBiZWZvcmUgdGhpcyBjYWxsLCBhbmQgc2luY2UgaXQgY2FsbHMgYHRsc19zdHJwX3JlYWRfY29weWAgaWYgYGlucSAmbHQ7IFRMU19IRUFERVJfU0laRWAsIGBsZW5gIGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBgZnJhZ19saXN0YCBiZWNhdXNlIGB0Y3BfaW5xYCBpcyBleGFjdGx5IHRoZSBzdW0gb2YgYHNrYi0mZ3Q7bGVuYCBpbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gVGh1cywgYGxlbmAgY2FuJiMzOTt0IGJlIGxhcmdlciB0aGFuIHRoZSBmcmFnIGxpc3QmIzM5O3MgdG90YWwgbGVuZ3RoLgoKSW4gc3VtbWFyeSwgdGhlIGtleSBpcyBwcmV2ZW50aW5nIHRoYXQgZXJyb3IgcmV0dXJuIGJ5IGNoZWNraW5nIGZvciBvdmVybGFwICpiZWZvcmUqIHJlYWRpbmcgdGhlIFRMUyBoZWFkZXIsIHRodXMgbWFpbnRhaW5pbmcgdGhlIGludGVncml0eSBvZiB0aGUgVENQIGNvbm5lY3Rpb24gYW5kIGF2b2lkaW5nIHNwdXJpb3VzIGNvbm5lY3Rpb24gZmFpbHVyZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RjcF9pbnEmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvaXB2NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L2lwdjQvdGNwLmM9NjM5PWludCB0Y3BfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCBpbnQgKmthcmcpXG4tLVxubmV0L2lwdjQvdGNwLmMtNjUwLVx0XHRzbG93ID0gbG9ja19zb2NrX2Zhc3Qoc2spO1xubmV0L2lwdjQvdGNwLmM6NjUxOlx0XHRhbnN3ID0gdGNwX2lucShzayk7XG5uZXQvaXB2NC90Y3AuYy02NTItXHRcdHVubG9ja19zb2NrX2Zhc3Qoc2ssIHNsb3cpO1xuLS1cbm5ldC9pcHY0L3RjcC5jPTE4MjM9aW50IHRjcF9wZWVrX2xlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrKVxubmV0L2lwdjQvdGNwLmMtMTgyNC17XG5uZXQvaXB2NC90Y3AuYzoxODI1Olx0cmV0dXJuIHRjcF9pbnEoc29jay1cdTAwM2Vzayk7XG5uZXQvaXB2NC90Y3AuYy0xODI2LX1cbi0tXG5uZXQvaXB2NC90Y3AuYz0yMTk1PXN0YXRpYyBpbnQgdGNwX3plcm9jb3B5X3JlY2VpdmUoc3RydWN0IHNvY2sgKnNrLFxuLS1cbm5ldC9pcHY0L3RjcC5jLTIyMDktXHR1MzIgdG90YWxfYnl0ZXNfdG9fbWFwO1xubmV0L2lwdjQvdGNwLmM6MjIxMDpcdGludCBpbnEgPSB0Y3BfaW5xKHNrKTtcbm5ldC9pcHY0L3RjcC5jLTIyMTEtXHRib29sIG1tYXBfbG9ja2VkO1xuLS1cbm5ldC9pcHY0L3RjcC5jPTIzNDY9dm9pZCB0Y3BfcmVjdl90aW1lc3RhbXAoc3RydWN0IG1zZ2hkciAqbXNnLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXG4tLVxubmV0L2lwdjQvdGNwLmMtMjQxMi1cbm5ldC9pcHY0L3RjcC5jOjI0MTM6c3RhdGljIGludCB0Y3BfaW5xX2hpbnQoc3RydWN0IHNvY2sgKnNrKVxubmV0L2lwdjQvdGNwLmMtMjQxNC17XG4tLVxubmV0L2lwdjQvdGNwLmM9MjkzMD1pbnQgdGNwX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncylcbi0tXG5uZXQvaXB2NC90Y3AuYy0yOTUwLVx0XHRpZiAoKGNtc2dfZmxhZ3MgXHUwMDI2IFRDUF9DTVNHX0lOUSkgfCBtc2ctXHUwMDNlbXNnX2dldF9pbnEpIHtcbm5ldC9pcHY0L3RjcC5jOjI5NTE6XHRcdFx0bXNnLVx1MDAzZW1zZ19pbnEgPSB0Y3BfaW5xX2hpbnQoc2spO1xubmV0L2lwdjQvdGNwLmMtMjk1Mi1cdFx0XHRpZiAoY21zZ19mbGFncyBcdTAwMjYgVENQX0NNU0dfSU5RKVxuLS1cbm5ldC9pcHY0L3RjcC5jPTQ0ODE9aW50IGRvX3RjcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLFxuLS1cbm5ldC9pcHY0L3RjcC5jLTQ3OTgtemVyb2NvcHlfcmN2X2lucTpcbm5ldC9pcHY0L3RjcC5jOjQ3OTk6XHRcdHpjLmlucSA9IHRjcF9pbnFfaGludChzayk7XG5uZXQvaXB2NC90Y3AuYy00ODAwLXplcm9jb3B5X3Jjdl9vdXQ6XG4tLVxubmV0L2lwdjQvdGNwX2JwZi5jPTMzNT1zdGF0aWMgaW50IHRjcF9icGZfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCBpbnQgKmthcmcpXG4tLVxubmV0L2lwdjQvdGNwX2JwZi5jLTM2MC1cdCAgICAhUkVBRF9PTkNFKHBzb2NrLVx1MDAzZXByb2dzLnNrYl92ZXJkaWN0KSlcbm5ldC9pcHY0L3RjcF9icGYuYzozNjE6XHRcdCprYXJnICYjNDM7PSB0Y3BfaW5xKHNrKTtcbm5ldC9pcHY0L3RjcF9icGYuYy0zNjItXHRza19wc29ja19wdXQoc2ssIHBzb2NrKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjUyMjkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkludmVzdGlnYXRpbmcgYHRjcF9pbnFgKioKCk9rYXksIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSYjMzk7bSB0aGlua2luZywgYmVmb3JlIEkgcHJvY2VlZCBmdXJ0aGVyLCBJIG5lZWQgdG8gbmFpbCBkb3duIGV4YWN0bHkgd2hhdCBgdGNwX2lucWAgcmVwcmVzZW50cy4gSXQmIzM5O3MgY3J1Y2lhbCB0byBoYXZlIGEgcm9jay1zb2xpZCBkZWZpbml0aW9uIGhlcmUsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggbG93LWxldmVsIG5ldHdvcmsgcGVyZm9ybWFuY2Ugb3IgZGlhZ25vc3RpY3MuIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4gSSB1bmRlcnN0YW5kIGl0cyBzcGVjaWZpYyBtZWFuaW5nIGluIHRoZSBjb250ZXh0IEkmIzM5O20gd29ya2luZyB3aXRoLCB3aGV0aGVyIHRoYXQmIzM5O3Mgd2l0aGluIHRoZSBrZXJuZWwsIGluIGEgc3BlY2lmaWMgbW9uaXRvcmluZyB0b29sLCBvciBpbiBhIHRoZW9yZXRpY2FsIGRpc2N1c3Npb24uIENvbnRleHQgaXMga2luZywgYXMgYWx3YXlzLCBidXQgdW5kZXJzdGFuZGluZyB0aGUgcHJlY2lzZSBzZW1hbnRpY3Mgb2YgYHRjcF9pbnFgIGlzIHRoZSBmb3VuZGF0aW9uLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCB0aGUgc3RhbmRhcmQgZGVmaW5pdGlvbiwgYW5kIHRoZW4gZGl2ZSBpbnRvIHRoZSByZWxldmFudCBzb3VyY2UgY29kZSBvciBkb2N1bWVudGF0aW9uIHRvIGNvbmZpcm0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2ludCB0Y3BfaW5xJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L3RjcC5oPTI3MzY9c3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfdGNwX3B1cmVfYWNrKHN0cnVjdCBza19idWZmICpza2IpXG4tLVxuaW5jbHVkZS9uZXQvdGNwLmgtMjc0MC1cbmluY2x1ZGUvbmV0L3RjcC5oOjI3NDE6c3RhdGljIGlubGluZSBpbnQgdGNwX2lucShzdHJ1Y3Qgc29jayAqc2spXG5pbmNsdWRlL25ldC90Y3AuaC0yNzQyLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjU1NTIKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQW5hbHl6aW5nIHRoZSBgdGNwX2lucWAgVmFyaWFibGUqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiAmIzM0O0xldCYjMzk7cyByZWFkIGB0Y3BfaW5xYCYjMzQ7IOKAkyB0aGF0JiMzOTtzIHRoZSBzdGFydGluZyBwb2ludC4gSSBpbW1lZGlhdGVseSBrbm93IHdlJiMzOTtyZSB0YWxraW5nIGFib3V0IGEgdmFyaWFibGUsIGxpa2VseSB3aXRoaW4gYSBuZXR3b3JrIHN0YWNrJiMzOTtzIGltcGxlbWVudGF0aW9uLiBUaGUgYHRjcF9gIHByZWZpeCBzdHJvbmdseSBzdWdnZXN0cyBpdCYjMzk7cyByZWxhdGVkIHRvIFRDUCwgYW5kIHRoZSBgaW5xYCBzdWZmaXggcHJvYmFibHkgcG9pbnRzIHRvIHNvbWV0aGluZyBhYm91dCB0aGUgaW5jb21pbmcgcXVldWUuCgpNeSBicmFpbiYjMzk7cyBhbHJlYWR5IHN0YXJ0aW5nIHRvIGZpbGwgaW4gdGhlIGJsYW5rcy4gSXMgdGhpcyBhIGtlcm5lbC1sZXZlbCB2YXJpYWJsZT8gVXNlci1zcGFjZT8gV2hhdCBhcmNoaXRlY3R1cmUgYXJlIHdlIGRlYWxpbmcgd2l0aD8gVGhlIHNwZWNpZmljIGNvbnRleHQgd291bGQgbWFrZSBhIGh1Z2UgZGlmZmVyZW5jZSBpbiBob3cgSSBpbnRlcnByZXQgaXQuIEFyZSB3ZSBsb29raW5nIGF0IGEgcGVyLXNvY2tldCB2YWx1ZSwgYSBnbG9iYWwgc3lzdGVtIHN0YXRpc3RpYywgb3Igc29tZXRoaW5nIG1vcmUgbnVhbmNlZD8KCkkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGltcGxpY2F0aW9ucy4gYHRjcF9pbnFgIGNvdWxkIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHF1ZXVlZCBmb3IgcmVjZXB0aW9uLCB0aGUgbnVtYmVyIG9mIHBhY2tldHMsIHBlcmhhcHMgYSBjb3VudCBvZiBvdXRzdGFuZGluZyBhY2tub3dsZWRnZW1lbnRzLCBvciBldmVuIGEgbWVhc3VyZSBvZiBidWZmZXJpbmcgcHJlc3N1cmUuIEl04oCZcyBwcm9iYWJseSBhIGNyaXRpY2FsIHBlcmZvcm1hbmNlIG1ldHJpYywgcmVmbGVjdGluZyB0aGUgZWZmaWNpZW5jeSBvZiB0aGUgVENQIHJlY2VpdmUgcGF0aC4gSSYjMzk7bSBrZWVuIHRvIHNlZSB0aGUgY29kZSB3aGVyZSBpdCYjMzk7cyB1c2VkLiBBbnkgY29uZ2VzdGlvbiBjb250cm9sIG1lY2hhbmlzbXMgbWlnaHQgaGF2ZSBhIGRlcGVuZGVuY3kgb24gdGhlIGluZm9ybWF0aW9uIGl0IGNvbnRhaW5zLgoKVGhlIGNvcmUgcXVlc3Rpb24gbm93IGlzOiBXaGF0IGRvZXMgKml0KiB0ZWxsIHVzPyBXaHkgYXJlIHdlIHJlYWRpbmcgaXQ/IFdoYXQgcHJvYmxlbSBhcmUgd2UgdHJ5aW5nIHRvIHNvbHZlIG9yIHVuZGVyc3RhbmQ/IElzIHRoaXMgcGFydCBvZiBhIGRlYnVnZ2luZyBleGVyY2lzZSwgcGVyZm9ybWFuY2UgdHVuaW5nLCBvciBuZXR3b3JrIG1vbml0b3Jpbmc/IFRoZSByZWFzb25zIGZvciB0aGUgcmVhZGluZyB3aWxsIGhlYXZpbHkgaW5mbHVlbmNlIG15IGFuYWx5c2lzIG9mIGl0LiBJcyB0aGVyZSBzb21ldGhpbmcgd2UgZXhwZWN0IHRvIGZpbmQsIG9yIGFyZSB3ZSBqdXN0IGhvcGluZyB0byBvYnRhaW4gYSBiYXNlbGluZSBudW1iZXIgdG8gYmUgdXNlZCBmb3IgY29tcGFyaXNvbj8gSSYjMzk7bSBleGNpdGVkIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uIGJlY2F1c2UsIGZvciBteSBmaWVsZCwgdGhpcyB2YXJpYWJsZSBpcyBhYnNvbHV0ZWx5IHZpdGFsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L3RjcC5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjc0MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNzQxOlx0c3RhdGljIGlubGluZSBpbnQgdGNwX2lucShzdHJ1Y3Qgc29jayAqc2spXG4yNzQyOlx0e1xuMjc0MzpcdFx0c3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7XG4yNzQ0Olx0XHRpbnQgYW5zdztcbjI3NDU6XHRcbjI3NDY6XHRcdGlmICgoMSBcdTAwM2NcdTAwM2Mgc2stXHUwMDNlc2tfc3RhdGUpIFx1MDAyNiAoVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKSB7XG4yNzQ3Olx0XHRcdGFuc3cgPSAwO1xuMjc0ODpcdFx0fSBlbHNlIGlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfVVJHSU5MSU5FKSB8fFxuMjc0OTpcdFx0XHQgICAhdHAtXHUwMDNldXJnX2RhdGEgfHxcbjI3NTA6XHRcdFx0ICAgYmVmb3JlKHRwLVx1MDAzZXVyZ19zZXEsIHRwLVx1MDAzZWNvcGllZF9zZXEpIHx8XG4yNzUxOlx0XHRcdCAgICFiZWZvcmUodHAtXHUwMDNldXJnX3NlcSwgdHAtXHUwMDNlcmN2X254dCkpIHtcbjI3NTI6XHRcbjI3NTM6XHRcdFx0YW5zdyA9IHRwLVx1MDAzZXJjdl9ueHQgLSB0cC1cdTAwM2Vjb3BpZWRfc2VxO1xuMjc1NDpcdFxuMjc1NTpcdFx0XHQvKiBTdWJ0cmFjdCAxLCBpZiBGSU4gd2FzIHJlY2VpdmVkICovXG4yNzU2Olx0XHRcdGlmIChhbnN3IFx1MDAyNlx1MDAyNiBzb2NrX2ZsYWcoc2ssIFNPQ0tfRE9ORSkpXG4yNzU3Olx0XHRcdFx0YW5zdy0tO1xuMjc1ODpcdFx0fSBlbHNlIHtcbjI3NTk6XHRcdFx0YW5zdyA9IHRwLVx1MDAzZXVyZ19zZXEgLSB0cC1cdTAwM2Vjb3BpZWRfc2VxO1xuMjc2MDpcdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjMxNAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDMxNzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFBvdGVudGlhbCBJc3N1ZXMgd2l0aCBUTFMvVENQIEhhbmRsaW5nKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEl0IHNlZW1zIHdlJiMzOTtyZSBsb29raW5nIGF0IGEgc2NlbmFyaW8gd2hlcmUgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gVExTIGFuZCBUQ1AgcmVjZWl2ZSBxdWV1ZXMgbWlnaHQgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBob3cgd2UgaGFuZGxlIG92ZXJsYXBwaW5nIFRDUCBzZWdtZW50cy4KCkZpcnN0LCBgdGNwX2lucWAgcHJvdmlkZXMgdGhlICpsb2dpY2FsKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSByZWNlaXZlIHF1ZXVlLCBjb25zaWRlcmluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIHNwYWNlLiBIb3dldmVyLCB3aGVuIG92ZXJsYXBwaW5nIFNLQnMgYXJlIHByZXNlbnQsIHRoZSAqcGh5c2ljYWwqIHN1bSBvZiBgc2tiLSZndDtsZW5gIHZhbHVlcyBjYW4gYmUgbGFyZ2VyLiBUaGUgaW1wb3J0YW50IHBvaW50IGlzIGBpbnFgICh0aGUgYHRjcF9pbnFgIHZhbHVlKSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgaW4tb3JkZXIgYnl0ZXMuCgpJZiBgaW5xYCBpcyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgVExTIGhlYWRlciAoYFRMU19IRUFERVJfU0laRWApLCB3ZSBhcmUgc2FmZSB0byBiZWdpbiBvdXIgcHJvY2Vzc2luZy4gV2Uga25vdyB0aGUgc3VtIG9mIGBza2ItJmd0O2xlbmAgaXMgYXQgKmxlYXN0KiBlcXVhbCB0byBgaW5xYCwgc28gbm8gbnVsbCBgc2tiYCBpcyBleHBlY3RlZC4KCk5vdywgdGhlIG9sZCBjb2RlJiMzOTtzIGxvZ2ljIGlzIGNvbmNlcm5pbmcuIElmIHRoZSBjYWxjdWxhdGVkIG1lc3NhZ2Ugc2l6ZSBgc3pgIChkZXJpdmVkIGZyb20gdGhlIFRMUyBoZWFkZXIpIGlzIGxhcmdlciB0aGFuIGBpbnFgLCB0aGUgY29kZSBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBUaGlzIGZ1bmN0aW9uIHV0aWxpemVzIGB0Y3BfcmVhZF9zb2NrYCB3aGljaCBoYW5kbGVzIG92ZXJsYXBwaW5nIHNlZ21lbnRzIHByb3Blcmx5LiBUaGVyZWZvcmUsIGluIHRoZSAqb2xkKiBjb2RlLCB3ZSB3ZXJlICpuZXZlciogY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHdpdGggYSBzaXplIGxhcmdlciB0aGFuIHdoYXQgd2FzIGF2YWlsYWJsZS4KCldoZW4gYGlucSAmZ3Q7PSBzemAsIHdlIGNhbGwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYC4gU2luY2UgYHNrYmAgaXMgbmV2ZXIgTlVMTCAoYmVjYXVzZSB0aGUgcGh5c2ljYWwgYnl0ZXMgYXJlIGF0IGxlYXN0IHRoZSBsb2dpY2FsIGJ5dGVzKSwgdGhpcyBjb25kaXRpb24gc2hvdWxkIHdvcmsuCgpIb3dldmVyLCB0aGUgcmVhbCBwcm9ibGVtIGFyaXNlcyB3aGVuIGFuYWx5emluZyB0aGUgcHVycG9zZSBvZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBJdCBleGFtaW5lcyB0aGUgVENQIHF1ZXVlLiBUaGUga2V5IGlzIHRoZSBjb25kaXRpb24gYFRDUF9TS0JfQ0Ioc2tiKS0mZ3Q7c2VxICE9IHNlcWAuIElmIHdlIGhhdmUgb3ZlcmxhcHBpbmcgc2VnbWVudHMsIHRoaXMgY29uZGl0aW9uIHdpbGwgYmUgdHJ1ZSwgYXMgVENQIHNlcXVlbmNlIG51bWJlcnMgd2lsbCBub3QgYWxpZ24gYXMgZXhwZWN0ZWQuIFRoaXMgY2hlY2sgaXMgZGVzaWduZWQgdG8gY2F0Y2ggb3ZlcmxhcHBpbmcgc2VnbWVudHMuIElmIG92ZXJsYXBwaW5nIHNlZ21lbnRzIGFyZSBkZXRlY3RlZCwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCByZXR1cm5zIGBmYWxzZWAsIGNhdXNpbmcgYSBmYWxsYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggdXNlcyBgdGNwX3JlYWRfc29ja2AuCgpUaGUgY29yZSBsb2dpYyBvZiB0aGUgYnVnIGlzIHRoYXQgd2l0aCBvdmVybGFwcGluZyBzZWdtZW50cywgYHRsc19yeF9tc2dfc2l6ZWAgbWlnaHQgcmVhZCBnYXJiYWdlIGRhdGEgZnJvbSBvdmVybGFwcGluZyBzZWdtZW50cyB0byBkZXRlcm1pbmUgYHN6YC4gVGhpcyBsZWFkcyB0byBhIHNwdXJpb3VzIGNvbm5lY3Rpb24gZmFpbHVyZSwgYXMgdGhlIFRMUyBoZWFkZXIgbWlnaHQgYmUgY29ycnVwdGVkLgoKS0FTQU4gYW5kIEtNU0FOIGFyZW4mIzM5O3QgbGlrZWx5IHRvIGRldGVjdCBhIGJ1ZyBoZXJlLiBJdCYjMzk7cyBhIGxvZ2ljIGJ1ZyAoZnVuY3Rpb25hbCksIG5vdCBhIG1lbW9yeSBzYWZldHkgaXNzdWUuIFRoZSBjb2RlIHJlYWRzIGluaXRpYWxpemVkIGJ5dGVzLCBldmVuIGlmIHRoZSAmIzM0O2NvcnJlY3QmIzM0OyBieXRlcyBhcmUgbm90IHJlYWQuIE5vIG91dC1vZi1ib3VuZHMgYWNjZXNzIGlzIG9jY3VycmluZy4KCkEgY3JpdGljYWwgcG9pbnQ6IFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgYGxlbmAgKHRoZSBhbW91bnQgb2YgZGF0YSB3ZSAqdGhpbmsqIHdlIGhhdmUgYXZhaWxhYmxlKSBpbiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzICpsZXNzIHRoYW4gb3IgZXF1YWwgdG8qIHRoZSBzdW0gb2YgdGhlIGBza2ItJmd0O2xlbmAgdmFsdWVzLiBXZSBrbm93IHRoaXMgaXMgdHJ1ZSBiZWNhdXNlIHdlIGxpbWl0IHRoZSBgbGVuYCB2YWx1ZSB0byBiZSBubyBtb3JlIHRoYW4gYGlucWAgYnl0ZXMgKHRoZSAqYXZhaWxhYmxlKiBieXRlcykuCgpIb3dldmVyLCB3aGF0IGlmIHRoZXJlIGFyZSB6ZXJvLWxlbmd0aCBza2JzPyBXZSBoYXZlIHRvIGhhbmRsZSB0aGlzIGluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuCgpXaGF0IGlmIGFuIGBzemAgZnJvbSBhIG1hbGZvcm1lZCBxdWV1ZSBpcyBsYXJnZT8gSXQgc2VlbXMgdGhhdCBpbiB0aGlzIGNhc2Ugd2UgcmV0dXJuIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLgoKU28sIHRoZSBidWcgaXMgYSAqZnVuY3Rpb25hbCogb25lOiBzcHVyaW91cyBjb25uZWN0aW9uIGZhaWx1cmVzIGR1ZSB0byBvdmVybGFwcGluZyBUQ1Agc2VnbWVudHMuIFRoZSBvdmVybGFwcGluZyBzZWdtZW50cyBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IGJ5IHRoZSBUTFMgY29kZSAqYmVmb3JlKiBpdCB0cmllcyB0byBwYXJzZSB0aGUgVExTIGhlYWRlciBhbmQgY2FsY3VsYXRlIHRoZSBUTFMgbWVzc2FnZSBzaXplLiBUaGUgZml4IGlzIHRvIHVzZSBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgICpiZWZvcmUqIHBhcnNpbmcgdGhlIGhlYWRlci4gVGhpcyB3aWxsIGNhdXNlIHVzIHRvIGZhbGwgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCB0byByZWNvdmVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0bHNfc3RycF9jaGVja19xdWV1ZV9vayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC90bHMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYz0zOTA9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy00MzItXG5uZXQvdGxzL3Rsc19zdHJwLmM6NDMzOnN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxubmV0L3Rscy90bHNfc3RycC5jLTQzNC1cdFx0XHRcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxuLS1cbm5ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4tLVxubmV0L3Rscy90bHNfc3RycC5jLTUzMC1cbm5ldC90bHMvdGxzX3N0cnAuYzo1MzE6XHRcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICYjNDM7IFRMU19IRUFERVJfU0laRSkpXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTMyLVx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuLS1cbm5ldC90bHMvdGxzX3N0cnAuYy01NDMtXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTQ0Olx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgJiM0Mzsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxubmV0L3Rscy90bHNfc3RycC5jLTU0NS1cdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMwNzE4CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTMxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgVExTIFN0YWxsL0ZhaWx1cmUgQnVnKioKCk9rYXksIHNvIEkgY2FuJiMzOTt0IGRpcmVjdGx5IGBncmVwcGVyYCBmb3IgdGhlIGNvbW1pdCBtZXNzYWdlIHJlbGF0ZWQgdG8gdGhpcyBpc3N1ZSwgYXMgdGhhdCB0b29sIHdvbiYjMzk7dCBkZWx2ZSBpbnRvIHRoZSBnaXQgbG9nLiBCdXQsIEkgY2FuIHdvcmsgaXQgb3V0IGJ5IGluZmVyZW5jZS4gSXQgbG9va3MgbGlrZSB0aGUgaXNzdWUgaXMgbGlrZWx5IHJvb3RlZCBpbiBob3cgYHRsc19yeF9tc2dfc2l6ZWAgaGFuZGxlcyBwb3RlbnRpYWxseSBvdmVybGFwcGluZyBTS0JzIG9uIGEgcXVldWUuCgpIZXJlJiMzOTtzIHRoZSBjaGFpbiBvZiBldmVudHM6IElmIGB0bHNfcnhfbXNnX3NpemVgIGlzIGNhbGxlZCBvbiBhIHF1ZXVlIHdpdGggb3ZlcmxhcHBpbmcgU0tCcywgaXQgbWlnaHQgZW5kIHVwIHJlYWRpbmcgYSBjb3JydXB0ZWQgaGVhZGVyLiBUaGlzIGNvcnJ1cHRlZCBoZWFkZXIgY291bGQgY2F1c2UgaXQgdG8gcmV0dXJuIGFuIGAtRUlOVkFMYCBlcnJvciwgcGVyaGFwcyBpbmRpY2F0aW5nIGEgYmFkIHZlcnNpb24gb3Igc29tZSBvdGhlciBjb3JydXB0aW9uLiBXaGVuIGB0bHNfcnhfbXNnX3NpemVgIHJldHVybnMgYC1FSU5WQUxgLCBgdGxzX3N0cnBfcmVhZF9zb2NrYCBpbiB0dXJuIGFsc28gcmV0dXJucyBgLUVJTlZBTGAuIFRoZW4gYHRsc19zdHJwX2NoZWNrX3JjdmAgbG9naWMgaXM6CgpgYGBjCglpZiAodGxzX3N0cnBfcmVhZF9zb2NrKHN0cnApID09IC1FTk9NRU0pCgkJcXVldWVfd29yayh0bHNfc3RycF93cSwgJmFtcDtzdHJwLSZndDt3b3JrKTsKYGBgCgpUaHVzLCB0aGUgYC1FSU5WQUxgIChmcm9tIGB0bHNfc3RycF9yZWFkX3NvY2tgKSBpcyBpZ25vcmVkLCBidXQgYHN0cnAtJmd0O21zZ19yZWFkeWAgaXMgbm90IHNldCwgbGVhZGluZyB0byBlaXRoZXIgYSBjb25uZWN0aW9uIHN0YWxsIG9yIG91dHJpZ2h0IGZhaWx1cmUuIFRoaXMgaXMgZGVmaW5pdGVseSBhIGZ1bmN0aW9uYWwgYnVnLgoKTm93LCBJIG5lZWQgdG8gY2hlY2sgc29tZXRoaW5nIGltcG9ydGFudDogSXMgaXQgcG9zc2libGUgdGhhdCBgdGxzX3J4X21zZ19zaXplYCBjb3VsZCBiZSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBMZXQmIzM5O3MgdHJhY2UgaXQgdGhyb3VnaDoKCmBgYGMKCWNoYXIgaGVhZGVyW1RMU19IRUFERVJfU0laRSAmIzQzOyBUTFNfTUFYX0lWX1NJWkVdOwoJLi4uCglyZXQgPSBza2JfY29weV9iaXRzKHNrYiwgc3RycC0mZ3Q7c3RtLm9mZnNldCwgaGVhZGVyLCBwcm90LSZndDtwcmVwZW5kX3NpemUpOwoJaWYgKHJldCAmbHQ7IDApCgkJZ290byByZWFkX2ZhaWx1cmU7CmBgYAoKYHNrYl9jb3B5X2JpdHNgIGNvcGllcyBgcHJvdC0mZ3Q7cHJlcGVuZF9zaXplYCBieXRlcyBpbnRvIGBoZWFkZXJgLiBgcHJvdC0mZ3Q7cHJlcGVuZF9zaXplYCBpcyBzZXQgdG8gYFRMU19IRUFERVJfU0laRWAsIHdoaWNoIGlzIDUuIFNvLCBpdCYjMzk7cyBjb3B5aW5nIDUgYnl0ZXMgaW50byBgaGVhZGVyYC4gTm93IHdlIGFjY2VzcyBgaGVhZGVyWzBdYCB0aHJvdWdoIGBoZWFkZXJbNF1gLiBUaG9zZSA1IGJ5dGVzICphcmUqIGluaXRpYWxpemVkIGJ5IGBza2JfY29weV9iaXRzYC4gVGhlIHJlc3Qgb2YgYGhlYWRlcmAgaXMgdW5pbml0aWFsaXplZCwgYnV04oCmIFdhaXQgYSBzZWMsIGRvZXMgdGhlIHJlc3Qgb2YgYGhlYWRlcmAgKmV2ZXIqIGdldCBhY2Nlc3NlZD8gTm8sIGB0bHNfcnhfbXNnX3NpemVgIG9ubHkgdXNlcyB0aG9zZSBmaXJzdCA1IGJ5dGVzLiBTbywgbm8sIHRoaXMgaXMgbm90IGEgc291cmNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLgoKSXMgdGhpcyBgaGVhZGVyYCB2YXJpYWJsZSB1c2VkIGFueXdoZXJlIGVsc2U/IE5vLCBpdCYjMzk7cyBsb2NhbCB0byBgdGxzX3J4X21zZ19zaXplYC4KCkJ1dCwgd2hhdCBpZiBgcHJvdC0mZ3Q7cHJlcGVuZF9zaXplYCB3YXMgbGFyZ2VyIHRoYW4gNT8gTm9wZSwgaXQmIzM5O3MgYWx3YXlzIHNldCB0byA1IGZvciBib3RoIFRMUyAxLjIgYW5kIDEuMywgYW5kIGl0JiMzOTtzIHNldCBpbiBgdGxzX3NldF9zd19vZmZsb2FkYC4gQWx3YXlzIGBUTFNfSEVBREVSX1NJWkVgLiBUaGF0JiMzOTtzIHNldHRsZWQuCgpOb3csIGxldCYjMzk7cyB0dXJuIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgOiBDb3VsZCBpdCBiZSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PwoKYGBgYwoJZm9yIChsZW4gPSBuZWVkX3NwYzsgbGVuICZndDsgMDsgbGVuIC09IFBBR0VfU0laRSkgewoJCXBhZ2UgPSBhbGxvY19wYWdlKHN0cnAtJmd0O3NrLSZndDtza19hbGxvY2F0aW9uKTsKCQlpZiAoIXBhZ2UpIHsKCQkJdGxzX3N0cnBfZmx1c2hfYW5jaG9yX2NvcHkoc3RycCk7CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCgkJc2tiX2ZpbGxfcGFnZV9kZXNjKHN0cnAtJmd0O2FuY2hvciwgc2hpbmZvLSZndDtucl9mcmFncyYjNDM7JiM0MzssCgkJCQkgICBwYWdlLCAwLCAwKTsKCX0KYGBgCgpJdCBhbGxvY2F0ZXMgcGFnZXMgd2l0aCBgYWxsb2NfcGFnZWAuICpUaG9zZSogcGFnZXMgYXJlIE5PVCB6ZXJvZWQhIFRoZW4gYHRsc19zdHJwX3JlYWRfY29weWluKHN0cnApYCBpcyBjYWxsZWQuIGB0bHNfc3RycF9yZWFkX2NvcHlpbmAgdXNlcyBgdGNwX3JlYWRfc29ja2AgdG8gY29weSBkYXRhIGZyb20gdGhlIFRDUCByZWNlaXZlIHF1ZXVlIGludG8gdGhlc2UgcGFnZXMuCgpgYGBjCglzdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbihyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKCQkJCSAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBpbl9sZW4pCgl7CgkJLi4uCgkJaWYgKElTX0VOQUJMRUQoQ09ORklHX1RMU19ERVZJQ0UpICZhbXA7JmFtcDsgc3RycC0mZ3Q7bWl4ZWRfZGVjcnlwdGVkKQoJCQlyZXQgPSB0bHNfc3RycF9jb3B5aW5fc2tiKHN0cnAsIHNrYiwgaW5fc2tiLCBvZmZzZXQsIGluX2xlbik7CgkJZWxzZQoJCQlyZXQgPSB0bHNfc3RycF9jb3B5aW5fZnJhZyhzdHJwLCBza2IsIGluX3NrYiwgb2Zmc2V0LCBpbl9sZW4pOwpgYGAKCmB0bHNfc3RycF9jb3B5aW5fZnJhZ2AgdGhlbiBjb3BpZXMgZGF0YSBmcm9tIGBpbl8KCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC90bHMvdGxzX3N0cnAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIxMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjEwOlx0c3RhdGljIGludCB0bHNfc3RycF9jb3B5aW5fZnJhZyhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiAyMTE6XHRcdFx0XHRcdHN0cnVjdCBza19idWZmICppbl9za2IsIHVuc2lnbmVkIGludCBvZmZzZXQsXG4gMjEyOlx0XHRcdFx0XHRzaXplX3QgaW5fbGVuKVxuIDIxMzpcdHtcbiAyMTQ6XHRcdHVuc2lnbmVkIGludCBuZnJhZyA9IHNrYi1cdTAwM2VsZW4gLyBQQUdFX1NJWkU7XG4gMjE1Olx0XHRzaXplX3QgbGVuLCBjaHVuaztcbiAyMTY6XHRcdHNrYl9mcmFnX3QgKmZyYWc7XG4gMjE3Olx0XHRpbnQgc3o7XG4gMjE4Olx0XG4gMjE5Olx0XHRpZiAodW5saWtlbHkobmZyYWcgXHUwMDNlPSBza2Jfc2hpbmZvKHNrYiktXHUwMDNlbnJfZnJhZ3MpKSB7XG4gMjIwOlx0XHRcdERFQlVHX05FVF9XQVJOX09OX09OQ0UoMSk7XG4gMjIxOlx0XHRcdHJldHVybiAtRU1TR1NJWkU7XG4gMjIyOlx0XHR9XG4gMjIzOlx0XG4gMjI0Olx0XHRmcmFnID0gXHUwMDI2c2tiX3NoaW5mbyhza2IpLVx1MDAzZWZyYWdzW25mcmFnXTtcbiAyMjU6XHRcbiAyMjY6XHRcdGxlbiA9IGluX2xlbjtcbiAyMjc6XHRcdC8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIGhlYWRlciAqL1xuIDIyODpcdFx0aWYgKCFzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbikge1xuIDIyOTpcdFx0XHQvKiBBc3N1bWUgb25lIHBhZ2UgaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgaGVhZGVycyAqL1xuIDIzMDpcdFx0XHRjaHVuayA9XHRtaW5fdChzaXplX3QsIGxlbiwgUEFHRV9TSVpFIC0gc2tiX2ZyYWdfc2l6ZShmcmFnKSk7XG4gMjMxOlx0XHRcdFdBUk5fT05fT05DRShza2JfY29weV9iaXRzKGluX3NrYiwgb2Zmc2V0LFxuIDIzMjpcdFx0XHRcdFx0XHQgICBza2JfZnJhZ19hZGRyZXNzKGZyYWcpICYjNDM7XG4gMjMzOlx0XHRcdFx0XHRcdCAgIHNrYl9mcmFnX3NpemUoZnJhZyksXG4gMjM0Olx0XHRcdFx0XHRcdCAgIGNodW5rKSk7XG4gMjM1Olx0XG4gMjM2Olx0XHRcdHNrYi1cdTAwM2VsZW4gJiM0Mzs9IGNodW5rO1xuIDIzNzpcdFx0XHRza2ItXHUwMDNlZGF0YV9sZW4gJiM0Mzs9IGNodW5rO1xuIDIzODpcdFx0XHRza2JfZnJhZ19zaXplX2FkZChmcmFnLCBjaHVuayk7XG4gMjM5Olx0XG4gMjQwOlx0XHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHNrYik7XG4gMjQxOlx0XHRcdGlmIChzeiBcdTAwM2MgMClcbiAyNDI6XHRcdFx0XHRyZXR1cm4gc3o7XG4gMjQzOlx0XG4gMjQ0Olx0XHRcdC8qIFdlIG1heSBoYXZlIG92ZXItcmVhZCwgc3ogPT0gMCBpcyBndWFyYW50ZWVkIHVuZGVyLXJlYWQgKi9cbiAyNDU6XHRcdFx0aWYgKHVubGlrZWx5KHN6IFx1MDAyNlx1MDAyNiBzeiBcdTAwM2Mgc2tiLVx1MDAzZWxlbikpIHtcbiAyNDY6XHRcdFx0XHRpbnQgb3ZlciA9IHNrYi1cdTAwM2VsZW4gLSBzejtcbiAyNDc6XHRcbiAyNDg6XHRcdFx0XHRXQVJOX09OX09OQ0Uob3ZlciBcdTAwM2UgY2h1bmspO1xuIDI0OTpcdFx0XHRcdHNrYi1cdTAwM2VsZW4gLT0gb3ZlcjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzM3NjIKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA1NDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBUTFMgRnJhZ21lbnQgQ29weWluZyBQcm9jZXNzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgdGxzX3N0cnBfY29weWluX2ZyYWdgLCBhbmQgaXQmIzM5O3MgdXNpbmcgYHNrYl9jb3B5X2JpdHNgIHRvIGNvcHkgZGlyZWN0bHkgaW50byB0aGUgcGFnZS4gVGhhdCYjMzk7cyBhIGRpcmVjdCBjb3B5LCBhbHJpZ2h0ISBJdCBjb3BpZXMgYGNodW5rYCBieXRlcyBmcm9tIGBpbl9za2JgIGludG8gdGhlIHBhZ2UsIHNwZWNpZmljYWxseSB1c2luZyBgc2tiX2ZyYWdfYWRkcmVzcyhmcmFnKSAmIzQzOyBza2JfZnJhZ19zaXplKGZyYWcpYCBhcyB0aGUgZGVzdGluYXRpb24uIFRoZW4sIHRoZSBjb2RlIGNhbGxzIGB0bHNfcnhfbXNnX3NpemVgLgoKTm93LCBgdGxzX3J4X21zZ19zaXplYCBpcyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBJIHJlbWVtYmVyIHRoYXQgZnVuY3Rpb24gcmVhZHMgdGhlIGhlYWRlciBmcm9tIHRoZSBgc2tiYCB1c2luZyBgc2tiX2NvcHlfYml0c2AsIHNwZWNpZmljYWxseSBmcm9tIHRoZSBgc3RycC0mZ3Q7YW5jaG9yYCBTS0IsIGFuZCBzdGFydGluZyBhdCBgc3RycC0mZ3Q7c3RtLm9mZnNldGAgd2hpY2gsIGxvb2tpbmcgYmFjaywgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyBpbiBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gVGhpcyBtZWFucyBpdCB3aWxsIHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWdlLiBBbmQgc2luY2UgYHNrYmAgaXMgdGhlIGBzdHJwLSZndDthbmNob3JgLCBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZSB3YXMganVzdCBwb3B1bGF0ZWQgYnkgYHNrYl9jb3B5X2JpdHNgIGZyb20gYGluX3NrYmAsIHRoaXMgbWVhbnMgdGhlIGRhdGEgaXMgaW5pdGlhbGl6ZWQuIEkgc2VlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgaGVyZS4KCkJ1dCB3YWl0LCB3aGF0IGlmIGBjaHVua2AgaXMgKnNtYWxsZXIqIHRoYW4gYFRMU19IRUFERVJfU0laRWA/IEFoLCBJIHNlZS4gSWYgYGNodW5rYCBpcyBsZXNzIHRoYW4gYFRMU19IRUFERVJfU0laRWAsIGB0bHNfcnhfbXNnX3NpemVgIHdvdWxkIGVuY291bnRlciBhIHNpdHVhdGlvbiB3aGVyZSBpdCB0cmllcyB0byByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBgc2tiYCYjMzk7cyBkYXRhLCBhcyBgc2tiLSZndDtsZW5gIHdvdWxkIGJlIGVxdWFsIHRvIGBjaHVua2AuIFRoaXMgcmVzdWx0cyBpbiBgdGxzX3J4X21zZ19zaXplYCByZXR1cm5pbmcgemVyby4gSXQgd2lsbCBjb3JyZWN0bHkgbm90IHJlYWQgdGhlIGhlYWRlciwgYW5kIGB0bHNfc3RycF9jb3B5aW5fZnJhZ2AgcmV0dXJucyB0aGUgY29waWVkIGRhdGEgc2l6ZS4gVGhlIGNhbGxlciB0aGVuIGNhbGxzIGB0bHNfc3RycF9jb3B5aW5gIGFnYWluIHdpdGggbW9yZSBkYXRhIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBwYWdlLCB1bnRpbCB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIGZvcm0gYSBUTFMgaGVhZGVyLiBPbmNlIHRoZSBTS0IgaGFzIGF0IGxlYXN0IGBUTFNfSEVBREVSX1NJWkVgIGJ5dGVzLCBgdGxzX3J4X21zZ19zaXplYCB3aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgaGVhZGVyLiBTbyBzdGlsbCwgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCwgaXQgaXMgaGFuZGxlZCBjb3JyZWN0bHkuCgpBbmQsIHdoYXQgYWJvdXQgYHNrYl9jb3B5X2JpdHNgIGZhaWxpbmc/IEl0IGhhcyBhIGBXQVJOX09OX09OQ0VgLCBidXQgaXQgc2hvdWxkbiYjMzk7dCBmYWlsIGJlY2F1c2UgYGluX3NrYmAgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGF0IGxlYXN0IGBjaHVua2AgYnl0ZXMgc3RhcnRpbmcgYXQgYG9mZnNldGAuIEl0IHNob3VsZCBzdWNjZWVkLCBzbyBubyBpc3N1ZSB0aGVyZS4KCk92ZXJhbGwsIGNvbnNpZGVyaW5nIGFsbCB0aGUgY2FzZXMsIEkgYW0gbm90IHNlZWluZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZC4gVGhlIGNvcHkgcHJvY2VzcyBoYW5kbGVzIGNhc2VzIHdpdGggc21hbGxlciBjaHVua3MgY29ycmVjdGx5LCBhbmQgYHNrYl9jb3B5X2JpdHNgIHNob3VsZCBhbHdheXMgc3VjY2VlZC4gVGhpcyBsb29rcyBzb3VuZC4gSSB3aWxsIG1vdmUgb24gdG8gY2hlY2tpbmcgYHRsc19zdHJwX2NvcHlpbl9za2JgIG5vdy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDcgMjA6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdGxzL3Rsc19zdHJwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODYsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI4NjpcdHN0YXRpYyBpbnQgdGxzX3N0cnBfY29weWluX3NrYihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiAyODc6XHRcdFx0XHQgICAgICAgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgdW5zaWduZWQgaW50IG9mZnNldCxcbiAyODg6XHRcdFx0XHQgICAgICAgc2l6ZV90IGluX2xlbilcbiAyODk6XHR7XG4gMjkwOlx0XHRzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwgKmZpcnN0LCAqbGFzdDtcbiAyOTE6XHRcdHN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNoaW5mbztcbiAyOTI6XHRcdHNpemVfdCBjaHVuaztcbiAyOTM6XHRcdGludCBzejtcbiAyOTQ6XHRcbiAyOTU6XHRcdGlmIChzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbilcbiAyOTY6XHRcdFx0Y2h1bmsgPSBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiAtIHNrYi1cdTAwM2VsZW47XG4gMjk3Olx0XHRlbHNlXG4gMjk4Olx0XHRcdGNodW5rID0gVExTX01BWF9QQVlMT0FEX1NJWkUgJiM0MzsgUEFHRV9TSVpFO1xuIDI5OTpcdFx0Y2h1bmsgPSBtaW4oY2h1bmssIGluX2xlbik7XG4gMzAwOlx0XG4gMzAxOlx0XHRuc2tiID0gdGxzX3N0cnBfc2tiX2NvcHkoc3RycCwgaW5fc2tiLCBvZmZzZXQsIGNodW5rKTtcbiAzMDI6XHRcdGlmICghbnNrYilcbiAzMDM6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMzA0Olx0XG4gMzA1Olx0XHRzaGluZm8gPSBza2Jfc2hpbmZvKHNrYik7XG4gMzA2Olx0XHRpZiAoIXNoaW5mby1cdTAwM2VmcmFnX2xpc3QpIHtcbiAzMDc6XHRcdFx0c2hpbmZvLVx1MDAzZWZyYWdfbGlzdCA9IG5za2I7XG4gMzA4Olx0XHRcdG5za2ItXHUwMDNlcHJldiA9IG5za2I7XG4gMzA5Olx0XHR9IGVsc2Uge1xuIDMxMDpcdFx0XHRmaXJzdCA9IHNoaW5mby1cdTAwM2VmcmFnX2xpc3Q7XG4gMzExOlx0XHRcdGxhc3QgPSBmaXJzdC1cdTAwM2VwcmV2O1xuIDMxMjpcdFx0XHRsYXN0LVx1MDAzZW5leHQgPSBuc2tiO1xuIDMxMzpcdFx0XHRmaXJzdC1cdTAwM2VwcmV2ID0gbnNrYjtcbiAzMTQ6XHRcdH1cbiAzMTU6XHRcbiAzMTY6XHRcdHNrYi1cdTAwM2VsZW4gJiM0Mzs9IGNodW5rO1xuIDMxNzpcdFx0c2tiLVx1MDAzZWRhdGFfbGVuICYjNDM7PSBjaHVuaztcbiAzMTg6XHRcbiAzMTk6XHRcdGlmICghc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pIHtcbiAzMjA6XHRcdFx0c3ogPSB0bHNfcnhfbXNnX3NpemUoc3RycCwgc2tiKTtcbiAzMjE6XHRcdFx0aWYgKHN6IFx1MDAzYyAwKVxuIDMyMjpcdFx0XHRcdHJldHVybiBzejtcbiAzMjM6XHRcbiAzMjQ6XHRcdFx0LyogV2UgbWF5IGhhdmUgb3Zlci1yZWFkLCBzeiA9PSAwIGlzIGd1YXJhbnRlZWQgdW5kZXItcmVhZCAqL1xuIDMyNTpcdFx0XHRpZiAodW5saWtlbHkoc3ogXHUwMDI2XHUwMDI2IHN6IFx1MDAzYyBza2ItXHUwMDNlbGVuKSkge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNyAyMDozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNTU4NQoJCQkJCQkJb3V0cHV0OiAyOTYKCQkJCQkJCXRob3VnaHRzOiAxMTE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBUTFMgUmVjZWl2ZSBRdWV1ZSBMb2dpYyBCdWcgRml4KioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhIGZ1bmN0aW9uYWwgYnVnLCBub3QgYSBtZW1vcnkgc2FmZXR5IGlzc3VlLiBUaGUgY29yZSBvZiB0aGUgcHJvYmxlbSBsaWVzIGluIGhvdyB0aGUgVExTIHN0YWNrIGhhbmRsZXMgb3ZlcmxhcHBpbmcgVENQIHNlZ21lbnRzIGluIHRoZSByZWNlaXZlIHF1ZXVlLiAgYHRsc19zdHJwX2NvcHlpbl9za2JgIHVzZXMgYHRsc19zdHJwX3NrYl9jb3B5YCB3aGljaCBhbGxvY2F0ZXMgYW5kIGNvcGllcyBkYXRhIGludG8gYSBuZXcgU0tCLCBhcHBlbmRzIGl0IHRvIGBmcmFnX2xpc3RgLCBhbmQgdGhlbiBjYWxscyBgdGxzX3J4X21zZ19zaXplYC4gIFRoZSBwcm9ibGVtIGlzIGBza2JfY29weV9iaXRzYCBpdGVyYXRpbmcgb3ZlciB0aGlzIGBmcmFnX2xpc3RgIGNvbnRhaW5pbmcgcG90ZW50aWFsbHkgb3ZlcmxhcHBpbmcgU0tCcy4gVGhpcyBvdmVybGFwIGxlYWRzIHRvIGB0bHNfcnhfbXNnX3NpemVgIHJlYWRpbmcgYSBjb3JydXB0ZWQgVExTIGhlYWRlciwgYmVjYXVzZSBgc2tiX2NvcHlfYml0c2AgYmxpbmRseSBjb3BpZXMgYml0cyBmcm9tIHRob3NlIG92ZXJsYXBwaW5nIFNLQnMsIHRodXMgcmVzdWx0aW5nIGluIGFuIGVycm9yIGFuZCBhbiBhYm9ydGVkIGNvbm5lY3Rpb24uCgpUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIGNoZWNrIHVzaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmJlZm9yZSogY2FsbGluZyBgdGxzX3J4X21zZ19zaXplYC4gVGhpcyBpcyBrZXkuIElmIHRoZSBxdWV1ZSBpcyBkZWVtZWQgJiMzNDtPSyYjMzQ7IChubyBvdmVybGFwcywgY29uc2lzdGVudCBkZWNyeXB0ZWQgc3RhdHVzKSwgdGhlIGV4aXN0aW5nIGxvZ2ljIHByb2NlZWRzLiBJZiB0aGUgcXVldWUgaXMgKm5vdCogT0ssIHRoZSBjb2RlIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weWAgd2hpY2ggbGV2ZXJhZ2VzIGB0Y3BfcmVhZF9zb2NrYCB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBvdmVybGFwcGluZyBzZWdtZW50cy4gIGB0Y3BfcmVhZF9zb2NrYCBpcyBkZXNpZ25lZCB0byBjb3JyZWN0bHkgbWFuYWdlIHRoZXNlIHNjZW5hcmlvcyBhbmQgcmVhZCB0aGUgYXBwcm9wcmlhdGUgZGF0YS4KCk5vdywgbGV0JiMzOTtzIGFkZHJlc3MgdGhlIG1lbW9yeSBzYWZldHkgY29uY2VybnM6CgoqICAgKipVbmluaXRpYWxpemVkIG1lbW9yeSByZWFkcz8qKiAgTm8uIFRoZSBkYXRhIGNvcGllZCBieSBgc2tiX2NvcHlfYml0c2AgKmlzKiBpbml0aWFsaXplZCwgYWxiZWl0IGluY29ycmVjdGx5IGR1ZSB0byB0aGUgb3ZlcmxhcC4gVGhlIGNvZGUgaXRzZWxmIGlzbiYjMzk7dCBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSB1bmluaXRpYWxpemVkIHJlZ2lvbnMgb2YgbWVtb3J5LgoqICAgKipPdXQtb2YtYm91bmRzIHJlYWRzPyoqIE5vLiBBZ2FpbiwgdGhlIHByb2JsZW0gaXMgd2l0aCB0aGUgZGF0YSBiZWluZyByZWFkLCBub3QgdGhlIGF0dGVtcHQgdG8gcmVhZCBpdCBvdXQgb2YgYm91bmRzLiBUaGUgYnVmZmVycyBpbnZvbHZlZCBhcmUgcHJvcGVybHkgYWxsb2NhdGVkLgoqICAgKipNZW1vcnkgc2FmZXR5IGlzc3VlcyBpbiBnZW5lcmFsPyoqIE5vLiBUaGUgY29yZSBvZiB0aGUgaXNzdWUgaXMgYSBsb2dpY2FsIGZsYXcgaW4gaG93IHRoZSBUTFMgbGF5ZXIgaGFuZGxlcyBvdmVybGFwcGluZyBzZWdtZW50cywgbm90IGEgbWVtb3J5IGNvcnJ1cHRpb24gdnVsbmVyYWJpbGl0eS4KKiAgICoqS01TQU4vS0FTQU4/KiogTmVpdGhlciB3b3VsZCBkZXRlY3QgYW55dGhpbmcgaGVyZSwgcHJlY2lzZWx5IGJlY2F1c2UgdGhlIGNvZGUgaXMgbm90IGRvaW5nIGFueXRoaW5nIHRoYXQgd291bGQgdHJpZ2dlciB0aG9zZSBzYW5pdGl6ZXJzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBidWcuCgpUaGVuIEkgY29uc2lkZXJlZCB0aGUgY2FzZSB3aGVyZSBgdGxzX3J4X21zZ19zaXplYCBjb21wdXRlZCBhIGh1Z2UgYHN6YCwgbGVhZGluZyB0byBsYXJnZSBtZW1vcnkgYWxsb2NhdGlvbnMuICBFdmVuIGlmIGB0bHNfcnhfbXNnX3NpemVgIHJlYWRzIGEgY29ycnVwdGVkIGhlYWRlciBhbmQgcmV0dXJucyBhIGh1Z2UgYHN6YCwgdGhlIHJlc3VsdGluZyBhbGxvY2F0aW9uIHZpYSBgdGxzX3N0cnBfcmVhZF9jb3B5YCBpcyBib3VuZGVkIGJ5IGBUTFNfTUFYX1BBWUxPQURfU0laRSAmIzQzOyBjaXBoZXJfb3ZlcmhlYWQgJiM0MzsgcHJvdC0mZ3Q7dGFpbF9zaXplYC4gVGhhdCYjMzk7cyBhcm91bmQgMTZLQiB3aGljaCBpcyBub3QgdW51c3VhbCwgaXQmIzM5O3MganVzdCBhIGZldyBwYWdlcywgc28gbm90IGEgbWVtb3J5IGV4aGF1c3Rpb24gcHJvYmxlbSBlaXRoZXIuCgpJZiBgc3pgIGlzIHNtYWxsIGFuZCB0aGUgY2hlY2sgZGV0ZWN0cyB0aGUgb3ZlcmxhcCwgaXQgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBgdGxzX3N0cnBfcmVhZF9jb3B5YCBhbmQgc28gYWdhaW4gbm8gY3Jhc2guCgpUaGVyZWZvcmUsIHRoZSBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IG1lbW9yeSBzYWZldHkgaXNzdWVzIGF0IGFsbDsgaXQmIzM5O3MgcHVyZWx5IGEgZnVuY3Rpb25hbCBidWcgZml4LgoKVGhlcmVmb3JlLCBJJiMzOTttIGNvbmZpZGVudCBpbiBjb25jbHVkaW5nIHRoYXQgYE5lZWRzS01TQU5gIHNob3VsZCBiZSBgZmFsc2VgLgoKTGV0IG1lIHJlaXRlcmF0ZSBteSByZWFzb25pbmc6IFRoZSBwYXRjaCBhZGRzIGEgY2hlY2sgKGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIGJlZm9yZSBjYWxsaW5nIHRoZSBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYyBgdGxzX3J4X21zZ19zaXplYC4gIFRoaXMgY2hlY2sgZGV0ZWN0cyB0aGUgb3ZlcmxhcHBpbmcgc2VnbWVudHMuIElmIHRoZSBxdWV1ZSBpcyBiYWQsIGl0IGZhbGxzIGJhY2sgdG8gYSBzYWZlciBwYXRoIHVzaW5nIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBUaGVyZSBhcmUgbm8gbWVtb3J5IHNhZmV0eSBpc3N1ZXMuICBUaGUgZGF0YSByZWFkIGlzIGluaXRpYWxpemVkIGFuZCB0aGVyZSBhcmUgbm8gb3V0IG9mIGJvdW5kcyByZWFkcy4gVGhpcyBpcyBhIGxvZ2ljIGZsYXcgbm90IGEgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWUsIGFuZCBzbyBuZWl0aGVyIEtNU0FOIG5vciBLQVNBTiBzaG91bGQgYmUgZW5hYmxlZC4KCioqRmluYWwgRG91YmxlLUNoZWNrKioKCkxldCYjMzk7cyBxdWlja2x5IGNoZWNrIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuCgpUaGUgbG9vcCBpdGVyYXRlcyB0aHJvdWdoIGBza2JgcywgYW5kIGBUQ1BfU0tCX0NCKHNrYilgIGFjY2Vzc2VzIGBza2ItJmd0O2NiYC4gYHNrYi0mZ3Q7Y2JgIGlzIGluaXRpYWxpemVkIHdoZW4gdGhlIGBza2JgIGlzIHJlY2VpdmVkIGJ5IFRDUCwgc28gbm8gdW5pbml0aWFsaXplZCByZWFkcy4KCkFsc28gYHNrYl9jbXBfZGVjcnlwdGVkYCBhY2Nlc3NlcyBgc2tiLSZndDtkZWNyeXB0ZWRgLiBgZGVjcnlwdGVkYCBpcyBhIGJpdGZpZWxkIGluIGBza2JgIHRoYXQmIzM5O3MgaW5pdGlhbGl6ZWQuCgpTbyBhZ2FpbiwgZXZlcnl0aGluZyBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4gSSYjMzk7bSB2ZXJ5IGNvbmZpZGVudCBpbiB0aGlzIGFzc2Vzc21lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA3IDIwOjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGZpeGVzIGEgbG9naWMgYnVnIGluIHRoZSBUTFMgc3RycGFyc2VyIHdoZXJlIGB0bHNfcnhfbXNnX3NpemUoKWAgY291bGQgYmUgY2FsbGVkIG9uIGEgVENQIHJlY2VpdmUgcXVldWUgY29udGFpbmluZyBvdmVybGFwcGluZyBzZWdtZW50cyAoZS5nLiwgZHVlIHRvIHJldHJhbnNtaXNzaW9ucykuIFdoZW4gdGhpcyBoYXBwZW5zLCBgc2tiX2NvcHlfYml0cygpYCBibGluZGx5IGl0ZXJhdGVzIG92ZXIgdGhlIGBmcmFnX2xpc3RgIGFuZCBtYXkgcmVhZCBvdmVybGFwcGluZyBieXRlcywgcmVzdWx0aW5nIGluIGEgY29ycnVwdGVkIFRMUyBoZWFkZXIuIFRoaXMgY29ycnVwdGVkIGhlYWRlciBjYXVzZXMgYHRsc19yeF9tc2dfc2l6ZSgpYCB0byByZXR1cm4gYW4gZXJyb3IgKGxpa2UgYC1FSU5WQUxgKSwgd2hpY2ggc3B1cmlvdXNseSBhYm9ydHMgdGhlIFRMUyBjb25uZWN0aW9uLlxuXG5CeSBjYWxsaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9vaygpYCBiZWZvcmUgcmVhZGluZyB0aGUgaGVhZGVyLCB0aGUgY29kZSBkZXRlY3RzIG92ZXJsYXBwaW5nIHNlZ21lbnRzIG9yIG1peGVkIGRlY3J5cHRlZCBzdGF0dXMgYW5kIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weSgpYC4gVGhpcyBmYWxsYmFjayB1c2VzIGB0Y3BfcmVhZF9zb2NrKClgIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIG92ZXJsYXBzIGFuZCBjb3B5IHRoZSBsb2dpY2FsIHN0cmVhbSBpbnRvIGEgbGluZWFyIGJ1ZmZlci5cblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnZvbHZlZC4gVGhlIGJ5dGVzIHJlYWQgYnkgYHNrYl9jb3B5X2JpdHMoKWAgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG5ldHdvcmsgZGF0YTsgdGhleSBhcmUgc2ltcGx5IHRoZSB3cm9uZyBieXRlcyBkdWUgdG8gdGhlIG92ZXJsYXBzLiBUaGVyZWZvcmUsIEtNU0FOICh3aGljaCBkZXRlY3RzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlKSBpcyBub3QgYXBwbGljYWJsZSBoZXJlLiBTdGFuZGFyZCBLQVNBTiB3b3VsZCBhbHNvIG5vdCBkZXRlY3QgYW55dGhpbmcsIGFzIHRoZXJlIGlzIG5vIG1lbW9yeSBjb3JydXB0aW9uIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXG5cbkJ5IGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKClgIGJlZm9yZSByZWFkaW5nIHRoZSBoZWFkZXIsIHRoZSBjb2RlIGRldGVjdHMgb3ZlcmxhcHBpbmcgc2VnbWVudHMgb3IgbWl4ZWQgZGVjcnlwdGVkIHN0YXR1cyBhbmQgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5KClgLiBUaGlzIGZhbGxiYWNrIHVzZXMgYHRjcF9yZWFkX3NvY2soKWAgdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgb3ZlcmxhcHMgYW5kIGNvcHkgdGhlIGxvZ2ljYWwgc3RyZWFtIGludG8gYSBsaW5lYXIgYnVmZmVyLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjI4LjkzNjE0MDA4N1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNDA2Mzc4NjE1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUTFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0bHNfc3RycF9jaGVja19yY3ZcIixcbiAgICBcInRsc19zd19yZWN2bXNnXCIsXG4gICAgXCJ0bHNfc3RycF9kYXRhX3JlYWR5XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiB0aGUgVExTIHN0cnBhcnNlciB3aGVyZSBgdGxzX3J4X21zZ19zaXplKClgIGNvdWxkIGJlIGNhbGxlZCBvbiBhIFRDUCByZWNlaXZlIHF1ZXVlIGNvbnRhaW5pbmcgb3ZlcmxhcHBpbmcgc2VnbWVudHMgKGUuZy4sIGR1ZSB0byByZXRyYW5zbWlzc2lvbnMpLiBXaGVuIHRoaXMgaGFwcGVucywgYHNrYl9jb3B5X2JpdHMoKWAgYmxpbmRseSBpdGVyYXRlcyBvdmVyIHRoZSBgZnJhZ19saXN0YCBhbmQgbWF5IHJlYWQgb3ZlcmxhcHBpbmcgYnl0ZXMsIHJlc3VsdGluZyBpbiBhIGNvcnJ1cHRlZCBUTFMgaGVhZGVyLiBUaGlzIGNvcnJ1cHRlZCBoZWFkZXIgY2F1c2VzIGB0bHNfcnhfbXNnX3NpemUoKWAgdG8gcmV0dXJuIGFuIGVycm9yIChsaWtlIGAtRUlOVkFMYCksIHdoaWNoIHNwdXJpb3VzbHkgYWJvcnRzIHRoZSBUTFMgY29ubmVjdGlvbi5cXG5cXG5CeSBjYWxsaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9vaygpYCBiZWZvcmUgcmVhZGluZyB0aGUgaGVhZGVyLCB0aGUgY29kZSBkZXRlY3RzIG92ZXJsYXBwaW5nIHNlZ21lbnRzIG9yIG1peGVkIGRlY3J5cHRlZCBzdGF0dXMgYW5kIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weSgpYC4gVGhpcyBmYWxsYmFjayB1c2VzIGB0Y3BfcmVhZF9zb2NrKClgIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIG92ZXJsYXBzIGFuZCBjb3B5IHRoZSBsb2dpY2FsIHN0cmVhbSBpbnRvIGEgbGluZWFyIGJ1ZmZlci5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIFRMUyBzdHJlYW0gcGFyc2VyIGxvZ2ljIChgdGxzX3N0cnBfcmVhZF9zb2NrYCBhbmQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCkgdG8gY29ycmVjdGx5IGNoZWNrIGlmIHRoZSByZWNlaXZlIHF1ZXVlIGhhcyBlbm91Z2ggZGF0YSBmb3IgdGhlIFRMUyBoZWFkZXIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZCBpdC4gVGhpcyBpcyBjb3JlIG5ldHdvcmsgcmVjZWl2ZSBsb2dpYyBmb3IgVExTIHNvY2tldHMgYW5kIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIGByZWN2bXNnYCBvbiBUTFMgc29ja2V0cy4gSXQgaXMgd29ydGggZnV6emluZyB0byBlbnN1cmUgdGhlIHN0cmVhbSBwYXJzZXIgaGFuZGxlcyBmcmFnbWVudGVkIG9yIHNob3J0IFRMUyByZWNvcmRzIGNvcnJlY3RseSB3aXRob3V0IG1lbW9yeSBjb3JydXB0aW9uIG9yIHN0YWxscy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6MjguOTM2MTQ3MDE3WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTkzNDQ3MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhNmIwNWI3ZTM1N2QxM2I1OTdlZjhjYjIyNmY0ZmFiNDBmZTNiOTIwXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgQXVnIDcgMjA6Mjk6MjcgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbmV0L3Rscy90bHNfc3RycC5jIGIvbmV0L3Rscy90bHNfc3RycC5jXFxuaW5kZXggNjFiMTBjNjk3ZWNjYi4uNjRkNWRlYTkwNTQwMyAxMDA2NDRcXG4tLS0gYS9uZXQvdGxzL3Rsc19zdHJwLmNcXG4rKysgYi9uZXQvdGxzL3Rsc19zdHJwLmNcXG5AQCAtNDMwLDkgKzQzMCw5IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIHFzaG9ydClcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLXN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbitzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBsZW4pXFxuIHtcXG4tXFx0dW5zaWduZWQgaW50IGxlbiA9IHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW47XFxuIFxcdHN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjtcXG4gXFx0dTMyIHNlcTtcXG4gXFxuQEAgLTUyNSw2ICs1MjUsMTIgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuIFxcbiBcXHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XFxuIFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuK1xcdFxcdGlmIChpbnEgXFx1MDAzYyBUTFNfSEVBREVSX1NJWkUpXFxuK1xcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuK1xcbitcXHRcXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBUTFNfSEVBREVSX1NJWkUpKVxcbitcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4rXFxuIFxcdFxcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXFx1MDAzZWFuY2hvcik7XFxuIFxcdFxcdGlmIChzeiBcXHUwMDNjIDApXFxuIFxcdFxcdFxcdHJldHVybiBzejtcXG5AQCAtNTM1LDcgKzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbiBcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKVxcbitcXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pKVxcbiBcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4gXFxuIFxcdFdSSVRFX09OQ0Uoc3RycC1cXHUwMDNlbXNnX3JlYWR5LCAxKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6MjkuNDM2NDE4OTNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoyODAyMjYxODgxNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUTFNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0bHNfc3RycF9jaGVja19yY3ZcIixcbiAgICBcInRsc19zd19yZWN2bXNnXCIsXG4gICAgXCJ0bHNfc3RycF9kYXRhX3JlYWR5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIFRMUyBzdHJlYW0gcGFyc2VyIGxvZ2ljIChgdGxzX3N0cnBfcmVhZF9zb2NrYCBhbmQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCkgdG8gY29ycmVjdGx5IGNoZWNrIGlmIHRoZSByZWNlaXZlIHF1ZXVlIGhhcyBlbm91Z2ggZGF0YSBmb3IgdGhlIFRMUyBoZWFkZXIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZCBpdC4gVGhpcyBpcyBjb3JlIG5ldHdvcmsgcmVjZWl2ZSBsb2dpYyBmb3IgVExTIHNvY2tldHMgYW5kIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIGByZWN2bXNnYCBvbiBUTFMgc29ja2V0cy4gSXQgaXMgd29ydGggZnV6emluZyB0byBlbnN1cmUgdGhlIHN0cmVhbSBwYXJzZXIgaGFuZGxlcyBmcmFnbWVudGVkIG9yIHNob3J0IFRMUyByZWNvcmRzIGNvcnJlY3RseSB3aXRob3V0IG1lbW9yeSBjb3JydXB0aW9uIG9yIHN0YWxscy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYTZiMDViN2UzNTdkMTNiNTk3ZWY4Y2IyMjZmNGZhYjQwZmUzYjkyMFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDcgMjA6Mjk6MjcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvdGxzL3Rsc19zdHJwLmMgYi9uZXQvdGxzL3Rsc19zdHJwLmNcbmluZGV4IDYxYjEwYzY5N2VjY2IuLjY0ZDVkZWE5MDU0MDMgMTAwNjQ0XG4tLS0gYS9uZXQvdGxzL3Rsc19zdHJwLmNcbisrKyBiL25ldC90bHMvdGxzX3N0cnAuY1xuQEAgLTQzMCw5ICs0MzAsOSBAQCBzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBxc2hvcnQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGJvb2wgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4rc3RhdGljIGJvb2wgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgaW50IGxlbilcbiB7XG4tXHR1bnNpZ25lZCBpbnQgbGVuID0gc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW47XG4gXHRzdHJ1Y3Qgc2tfYnVmZiAqZmlyc3QsICpza2I7XG4gXHR1MzIgc2VxO1xuIFxuQEAgLTUyNSw2ICs1MjUsMTIgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gXG4gXHR0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlKHN0cnAsIGlucSk7XG4gXHRpZiAoIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XG4rXHRcdGlmIChpbnEgXHUwMDNjIFRMU19IRUFERVJfU0laRSlcbitcdFx0XHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIHRydWUpO1xuK1xuK1x0XHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIFRMU19IRUFERVJfU0laRSkpXG4rXHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4rXG4gXHRcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHN0cnAtXHUwMDNlYW5jaG9yKTtcbiBcdFx0aWYgKHN6IFx1MDAzYyAwKVxuIFx0XHRcdHJldHVybiBzejtcbkBAIC01MzUsNyArNTQxLDcgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXG4gXHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcbiBcdH1cbiBcbi1cdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCkpXG4rXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKSlcbiBcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XG4gXG4gXHRXUklURV9PTkNFKHN0cnAtXHUwMDNlbXNnX3JlYWR5LCAxKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjI5LjQzNjQyMTc5WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDU0ODU4MDMzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFRMUyBTdHJpcCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBuZXQvdGxzL3Rsc19zdHJwLmNgIGFuZCBpbW1lZGlhdGVseSwgSSBzZWUgYSBzaWduaWZpY2FudCBjaGFuZ2UgaW4gaG93IHdlJ3JlIGhhbmRsaW5nIHF1ZXVlIGNoZWNrcy4gVGhlIHByaW1hcnkgbW9kaWZpY2F0aW9uIHJldm9sdmVzIGFyb3VuZCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBJbnN0ZWFkIG9mIGNhbGN1bGF0aW5nIHRoZSBsZW5ndGggaW50ZXJuYWxseSwgaXQgbm93IGFjY2VwdHMgYSBgbGVuYCBwYXJhbWV0ZXIuIFRoaXMgaXMgaW50ZXJlc3RpbmcsIGl0IGltcGxpZXMgd2UncmUgdHJ5aW5nIHRvIGNlbnRyYWxpemUgb3Igb3B0aW1pemUgaG93IHRoaXMgbGVuZ3RoIGlzIGRldGVybWluZWQuXG5cblRoZSBvdGhlciBrZXkgY2hhbmdlIGlzIHdpdGhpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYC4gVGhlIHBhdGNoIG1vdmVzIHRoZSBjYWxsIHRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmJlZm9yZSogd2UgY2FsbCBgdGxzX3J4X21zZ19zaXplYC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBjbGVhciwgd2UgbmVlZCB0byBlbnN1cmUgdGhlIHF1ZXVlIGhhcyB0aGUgcmVzb3VyY2VzIG5lZWRlZCB0byByZWFkIHRoZSBUTFMgaGVhZGVyICpiZWZvcmUqIHdlIGV2ZW4gYXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIGhlYWRlcidzIHNpemUuIEl0J3MgYSBwcmVlbXB0aXZlIHNhZmV0eSBjaGVjay4gSWYgdGhlIHF1ZXVlIGlzbid0IHN1aXRhYmxlLCBpdCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBUaGlzIG1ha2VzIHNlbnNlLCBpdCdzIGEgZ29vZCBmYWlsLXNhZmUuXG5cblRpbWUgdG8gZGl2ZSBkZWVwZXIuIEknbGwgdXNlIGBncmVwcGVyYCB0byBsb2NhdGUgYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaW4gdGhlIGZpbGUuIEkgd2FudCB0byBzZWUgaG93IHRoZXNlIGNoYW5nZXMgYXJlIGltcGFjdGluZyB0aGUgb3ZlcmFsbCBmbG93LCBzcGVjaWZpY2FsbHkgaG93IGBsZW5gIGlzIGJlaW5nIGNhbGN1bGF0ZWQgYW5kIHBhc3NlZCwgYW5kIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIHNpZGUgZWZmZWN0cyB0byBiZSBhd2FyZSBvZi4gSSdsbCBuZWVkIHRvIHZlcmlmeSB0aGF0IHRoaXMgY2hhbmdlIGlzIGluZGVlZCBhbiBpbXByb3ZlbWVudCwgYW5kIGhhc24ndCBpbnRyb2R1Y2VkIGFueSB1bmludGVuZGVkIGNvbnNlcXVlbmNlcyByZWxhdGVkIHRvIHJhY2UgY29uZGl0aW9ucyBvciBidWZmZXIgb3ZlcmZsb3dzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzcwLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6MzMuOTg1MDA1NTgzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3MjIyMTk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRsc19zdHJwX3JlYWRfc29ja1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Rscy90bHNfc3RycC5jPTQ4Mz1ib29sIHRsc19zdHJwX21zZ19sb2FkKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGZvcmNlX3JlZnJlc2gpXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTExLS8qIENhbGxlZCB3aXRoIGxvY2sgaGVsZCBvbiBsb3dlciBzb2NrZXQgKi9cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTEyOnN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbm5ldC90bHMvdGxzX3N0cnAuYy01MTMte1xcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTU1Nz12b2lkIHRsc19zdHJwX2NoZWNrX3JjdihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBhbm5vdW5jZSlcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NjEtXFxubmV0L3Rscy90bHNfc3RycC5jOjU2MjpcXHRpZiAodGxzX3N0cnBfcmVhZF9zb2NrKHN0cnApID09IC1FTk9NRU0pXFxubmV0L3Rscy90bHNfc3RycC5jLTU2My1cXHRcXHRxdWV1ZV93b3JrKHRsc19zdHJwX3dxLCBcXHUwMDI2c3RycC1cXHUwMDNld29yayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjM0LjA2MjIzMzU4WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjg5MzE1MjE2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyBgdGxzX3N0cnBfcmVhZF9zb2NrYCdzIENhbGwgQ2hhaW4qKlxuXG5BbHJpZ2h0LCBzbyBgdGxzX3N0cnBfcmVhZF9zb2NrYCBpcyBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCBtZWFucyBpdHMgc2NvcGUgaXMgbGltaXRlZCwgbWFraW5nIGl0IGVhc2llciB0byByZWFzb24gYWJvdXQsIGJ1dCBhbHNvIHBvdGVudGlhbGx5IGhpZGVzIGl0cyB1c2UuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQncyB0cmFjZSBpdHMgdXNhZ2UuIEkga25vdyBpdCdzIGNhbGxlZCBieSBgdGxzX3N0cnBfY2hlY2tfcmN2YCwgd2hpY2ggaGVscHMgYSBsb3QuIEJ1dCBJIG5lZWQgdGhlIHdob2xlIHBpY3R1cmUuIFNvIHRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBzZWUgKndobyogaXMgY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcmN2YC4gRmlndXJpbmcgb3V0IHRoYXQgY2FsbGluZyBoaWVyYXJjaHkgaXMgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBmdW5jdGlvbidzIHBsYWNlIGluIHRoZSBicm9hZGVyIHN5c3RlbSBhbmQgYW55IHBvdGVudGlhbCBzaWRlIGVmZmVjdHMgb2YgaXRzIGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MzE4NywiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjM2Ljk1NTM4ODE2MVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3OTEzOTQ4NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0bHNfc3RycF9jaGVja19yY3ZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Rscy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Rscy90bHMuaD0xOTQ9dm9pZCB0bHNfc3RycF9kYXRhX3JlYWR5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKTtcXG5uZXQvdGxzL3Rscy5oLTE5NS1cXG5uZXQvdGxzL3Rscy5oOjE5Njp2b2lkIHRsc19zdHJwX2NoZWNrX3JjdihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBhbm5vdW5jZSk7XFxubmV0L3Rscy90bHMuaC0xOTctdm9pZCB0bHNfc3RycF9tc2dfY29uc3VtZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCk7XFxuLS1cXG5uZXQvdGxzL3Rsc19tYWluLmM9NjI3PXN0YXRpYyBpbnQgZG9fdGxzX3NldHNvY2tvcHRfY29uZihzdHJ1Y3Qgc29jayAqc2ssIHNvY2twdHJfdCBvcHR2YWwsXFxuLS1cXG5uZXQvdGxzL3Rsc19tYWluLmMtNzc0LVxcbm5ldC90bHMvdGxzX21haW4uYzo3NzU6XFx0XFx0dGxzX3N0cnBfY2hlY2tfcmN2KFxcdTAwMjZyeF9jdHgtXFx1MDAzZXN0cnAsIHRydWUpO1xcbm5ldC90bHMvdGxzX21haW4uYy03NzYtXFx0fVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTUxMj1zdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NTYtICovXFxubmV0L3Rscy90bHNfc3RycC5jOjU1Nzp2b2lkIHRsc19zdHJwX2NoZWNrX3JjdihzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBhbm5vdW5jZSlcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTU4LXtcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYz01Njk9dm9pZCB0bHNfc3RycF9kYXRhX3JlYWR5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTU4Mi1cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTgzOlxcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTg0LX1cXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYz01ODY9c3RhdGljIHZvaWQgdGxzX3N0cnBfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTkxLVxcdGxvY2tfc29jayhzdHJwLVxcdTAwM2Vzayk7XFxubmV0L3Rscy90bHNfc3RycC5jOjU5MjpcXHR0bHNfc3RycF9jaGVja19yY3Yoc3RycCwgdHJ1ZSk7XFxubmV0L3Rscy90bHNfc3RycC5jLTU5My1cXHRyZWxlYXNlX3NvY2soc3RycC1cXHUwMDNlc2spO1xcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTU5Ni0vKiBSZWxlYXNlIHRoZSBjdXJyZW50IHJlY29yZCB3aXRob3V0IHRyaWdnZXJpbmcgYSBjaGVjayBmb3IgdGhlXFxubmV0L3Rscy90bHNfc3RycC5jOjU5NzogKiBuZXh0IHJlY29yZC4gQ2FsbGVycyBtdXN0IGludm9rZSB0bHNfc3RycF9jaGVja19yY3YoKSBiZWZvcmVcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTk4LSAqIHJlbGVhc2luZyB0aGUgc29ja2V0IGxvY2ssIG9yIHF1ZXVlZCBkYXRhIHdpbGwgc3RhbGwgdW50aWwgdGhlXFxuLS1cXG5uZXQvdGxzL3Rsc19zdy5jPTEwOTU9dGxzX3J4X3JlY193YWl0KHN0cnVjdCBzb2NrICpzaywgYm9vbCBub25ibG9jaywgYm9vbCByZWxlYXNlZCwgYm9vbCBoYXNfY29waWVkKVxcbi0tXFxubmV0L3Rscy90bHNfc3cuYy0xMTI0LVxcdFxcdFxcdCAqL1xcbm5ldC90bHMvdGxzX3N3LmM6MTEyNTpcXHRcXHRcXHR0bHNfc3RycF9jaGVja19yY3YoXFx1MDAyNmN0eC1cXHUwMDNlc3RycCwgZmFsc2UpO1xcbm5ldC90bHMvdGxzX3N3LmMtMTEyNi1cXHRcXHRcXHRpZiAodGxzX3N0cnBfbXNnX3JlYWR5KGN0eCkpXFxuLS1cXG5uZXQvdGxzL3Rsc19zdy5jPTE2MjQ9c3RhdGljIHZvaWQgdGxzX3J4X3JlY19kb25lKHN0cnVjdCB0bHNfc3dfY29udGV4dF9yeCAqY3R4KVxcbi0tXFxubmV0L3Rscy90bHNfc3cuYy0xNjI2LVxcdHRsc19zdHJwX21zZ19jb25zdW1lKFxcdTAwMjZjdHgtXFx1MDAzZXN0cnApO1xcbm5ldC90bHMvdGxzX3N3LmM6MTYyNzpcXHR0bHNfc3RycF9jaGVja19yY3YoXFx1MDAyNmN0eC1cXHUwMDNlc3RycCwgZmFsc2UpO1xcbm5ldC90bHMvdGxzX3N3LmMtMTYyOC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjM3LjAzNDUzMzUzOFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3NTUwNTAyNTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb24qKlxuXG5Pa2F5LCBzbyB0aGlzIGlzIGRlZmluaXRlbHkgY29yZSBUTFMgcmVjZWl2ZSBsb2dpYywgd2hpY2ggbWVhbnMgaXQncyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gR2l2ZW4gdGhlIHBhdGNoIG1vZGlmaWVzIGB0bHNfc3RycF9yZWFkX3NvY2tgLCBhbmQgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYHRsc19zdHJwX2NoZWNrX3JjdmAsIHRoYXQncyBhbiBpbW1lZGlhdGUgYXJlYSBvZiBpbnRlcmVzdC4gTm93LCBgdGxzX3N0cnBfY2hlY2tfcmN2YCBpcyBjYWxsZWQgZnJvbSBhIGhhbmRmdWwgb2Ygb3RoZXIgZnVuY3Rpb25zOiBgdGxzX3J4X3JlY193YWl0YCwgYHRsc19yeF9yZWNfZG9uZWAsIGB0bHNfc3RycF93b3JrYCwgYHRsc19zdHJwX2RhdGFfcmVhZHlgLCBhbmQgYGRvX3Rsc19zZXRzb2Nrb3B0X2NvbmZgLlxuXG5Jbml0aWFsbHksIEkgdGhvdWdodCB0aGUgcHJpbWFyeSBmb2N1cyBzaG91bGQgYmUgb24gdGhlIGNhbGxzIHRvIGB0bHNfc3RycF9jaGVja19yY3ZgLCBgdGxzX3N0cnBfZGF0YV9yZWFkeWAsIGB0bHNfcnhfcmVjX3dhaXRgLCBhbmQgYHRsc19yeF9yZWNfZG9uZWAsIGJ1dCB3YWl0LCBgdGxzX3J4X3JlY193YWl0YCBhbmQgYHRsc19yeF9yZWNfZG9uZWAgYXJlIHN0YXRpYyBmdW5jdGlvbnMuLi4gc28gdGhhdCBjb21wbGljYXRlcyB0aGluZ3MuXG5cbkxldCdzIHN0YXJ0IGJ5IGRpZ2dpbmcgaW50byBgdGxzX3N0cnBfY2hlY2tfcmN2YCBhbmQgYHRsc19zdHJwX2RhdGFfcmVhZHlgIGFuZCBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gT2gsIGFsc28sIHdoYXQgYWJvdXQgYHRsc19zdHJwX21zZ19sb2FkYD8gTWF5YmUgd2Ugc2hvdWxkIGNoZWNrIHdobyBjYWxscyBgdGxzX3N0cnBfcmVhZF9zb2NrYCB0byBzZWUgaWYgd2UgbWlzc2VkIGFueXRoaW5nLiBBaCwgYW5kIGl0IHR1cm5zIG91dCwgYHRsc19zdHJwX3JlYWRfc29ja2AgaXMgb25seSBjYWxsZWQgZnJvbSBgdGxzX3N0cnBfY2hlY2tfcmN2YC5cblxuQWxyaWdodCwgaXQgbG9va3MgbGlrZSBgdGxzX3N0cnBfY2hlY2tfcmN2YCBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgc3ltYm9sIHRvIGZvY3VzIG9uIGZvciBub3cuIE5leHQsIEkgc2hvdWxkIGNoZWNrIHRoZSBLY29uZmlnIHRvIHNlZSBob3cgVExTIGlzIGNvbmZpZ3VyZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQzNTUsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6NDEuNzg5NTg3OTc0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2ODg5Mzg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBUTFNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Rscy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3Rscy9LY29uZmlnLTQtI1xcbm5ldC90bHMvS2NvbmZpZzo1OmNvbmZpZyBUTFNcXG5uZXQvdGxzL0tjb25maWctNi1cXHR0cmlzdGF0ZSBcXFwiVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IHN1cHBvcnRcXFwiXFxuLS1cXG5uZXQvdGxzL0tjb25maWctMTgtXFxubmV0L3Rscy9LY29uZmlnOjE5OmNvbmZpZyBUTFNfREVWSUNFXFxubmV0L3Rscy9LY29uZmlnLTIwLVxcdGJvb2wgXFxcIlRyYW5zcG9ydCBMYXllciBTZWN1cml0eSBIVyBvZmZsb2FkXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo0MS44NjY0ODE3MzFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjg4NTk4Mjk2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHByZXNlbnRlZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIGdpdmVuIG15IGV4cGVydGlzZTpcblxuKipDaGVja2luZyBUTFMgU3RyaXBwaW5nIENvbmZpZ3VyYXRpb24qKlxuXG5BbHJpZ2h0LCB0aGUgY29uZmlndXJhdGlvbiBpbiBxdWVzdGlvbiBpcyBkZWZpbml0ZWx5IHNldCB0byBUTFMuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHdpdGggcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyByZWxhdGVkIHRvIFRMUyBzdHJpcHBpbmcuIFRoZXJlZm9yZSwgbXkgbmV4dCB0aG91Z2h0IGlzIHRvIGludmVzdGlnYXRlIHRoZSBgdGxzX3N0cnBfY2hlY2tfcmN2YCBmdW5jdGlvbi4gVGhhdCdzIGEgc3Ryb25nIGluZGljYXRvci4gSXQncyBsb2NhdGVkIGluIGBuZXQvdGxzL3Rsc19zdHJwLmNgLCB3aGljaCBtYWtlcyBzZW5zZSBhcyB0aGUgbmV0IGRpcmVjdG9yeSBzdWdnZXN0cyBpdCByZWxhdGVzIHRvIG5ldHdvcmsgZnVuY3Rpb25zLiBJIHdhbnQgdG8gY2hlY2sgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBiZWNhdXNlIGl0J3MgaGlnaGx5IGxpa2VseSB0byBob2xkIHRoZSBjb3JlIGxvZ2ljIGZvciB0aGUgVExTIHN0cmlwcGluZyBjaGVjaywgcGFydGljdWxhcmx5IHJlZ2FyZGluZyBpbmNvbWluZyBkYXRhLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgdmFsaWRhdGVzIHJlY2VpdmVkIGRhdGEgaW4gdGhpcyBzcGVjaWZpYyBUTFMgY29uZmlndXJhdGlvbiB0byBpZGVudGlmeSBhbnkgcG90ZW50aWFsIHdlYWtuZXNzZXMuIEknbSBsb29raW5nIGZvciBrbm93biBieXBhc3NlcyBvciBlZGdlIGNhc2VzIGhlcmUsIEknbGwgc2VlIHdoYXQgSSBjYW4gZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTE0MCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjQ1LjE1NTA4MjEzOFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTgxNjIxMTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGxzX3N0cnBfY2hlY2tfcmN2XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90bHMvdGxzX3N0cnAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmM9NTEyPXN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTU1Ni0gKi9cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTU3OnZvaWQgdGxzX3N0cnBfY2hlY2tfcmN2KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGFubm91bmNlKVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NTgte1xcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTU2OT12b2lkIHRsc19zdHJwX2RhdGFfcmVhZHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTgyLVxcbm5ldC90bHMvdGxzX3N0cnAuYzo1ODM6XFx0dGxzX3N0cnBfY2hlY2tfcmN2KHN0cnAsIHRydWUpO1xcbm5ldC90bHMvdGxzX3N0cnAuYy01ODQtfVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTU4Nj1zdGF0aWMgdm9pZCB0bHNfc3RycF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdylcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01OTEtXFx0bG9ja19zb2NrKHN0cnAtXFx1MDAzZXNrKTtcXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTkyOlxcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTkzLVxcdHJlbGVhc2Vfc29jayhzdHJwLVxcdTAwM2Vzayk7XFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTk2LS8qIFJlbGVhc2UgdGhlIGN1cnJlbnQgcmVjb3JkIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGNoZWNrIGZvciB0aGVcXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTk3OiAqIG5leHQgcmVjb3JkLiBDYWxsZXJzIG11c3QgaW52b2tlIHRsc19zdHJwX2NoZWNrX3JjdigpIGJlZm9yZVxcbm5ldC90bHMvdGxzX3N0cnAuYy01OTgtICogcmVsZWFzaW5nIHRoZSBzb2NrZXQgbG9jaywgb3IgcXVldWVkIGRhdGEgd2lsbCBzdGFsbCB1bnRpbCB0aGVcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6NDUuMjUzMjUwODY1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMwMDE4MjQwNzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aGUgZXhwZXJ0OlxuXG4qKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWxseSBFeHBvc2VkIFRMUyBGdW5jdGlvbioqXG5cbk9rYXksIHNvIGB0bHNfc3RycF9jaGVja19yY3ZgIGlzIGVpdGhlciBleHBvcnRlZCBvciwgYXQgdGhlIHZlcnkgbGVhc3QsIG5vdCBkZWNsYXJlZCBhcyBzdGF0aWMuIFRoYXQncyBpbW1lZGlhdGVseSBpbnRlcmVzdGluZzsgaXQgbWVhbnMgaXQncyBwb3RlbnRpYWxseSBhY2Nlc3NpYmxlIG91dHNpZGUgaXRzIGN1cnJlbnQgc2NvcGUuIE15IG5leHQgc3RlcCBpcyB0byBwaW5wb2ludCBpdHMgdXNhZ2Ugd2l0aGluIHRoZSBUTFMgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgdG8gc2VlIGhvdyBpdCBmaXRzIGludG8gdGhlIGRhdGEgcmVjZWl2ZSBwYXRoLiBMZXQncyBkaWcgaW50byBgbmV0L3Rscy90bHNfc3cuY2AgYW5kIHNlYXJjaCBmb3IgdGhlIGB0bHNfc3dfcmVjdm1zZ2AgZnVuY3Rpb24uIEZpbmRpbmcgdGhhdCB3aWxsIGxpa2VseSBnaXZlIG1lIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0IGFuZCBxdWlja2x5IHJldmVhbCBob3cgYHRsc19zdHJwX2NoZWNrX3JjdmAgaXMgaW52b2tlZC4gSXQnbGwgZ2l2ZSBtZSBhIGdvb2QgdW5kZXJzdGFuZGluZyBvZiB3aGVyZSBhbmQgaG93IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhbmQgaXRzIG92ZXJhbGwgaW1wb3J0YW5jZS4gSSdtIGhvcGluZyB0aGlzIHdpbGwgcHJvdmlkZSBlbm91Z2ggY29udGV4dCBmb3IgbWUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZnVuY3Rpb24gaXMgYSBwb2ludCBvZiBjb25jZXJuLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1ODM5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6NDguMjU1MDc3MTUyWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDYxNDcyNTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidGxzX3N3X3JlY3Ztc2dcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Rscy90bHNfc3cuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGxzL3Rsc19zdy5jPTE4MDA9c3RhdGljIHZvaWQgdGxzX3J4X3JlYWRlcl91bmxvY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGxzX3N3X2NvbnRleHRfcnggKmN0eClcXG4tLVxcbm5ldC90bHMvdGxzX3N3LmMtMTgwNS1cXG5uZXQvdGxzL3Rsc19zdy5jOjE4MDY6aW50IHRsc19zd19yZWN2bXNnKHN0cnVjdCBzb2NrICpzayxcXG5uZXQvdGxzL3Rsc19zdy5jLTE4MDctXFx0XFx0ICAgc3RydWN0IG1zZ2hkciAqbXNnLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo0OC4zNjEyMjg0MjhaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ1ODg2ODg3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgVExTIFNvY2tldCBSZWNlcHRpb24gVnVsbmVyYWJpbGl0aWVzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgVExTIHNvY2tldCBoYW5kbGluZywgc3BlY2lmaWNhbGx5IHRoZSByZWNlcHRpb24gcHJvY2Vzcy4gYHRsc19zd19yZWN2bXNnYCBpcyB0aGUga2V5IGZ1bmN0aW9uIGhlcmUsIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgYW5hbHlzaXMuIEFuZCBJIHNob3VsZCBhbHNvIGtlZXAgYW4gZXllIG9uIGB0bHNfc3RycF9kYXRhX3JlYWR5YCBhcyB0aGUgZGF0YS1yZWFkeSBjYWxsYmFjay5cblxuUmlnaHQsIGxldCdzIGRpdmUgaW50byBgbmV0L3Rscy90bHNfc3RycC5jYCBhbmQgdGFrZSBhIGxvb2sgYXQgYHRsc19zdHJwX3JlYWRfc29ja2AuIEl0J3Mgc3RhdGljLCBzbyBJJ2xsIG5lZWQgdG8gdHJhY2UgaXQgY2FyZWZ1bGx5LiBBaCwgaGVyZSdzIGEgcGF0Y2ggdGhhdCBhZGRyZXNzZXMgYSBidWcgd2hlcmUgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3YXMgYmVpbmcgY2FsbGVkIGluY29ycmVjdGx5LCBlaXRoZXIgd2l0aCBhbiBpbmNvcnJlY3QgbGVuZ3RoIG9yIGF0IHRoZSB3cm9uZyB0aW1lLiBUaGlzIHdvdWxkIGxlYWQgdG8gcHJvYmxlbXMgd2hlbiB0aGUgcmVjZWl2ZSBxdWV1ZSBkb2Vzbid0IGhhdmUgdGhlIGNvbXBsZXRlIFRMUyBoZWFkZXIsIHdoaWNoIHdvdWxkIGJlIGEgc2lnbmlmaWNhbnQgdnVsbmVyYWJpbGl0eSB0byBleHBsb2l0LiBUaGlzIGlzICpkZWZpbml0ZWx5KiBmdXp6aW5nIG1hdGVyaWFsLiBUaGUgcG90ZW50aWFsIGhlcmUgaXMgcXVpdGUgaW50ZXJlc3RpbmcuXG5cblRvIGFpZCB3aXRoIHRoYXQsIGxldCBtZSBub3RlIGRvd24gc29tZSBtb3JlIGZvY3VzIHN5bWJvbHMuIEkgaGF2ZTpcblxuLSAgIGB0bHNfc3RycF9jaGVja19yY3ZgXG4tICAgYHRsc19zd19yZWN2bXNnYFxuLSAgIGB0bHNfc3RycF9kYXRhX3JlYWR5YFxuXG5Hb29kLCBnb29kLiBJ4oCZbGwgbWFrZSBzdXJlIHRoZSBgVExTYCBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBlbmFibGVkLiBOb3csIGxldCBtZSBqdXN0IHF1aWNrbHkgZG91YmxlLWNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgdGhhdCBtaWdodCBiZSBpbiBwbGF5LiBBbHdheXMgZ29vZCB0byBjb3ZlciBteSBiYXNlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6NjI0MCwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo1Mi44MjAxMDA0MzRaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU1MDQ3NjE5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImRlcGVuZHMgb25cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3Rscy9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90bHMvS2NvbmZpZz01PWNvbmZpZyBUTFNcXG5uZXQvdGxzL0tjb25maWctNi1cXHR0cmlzdGF0ZSBcXFwiVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IHN1cHBvcnRcXFwiXFxubmV0L3Rscy9LY29uZmlnOjc6XFx0ZGVwZW5kcyBvbiBJTkVUXFxubmV0L3Rscy9LY29uZmlnLTgtXFx0c2VsZWN0IENSWVBUT1xcbi0tXFxubmV0L3Rscy9LY29uZmlnPTE5PWNvbmZpZyBUTFNfREVWSUNFXFxubmV0L3Rscy9LY29uZmlnLTIwLVxcdGJvb2wgXFxcIlRyYW5zcG9ydCBMYXllciBTZWN1cml0eSBIVyBvZmZsb2FkXFxcIlxcbm5ldC90bHMvS2NvbmZpZzoyMTpcXHRkZXBlbmRzIG9uIFRMU1xcbm5ldC90bHMvS2NvbmZpZy0yMi1cXHRzZWxlY3QgU0tCX0RFQ1JZUFRFRFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo1Mi44NzUxNTIzNTNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQzMDQwMTk0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBUTFMgU3RyZWFtIFBhcnNlciBQYXRjaCoqXG5cbk9rYXksIHNvIHRoZSBnaXN0IG9mIGl0IGlzIHRoaXM6IGBJTkVUYCBpcyB0aGUgZ28tdG8sIGFuZCBgVExTYCBpcyBnb29kIGVub3VnaCBmb3Igd2hhdCB3ZSdyZSBkb2luZy4gTGV0IG1lIGJyZWFrIGRvd24gdGhlIHRoaW5raW5nIGhlcmUuXG5cblRoaXMgcGF0Y2gsIGl0J3MgbWVzc2luZyB3aXRoIHRoZSBUTFMgc3RyZWFtIHBhcnNlciwgc3BlY2lmaWNhbGx5IHRob3NlIGB0bHNfc3RycF9yZWFkX3NvY2tgIGFuZCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGZ1bmN0aW9ucy4gSXQncyBhYm91dCBtYWtpbmcgc3VyZSB0aGUgY29kZSAqYWN0dWFsbHkqIGNoZWNrcyBpZiB0aGVyZSdzIGVub3VnaCBkYXRhIGluIHRoZSByZWNlaXZlIHF1ZXVlIGJlZm9yZSB0cnlpbmcgdG8gcGFyc2UgdGhlIFRMUyBoZWFkZXIuIFRoYXQncyBjcml0aWNhbCBuZXR3b3JrIHJlY2VpdmUgbG9naWMsIHRoZSBicmVhZCBhbmQgYnV0dGVyIG9mIFRMUyBzb2NrZXRzLCBhbmQgaXQncyBzb21ldGhpbmcgdXNlcnNwYWNlIGNhbiBwb2tlIGF0IHdpdGggYHJlY3Ztc2dgIG9uIHRob3NlIFRMUyBzb2NrZXRzLiBUaGlzIGlzICpwcmltZSogZnV6emluZyBtYXRlcmlhbCwgbm8gcXVlc3Rpb24uIFdlIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlIHBhcnNlciBncmFjZWZ1bGx5IGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3Jkcy4gTm8gbWVtb3J5IGNvcnJ1cHRpb24sIG5vIHN0YWxscyDigJMgdGhhdCdzIHRoZSBuYW1lIG9mIHRoZSBnYW1lLiBXZSBhcmUgZ29pbmcgdG8gbmVlZCB0byBwcm92aWRlIHRoZXNlIHJlc3VsdHMgd2l0aCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2OTE0LCJPdXRwdXRUb2tlbnMiOjE2MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo1Ny4zMDU1NTY5NFoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzQ3ODE3NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVExTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidGxzX3N0cnBfY2hlY2tfcmN2XCIsXG4gICAgXCJ0bHNfc3dfcmVjdm1zZ1wiLFxuICAgIFwidGxzX3N0cnBfZGF0YV9yZWFkeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVExTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidGxzX3N0cnBfY2hlY2tfcmN2XCIsXG4gICAgXCJ0bHNfc3dfcmVjdm1zZ1wiLFxuICAgIFwidGxzX3N0cnBfZGF0YV9yZWFkeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBUTFMgc3RyZWFtIHBhcnNlciBsb2dpYyAoYHRsc19zdHJwX3JlYWRfc29ja2AgYW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2ApIHRvIGNvcnJlY3RseSBjaGVjayBpZiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSBUTFMgaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXQuIFRoaXMgaXMgY29yZSBuZXR3b3JrIHJlY2VpdmUgbG9naWMgZm9yIFRMUyBzb2NrZXRzIGFuZCBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBgcmVjdm1zZ2Agb24gVExTIHNvY2tldHMuIEl0IGlzIHdvcnRoIGZ1enppbmcgdG8gZW5zdXJlIHRoZSBzdHJlYW0gcGFyc2VyIGhhbmRsZXMgZnJhZ21lbnRlZCBvciBzaG9ydCBUTFMgcmVjb3JkcyBjb3JyZWN0bHkgd2l0aG91dCBtZW1vcnkgY29ycnVwdGlvbiBvciBzdGFsbHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjI5OjU3LjQ1OTA0MjQ1NVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg1NTQwODY4Mjk1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6Mjk6NTcuNDU5NDkxNzc1WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE4NTU0MDQxNDQzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXFxuXFxuQnkgY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soKWAgYmVmb3JlIHJlYWRpbmcgdGhlIGhlYWRlciwgdGhlIGNvZGUgZGV0ZWN0cyBvdmVybGFwcGluZyBzZWdtZW50cyBvciBtaXhlZCBkZWNyeXB0ZWQgc3RhdHVzIGFuZCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHkoKWAuIFRoaXMgZmFsbGJhY2sgdXNlcyBgdGNwX3JlYWRfc29jaygpYCB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBvdmVybGFwcyBhbmQgY29weSB0aGUgbG9naWNhbCBzdHJlYW0gaW50byBhIGxpbmVhciBidWZmZXIuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnZvbHZlZC4gVGhlIGJ5dGVzIHJlYWQgYnkgYHNrYl9jb3B5X2JpdHMoKWAgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG5ldHdvcmsgZGF0YTsgdGhleSBhcmUgc2ltcGx5IHRoZSB3cm9uZyBieXRlcyBkdWUgdG8gdGhlIG92ZXJsYXBzLiBUaGVyZWZvcmUsIEtNU0FOICh3aGljaCBkZXRlY3RzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlKSBpcyBub3QgYXBwbGljYWJsZSBoZXJlLiBTdGFuZGFyZCBLQVNBTiB3b3VsZCBhbHNvIG5vdCBkZXRlY3QgYW55dGhpbmcsIGFzIHRoZXJlIGlzIG5vIG1lbW9yeSBjb3JydXB0aW9uIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGE2YjA1YjdlMzU3ZDEzYjU5N2VmOGNiMjI2ZjRmYWI0MGZlM2I5MjBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyA3IDIwOjI5OjI3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3Rscy90bHNfc3RycC5jIGIvbmV0L3Rscy90bHNfc3RycC5jXG5pbmRleCA2MWIxMGM2OTdlY2NiLi42NGQ1ZGVhOTA1NDAzIDEwMDY0NFxuLS0tIGEvbmV0L3Rscy90bHNfc3RycC5jXG4rKysgYi9uZXQvdGxzL3Rsc19zdHJwLmNcbkBAIC00MzAsOSArNDMwLDkgQEAgc3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuK3N0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGludCBsZW4pXG4ge1xuLVx0dW5zaWduZWQgaW50IGxlbiA9IHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuO1xuIFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0LCAqc2tiO1xuIFx0dTMyIHNlcTtcbiBcbkBAIC01MjUsNiArNTI1LDEyIEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIFxuIFx0dGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZShzdHJwLCBpbnEpO1xuIFx0aWYgKCFzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbikge1xuK1x0XHRpZiAoaW5xIFx1MDAzYyBUTFNfSEVBREVSX1NJWkUpXG4rXHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcbitcbitcdFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgKyBUTFNfSEVBREVSX1NJWkUpKVxuK1x0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuK1xuIFx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVx1MDAzZWFuY2hvcik7XG4gXHRcdGlmIChzeiBcdTAwM2MgMClcbiBcdFx0XHRyZXR1cm4gc3o7XG5AQCAtNTM1LDcgKzU0MSw3IEBAIHN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxuIFx0XHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XG4gXHR9XG4gXG4tXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnApKVxuK1x0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVx1MDAzZXN0bS5vZmZzZXQgKyBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbikpXG4gXHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuIFxuIFx0V1JJVEVfT05DRShzdHJwLVx1MDAzZW1zZ19yZWFkeSwgMSk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDoyOTo1Ny40NTk0OTI1NDVaIiwiU2VxIjoxOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTkwNTI0MTA5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFRMUyBTdHJlYW0gUHJvY2Vzc2luZyBQYXRjaCoqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgYWltZWQgYXQgaW1wcm92aW5nIHRoZSBoYW5kbGluZyBvZiBUTFMgc3RyZWFtIHByb2Nlc3NpbmcsIHNwZWNpZmljYWxseSBhcm91bmQgaG93IHRoZSBpbnB1dCBxdWV1ZSBpcyB2YWxpZGF0ZWQgYW5kIHJlYWQuIFRoZSBrZXkgY2hhbmdlIGlzIHRoYXQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBub3cgYWNjZXB0cyBhbiBleHBsaWNpdCBsZW5ndGggYXJndW1lbnQgKGBsZW5gKSBpbnN0ZWFkIG9mIHJlY2FsY3VsYXRpbmcgaXQgZnJvbSBgc3RycC1cdTAwM2VzdG0ub2Zmc2V0YCBhbmQgYHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuYC4gVGhpcyBpcyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IHNoaWZ0IOKAkyBpdCBhbGxvd3MgZm9yIG1vcmUgZmxleGliaWxpdHkgYW5kIHBvdGVudGlhbGx5IGF2b2lkcyByZWR1bmRhbnQgY2FsY3VsYXRpb25zIG9yIHBvc3NpYmxlIG9mZi1ieS1vbmUgZXJyb3JzIHRoYXQgbWlnaHQgYXJpc2UgZnJvbSB0aGUgaW1wbGljaXQgY2FsY3VsYXRpb24uXG5cblRoZSBvdGhlciBwb2ludCBvZiBpbnRlcmVzdCBpcyB0aGUgYWRkZWQgY2hlY2sgd2l0aGluIGB0bHNfc3RycF9yZWFkX3NvY2tgLiBUaGUgY29kZSBub3cgZXhwbGljaXRseSBhZGRyZXNzZXMgdGhlIGNhc2Ugd2hlcmUgYHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuYCBpcyB6ZXJvLiBXaGVuIHRoZSBidWZmZXIgaXMgZW1wdHksIGl0IGZpcnN0IGxvYWRzIGFuIGFuY2hvciBmcm9tIHRoZSBxdWV1ZS4gVGhlbiwgdGhlIHBhdGNoIGluc2VydHMgYWRkaXRpb25hbCBjb25kaXRpb25hbCBsb2dpYzpcblxuMS4gIElmIHRoZSBpbnB1dCBxdWV1ZSBzaXplIChgaW5xYCkgaXMgc21hbGxlciB0aGFuIGBUTFNfSEVBREVSX1NJWkVgLCBpdCBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggSSBpbmZlciBtaWdodCBoYW5kbGUgYSBzaG9ydCByZWFkIG9yIGEgc3BlY2lhbCBpbml0aWFsaXphdGlvbi5cbjIuICBJZiB0aGUgc2l6ZSBpcyBzdWZmaWNpZW50IChgaW5xYCBcdTAwM2U9IGBUTFNfSEVBREVSX1NJWkVgKSBpdCB0aGVuIGNhbGxzIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2Agd2l0aCBhIHNpemUgb2YgYHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIFRMU19IRUFERVJfU0laRWAuIFRoaXMgc2l6ZSBpcyBtb3N0IGxpa2VseSBjaGVja2luZyBpZiB0aGUgVExTIGhlYWRlciBpcyB2YWxpZCB3aXRoaW4gdGhlIHF1ZXVlLiBJZiBpdCAqaXNuJ3QqIG9rYXksIGl0IGNhbGxzIGB0bHNfc3RycF9yZWFkX2NvcHlgIGFnYWluLCB0aGlzIHRpbWUgd2l0aCBhIGBmYWxzZWAgYXJndW1lbnQuXG5cbkkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgZXhhY3RseSBgdGxzX3N0cnBfcmVhZF9jb3B5YCBkb2VzIGluIHRob3NlIGNhc2VzLiBUaGUgYHRydWVgIGFuZCBgZmFsc2VgIGFyZ3VtZW50cyBzdWdnZXN0IGRpZmZlcmVudCBiZWhhdmlvcnMsIGFuZCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRob3NlIGRpZmZlcmVuY2VzIGFyZSwgd2hpY2ggd2lsbCBwcm9iYWJseSB0ZWxsIG1lIHdoYXQncyBnb2luZyBvbiBoZXJlLiBUaGUgY2FsbCB0byBgdGxzX3J4X21zZ19zaXplYCBhZnRlciB0aGVzZSBjaGVja3MgaW1wbGllcyB0aGF0IHRoZSBjb2RlIGlzIGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBpbmNvbWluZyBUTFMgbWVzc2FnZS5cblxuVWx0aW1hdGVseSwgdGhlIGdvYWwgaXMgdG8gbWFrZSBzdXJlIHRoYXQgd2hhdGV2ZXIncyBpbiB0aGUgaW5wdXQgcXVldWUgaXMgdmFsaWQgYW5kIHNhZmUgdG8gcHJvY2VzcywgZXNwZWNpYWxseSB3aGVuIHRoZSBzdHJlYW0gbGVuZ3RoIGlzbid0IGltbWVkaWF0ZWx5IGtub3duLiBUaGUgZXhwbGljaXQgbGVuZ3RoIGFyZ3VtZW50IHRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2Agc3VnZ2VzdHMgYSBkZXNpcmUgZm9yIGdyZWF0ZXIgcHJlY2lzaW9uIGFuZCBwb3RlbnRpYWxseSBtb3JlIGVmZmljaWVudCB2YWxpZGF0aW9uLiBJIHNob3VsZCBkZWx2ZSBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjM2NywiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0NCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMwOjAzLjM2NDczNjg0MloiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA0MTQwMTk2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRsc19zdHJwX2NoZWNrX3F1ZXVlX29rXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90bHMvdGxzX3N0cnAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmM9MzkwPXN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIHFzaG9ydClcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy00MzItXFxubmV0L3Rscy90bHNfc3RycC5jOjQzMzpzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNDM0LVxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTUxMj1zdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfc29jayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01MzAtXFxubmV0L3Rscy90bHNfc3RycC5jOjUzMTpcXHRcXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBUTFNfSEVBREVSX1NJWkUpKVxcbm5ldC90bHMvdGxzX3N0cnAuYy01MzItXFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTQzLVxcbm5ldC90bHMvdGxzX3N0cnAuYzo1NDQ6XFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ICsgc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSlcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTQ1LVxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDowMy40Njg4ODMxNjhaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDE4OTA3NTk2NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRob3NlIGZ1bmN0aW9ucywgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBhbmQgYHRsc19zdHJwX3JlYWRfc29ja2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBxdWV1ZSBhbmQgc29ja2V0IGhhbmRsaW5nIGhlcmUsIGFuZCBob3cgdGhleSByZWxhdGUgdG8gdGhlIG92ZXJhbGwgVExTL1NSUCBwcm9jZXNzLlxuXG4qKkRpdmluZyBpbnRvIFF1ZXVlIGFuZCBTb2NrZXQgSW50ZWdyaXR5KipcblxuSSdtIGltbWVkaWF0ZWx5IGZvY3VzaW5nIG9uIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuIE15IGd1dCBmZWVsaW5nIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBsaWtlbHkgZXhhbWluZXMgdGhlIHN0YXRlIG9mIGEgcXVldWUsIHByZXN1bWFibHkgcmVsYXRlZCB0byBkYXRhIGNvbWluZyBpbiBvciBnb2luZyBvdXQgb2YgdGhlIFRMUy9TUlAgY29tbXVuaWNhdGlvbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCBjb25zdGl0dXRlcyBhbiBcIm9rXCIgc3RhdGUuIElzIGl0IGNoZWNraW5nIGZvciBvdmVyZmxvdz8gVW5kZXJmbG93PyBTcGVjaWZpYyBmbGFncz8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBzaW1wbGUgRklGTyBxdWV1ZSwgb3Igc29tZXRoaW5nIG1vcmUgY29tcGxleD8gVGhlIFwib2tcIiBjb25kaXRpb24gd2lsbCBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgZXJyb3IgaGFuZGxpbmcgb3IgZmxvdyBjb250cm9sIG1lY2hhbmlzbXMgaW4gcGxhY2UuIFRoZSBuYW1pbmcgY29udmVudGlvbiBzdWdnZXN0cyBpdCBtaWdodCBiZSBzcGVjaWZpYyB0byBTZWN1cmUgUmVtb3RlIFBhc3N3b3JkLlxuXG5OZXh0LCBgdGxzX3N0cnBfcmVhZF9zb2NrYC4gVGhlIGByZWFkX3NvY2tgIHBhcnQgaXMgc3RyYWlnaHRmb3J3YXJkIOKAkyB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZXNwb25zaWJsZSBmb3IgcmVjZWl2aW5nIGRhdGEgZnJvbSB0aGUgc29ja2V0LiBIb3dldmVyLCB0aGUgXCJTUlBcIiBwcmVmaXggc3VnZ2VzdHMgYSB2ZXJ5IHNwZWNpZmljLCBhbmQgcHJvYmFibHkgc2VjdXJpdHktc2Vuc2l0aXZlLCBvcGVyYXRpb24uIEknbSBndWVzc2luZyB0aGF0IHRoaXMgaXMgcmVsYXRlZCB0byByZWNlaXZpbmcgU1JQIGNoYWxsZW5nZSByZXNwb25zZXMsIHZlcmlmaWNhdGlvbiBkYXRhLCBvciBwZXJoYXBzIGV2ZW4gdGhlIFRMUyBoYW5kc2hha2UgaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGxhcmdlciBUTFMvU1JQIHN0YXRlIG1hY2hpbmUuIElzIGl0IGJsb2NraW5nLCBub24tYmxvY2tpbmcsIG9yIHVzaW5nIHNlbGVjdC9wb2xsPyBBcmUgdGhlcmUgc3BlY2lmaWMgZXJyb3IgY29kZXMgdG8gaGFuZGxlPyBXaGF0IGhhcHBlbnMgb24gcGFydGlhbCByZWFkcz8gV2hhdCBzZWN1cml0eSBjaGVja3MgYXJlIGhhcHBlbmluZyBoZXJlP1xuXG5NeSBwcmltYXJ5IGNvbmNlcm4gd2l0aCB0aGVzZSB0d28gZnVuY3Rpb25zIHdpbGwgYmUgdW5kZXJzdGFuZGluZyB0aGVpciBpbnRlcnBsYXkuIEhvdyBkb2VzIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaW5mbHVlbmNlIHRoZSBiZWhhdmlvciBvZiBgdGxzX3N0cnBfcmVhZF9zb2NrYD8gRG9lcyB0aGUgcXVldWUgY2hlY2sgZ2F0ZSB0aGUgcmVhZD8gRG9lcyB0aGUgcXVldWUgcmVwcmVzZW50IGEgYnVmZmVyIGZvciBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBzb2NrZXQ/IFRoZSByZWxhdGlvbnNoaXBzIGFyZSBrZXkuIEknbGwgbmVlZCB0byBjYXJlZnVsbHkgdHJhY2UgdGhlIGRhdGEgZmxvdyBhbmQgcG90ZW50aWFsIGVycm9yIGNvbmRpdGlvbnMgaW4gdGhlIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzUzMywiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMwOjA3LjY1Nzk2MTk5NFoiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4OTM5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDMwLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQzMDpcXHRcXHRyZXR1cm4gMDtcXG4gNDMxOlxcdH1cXG4gNDMyOlxcdFxcbiA0MzM6XFx0c3RhdGljIGJvb2wgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsXFxuIDQzNDpcXHRcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IGxlbilcXG4gNDM1OlxcdHtcXG4gNDM2OlxcdFxcdHN0cnVjdCBza19idWZmICpmaXJzdCwgKnNrYjtcXG4gNDM3OlxcdFxcdHUzMiBzZXE7XFxuIDQzODpcXHRcXG4gNDM5OlxcdFxcdGZpcnN0ID0gc2tiX3NoaW5mbyhzdHJwLVxcdTAwM2VhbmNob3IpLVxcdTAwM2VmcmFnX2xpc3Q7XFxuIDQ0MDpcXHRcXHRza2IgPSBmaXJzdDtcXG4gNDQxOlxcdFxcdHNlcSA9IFRDUF9TS0JfQ0IoZmlyc3QpLVxcdTAwM2VzZXE7XFxuIDQ0MjpcXHRcXG4gNDQzOlxcdFxcdC8qIE1ha2Ugc3VyZSB0aGVyZSdzIG5vIGR1cGxpY2F0ZSBkYXRhIGluIHRoZSBxdWV1ZSxcXG4gNDQ0OlxcdFxcdCAqIGFuZCB0aGUgZGVjcnlwdGVkIHN0YXR1cyBtYXRjaGVzLlxcbiA0NDU6XFx0XFx0ICovXFxuIDQ0NjpcXHRcXHR3aGlsZSAoc2tiLVxcdTAwM2VsZW4gXFx1MDAzYyBsZW4pIHtcXG4gNDQ3OlxcdFxcdFxcdHNlcSArPSBza2ItXFx1MDAzZWxlbjtcXG4gNDQ4OlxcdFxcdFxcdGxlbiAtPSBza2ItXFx1MDAzZWxlbjtcXG4gNDQ5OlxcdFxcdFxcdHNrYiA9IHNrYi1cXHUwMDNlbmV4dDtcXG4gNDUwOlxcdFxcbiA0NTE6XFx0XFx0XFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cXHUwMDNlc2VxICE9IHNlcSlcXG4gNDUyOlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNDUzOlxcdFxcdFxcdGlmIChza2JfY21wX2RlY3J5cHRlZChmaXJzdCwgc2tiKSlcXG4gNDU0OlxcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gNDU1OlxcdFxcdH1cXG4gNDU2OlxcdFxcbiA0NTc6XFx0XFx0cmV0dXJuIHRydWU7XFxuIDQ1ODpcXHR9XFxuIDQ1OTpcXHRcXG4gNDYwOlxcdHN0YXRpYyB2b2lkIHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGludCBsZW4pXFxuIDQ2MTpcXHR7XFxuIDQ2MjpcXHRcXHRzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHN0cnAtXFx1MDAzZXNrKTtcXG4gNDYzOlxcdFxcdHN0cnVjdCBza19idWZmICpmaXJzdDtcXG4gNDY0OlxcdFxcdHUzMiBvZmZzZXQ7XFxuIDQ2NTpcXHRcXG4gNDY2OlxcdFxcdGZpcnN0ID0gdGNwX3JlY3Zfc2tiKHN0cnAtXFx1MDAzZXNrLCB0cC1cXHUwMDNlY29waWVkX3NlcSwgXFx1MDAyNm9mZnNldCk7XFxuIDQ2NzpcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKCFmaXJzdCkpXFxuIDQ2ODpcXHRcXHRcXHRyZXR1cm47XFxuIDQ2OTpcXHRcXG4gNDcwOlxcdFxcdC8qIEJlc3RvdyB0aGUgc3RhdGUgb250byB0aGUgYW5jaG9yICovXFxuIDQ3MTpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZWxlbiA9IG9mZnNldCArIGxlbjtcXG4gNDcyOlxcdFxcdHN0cnAtXFx1MDAzZWFuY2hvci1cXHUwMDNlZGF0YV9sZW4gPSBvZmZzZXQgKyBsZW47XFxuIDQ3MzpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZXRydWVzaXplID0gb2Zmc2V0ICsgbGVuO1xcbiA0NzQ6XFx0XFxuIDQ3NTpcXHRcXHRza2Jfc2hpbmZvKHN0cnAtXFx1MDAzZWFuY2hvciktXFx1MDAzZWZyYWdfbGlzdCA9IGZpcnN0O1xcbiA0NzY6XFx0XFxuIDQ3NzpcXHRcXHRza2JfY29weV9oZWFkZXIoc3RycC1cXHUwMDNlYW5jaG9yLCBmaXJzdCk7XFxuIDQ3ODpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZWRlc3RydWN0b3IgPSBOVUxMO1xcbiA0Nzk6XFx0XFxuIDQ4MDpcXHRcXHRzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ID0gb2Zmc2V0O1xcbiA0ODE6XFx0fVxcbiA0ODI6XFx0XFxuIDQ4MzpcXHRib29sIHRsc19zdHJwX21zZ19sb2FkKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGZvcmNlX3JlZnJlc2gpXFxuIDQ4NDpcXHR7XFxuIDQ4NTpcXHRcXHRzdHJ1Y3Qgc3RycF9tc2cgKnJ4bTtcXG4gNDg2OlxcdFxcdHN0cnVjdCB0bHNfbXNnICp0bG07XFxuIDQ4NzpcXHRcXG4gNDg4OlxcdFxcdERFQlVHX05FVF9XQVJOX09OX09OQ0UoIXN0cnAtXFx1MDAzZW1zZ19yZWFkeSk7XFxuIDQ4OTpcXHRcXHRERUJVR19ORVRfV0FSTl9PTl9PTkNFKCFzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pO1xcbiA0OTA6XFx0XFxuIDQ5MTpcXHRcXHRpZiAoIXN0cnAtXFx1MDAzZWNvcHlfbW9kZSBcXHUwMDI2XFx1MDAyNiBmb3JjZV9yZWZyZXNoKSB7XFxuIDQ5MjpcXHRcXHRcXHRpZiAodW5saWtlbHkodGNwX2lucShzdHJwLVxcdTAwM2VzaykgXFx1MDAzYyBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pKSB7XFxuIDQ5MzpcXHRcXHRcXHRcXHRXUklURV9PTkNFKHN0cnAtXFx1MDAzZW1zZ19yZWFkeSwgMCk7XFxuIDQ5NDpcXHRcXHRcXHRcXHRzdHJwLVxcdTAwM2Vtc2dfYW5ub3VuY2VkID0gMDtcXG4gNDk1OlxcdFxcdFxcdFxcdG1lbXNldChcXHUwMDI2c3RycC1cXHUwMDNlc3RtLCAwLCBzaXplb2Yoc3RycC1cXHUwMDNlc3RtKSk7XFxuIDQ5NjpcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDQ5NzpcXHRcXHRcXHR9XFxuIDQ5ODpcXHRcXG4gNDk5OlxcdFxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKTtcXG4gNTAwOlxcdFxcdH1cXG4gNTAxOlxcdFxcbiA1MDI6XFx0XFx0cnhtID0gc3RycF9tc2coc3RycC1cXHUwMDNlYW5jaG9yKTtcXG4gNTAzOlxcdFxcdHJ4bS1cXHUwMDNlZnVsbF9sZW5cXHQ9IHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbjtcXG4gNTA0OlxcdFxcdHJ4bS1cXHUwMDNlb2Zmc2V0XFx0PSBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0O1xcbiA1MDU6XFx0XFx0dGxtID0gdGxzX21zZyhzdHJwLVxcdTAwM2VhbmNob3IpO1xcbiA1MDY6XFx0XFx0dGxtLVxcdTAwM2Vjb250cm9sXFx0PSBzdHJwLVxcdTAwM2VtYXJrO1xcbiA1MDc6XFx0XFxuIDUwODpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTA5OlxcdH1cXG4gNTEwOlxcdFxcbiA1MTE6XFx0LyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIG9uIGxvd2VyIHNvY2tldCAqL1xcbiA1MTI6XFx0c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuIDUxMzpcXHR7XFxuIDUxNDpcXHRcXHRpbnQgc3osIGlucTtcXG4gNTE1OlxcdFxcbiA1MTY6XFx0XFx0aW5xID0gdGNwX2lucShzdHJwLVxcdTAwM2Vzayk7XFxuIDUxNzpcXHRcXHRpZiAoaW5xIFxcdTAwM2MgMSlcXG4gNTE4OlxcdFxcdFxcdHJldHVybiAwO1xcbiA1MTk6XFx0XFxuIDUyMDpcXHRcXHRpZiAodW5saWtlbHkoc3RycC1cXHUwMDNlY29weV9tb2RlKSlcXG4gNTIxOlxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHlpbihzdHJwKTtcXG4gNTIyOlxcdFxcbiA1MjM6XFx0XFx0aWYgKGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTI0OlxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDUyNTpcXHRcXG4gNTI2OlxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcXG4gNTI3OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDUyODpcXHRcXHRcXHRpZiAoaW5xIFxcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxcbiA1Mjk6XFx0XFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MDcuNjU4MDUyNjk0WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI4MDI2NzkzOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duLCBhc3N1bWluZyBJJ20gYW4gZXhwZXJ0IGluIHRoaXMgZmllbGQ6XG5cbioqRGl2aW5nIGludG8gYHRsc19zdHJwX3JlYWRfc29ja2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgZGlnIGludG8gdGhlIHJlc3Qgb2YgdGhpcyBgdGxzX3N0cnBfcmVhZF9zb2NrYCBmdW5jdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbXBsZXRlIG9wZXJhdGlvbmFsIGNvbnRleHQuIFRoaXMgaW5pdGlhbCBzZWN0aW9uIHByb3ZpZGVkIGEga2V5LCBidXQgSSBuZWVkIHRvIHNlZSB0aGUgZW50aXJlIHRoaW5nLiBUaGUgaGVhZGVyIHRlbGxzIG1lIHdoZXJlIHdlIGFyZSwgYnV0IEkgbmVlZCB0aGUgZnVsbCBwaWN0dXJlIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIHJlYWxseSBkb2luZywgaG93IGl0IGhhbmRsZXMgZXJyb3JzLCBhbmQgdGhlIGxvZ2ljIGZsb3cuIExldCdzIHNlZSBob3cgdGhlIHJlc3Qgb2YgaXQgaGFuZGxlcyBpdHMgY29yZSByZXNwb25zaWJpbGl0aWVzLiBUaGlzIHdpbGwgY2xhcmlmeSB0aGUgYWN0dWFsIG1lY2hhbmlzbXMgZm9yIGhhbmRsaW5nIHRoZSBzb2NrZXQgcmVhZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTUyNCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MTAuNDYwNzM0Mzc4WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNzUzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTI1LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyNTpcXHRcXG4gNTI2OlxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcXG4gNTI3OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDUyODpcXHRcXHRcXHRpZiAoaW5xIFxcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxcbiA1Mjk6XFx0XFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcXG4gNTMwOlxcdFxcbiA1MzE6XFx0XFx0XFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ICsgVExTX0hFQURFUl9TSVpFKSlcXG4gNTMyOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xcbiA1MzM6XFx0XFxuIDUzNDpcXHRcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVxcdTAwM2VhbmNob3IpO1xcbiA1MzU6XFx0XFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4gNTM2OlxcdFxcdFxcdFxcdHJldHVybiBzejtcXG4gNTM3OlxcdFxcbiA1Mzg6XFx0XFx0XFx0c3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XFxuIDUzOTpcXHRcXG4gNTQwOlxcdFxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuIHx8IGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTQxOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDU0MjpcXHRcXHR9XFxuIDU0MzpcXHRcXG4gNTQ0OlxcdFxcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbikpXFxuIDU0NTpcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4gNTQ2OlxcdFxcbiA1NDc6XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDEpO1xcbiA1NDg6XFx0XFxuIDU0OTpcXHRcXHRyZXR1cm4gMDtcXG4gNTUwOlxcdH1cXG4gNTUxOlxcdFxcbiA1NTI6XFx0LyogUGFyc2UgcXVldWVkIGRhdGEuIFdoZW4gQGFubm91bmNlIGlzIHRydWUgYW5kIHBhcnNpbmcgcHJvZHVjZXMgYVxcbiA1NTM6XFx0ICogbmV3bHktcmVhZHkgcmVjb3JkLCBmaXJlIHRoZSBjb25zdW1lciBub3RpZmljYXRpb24uIENhbGxlcnMgdGhhdFxcbiA1NTQ6XFx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxcbiA1NTU6XFx0ICogc2hvdWxkIGludm9rZSB0bHNfcnhfbXNnX21heWJlX2Fubm91bmNlKCkgZGlyZWN0bHkuXFxuIDU1NjpcXHQgKi9cXG4gNTU3OlxcdHZvaWQgdGxzX3N0cnBfY2hlY2tfcmN2KHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBib29sIGFubm91bmNlKVxcbiA1NTg6XFx0e1xcbiA1NTk6XFx0XFx0aWYgKHVubGlrZWx5KHN0cnAtXFx1MDAzZXN0b3BwZWQpIHx8IHN0cnAtXFx1MDAzZW1zZ19yZWFkeSlcXG4gNTYwOlxcdFxcdFxcdHJldHVybjtcXG4gNTYxOlxcdFxcbiA1NjI6XFx0XFx0aWYgKHRsc19zdHJwX3JlYWRfc29jayhzdHJwKSA9PSAtRU5PTUVNKVxcbiA1NjM6XFx0XFx0XFx0cXVldWVfd29yayh0bHNfc3RycF93cSwgXFx1MDAyNnN0cnAtXFx1MDAzZXdvcmspO1xcbiA1NjQ6XFx0XFx0ZWxzZSBpZiAoYW5ub3VuY2UgXFx1MDAyNlxcdTAwMjYgc3RycC1cXHUwMDNlbXNnX3JlYWR5KVxcbiA1NjU6XFx0XFx0XFx0dGxzX3J4X21zZ19tYXliZV9hbm5vdW5jZShzdHJwKTtcXG4gNTY2OlxcdH1cXG4gNTY3OlxcdFxcbiA1Njg6XFx0LyogTG93ZXIgc29jayBsb2NrIGhlbGQgKi9cXG4gNTY5OlxcdHZvaWQgdGxzX3N0cnBfZGF0YV9yZWFkeShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycClcXG4gNTcwOlxcdHtcXG4gNTcxOlxcdFxcdC8qIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIHN5bmNocm9uaXplIHdpdGggZG9fdGxzX3N0cnBfd29yay5cXG4gNTcyOlxcdFxcdCAqIGRvX3Rsc19zdHJwX3dvcmsgYWNxdWlyZXMgYSBwcm9jZXNzIGxvY2sgKGxvY2tfc29jaykgd2hlcmVhc1xcbiA1NzM6XFx0XFx0ICogdGhlIGxvY2sgaGVsZCBoZXJlIGlzIGJoX2xvY2tfc29jay4gVGhlIHR3byBsb2NrcyBjYW4gYmVcXG4gNTc0OlxcdFxcdCAqIGhlbGQgYnkgZGlmZmVyZW50IHRocmVhZHMgYXQgdGhlIHNhbWUgdGltZSwgYnV0IGJoX2xvY2tfc29ja1xcbiA1NzU6XFx0XFx0ICogYWxsb3dzIGEgdGhyZWFkIGluIEJIIGNvbnRleHQgdG8gc2FmZWx5IGNoZWNrIGlmIHRoZSBwcm9jZXNzXFxuIDU3NjpcXHRcXHQgKiBsb2NrIGlzIGhlbGQuIEluIHRoaXMgY2FzZSwgaWYgdGhlIGxvY2sgaXMgaGVsZCwgcXVldWUgd29yay5cXG4gNTc3OlxcdFxcdCAqL1xcbiA1Nzg6XFx0XFx0aWYgKHNvY2tfb3duZWRfYnlfdXNlcl9ub2NoZWNrKHN0cnAtXFx1MDAzZXNrKSkge1xcbiA1Nzk6XFx0XFx0XFx0cXVldWVfd29yayh0bHNfc3RycF93cSwgXFx1MDAyNnN0cnAtXFx1MDAzZXdvcmspO1xcbiA1ODA6XFx0XFx0XFx0cmV0dXJuO1xcbiA1ODE6XFx0XFx0fVxcbiA1ODI6XFx0XFxuIDU4MzpcXHRcXHR0bHNfc3RycF9jaGVja19yY3Yoc3RycCwgdHJ1ZSk7XFxuIDU4NDpcXHR9XFxuIDU4NTpcXHRcXG4gNTg2OlxcdHN0YXRpYyB2b2lkIHRsc19zdHJwX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3KVxcbiA1ODc6XFx0e1xcbiA1ODg6XFx0XFx0c3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAgPVxcbiA1ODk6XFx0XFx0XFx0Y29udGFpbmVyX29mKHcsIHN0cnVjdCB0bHNfc3RycGFyc2VyLCB3b3JrKTtcXG4gNTkwOlxcdFxcbiA1OTE6XFx0XFx0bG9ja19zb2NrKHN0cnAtXFx1MDAzZXNrKTtcXG4gNTkyOlxcdFxcdHRsc19zdHJwX2NoZWNrX3JjdihzdHJwLCB0cnVlKTtcXG4gNTkzOlxcdFxcdHJlbGVhc2Vfc29jayhzdHJwLVxcdTAwM2Vzayk7XFxuIDU5NDpcXHR9XFxuIDU5NTpcXHRcXG4gNTk2OlxcdC8qIFJlbGVhc2UgdGhlIGN1cnJlbnQgcmVjb3JkIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGNoZWNrIGZvciB0aGVcXG4gNTk3OlxcdCAqIG5leHQgcmVjb3JkLiBDYWxsZXJzIG11c3QgaW52b2tlIHRsc19zdHJwX2NoZWNrX3JjdigpIGJlZm9yZVxcbiA1OTg6XFx0ICogcmVsZWFzaW5nIHRoZSBzb2NrZXQgbG9jaywgb3IgcXVldWVkIGRhdGEgd2lsbCBzdGFsbCB1bnRpbCB0aGVcXG4gNTk5OlxcdCAqIG5leHQgdGxzX3N0cnBfZGF0YV9yZWFkeSgpIGV2ZW50LlxcbiA2MDA6XFx0ICovXFxuIDYwMTpcXHR2b2lkIHRsc19zdHJwX21zZ19jb25zdW1lKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbiA2MDI6XFx0e1xcbiA2MDM6XFx0XFx0V0FSTl9PTighc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKTtcXG4gNjA0OlxcdFxcbiA2MDU6XFx0XFx0aWYgKGxpa2VseSghc3RycC1cXHUwMDNlY29weV9tb2RlKSlcXG4gNjA2OlxcdFxcdFxcdHRjcF9yZWFkX2RvbmUoc3RycC1cXHUwMDNlc2ssIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbik7XFxuIDYwNzpcXHRcXHRlbHNlXFxuIDYwODpcXHRcXHRcXHR0bHNfc3RycF9mbHVzaF9hbmNob3JfY29weShzdHJwKTtcXG4gNjA5OlxcdFxcbiA2MTA6XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDApO1xcbiA2MTE6XFx0XFx0c3RycC1cXHUwMDNlbXNnX2Fubm91bmNlZCA9IDA7XFxuIDYxMjpcXHRcXHRtZW1zZXQoXFx1MDAyNnN0cnAtXFx1MDAzZXN0bSwgMCwgc2l6ZW9mKHN0cnAtXFx1MDAzZXN0bSkpO1xcbiA2MTM6XFx0fVxcbiA2MTQ6XFx0XFxuIDYxNTpcXHR2b2lkIHRsc19zdHJwX3N0b3Aoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuIDYxNjpcXHR7XFxuIDYxNzpcXHRcXHRzdHJwLVxcdTAwM2VzdG9wcGVkID0gMTtcXG4gNjE4OlxcdH1cXG4gNjE5OlxcdFxcbiA2MjA6XFx0aW50IHRsc19zdHJwX2luaXQoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBzb2NrICpzaylcXG4gNjIxOlxcdHtcXG4gNjIyOlxcdFxcdG1lbXNldChzdHJwLCAwLCBzaXplb2YoKnN0cnApKTtcXG4gNjIzOlxcdFxcbiA2MjQ6XFx0XFx0c3RycC1cXHUwMDNlc2sgPSBzaztcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MTAuNDYwODQzMTE4WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU3ODcxNzE3ODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBUTFMgU3RyZWFtIFByb2Nlc3NpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGFpbWVkIGF0IGltcHJvdmluZyBob3cgd2UgaGFuZGxlIHRoZSBUTFMgc3RyZWFtIHByb2Nlc3NpbmcuIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgcmV2b2x2ZXMgYXJvdW5kIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuICBJIHNlZSBpdCdzIG5vdyB0YWtpbmcgYW4gZXhwbGljaXQgYGxlbmAgYXJndW1lbnQsIHdoaWNoIGlzIGEgZ29vZCBwcmFjdGljZSBmb3IgY2xhcml0eS4gVGhlIGludGVudCBoZXJlIGlzIGNsZWFyLCB3ZeKAmXJlIGFkZGluZyBhIHByb2FjdGl2ZSBjaGVjayBpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYCB0byBlbnN1cmUgdGhhdCB0aGUgcmVjZWl2ZSBxdWV1ZSBpcyB2YWxpZCAqYmVmb3JlKiB3ZSBldmVuIGNhbGwgYHRsc19yeF9tc2dfc2l6ZWAuICBUaGF0IG1ha2VzIGEgbG90IG9mIHNlbnNlOyBwcmUtZW1wdGl2ZWx5IHZhbGlkYXRpbmcgYmVmb3JlIHBvdGVudGlhbGx5IGNvc3RseSBvcGVyYXRpb25zIGlzIGEgc29saWQgZGVmZW5zaXZlIHByb2dyYW1taW5nIGFwcHJvYWNoLlxuXG5JJ20gYXNzdW1pbmcgYHRsc19yeF9tc2dfc2l6ZWAgaXMgcmVzcG9uc2libGUgZm9yIGRlY2lwaGVyaW5nIHRoZSBUTFMgaGVhZGVyIHRvIGRldGVybWluZSB0aGUgc3Vic2VxdWVudCBtZXNzYWdlIHNpemUuIFRoYXQncyBhIHJlYXNvbmFibGUgYXNzdW1wdGlvbiwgZ2l2ZW4gaXRzIG5hbWUuIFRoZSBwYXRjaCBoaWdobGlnaHRzIHRoYXQgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aWxsIHJldHVybiBmYWxzZSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBtZXNzZWQtdXAgcXVldWUg4oCTIG1lYW5pbmcgbWl4ZWQgZGVjcnlwdGVkIGFuZCB1bi1kZWNyeXB0ZWQgZGF0YSwgb3IgcGVyaGFwcyBvdXQtb2Ytb3JkZXIgZGF0YSBzZWdtZW50cy4gIFRoZSBjcnVjaWFsIHBhcnQgaXMgdGhlIGZhbGxiYWNrIG1lY2hhbmlzbTogaWYgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBmYWlscywgaXQgZmFsbHMgYmFjayB0byB1c2luZyBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gIFRoaXMgaXMgYSBkZWZpbml0ZSBidWcgZml4LCBwcm90ZWN0aW5nIGFnYWluc3Qgc2l0dWF0aW9ucyB3aGVyZSBgdGxzX3J4X21zZ19zaXplYCBtaWdodCBiZSBnaXZlbiBhbiBpbnZhbGlkIG9yIGluY29uc2lzdGVudCBTS0IsIHdoaWNoIGlzIGNydWNpYWwgZm9yIHByZXZlbnRpbmcgY3Jhc2hlcyBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuXG5cbldhaXQgYSBzZWNvbmTigKYgSSBuZWVkIHRvIGNsYXJpZnkgc29tZXRoaW5nLiAgYHRsc19yeF9tc2dfc2l6ZWAgZG9lc24ndCBkaXJlY3RseSByZWFkIGZyb20gdGhlIHNvY2tldCBidWZmZXIgKGBza2JgKS4gSSBzZWVtIHRvIHJlY2FsbCBpdCByZWFkcyBmcm9tIGBzdHJwLVx1MDAzZWFuY2hvcmAuIFRoaXMgaXMgaW1wb3J0YW50LCBzbyBsZXQgbWUganVzdCB0YWtlIGEgcXVpY2sgbG9vayBhdCB0aGUgc291cmNlIGNvZGUgZm9yIGB0bHNfcnhfbXNnX3NpemVgIHRvIGNvbmZpcm0uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjczNzIsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMTksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDoxNi4yNDgwMjc2MDhaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU0MzM1OTE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRsc19yeF9tc2dfc2l6ZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdGxzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdGxzL3Rscy5oPTE5Nz12b2lkIHRsc19zdHJwX21zZ19jb25zdW1lKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKTtcXG5uZXQvdGxzL3Rscy5oLTE5OC1cXG5uZXQvdGxzL3Rscy5oOjE5OTppbnQgdGxzX3J4X21zZ19zaXplKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTtcXG5uZXQvdGxzL3Rscy5oLTIwMC12b2lkIHRsc19yeF9tc2dfbWF5YmVfYW5ub3VuY2Uoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApO1xcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTIxMD1zdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbl9mcmFnKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTIzOS1cXG5uZXQvdGxzL3Rsc19zdHJwLmM6MjQwOlxcdFxcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHNrYik7XFxubmV0L3Rscy90bHNfc3RycC5jLTI0MS1cXHRcXHRpZiAoc3ogXFx1MDAzYyAwKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jPTI4Nj1zdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbl9za2Ioc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IsXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtMzE5LVxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxubmV0L3Rscy90bHNfc3RycC5jOjMyMDpcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBza2IpO1xcbm5ldC90bHMvdGxzX3N0cnAuYy0zMjEtXFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYz01MTI9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX3NvY2soc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnApXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTMzLVxcbm5ldC90bHMvdGxzX3N0cnAuYzo1MzQ6XFx0XFx0c3ogPSB0bHNfcnhfbXNnX3NpemUoc3RycCwgc3RycC1cXHUwMDNlYW5jaG9yKTtcXG5uZXQvdGxzL3Rsc19zdHJwLmMtNTM1LVxcdFxcdGlmIChzeiBcXHUwMDNjIDApXFxuLS1cXG5uZXQvdGxzL3Rsc19zdy5jPTIxNzA9Ym9vbCB0bHNfc3dfc29ja19pc19yZWFkYWJsZShzdHJ1Y3Qgc29jayAqc2spXFxuLS1cXG5uZXQvdGxzL3Rsc19zdy5jLTIxNzgtXFxubmV0L3Rscy90bHNfc3cuYzoyMTc5OmludCB0bHNfcnhfbXNnX3NpemUoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpXFxubmV0L3Rscy90bHNfc3cuYy0yMTgwLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MTYuMzAyNDQzMjA2WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM4MjQwNTU3NzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgYXMgaWYgdGhleSdyZSBteSBvd246XG5cbioqQW5hbHl6aW5nIGB0bHNfcnhfbXNnX3NpemVgKipcblxuQWxyaWdodCwgbGV0J3MgcHVsbCB1cCBhbmQgYW5hbHl6ZSB0aGlzIGB0bHNfcnhfbXNnX3NpemVgIHRoaW5nLiBJJ20gaW1tZWRpYXRlbHkgdGhpbmtpbmcsIG9rYXksIHRoaXMgbGlrZWx5IHJlbGF0ZXMgdG8gdGhlIHJlY2VwdGlvbiBzaWRlIG9mIFRMUywgcmlnaHQ/IFRoZSBzaXplIG9mIGEgcmVjZWl2ZWQgVExTIG1lc3NhZ2UuIE5vdywgdGhlIGNvbnRleHQgaXMga2V5LiBXaGF0J3MgdGhlIGVudmlyb25tZW50PyBJcyB0aGlzIGNsaWVudC1zaWRlLCBzZXJ2ZXItc2lkZSwgb3Igc29tZXRoaW5nIGVsc2U/IElzIHRoaXMgY29kZSBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgVExTIGxpYnJhcnk/IEFuZCwgbW9yZSBpbXBvcnRhbnRseSwgd2hhdCdzIHRoZSBsZXZlbCBvZiBhYnN0cmFjdGlvbiB3ZSdyZSBhdD8gQXJlIHdlIGxvb2tpbmcgYXQgYSByYXcgYnl0ZSBidWZmZXIsIG9yIGFyZSB3ZSBkZWFsaW5nIHdpdGggYSBoaWdoZXItbGV2ZWwgZGF0YSBzdHJ1Y3R1cmU/IFRoZSBkZXZpbCBpcyBhbHdheXMgaW4gdGhlIGRldGFpbHMgd2l0aCBUTFMsIGFuZCBtZXNzYWdlIHNpemluZyBpcyBhIGtub3duIGF0dGFjayB2ZWN0b3IsIHNvIEknbGwgYmUga2VlcGluZyBhIHNoYXJwIGV5ZSBvdXQgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgbGlrZSBpbnRlZ2VyIG92ZXJmbG93cyBvciByZXNvdXJjZSBleGhhdXN0aW9uIGhlcmUuIFdl4oCZbGwgYmUgY2hlY2tpbmcgaG93IHNpemUgaXMgZGV0ZXJtaW5lZCBhbmQgdXNlZCwgYW5kIHdoZXJlIHRoZSB2YWx1ZSBjYW1lIGZyb20uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg2MjEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDoyMC4xMjY1MDE2NzVaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY5MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90bHMvdGxzX3N3LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjE3OSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjE3OTpcXHRpbnQgdGxzX3J4X21zZ19zaXplKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjIxODA6XFx0e1xcbjIxODE6XFx0XFx0c3RydWN0IHRsc19jb250ZXh0ICp0bHNfY3R4ID0gdGxzX2dldF9jdHgoc3RycC1cXHUwMDNlc2spO1xcbjIxODI6XFx0XFx0c3RydWN0IHRsc19wcm90X2luZm8gKnByb3QgPSBcXHUwMDI2dGxzX2N0eC1cXHUwMDNlcHJvdF9pbmZvO1xcbjIxODM6XFx0XFx0Y2hhciBoZWFkZXJbVExTX0hFQURFUl9TSVpFICsgVExTX01BWF9JVl9TSVpFXTtcXG4yMTg0OlxcdFxcdHNpemVfdCBjaXBoZXJfb3ZlcmhlYWQ7XFxuMjE4NTpcXHRcXHRzaXplX3QgZGF0YV9sZW4gPSAwO1xcbjIxODY6XFx0XFx0aW50IHJldDtcXG4yMTg3OlxcdFxcbjIxODg6XFx0XFx0LyogVmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIGZ1bGwgVExTIGhlYWRlciwgb3Igd2FpdCBmb3IgbW9yZSBkYXRhICovXFxuMjE4OTpcXHRcXHRpZiAoc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHByb3QtXFx1MDAzZXByZXBlbmRfc2l6ZSBcXHUwMDNlIHNrYi1cXHUwMDNlbGVuKVxcbjIxOTA6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjE5MTpcXHRcXG4yMTkyOlxcdFxcdC8qIFNhbml0eS1jaGVjayBzaXplIG9mIG9uLXN0YWNrIGJ1ZmZlci4gKi9cXG4yMTkzOlxcdFxcdGlmIChXQVJOX09OKHByb3QtXFx1MDAzZXByZXBlbmRfc2l6ZSBcXHUwMDNlIHNpemVvZihoZWFkZXIpKSkge1xcbjIxOTQ6XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4yMTk1OlxcdFxcdFxcdGdvdG8gcmVhZF9mYWlsdXJlO1xcbjIxOTY6XFx0XFx0fVxcbjIxOTc6XFx0XFxuMjE5ODpcXHRcXHQvKiBMaW5lYXJpemUgaGVhZGVyIHRvIGxvY2FsIGJ1ZmZlciAqL1xcbjIxOTk6XFx0XFx0cmV0ID0gc2tiX2NvcHlfYml0cyhza2IsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQsIGhlYWRlciwgcHJvdC1cXHUwMDNlcHJlcGVuZF9zaXplKTtcXG4yMjAwOlxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjIyMDE6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIwMjpcXHRcXG4yMjAzOlxcdFxcdHN0cnAtXFx1MDAzZW1hcmsgPSBoZWFkZXJbMF07XFxuMjIwNDpcXHRcXG4yMjA1OlxcdFxcdGRhdGFfbGVuID0gKChoZWFkZXJbNF0gXFx1MDAyNiAweEZGKSB8IChoZWFkZXJbM10gXFx1MDAzY1xcdTAwM2MgOCkpO1xcbjIyMDY6XFx0XFxuMjIwNzpcXHRcXHRjaXBoZXJfb3ZlcmhlYWQgPSBwcm90LVxcdTAwM2V0YWdfc2l6ZTtcXG4yMjA4OlxcdFxcdGlmIChwcm90LVxcdTAwM2V2ZXJzaW9uICE9IFRMU18xXzNfVkVSU0lPTiBcXHUwMDI2XFx1MDAyNlxcbjIyMDk6XFx0XFx0ICAgIHByb3QtXFx1MDAzZWNpcGhlcl90eXBlICE9IFRMU19DSVBIRVJfQ0hBQ0hBMjBfUE9MWTEzMDUpXFxuMjIxMDpcXHRcXHRcXHRjaXBoZXJfb3ZlcmhlYWQgKz0gcHJvdC1cXHUwMDNlaXZfc2l6ZTtcXG4yMjExOlxcdFxcbjIyMTI6XFx0XFx0aWYgKGRhdGFfbGVuIFxcdTAwM2UgVExTX01BWF9QQVlMT0FEX1NJWkUgKyBjaXBoZXJfb3ZlcmhlYWQgK1xcbjIyMTM6XFx0XFx0ICAgIHByb3QtXFx1MDAzZXRhaWxfc2l6ZSkge1xcbjIyMTQ6XFx0XFx0XFx0cmV0ID0gLUVNU0dTSVpFO1xcbjIyMTU6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIxNjpcXHRcXHR9XFxuMjIxNzpcXHRcXHRpZiAoZGF0YV9sZW4gXFx1MDAzYyBjaXBoZXJfb3ZlcmhlYWQpIHtcXG4yMjE4OlxcdFxcdFxcdHJldCA9IC1FQkFETVNHO1xcbjIyMTk6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIyMDpcXHRcXHR9XFxuMjIyMTpcXHRcXG4yMjIyOlxcdFxcdC8qIE5vdGUgdGhhdCBib3RoIFRMUzEuMyBhbmQgVExTMS4yIHVzZSBUTFNfMV8yIHZlcnNpb24gaGVyZSAqL1xcbjIyMjM6XFx0XFx0aWYgKGhlYWRlclsxXSAhPSBUTFNfMV8yX1ZFUlNJT05fTUlOT1IgfHxcXG4yMjI0OlxcdFxcdCAgICBoZWFkZXJbMl0gIT0gVExTXzFfMl9WRVJTSU9OX01BSk9SKSB7XFxuMjIyNTpcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbjIyMjY6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIyNzpcXHRcXHR9XFxuMjIyODpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6MjAuMTI2NzczMzc1WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgwMTUxNjMzNjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFRMUyBWdWxuZXJhYmlsaXR5KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgdGxzX3J4X21zZ19zaXplYCBmdW5jdGlvbiwgYW5kIGl0J3MgY2FsbGluZyBgc2tiX2NvcHlfYml0c2AuIFRoZSBwb3RlbnRpYWwgcHJvYmxlbSBpbW1lZGlhdGVseSBoaXRzIG1lOiBpZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzbid0IGNhbGxlZCAqYmVmb3JlKiB0aGlzIGBza2JfY29weV9iaXRzYCBjYWxsLCB0aGVuIHRoZSBTb2NrZXQgQnVmZmVyIChza2IpIGNvdWxkIGNvbnRhaW4gbWl4ZWQgb3Igb3V0LW9mLW9yZGVyIGRlY3J5cHRlZCBkYXRhLiBgc2tiX2NvcHlfYml0c2AganVzdCAqcmVhZHMqIGZyb20gdGhlIHNrYiwgc28gaXQgY2FuJ3QgYmUgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUuIEl0IGNvcGllcyBkYXRhIGZyb20gdGhlIHNvY2tldCBidWZmZXIgaW50byBgaGVhZGVyYC4gQnV0IGlmIHRoZSBza2IgaGFzIGJhZCBkYXRhLCBgc2tiX2NvcHlfYml0c2AgaXMgZ29pbmcgdG8gcmVhZCBnYXJiYWdlLlxuXG5JZiBpdCByZWFkcyBnYXJiYWdlLCB0aGF0IG1lYW5zIGl0IG1pZ2h0IGNhbGN1bGF0ZSBhIGNvbXBsZXRlbHkgaW5jb3JyZWN0IGBkYXRhX2xlbmAuIFRoZSBvcmlnaW5hbCBhbmFseXNpcyBzYWlkIGBoZWFkZXJgIGlzIGZ1bGx5IHdyaXR0ZW4gYnkgYHNrYl9jb3B5X2JpdHNgLCBvciBpdCByZXR1cm5zIGFuIGVycm9yLCBzbyBgaGVhZGVyYCB3aWxsIGJlIGluaXRpYWxpemVkIGluIGFsbCBjYXNlcy5cblxuVGhlIHJlYWwgaXNzdWUgaXMgdGhlIHRpbWluZy4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCAqdXNlZCogdG8gYmUgY2FsbGVkICphZnRlciogYHRsc19yeF9tc2dfc2l6ZWAgYW5kIHRoZSBzZXR0aW5nIG9mIGBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbmAuIFRoaXMgb3JkZXIgaXMgY3JpdGljYWwgYmVjYXVzZSBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHZlcmlmaWVzIHRoZSBxdWV1ZSdzIGludGVncml0eSBiYXNlZCBvbiBgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW5gLiBJZiB0aGUgcXVldWUgaXNuJ3QgT0ssIGl0IGNhbGxzIGB0bHNfc3RycF9yZWFkX2NvcHlgLlxuXG5TbywgYmVmb3JlIHRoaXMgcGF0Y2gsIGB0bHNfcnhfbXNnX3NpemVgIGNvdWxkIHJlYWQgZnJvbSBhIGNvcnJ1cHQgcXVldWUuIFRoYXQgd291bGQgZ2l2ZSBpdCBhIGJhZCBUTFMgaGVhZGVyIGFuZCB0aGVyZWZvcmUsIGEgd3JvbmcgYHN6YCB2YWx1ZS4gVGhlbiwgd2hlbiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGlzIGNhbGxlZCAqYWZ0ZXIqIHRoaXMgY2FsY3VsYXRpb24sIGl0J3MgY2hlY2tpbmcgYWdhaW5zdCBhbiBhbHJlYWR5IGluY29ycmVjdCBgZnVsbF9sZW5gLlxuXG5JZiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGZhaWxzLCBpdCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBIb3dldmVyLCBldmVuIGlmIHRoZSBxdWV1ZSBpcyBiYWQsIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKm1pZ2h0KiBpdGVyYXRlIG92ZXIgdGhlIHF1ZXVlIHVwIHRvIGBsZW5gIGlmIHRoZSByZXN1bHRpbmcgYHN6YCBpcyBhIGh1Z2UgdmFsdWUuIFRoaXMgY291bGQgb3BlbiBhIG5ldyBhdmVudWUgZm9yIGF0dGFjay4gSSBuZWVkIHRvIHJlLWV4YW1pbmUgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBtb3JlIGNsb3NlbHkgdG8gYmUgc3VyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6OTcxMywiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMwOjI4LjE0MTkzOTYwOVoiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTEwNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQzMyxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQzMzpcXHRzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxcbiA0MzU6XFx0e1xcbiA0MzY6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKmZpcnN0LCAqc2tiO1xcbiA0Mzc6XFx0XFx0dTMyIHNlcTtcXG4gNDM4OlxcdFxcbiA0Mzk6XFx0XFx0Zmlyc3QgPSBza2Jfc2hpbmZvKHN0cnAtXFx1MDAzZWFuY2hvciktXFx1MDAzZWZyYWdfbGlzdDtcXG4gNDQwOlxcdFxcdHNrYiA9IGZpcnN0O1xcbiA0NDE6XFx0XFx0c2VxID0gVENQX1NLQl9DQihmaXJzdCktXFx1MDAzZXNlcTtcXG4gNDQyOlxcdFxcbiA0NDM6XFx0XFx0LyogTWFrZSBzdXJlIHRoZXJlJ3Mgbm8gZHVwbGljYXRlIGRhdGEgaW4gdGhlIHF1ZXVlLFxcbiA0NDQ6XFx0XFx0ICogYW5kIHRoZSBkZWNyeXB0ZWQgc3RhdHVzIG1hdGNoZXMuXFxuIDQ0NTpcXHRcXHQgKi9cXG4gNDQ2OlxcdFxcdHdoaWxlIChza2ItXFx1MDAzZWxlbiBcXHUwMDNjIGxlbikge1xcbiA0NDc6XFx0XFx0XFx0c2VxICs9IHNrYi1cXHUwMDNlbGVuO1xcbiA0NDg6XFx0XFx0XFx0bGVuIC09IHNrYi1cXHUwMDNlbGVuO1xcbiA0NDk6XFx0XFx0XFx0c2tiID0gc2tiLVxcdTAwM2VuZXh0O1xcbiA0NTA6XFx0XFxuIDQ1MTpcXHRcXHRcXHRpZiAoVENQX1NLQl9DQihza2IpLVxcdTAwM2VzZXEgIT0gc2VxKVxcbiA0NTI6XFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA0NTM6XFx0XFx0XFx0aWYgKHNrYl9jbXBfZGVjcnlwdGVkKGZpcnN0LCBza2IpKVxcbiA0NTQ6XFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA0NTU6XFx0XFx0fVxcbiA0NTY6XFx0XFxuIDQ1NzpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNDU4OlxcdH1cXG4gNDU5OlxcdFxcbiA0NjA6XFx0c3RhdGljIHZvaWQgdGxzX3N0cnBfbG9hZF9hbmNob3Jfd2l0aF9xdWV1ZShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgaW50IGxlbilcXG4gNDYxOlxcdHtcXG4gNDYyOlxcdFxcdHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc3RycC1cXHUwMDNlc2spO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDoyOC4xNDIwOTMyOTlaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTEwNjY3MjYxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgTlVMTCBQb2ludGVyIERlcmVmZXJlbmNlIGluIHRoZSBUTFMgU3RhY2sqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIEkgc2VlIHRoaXMgbG9vcCBpdGVyYXRpbmcgdGhyb3VnaCBhbiBgc2tiYCBmcmFnX2xpc3QuIFRoZSBjb3JlIGNvbmNlcm4gaGVyZSBpcyB0aGF0IGlmIHRoZSBgbGVuYCB2YWx1ZSBpcyBleGNlc3NpdmVseSBsYXJnZSwgbGlrZWx5IGR1ZSB0byBhIGdhcmJhZ2UgdmFsdWUgZnJvbSB0aGUgYHN6YCBjYWxjdWxhdGlvbiwgdGhlIGBza2JgIHBvaW50ZXIgY291bGQgYmVjb21lIE5VTEwgYmVmb3JlIGBsZW5gIGlzIGZ1bGx5IGNvbnN1bWVkLiBTcGVjaWZpY2FsbHksIGluc2lkZSB0aGUgbG9vcCwgaWYgd2UgZXhoYXVzdCB0aGUgZnJhZ19saXN0IGFuZCBgc2tiYCBiZWNvbWVzIE5VTEwgYmVmb3JlIGBsZW5gIGlzIHplcm8sIHRoZW4gdGhlIHN1YnNlcXVlbnQgYWNjZXNzIHRvIGBUQ1BfU0tCX0NCKHNrYilgIHdpbGwgcmVzdWx0IGluIGEgZGVyZWZlcmVuY2Ugb2YgYSBOVUxMIHBvaW50ZXIsIGxlYWRpbmcgdG8gYSBjcmFzaCDigJMgYSBjbGFzc2ljIGFuZCByZWFkaWx5IGRldGVjdGFibGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGJ1Zy4gS0FTQU4gd291bGQgZGVmaW5pdGVseSBmbGFnIHRoaXMsIG9yIHdlJ2QgZ2V0IGEga2VybmVsIG9vcHMuXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMgdG8gY29uc2lkZXIgaWYgdGhpcyByZWxhdGVzIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBidXQgdGhlbiBJIHJlbWVtYmVyZWQgdGhhdCBgc2tiX2NvcHlfYml0c2AgaW5pdGlhbGl6ZXMgdGhlIGBoZWFkZXJgLiBTbywgaXQncyBub3QgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBjcnV4IG9mIHRoZSBpc3N1ZSBhcHBlYXJzIHRvIGJlIHRoYXQgYHRsc19yeF9tc2dfc2l6ZWAgaXMgcmVhZGluZyBhIG1hbGZvcm1lZCBxdWV1ZSwgb2J0YWlucyBhIGdhcmJhZ2UgbGVuZ3RoIGFuZCB0aGVuIHRoYXQgZ2FyYmFnZSBsZW5ndGggZ2V0cyB1c2VkIGJ5IGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AsIHdoaWNoIHRoZW4gaXRlcmF0ZXMgb3ZlciB0aGUgZnJhZ19saXN0IHBvdGVudGlhbGx5IGRlcmVmZXJlbmNpbmcgYSBOVUxMIHBvaW50ZXIuXG5cbkJ1dCB3YWl0LCBpcyBgbGVuYCAqZ3VhcmFudGVlZCogdG8gYmUgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGZyYWdfbGlzdD8gTGV0J3MgdHJhY2UgaXQgYmFjay4gYHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWVgIHNldHMgYHN0cnAtXHUwMDNlYW5jaG9yLVx1MDAzZWxlbmAgdG8gYG9mZnNldCArIGxlbmAsIHdoZXJlIGBsZW5gIGlzIGBpbnFgLiBIb3dldmVyLCBgc3pgIGNhbiBiZSBhcyBsYXJnZSBhcyBgVExTX01BWF9QQVlMT0FEX1NJWkUgKyBjaXBoZXJfb3ZlcmhlYWQgKyBwcm90LVx1MDAzZXRhaWxfc2l6ZWAsIHdoaWNoIGlzIGFyb3VuZCAxNktCLlxuXG5Ob3csIGxldCdzIGxvb2sgYXQgYHRsc19zdHJwX3JlYWRfc29ja2AuIElmIGBpbnFgIGlzIHNtYWxsZXIgdGhhbiBgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW5gLCB0aGVuIHRoZSBjb2RlIHJldHVybnMgYHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKWAgKmJlZm9yZSogY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBTbywgdGhlIHZ1bG5lcmFibGUgY2FzZSBpcyBwcmVjaXNlbHkgd2hlbiBgaW5xYCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIGBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbmAsIGluIG90aGVyIHdvcmRzIHdlIGNhbiBnZXQgYSBsYXJnZXIgbGVuZ3RoIGNhbGN1bGF0ZWQsIGFuZCB0aGVuIGl0IGlzIHBhc3NlZCBpbnRvIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AuIE5lZWQgdG8gbG9vayBhdCBgdGxzX3N0cnBfcmVhZF9zb2NrYCBhZ2FpbiBhbmQgY29uZmlybSB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTI2OCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMwOjM3LjI0ODc2ODk1NloiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjc3NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUyNSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyNTpcXHRcXG4gNTI2OlxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcXG4gNTI3OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDUyODpcXHRcXHRcXHRpZiAoaW5xIFxcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxcbiA1Mjk6XFx0XFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcXG4gNTMwOlxcdFxcbiA1MzE6XFx0XFx0XFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ICsgVExTX0hFQURFUl9TSVpFKSlcXG4gNTMyOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xcbiA1MzM6XFx0XFxuIDUzNDpcXHRcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVxcdTAwM2VhbmNob3IpO1xcbiA1MzU6XFx0XFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4gNTM2OlxcdFxcdFxcdFxcdHJldHVybiBzejtcXG4gNTM3OlxcdFxcbiA1Mzg6XFx0XFx0XFx0c3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XFxuIDUzOTpcXHRcXG4gNTQwOlxcdFxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuIHx8IGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTQxOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDU0MjpcXHRcXHR9XFxuIDU0MzpcXHRcXG4gNTQ0OlxcdFxcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbikpXFxuIDU0NTpcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4gNTQ2OlxcdFxcbiA1NDc6XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDEpO1xcbiA1NDg6XFx0XFxuIDU0OTpcXHRcXHRyZXR1cm4gMDtcXG4gNTUwOlxcdH1cXG4gNTUxOlxcdFxcbiA1NTI6XFx0LyogUGFyc2UgcXVldWVkIGRhdGEuIFdoZW4gQGFubm91bmNlIGlzIHRydWUgYW5kIHBhcnNpbmcgcHJvZHVjZXMgYVxcbiA1NTM6XFx0ICogbmV3bHktcmVhZHkgcmVjb3JkLCBmaXJlIHRoZSBjb25zdW1lciBub3RpZmljYXRpb24uIENhbGxlcnMgdGhhdFxcbiA1NTQ6XFx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDozNy4yNDg5MzkwODZaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTY2MzE5NDk0MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGB0bHNfc3RycF9yZWFkX3NvY2tgIGFuZCBRdWV1ZSBJbnRlZ3JpdHkqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEluIGB0bHNfc3RycF9yZWFkX3NvY2tgLCBJJ20gbG9va2luZyBhdCBob3cgd2UncmUgaGFuZGxpbmcgZGF0YSByZWNlcHRpb24sIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBUTFMgc3RyZWFtLiBUaGUgY3JpdGljYWwgcGFydCBpcyB0aGF0IGNvbmRpdGlvbmFsIGJsb2NrOlxuXG5gYGBjXG5cdFx0aWYgKCFzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbiB8fCBpbnEgXHUwMDNjIHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuKVxuXHRcdFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcblx0fVxuXG5cdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICsgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW4pKVxuXHRcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xuYGBgXG5cbkVzc2VudGlhbGx5LCBpZiB3ZSBoYXZlbid0IGRldGVybWluZWQgdGhlIGZ1bGwgbWVzc2FnZSBsZW5ndGggeWV0IChgIXN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuYCkgb3IgaWYgdGhlIGF2YWlsYWJsZSBkYXRhIGluIHRoZSByZWNlaXZlIHF1ZXVlIChgaW5xYCkgaXMgbGVzcyB0aGFuIHRoZSBleHBlY3RlZCBmdWxsIGxlbmd0aCwgd2UgZmFsbCBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHlgLiBIb3dldmVyLCB0aGUgY3JpdGljYWwgcG9pbnQgaXMgdGhlIHNlY29uZCBjb25kaXRpb24uIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgaXMgb25seSBjYWxsZWQgaWYgYGlucSBcdTAwM2U9IHN0cnAtXHUwMDNlc3RtLmZ1bGxfbGVuYC4gVGhpcyBtZWFucyB0aGUgY29kZSBhc3N1bWVzIHRoYXQgaWYgd2UgaGF2ZSBlbm91Z2ggKnRvdGFsKiBkYXRhLCB3ZSBjYW4gcHJvY2VlZC5cblxuTm93LCBpZiBgaW5xYCB0cnVseSByZXByZXNlbnRzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGZyYWdfbGlzdCAod2hpY2ggaXMgcG9wdWxhdGVkIHZpYSBgdGNwX3JlY3Zfc2tiYCksIHRoZW4gdGhlIGBza2ItXHUwMDNlbmV4dGAgcG9pbnRlciAqc2hvdWxkKiBuZXZlciBiZSBOVUxMIGluc2lkZSBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLCBwcm92aWRlZCB0aGUgY29uZGl0aW9uIGlzIGBpbnEgXHUwMDNlPSBzdHJwLVx1MDAzZXN0bS5mdWxsX2xlbmAsIGJlY2F1c2UgdGhlIHRvdGFsIG9mIHRoZSBza2IncyBsZW4gd2lsbCBiZSBhdCBsZWFzdCBgc3RycC1cdTAwM2VzdG0uZnVsbF9sZW5gLlxuXG5Ib3dldmVyLCBgdGNwX3JlY3Zfc2tiYCByZXR1cm5zIG9ubHkgdGhlIGZpcnN0IFNLQiwgd2hpY2ggaXMgdGhlbiBsaW5rZWQgdmlhIGBza2ItXHUwMDNlbmV4dGAuIElmIHRoZSB0b3RhbCBzdW0gb2YgYHNrYi1cdTAwM2VsZW5gIG9mIGFsbCBza2JzIGlzIGF0IGxlYXN0IGBsZW5gLCB0aGVuIGBza2JgIHdpbGwgbm90IGJlIE5VTEwgYWZ0ZXIgdGhlIGl0ZXJhdGlvbi5cblxuSSBuZWVkIHRvIGNvbmZpcm0gaWYgYGlucWAgdHJ1bHkgcmVmbGVjdHMgdGhlIHN1bSBvZiBhbGwgYHNrYi1cdTAwM2VsZW5gIHZhbHVlcyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSwgYXMgdGhlIGNoZWNrIGluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgZGVwZW5kcyBvbiB0aGlzLiBCYXNlZCBvbiBob3cgYHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWVgIGlzIGRlZmluZWQ6XG5cbmBgYGNcblx0Zmlyc3QgPSB0Y3BfcmVjdl9za2Ioc3RycC1cdTAwM2VzaywgdHAtXHUwMDNlY29waWVkX3NlcSwgXHUwMDI2b2Zmc2V0KTtcblx0aWYgKFdBUk5fT05fT05DRSghZmlyc3QpKVxuXHRcdHJldHVybjtcblxuXHQvKiBCZXN0b3cgdGhlIHN0YXRlIG9udG8gdGhlIGFuY2hvciAqL1xuXHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2VsZW4gPSBvZmZzZXQgKyBsZW47XG5cdHN0cnAtXHUwMDNlYW5jaG9yLVx1MDAzZWRhdGFfbGVuID0gb2Zmc2V0ICsgbGVuO1xuXHRzdHJwLVx1MDAzZWFuY2hvci1cdTAwM2V0cnVlc2l6ZSA9IG9mZnNldCArIGxlbjtcblxuXHRza2Jfc2hpbmZvKHN0cnAtXHUwMDNlYW5jaG9yKS1cdTAwM2VmcmFnX2xpc3QgPSBmaXJzdDtcbmBgYFxuXG5gdGNwX3JlY3Zfc2tiYCBhbmQgYHRjcF9pbnFgIHdvcmsgdG9nZXRoZXIgdG8gKmd1YXJhbnRlZSogdGhhdCBgaW5xYCByZXByZXNlbnRzIHRoZSB0b3RhbCBhbW91bnQgb2YgYXZhaWxhYmxlIGRhdGEsIGFsdGhvdWdoIG9ubHkgdGhlIGZpcnN0IFNLQiBpcyBpbW1lZGlhdGVseSBsaW5rZWQuXG5cbk15IGNvbmNlcm4gc3RlbXMgZnJvbSBhIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5IGluIGhvdyBgdGxzX3J4X21zZ19zaXplYCBoYW5kbGVzIGZyYWdtZW50ZWQsIHBvdGVudGlhbGx5IG1hbGZvcm1lZCwgVENQIGRhdGEgd2l0aGluIHRoZSBgZnJhZ19saXN0YCBzdHJ1Y3R1cmUuIFRoZSBmdW5jdGlvbiByZWFkcyB0aGUgbWVzc2FnZSBzaXplIHVzaW5nIGBza2JfY29weV9iaXRzYCwgc3RhcnRpbmcgZnJvbSBhIGtub3duIG9mZnNldCB3aXRoaW4gdGhlIGBzdHJwLVx1MDAzZWFuY2hvcmAgU0tCLiBIb3dldmVyLCBpZiB0aGUgVENQIHJlY2VpdmUgcXVldWUgaXMgY29ycnVwdGVkLCB3aXRoIG91dC1vZi1vcmRlciwgb3ZlcmxhcHBpbmcgb3IgbWlzc2luZyBza2JzLCBgc2tiX2NvcHlfYml0c2AgbWF5IHJlYWQgdGhlIHdyb25nIGJpdHMsIGJhc2VkIG9uIGluY29ycmVjdCBhc3N1bXB0aW9ucyBhYm91dCBkYXRhIGNvbnRpZ3VpdHkgd2l0aGluIHRoZSBgZnJhZ19saXN0YC5cblxuVGhlIFRDUCByZWNlaXZlIHF1ZXVlIGNvbnRhaW5zICppbi1vcmRlciogc2ticy5cblxuQnV0LCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIGNoZWNrcyBgVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcSAhPSBzZXFgLiBJcyB0aGlzIGNvcnJlY3Q/IElzIGl0IGNoZWNraW5nIGZvciAqZW5jcnlwdGVkKiBkYXRhIGluIHRoZSByZWNlaXZlIHF1ZXVlP1xuXG5gYGBjXG5cdFx0aWYgKFRDUF9TS0JfQ0Ioc2tiKS1cdTAwM2VzZXEgIT0gc2VxKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdGlmIChza2JfY21wX2RlY3J5cHRlZChmaXJzdCwgc2tiKSlcblx0XHRcdHJldHVybiBmYWxzZTtcbmBgYFxuXG5JZiBgVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcSAhPSBzZXFgLCBpdCBtZWFucyBkYXRhIGlzIG91dC1vZi1vcmRlciwgb3IgcG9zc2libHkgdGhlcmUgaXMgYSBnYXAuIE92ZXJsYXBwaW5nIHNrYnMgYXJlIHBvc3NpYmxlLCBhbmQgYHNrYl9jb3B5X2JpdHNgICp3aWxsKiByZWFkIHRoZSB3cm9uZyBieXRlcyBmcm9tIHRoZXNlIGZyYWdtZW50cy4gSXQgbWF5IHJlYWQgZnJvbSBvdmVybGFwcGluZyBkYXRhLCBsZWFkaW5nIHRvIGluY29ycmVjdCBzaXplIGNhbGN1bGF0aW9uLiBJZiB0aGUgc2l6ZSBpcyBpbmNvcnJlY3QsIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgbWlnaHQgdGhlbiBmYWlsLlxuXG5UaGUgcGF0Y2gncyBpbnRyb2R1Y3Rpb24gb2YgdGhlIGBpZiAoaW5xXG5cbiIsIklucHV0VG9rZW5zIjoxMjk1OCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNjQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMDo1My44ODA4OTA1MzNaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcxNTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90bHMvdGxzX3N3LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjE3OSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjE3OTpcXHRpbnQgdGxzX3J4X21zZ19zaXplKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbjIxODA6XFx0e1xcbjIxODE6XFx0XFx0c3RydWN0IHRsc19jb250ZXh0ICp0bHNfY3R4ID0gdGxzX2dldF9jdHgoc3RycC1cXHUwMDNlc2spO1xcbjIxODI6XFx0XFx0c3RydWN0IHRsc19wcm90X2luZm8gKnByb3QgPSBcXHUwMDI2dGxzX2N0eC1cXHUwMDNlcHJvdF9pbmZvO1xcbjIxODM6XFx0XFx0Y2hhciBoZWFkZXJbVExTX0hFQURFUl9TSVpFICsgVExTX01BWF9JVl9TSVpFXTtcXG4yMTg0OlxcdFxcdHNpemVfdCBjaXBoZXJfb3ZlcmhlYWQ7XFxuMjE4NTpcXHRcXHRzaXplX3QgZGF0YV9sZW4gPSAwO1xcbjIxODY6XFx0XFx0aW50IHJldDtcXG4yMTg3OlxcdFxcbjIxODg6XFx0XFx0LyogVmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIGZ1bGwgVExTIGhlYWRlciwgb3Igd2FpdCBmb3IgbW9yZSBkYXRhICovXFxuMjE4OTpcXHRcXHRpZiAoc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHByb3QtXFx1MDAzZXByZXBlbmRfc2l6ZSBcXHUwMDNlIHNrYi1cXHUwMDNlbGVuKVxcbjIxOTA6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjE5MTpcXHRcXG4yMTkyOlxcdFxcdC8qIFNhbml0eS1jaGVjayBzaXplIG9mIG9uLXN0YWNrIGJ1ZmZlci4gKi9cXG4yMTkzOlxcdFxcdGlmIChXQVJOX09OKHByb3QtXFx1MDAzZXByZXBlbmRfc2l6ZSBcXHUwMDNlIHNpemVvZihoZWFkZXIpKSkge1xcbjIxOTQ6XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4yMTk1OlxcdFxcdFxcdGdvdG8gcmVhZF9mYWlsdXJlO1xcbjIxOTY6XFx0XFx0fVxcbjIxOTc6XFx0XFxuMjE5ODpcXHRcXHQvKiBMaW5lYXJpemUgaGVhZGVyIHRvIGxvY2FsIGJ1ZmZlciAqL1xcbjIxOTk6XFx0XFx0cmV0ID0gc2tiX2NvcHlfYml0cyhza2IsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQsIGhlYWRlciwgcHJvdC1cXHUwMDNlcHJlcGVuZF9zaXplKTtcXG4yMjAwOlxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjIyMDE6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIwMjpcXHRcXG4yMjAzOlxcdFxcdHN0cnAtXFx1MDAzZW1hcmsgPSBoZWFkZXJbMF07XFxuMjIwNDpcXHRcXG4yMjA1OlxcdFxcdGRhdGFfbGVuID0gKChoZWFkZXJbNF0gXFx1MDAyNiAweEZGKSB8IChoZWFkZXJbM10gXFx1MDAzY1xcdTAwM2MgOCkpO1xcbjIyMDY6XFx0XFxuMjIwNzpcXHRcXHRjaXBoZXJfb3ZlcmhlYWQgPSBwcm90LVxcdTAwM2V0YWdfc2l6ZTtcXG4yMjA4OlxcdFxcdGlmIChwcm90LVxcdTAwM2V2ZXJzaW9uICE9IFRMU18xXzNfVkVSU0lPTiBcXHUwMDI2XFx1MDAyNlxcbjIyMDk6XFx0XFx0ICAgIHByb3QtXFx1MDAzZWNpcGhlcl90eXBlICE9IFRMU19DSVBIRVJfQ0hBQ0hBMjBfUE9MWTEzMDUpXFxuMjIxMDpcXHRcXHRcXHRjaXBoZXJfb3ZlcmhlYWQgKz0gcHJvdC1cXHUwMDNlaXZfc2l6ZTtcXG4yMjExOlxcdFxcbjIyMTI6XFx0XFx0aWYgKGRhdGFfbGVuIFxcdTAwM2UgVExTX01BWF9QQVlMT0FEX1NJWkUgKyBjaXBoZXJfb3ZlcmhlYWQgK1xcbjIyMTM6XFx0XFx0ICAgIHByb3QtXFx1MDAzZXRhaWxfc2l6ZSkge1xcbjIyMTQ6XFx0XFx0XFx0cmV0ID0gLUVNU0dTSVpFO1xcbjIyMTU6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIxNjpcXHRcXHR9XFxuMjIxNzpcXHRcXHRpZiAoZGF0YV9sZW4gXFx1MDAzYyBjaXBoZXJfb3ZlcmhlYWQpIHtcXG4yMjE4OlxcdFxcdFxcdHJldCA9IC1FQkFETVNHO1xcbjIyMTk6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIyMDpcXHRcXHR9XFxuMjIyMTpcXHRcXG4yMjIyOlxcdFxcdC8qIE5vdGUgdGhhdCBib3RoIFRMUzEuMyBhbmQgVExTMS4yIHVzZSBUTFNfMV8yIHZlcnNpb24gaGVyZSAqL1xcbjIyMjM6XFx0XFx0aWYgKGhlYWRlclsxXSAhPSBUTFNfMV8yX1ZFUlNJT05fTUlOT1IgfHxcXG4yMjI0OlxcdFxcdCAgICBoZWFkZXJbMl0gIT0gVExTXzFfMl9WRVJTSU9OX01BSk9SKSB7XFxuMjIyNTpcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbjIyMjY6XFx0XFx0XFx0Z290byByZWFkX2ZhaWx1cmU7XFxuMjIyNzpcXHRcXHR9XFxuMjIyODpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzA6NTMuODgxMDYzODg0WiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjgwMTM5ODk2MTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgUmVhc29uaW5nIG9uIHRoZSBUTFMgUlggTWVzc2FnZSBTaXplIGFuZCBRdWV1ZSBWYWxpZGl0eSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyB3ZSBoYW5kbGUgbWVzc2FnZSBzaXplcyBpbiB0aGlzIFRMUyBpbXBsZW1lbnRhdGlvbiwgc3BlY2lmaWNhbGx5IHdoZW4gYHRsc19yeF9tc2dfc2l6ZWAgaXMgY2FsbGVkLiBJdCBzZWVtcyBsaWtlIGlmIHRoYXQgZnVuY3Rpb24gZW5jb3VudGVycyBhIHByb2JsZW0gb24gYSBxdWV1ZSB0aGF0J3Mgbm90IGluIGEgZ29vZCBzdGF0ZSwgaXQncyBkZXNpZ25lZCB0byByZXR1cm4gYW4gZXJyb3IgbGlrZSBgLUVJTlZBTGAsIGAtRU1TR1NJWkVgLCBvciBgLUVCQURNU0dgLiBUaGUgY29kZSBpbiBgdGxzX3N0cnBfcmVhZF9zb2NrYCBkaXJlY3RseSBwYXNzZXMgdGhpcyBlcnJvciB1cCB0aGUgY2hhaW46XG5cbmBgYGNcblx0XHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVx1MDAzZWFuY2hvcik7XG5cdFx0aWYgKHN6IFx1MDAzYyAwKVxuXHRcdFx0cmV0dXJuIHN6O1xuYGBgXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMsIFwiR3JlYXQsIGVycm9yIGhhbmRsaW5nISBJdCdzIHByb3BhZ2F0ZWQgY29ycmVjdGx5LlwiIEJ1dCwgaG9sZCBvbiBhIHNlY29uZC4uLiB3aGF0IGlmIHRoZSAqcXVldWUqIGlzIHRoZSBwcm9ibGVtPyBXaGF0IGlmIHRoZSBxdWV1ZSBpcyBtZXNzZWQgdXAg4oCTIG1heWJlIGl0J3MgZ290IGEgbWl4IG9mIGRlY3J5cHRlZCBhbmQgdW4tZGVjcnlwdGVkIGRhdGEsIG9yIG92ZXJsYXBwaW5nIHNrYnM/IEluIHRob3NlIGNhc2VzLCByZXR1cm5pbmcgYW4gKmVycm9yKiBhbmQgYWJvcnRpbmcgdGhlIGNvbm5lY3Rpb24gaXMgdGhlICp3cm9uZyogdGhpbmcgdG8gZG8hIFdlIG5lZWQgdG8gaGFuZGxlIHRoYXQgZ3JhY2VmdWxseSwgYW5kIGl0IHNlZW1zIGxpa2UgdGhlIGZhbGxiYWNrIG1lY2hhbmlzbSB0byBgdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKWAgaXMgdGhlIHJpZ2h0IHRvb2wgZm9yIHRoaXMgam9iLlxuXG5BaGEhIE5vdyBJIHNlZS4gV2hlbiBgdGxzX3J4X21zZ19zaXplYCBlbmNvdW50ZXJzIGdhcmJhZ2UgZGF0YSBiZWNhdXNlIG9mIG92ZXJsYXBwaW5nIFNLQnMsIGl0IGNhbiByZXR1cm4gYW4gZXJyb3IgbGlrZSBgLUVJTlZBTGAgKG1heWJlIGR1ZSB0byBhIGJhZCBUTFMgdmVyc2lvbikgb3IgYC1FTVNHU0laRWAgKGEgYmFkIGxlbmd0aCBmaWVsZCkuIElmIHdlICpkaWRuJ3QqIGNoZWNrIHRoZSBxdWV1ZSdzIGhlYWx0aCwgYHRsc19zdHJwX3JlYWRfc29ja2Agd291bGQgYmxpbmRseSByZXR1cm4gdGhpcyBlcnJvciwgcG90ZW50aWFsbHkgY2F1c2luZyBhbiB1bm5lY2Vzc2FyeSBjb25uZWN0aW9uIHRlcm1pbmF0aW9uLlxuXG5CdXQsIGlmIHdlIGNoZWNrIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmZpcnN0Kiwgd2UgcmVhbGl6ZSB0aGUgcXVldWUgaXNuJ3QgcHJpc3RpbmUgYW5kIHRoYXQgd2UgbmVlZCB0byBzd2l0Y2ggdG8gYSBtb3JlIHJvYnVzdCByZWFkaW5nIHN0cmF0ZWd5LiBUaGF0J3Mgd2hlcmUgYHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSlgIGNvbWVzIGluISBUaGlzIGZ1bmN0aW9uIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBkZWFsIHdpdGggdGhlIG1lc3N5IHF1ZXVlIHNpdHVhdGlvbnMuIE15IG1lbW9yeSB0ZWxscyBtZSB0aGF0IGl0IHByb2JhYmx5IGNvcGllcyB0aGUgZGF0YSBpbnRvIGEgY29udGlndW91cyBidWZmZXIgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gSSB3b25kZXIgd2hhdCBpdCBhY3R1YWxseSBkb2VzPyBJIG5lZWQgdG8gY2hlY2sgdGhlIGNvZGUgdGhlcmUgdG8gY29uZmlybSB0aGlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjIwMiwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM0MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjAxLjg5NTA1NjgxOFoiLCJTZXEiOjM2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTkxNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM5MCxcbiAgXCJMaW5lQ291bnRcIjogNDVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDM5MDpcXHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBxc2hvcnQpXFxuIDM5MTpcXHR7XFxuIDM5MjpcXHRcXHRzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87XFxuIDM5MzpcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gMzk0OlxcdFxcdGludCBuZWVkX3NwYywgbGVuO1xcbiAzOTU6XFx0XFxuIDM5NjpcXHRcXHQvKiBJZiB0aGUgcmJ1ZiBpcyBzbWFsbCBvciByY3Ygd2luZG93IGhhcyBjb2xsYXBzZWQgdG8gMCB3ZSBuZWVkXFxuIDM5NzpcXHRcXHQgKiB0byByZWFkIHRoZSBkYXRhIG91dC4gT3RoZXJ3aXNlIHRoZSBjb25uZWN0aW9uIHdpbGwgc3RhbGwuXFxuIDM5ODpcXHRcXHQgKiBXaXRob3V0IHByZXNzdXJlIHRocmVzaG9sZCBvZiBJTlRfTUFYIHdpbGwgbmV2ZXIgYmUgcmVhZHkuXFxuIDM5OTpcXHRcXHQgKi9cXG4gNDAwOlxcdFxcdGlmIChsaWtlbHkocXNob3J0IFxcdTAwMjZcXHUwMDI2ICF0Y3BfZXBvbGxpbl9yZWFkeShzdHJwLVxcdTAwM2VzaywgSU5UX01BWCkpKVxcbiA0MDE6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDQwMjpcXHRcXG4gNDAzOlxcdFxcdHNoaW5mbyA9IHNrYl9zaGluZm8oc3RycC1cXHUwMDNlYW5jaG9yKTtcXG4gNDA0OlxcdFxcbiA0MDU6XFx0XFx0LyogSWYgd2UgZG9uJ3Qga25vdyB0aGUgbGVuZ3RoIGdvIG1heCBwbHVzIHBhZ2UgZm9yIGNpcGhlciBvdmVyaGVhZCAqL1xcbiA0MDY6XFx0XFx0bmVlZF9zcGMgPSBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4gPzogVExTX01BWF9QQVlMT0FEX1NJWkUgKyBQQUdFX1NJWkU7XFxuIDQwNzpcXHRcXG4gNDA4OlxcdFxcdGZvciAobGVuID0gbmVlZF9zcGM7IGxlbiBcXHUwMDNlIDA7IGxlbiAtPSBQQUdFX1NJWkUpIHtcXG4gNDA5OlxcdFxcdFxcdHBhZ2UgPSBhbGxvY19wYWdlKHN0cnAtXFx1MDAzZXNrLVxcdTAwM2Vza19hbGxvY2F0aW9uKTtcXG4gNDEwOlxcdFxcdFxcdGlmICghcGFnZSkge1xcbiA0MTE6XFx0XFx0XFx0XFx0dGxzX3N0cnBfZmx1c2hfYW5jaG9yX2NvcHkoc3RycCk7XFxuIDQxMjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gNDEzOlxcdFxcdFxcdH1cXG4gNDE0OlxcdFxcbiA0MTU6XFx0XFx0XFx0c2tiX2ZpbGxfcGFnZV9kZXNjKHN0cnAtXFx1MDAzZWFuY2hvciwgc2hpbmZvLVxcdTAwM2Vucl9mcmFncysrLFxcbiA0MTY6XFx0XFx0XFx0XFx0XFx0ICAgcGFnZSwgMCwgMCk7XFxuIDQxNzpcXHRcXHR9XFxuIDQxODpcXHRcXG4gNDE5OlxcdFxcdHNoaW5mby1cXHUwMDNlZnJhZ19saXN0ID0gTlVMTDtcXG4gNDIwOlxcdFxcbiA0MjE6XFx0XFx0c3RycC1cXHUwMDNlY29weV9tb2RlID0gMTtcXG4gNDIyOlxcdFxcdHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgPSAwO1xcbiA0MjM6XFx0XFxuIDQyNDpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZWxlbiA9IDA7XFxuIDQyNTpcXHRcXHRzdHJwLVxcdTAwM2VhbmNob3ItXFx1MDAzZWRhdGFfbGVuID0gMDtcXG4gNDI2OlxcdFxcdHN0cnAtXFx1MDAzZWFuY2hvci1cXHUwMDNldHJ1ZXNpemUgPSByb3VuZF91cChuZWVkX3NwYywgUEFHRV9TSVpFKTtcXG4gNDI3OlxcdFxcbiA0Mjg6XFx0XFx0dGxzX3N0cnBfcmVhZF9jb3B5aW4oc3RycCk7XFxuIDQyOTpcXHRcXG4gNDMwOlxcdFxcdHJldHVybiAwO1xcbiA0MzE6XFx0fVxcbiA0MzI6XFx0XFxuIDQzMzpcXHRzdGF0aWMgYm9vbCB0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCxcXG4gNDM0OlxcdFxcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgbGVuKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMTowMS44OTUyMTgzNzhaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTk3MTk0MTcyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEaXZpbmcgRGVlcCBpbnRvIHRoZSBUTFMgU3RyaW5nIFBhcnNlcioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGB0bHNfc3RycF9yZWFkX2NvcHlgLCBhbmQgaXQncyBrZXkgZnVuY3Rpb25hbGl0eSBpbW1lZGlhdGVseSBqdW1wcyBvdXQ6IEl0IGZsaXBzIHRoZSBzdHJwYXJzZXIgaW50byBgY29weV9tb2RlID0gMWAuIFRoYXQncyB0aGUgc2lnbmFsIHRvIGdldCBzZXJpb3VzIGFib3V0IGRhdGEgaGFuZGxpbmcuIEl0IGxvb2tzIGxpa2UgaXQgaGFuZGxlcyBhbGxvY2F0aW9uIG9mIHBhZ2VzLCBhbmQgdGhlbiBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5aW4oc3RycClgLiBOb3csIHRoaXMgaXMgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4gYHRsc19zdHJwX3JlYWRfY29weWluYCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBhY3R1YWxseSAqY29waWVzKiB0aGUgZGF0YSwgcmlnaHQ/IEl0J3MgdGFraW5nIGRhdGEgZnJvbSB0aGUgVENQIHJlY2VpdmUgcXVldWUgYW5kIHB1dHRpbmcgaXQgaW50byB0aG9zZSBmcmVzaGx5IGFsbG9jYXRlZCBwYWdlcy5cblxuVGhpcyBzdWdnZXN0cyB0aGF0IHRoaXMgd2hvbGUgYXBwcm9hY2ggaXMgYnVpbHQgdG8gaGFuZGxlIHNwZWNpZmljLCBwb3RlbnRpYWxseSBtZXNzeSBzY2VuYXJpb3MuIFNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IG1peGVkIGRlY3J5cHRlZCBhbmQgbm9uLWRlY3J5cHRlZCBkYXRhIGluIHRoZSBUQ1AgcXVldWUsIG9yIHBvdGVudGlhbGx5IG92ZXJsYXBwaW5nIHNlcXVlbmNlIG51bWJlcnMuIFN0YW5kYXJkIGB0Y3BfcmVjdl9za2JgIG1pZ2h0IG5vdCBiZSB0aGUgbW9zdCBlbGVnYW50IHNvbHV0aW9uIHdoZW4geW91IGhhdmUgdGhvc2UgY29tcGxleGl0aWVzLCBlc3BlY2lhbGx5IGlmIHdlIHdlcmUgcmVseWluZyBkaXJlY3RseSBvbiBgZnJhZ19saXN0YC5cblxuSG9sZCBvbiBhIHNlY29uZCwgdGhvdWdoLiBJIHJlbWVtYmVyIGB0Y3BfcmVjdl9za2JgIGVzc2VudGlhbGx5IHJldHVybnMgdGhlIGZpcnN0IHNrYi4gSWYgd2UncmUgdXNpbmcgYGNvcHlfbW9kZWAgbGlrZSB0aGlzLCB3ZSdyZSBsaWtlbHkgbGV2ZXJhZ2luZyBzb21ldGhpbmcgbW9yZSByb2J1c3QsIHByb2JhYmx5IGB0Y3BfcmVhZF9zb2NrYCBvciBzaW1pbGFyLCB0byBoYW5kbGUgYWxsIHRob3NlIGludHJpY2FjaWVzIHdpdGggb3ZlcmxhcHBpbmcgc2VnbWVudHMgYW5kIGdhcHMgaW4gdGhlIGRhdGEgc3RyZWFtIHByb3Blcmx5LiBUaGF0IG1ha2VzIHNlbnNlLiBXZeKAmXJlIGJlaW5nIHByb2FjdGl2ZS5cblxuUmlnaHQsIHRpbWUgdG8gemVybyBpbiBvbiBgdGxzX3N0cnBfcmVhZF9jb3B5aW5gIGl0c2VsZiBhbmQgc2VlIGV4YWN0bHkgaG93IGl0IGFjaGlldmVzIHRoaXMgY2xlYW4gY29weS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIG1lY2hhbmljcyBpbiBkZXRhaWwgdG8gcmVhbGx5IGFwcHJlY2lhdGUgdGhlIGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc3ODgsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMTowNy44NjcxNjMxNzJaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA0NTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC90bHMvdGxzX3N0cnAuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzMjUsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzMjU6XFx0XFx0XFx0aWYgKHVubGlrZWx5KHN6IFxcdTAwMjZcXHUwMDI2IHN6IFxcdTAwM2Mgc2tiLVxcdTAwM2VsZW4pKSB7XFxuIDMyNjpcXHRcXHRcXHRcXHRpbnQgb3ZlciA9IHNrYi1cXHUwMDNlbGVuIC0gc3o7XFxuIDMyNzpcXHRcXG4gMzI4OlxcdFxcdFxcdFxcdFdBUk5fT05fT05DRShvdmVyIFxcdTAwM2UgY2h1bmspO1xcbiAzMjk6XFx0XFx0XFx0XFx0c2tiLVxcdTAwM2VsZW4gLT0gb3ZlcjtcXG4gMzMwOlxcdFxcdFxcdFxcdHNrYi1cXHUwMDNlZGF0YV9sZW4gLT0gb3ZlcjtcXG4gMzMxOlxcdFxcdFxcdFxcdF9fcHNrYl90cmltKG5za2IsIG5za2ItXFx1MDAzZWxlbiAtIG92ZXIpO1xcbiAzMzI6XFx0XFxuIDMzMzpcXHRcXHRcXHRcXHRjaHVuayAtPSBvdmVyO1xcbiAzMzQ6XFx0XFx0XFx0fVxcbiAzMzU6XFx0XFxuIDMzNjpcXHRcXHRcXHRzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4gPSBzejtcXG4gMzM3OlxcdFxcdH1cXG4gMzM4OlxcdFxcbiAzMzk6XFx0XFx0cmV0dXJuIGNodW5rO1xcbiAzNDA6XFx0fVxcbiAzNDE6XFx0XFxuIDM0MjpcXHRzdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbihyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IHNrX2J1ZmYgKmluX3NrYixcXG4gMzQzOlxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBpbl9sZW4pXFxuIDM0NDpcXHR7XFxuIDM0NTpcXHRcXHRzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCA9IChzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqKWRlc2MtXFx1MDAzZWFyZy5kYXRhO1xcbiAzNDY6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcXG4gMzQ3OlxcdFxcdGludCByZXQ7XFxuIDM0ODpcXHRcXG4gMzQ5OlxcdFxcdGlmIChzdHJwLVxcdTAwM2Vtc2dfcmVhZHkpXFxuIDM1MDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gMzUxOlxcdFxcbiAzNTI6XFx0XFx0c2tiID0gc3RycC1cXHUwMDNlYW5jaG9yO1xcbiAzNTM6XFx0XFx0aWYgKCFza2ItXFx1MDAzZWxlbilcXG4gMzU0OlxcdFxcdFxcdHNrYl9jb3B5X2RlY3J5cHRlZChza2IsIGluX3NrYik7XFxuIDM1NTpcXHRcXHRlbHNlXFxuIDM1NjpcXHRcXHRcXHRzdHJwLVxcdTAwM2VtaXhlZF9kZWNyeXB0ZWQgfD0gISFza2JfY21wX2RlY3J5cHRlZChza2IsIGluX3NrYik7XFxuIDM1NzpcXHRcXG4gMzU4OlxcdFxcdGlmIChJU19FTkFCTEVEKENPTkZJR19UTFNfREVWSUNFKSBcXHUwMDI2XFx1MDAyNiBzdHJwLVxcdTAwM2VtaXhlZF9kZWNyeXB0ZWQpXFxuIDM1OTpcXHRcXHRcXHRyZXQgPSB0bHNfc3RycF9jb3B5aW5fc2tiKHN0cnAsIHNrYiwgaW5fc2tiLCBvZmZzZXQsIGluX2xlbik7XFxuIDM2MDpcXHRcXHRlbHNlXFxuIDM2MTpcXHRcXHRcXHRyZXQgPSB0bHNfc3RycF9jb3B5aW5fZnJhZyhzdHJwLCBza2IsIGluX3NrYiwgb2Zmc2V0LCBpbl9sZW4pO1xcbiAzNjI6XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApIHtcXG4gMzYzOlxcdFxcdFxcdGRlc2MtXFx1MDAzZWVycm9yID0gcmV0O1xcbiAzNjQ6XFx0XFx0XFx0cmV0ID0gMDtcXG4gMzY1OlxcdFxcdH1cXG4gMzY2OlxcdFxcbiAzNjc6XFx0XFx0aWYgKHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbiBcXHUwMDI2XFx1MDAyNiBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4gPT0gc2tiLVxcdTAwM2VsZW4pIHtcXG4gMzY4OlxcdFxcdFxcdGRlc2MtXFx1MDAzZWNvdW50ID0gMDtcXG4gMzY5OlxcdFxcbiAzNzA6XFx0XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDEpO1xcbiAzNzE6XFx0XFx0fVxcbiAzNzI6XFx0XFxuIDM3MzpcXHRcXHRyZXR1cm4gcmV0O1xcbiAzNzQ6XFx0fVxcbiAzNzU6XFx0XFxuIDM3NjpcXHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weWluKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbiAzNzc6XFx0e1xcbiAzNzg6XFx0XFx0cmVhZF9kZXNjcmlwdG9yX3QgZGVzYztcXG4gMzc5OlxcdFxcbiAzODA6XFx0XFx0ZGVzYy5hcmcuZGF0YSA9IHN0cnA7XFxuIDM4MTpcXHRcXHRkZXNjLmVycm9yID0gMDtcXG4gMzgyOlxcdFxcdGRlc2MuY291bnQgPSAxOyAvKiBnaXZlIG1vcmUgdGhhbiBvbmUgc2tiIHBlciBjYWxsICovXFxuIDM4MzpcXHRcXG4gMzg0OlxcdFxcdC8qIHNrIHNob3VsZCBiZSBsb2NrZWQgaGVyZSwgc28gb2theSB0byBkbyByZWFkX3NvY2sgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6MDcuODY3Mjc3MTEyWiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM0ODIyMTM5NzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzaW5nOlxuXG4qKkFuYWx5emluZyB0aGUgYHRsc19zdHJwX3JlYWRfY29weWluYCBGdW5jdGlvbioqXG5cbkFscmlnaHQsIHNvIHRoZSBmaXJzdCB0aGluZyBJIHNlZSBpcyB0aGF0IGB0bHNfc3RycF9yZWFkX2NvcHlpbmAgY2FsbHMgYHRjcF9yZWFkX3NvY2tgIHdpdGggdGhlIGB0bHNfc3RycF9jb3B5aW5gIGZ1bmN0aW9uIGFzIGEgY2FsbGJhY2suIFRoYXQncyBhIGtleSBwYXJ0IG9mIHRoZSBkYXRhIGZsb3csIHVzaW5nIGB0Y3BfcmVhZF9zb2NrYCB0byByZWFkIGZyb20gdGhlIHNvY2tldCBgc3RycC1cdTAwM2Vza2AgYW5kIGNvcHkgdGhlIGRhdGEgc29tZXdoZXJlLCBsaWtlbHkgd2l0aGluIHRoZSBUTFMgY29udGV4dC4gQnV0LCBJIG5lZWQgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gdG8gdW5kZXJzdGFuZCB0aGUgd2hvbGUgcGljdHVyZS4gSSdtIGdvaW5nIHRvIGRpZyBkZWVwZXIgYW5kIHNlZSB3aGF0IHRoYXQgY2FsbGJhY2sgZG9lcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkyNjYsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjExLjM0OTQ5Mzk4MloiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDYzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM4MCxcbiAgXCJMaW5lQ291bnRcIjogMTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDM4MDpcXHRcXHRkZXNjLmFyZy5kYXRhID0gc3RycDtcXG4gMzgxOlxcdFxcdGRlc2MuZXJyb3IgPSAwO1xcbiAzODI6XFx0XFx0ZGVzYy5jb3VudCA9IDE7IC8qIGdpdmUgbW9yZSB0aGFuIG9uZSBza2IgcGVyIGNhbGwgKi9cXG4gMzgzOlxcdFxcbiAzODQ6XFx0XFx0Lyogc2sgc2hvdWxkIGJlIGxvY2tlZCBoZXJlLCBzbyBva2F5IHRvIGRvIHJlYWRfc29jayAqL1xcbiAzODU6XFx0XFx0dGNwX3JlYWRfc29jayhzdHJwLVxcdTAwM2VzaywgXFx1MDAyNmRlc2MsIHRsc19zdHJwX2NvcHlpbik7XFxuIDM4NjpcXHRcXG4gMzg3OlxcdFxcdHJldHVybiBkZXNjLmVycm9yO1xcbiAzODg6XFx0fVxcbiAzODk6XFx0XFxuIDM5MDpcXHRzdGF0aWMgaW50IHRsc19zdHJwX3JlYWRfY29weShzdHJ1Y3QgdGxzX3N0cnBhcnNlciAqc3RycCwgYm9vbCBxc2hvcnQpXFxuIDM5MTpcXHR7XFxuIDM5MjpcXHRcXHRzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87XFxuIDM5MzpcXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gMzk0OlxcdFxcdGludCBuZWVkX3NwYywgbGVuO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMToxMS4zNDk2NDIxOTJaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTI3NzU1NzY0MjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBWdWxuZXJhYmlsaXR5IGluIFRDUCBRdWV1ZSBIYW5kbGluZyoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiB0aGlua2luZyB0aHJvdWdoIHRoaXMgaXNzdWUuIFRoZSBjb3JlIHByb2JsZW0gbGllcyBpbiBob3cgd2UgaGFuZGxlIHBvdGVudGlhbGx5IG1hbGZvcm1lZCBUQ1AgcmVjZWl2ZSBxdWV1ZXMsIHNwZWNpZmljYWxseSB3aGVuIHRoZXkgY29udGFpbiBvdmVybGFwcywgZ2Fwcywgb3IgbWl4ZWQgZGVjcnlwdGVkIGRhdGEuIEkndmUgY29uZmlybWVkIHRoYXQgYHRjcF9yZWFkX3NvY2tgIGNvcnJlY3RseSBoYW5kbGVzIGFsbCB0aGVzZSBlZGdlIGNhc2VzLCB3aGljaCBpcyBnb29kLiBUaGUgY3J1eCBpcyB0aGF0IGlmIHRoZSBxdWV1ZSBpc24ndCBcImNsZWFuXCIg4oCTIG1lYW5pbmcgaXQgaGFzIHRob3NlIGlzc3VlcyDigJMgd2UgKm11c3QqIHVzZSBgdGNwX3JlYWRfc29ja2AgdmlhIGBjb3B5X21vZGVgLlxuXG5UaGUgaXNzdWUgYXJpc2VzIGZyb20gaG93IGB0bHNfc3RycF9sb2FkX2FuY2hvcl93aXRoX3F1ZXVlYCB1c2VzIGBmcmFnX2xpc3RgIGRpcmVjdGx5LiBJdCBhcHBlYXJzIHRoYXQgaWYgdGhlIHF1ZXVlIGlzIG1hbGZvcm1lZCwgd2UgY291bGQgZW5kIHVwIHJlYWRpbmcgZ2FyYmFnZSBvciBjcmFzaGluZyBpZiB3ZSBjYWxsIGB0bHNfcnhfbXNnX3NpemVgIG9uIHRoZSBtYWxmb3JtZWQgcXVldWUuICBUaGUgZnVuY3Rpb24gYHNrYl9jb3B5X2JpdHNgLCBpbiBwYXJ0aWN1bGFyLCB3b3JyaWVzIG1lLiBJdCBqdXN0IGl0ZXJhdGVzIG92ZXIgdGhlIGZyYWdzIGluIGFuIHNrYiB0aGVuIHRoZSBgZnJhZ19saXN0YCBhcyBpZiB0aGV5IGFyZSBjb250aWd1b3VzIG1lbW9yeSByZWdpb25zLiBJZiB0aGVzZSBmcmFncyBvdmVybGFwIOKAkyBhcyBjYW4gaGFwcGVuIHdpdGggcmV0cmFuc21pc3Npb25zIG9yIG91dC1vZi1vcmRlciBwYWNrZXRzIHRoYXQgaGF2ZW4ndCBiZWVuIGNvbXBsZXRlbHkgY29sbGFwc2VkIOKAkyBgc2tiX2NvcHlfYml0c2Agd2lsbCBzaW1wbHkgcmVhZCB0aGVtIGNvbnRpZ3VvdXNseSwgd2hpY2ggd2lsbCBsZWFkIHRvIGluY29ycmVjdCBkYXRhIGJlaW5nIHJlYWQuXG5cblRoaXMsIGluIHR1cm4sIGNhbiBjb21wdXRlIGFuIGluY29ycmVjdCBgc3pgIGFuZCB0aGVuIGNhdXNlIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLiBTcGVjaWZpY2FsbHksIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2Agd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHdyb25nIHZhbHVlIGZvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgcXVldWUsIG9yIGNhbGN1bGF0ZWQgYHN6YC4gSWYgdGhpcyBgc3pgIGlzIGEgbGFyZ2UgdmFsdWUsIGFuZCB0aGUgcXVldWUgYWN0dWFsbHkgaGFzIGEgc21hbGxlciBhbW91bnQgb2YgZGF0YSwgdGhlIGNvZGUgd2lsbCB0cnkgdG8gaXRlcmF0ZSBvdmVyIHNrYi1cdTAwM2VuZXh0IHBhc3QgdGhlIGVuZCBvZiB0aGUgZGF0YS4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBhdHRlbXB0IHRvIGRlcmVmZXJlbmNlIGEgTlVMTCBwb2ludGVyIGluIHRoZSBgVENQX1NLQl9DQihza2IpLVx1MDAzZXNlcWAgZmllbGQsIHdoaWNoIHdpbGwgdHJpZ2dlciBhIGNyYXNoLiBUaGUga2VybmVsJ3MgS0FTQU4gd2lsbCBjYXRjaCB0aGlzLlxuXG5Jbml0aWFsbHksIEkgd2FzIGNvbmNlcm5lZCBhYm91dCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy4gQnV0IGBza2JfY29weV9iaXRzYCB3aWxsIG9ubHkgcmVhZCAqaW5pdGlhbGl6ZWQqIGJ5dGVzIGZyb20gdGhlIGBmcmFnX2xpc3RgLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IHdpbGwgcmVhZCB0aGUgKndyb25nKiBieXRlcywgbGVhZGluZyB0byB0aGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cbkkgd2FzIGNvbnNpZGVyaW5nIHRoZSBjYXNlIHdoZXJlIGBzemAgbWlnaHQgYmUgc21hbGwsIGJ1dCB0aGUgcXVldWUgaGFzIG92ZXJsYXBzLCBidXQgdGhlbiBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgIHdpbGwgZGV0ZWN0IHRoZSBvdmVybGFwcywgYW5kIHJldHVybiBgZmFsc2VgLCB3aGljaCB3aWxsIGNhbGwgYHRsc19zdHJwX3JlYWRfY29weWAgZXZlbnR1YWxseS4gU28gdGhpcyB3b3VsZG4ndCBiZSBhIHByb2JsZW0uXG5cbkhvd2V2ZXIsIEkganVzdCByZWFsaXplZCB0aGF0IHRoZSBjb2RlIGhhcyBhIGNyaXRpY2FsIGNoZWNrLiBgdGxzX3N0cnBfcmVhZF9zb2NrYCBjaGVja3MgaWYgdGhlcmUgYXJlIGVub3VnaCBieXRlcyBpbiB0aGUgcXVldWUgYmVmb3JlIGV2ZW4gY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBJZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGJ5dGVzLCBpdCByZXR1cm5zIGB0bHNfc3RycF9yZWFkX2NvcHlgLCB3aGljaCBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5aW5gLiBTbyBpdCBkb2Vzbid0IGNyYXNoIGluIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AhIFRoZW4gd2hhdCBpcyB0aGUgYnVnPyBJIG5lZWQgdG8gcmUtcmVhZCB0aGUgcGF0Y2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NzYxLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAxMCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjI0LjEyNTIyMzQ4M1oiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjg3MTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUyMCxcbiAgXCJMaW5lQ291bnRcIjogMzVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyMDpcXHRcXHRpZiAodW5saWtlbHkoc3RycC1cXHUwMDNlY29weV9tb2RlKSlcXG4gNTIxOlxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHlpbihzdHJwKTtcXG4gNTIyOlxcdFxcbiA1MjM6XFx0XFx0aWYgKGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTI0OlxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDUyNTpcXHRcXG4gNTI2OlxcdFxcdHRsc19zdHJwX2xvYWRfYW5jaG9yX3dpdGhfcXVldWUoc3RycCwgaW5xKTtcXG4gNTI3OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDUyODpcXHRcXHRcXHRpZiAoaW5xIFxcdTAwM2MgVExTX0hFQURFUl9TSVpFKVxcbiA1Mjk6XFx0XFx0XFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCB0cnVlKTtcXG4gNTMwOlxcdFxcbiA1MzE6XFx0XFx0XFx0aWYgKCF0bHNfc3RycF9jaGVja19xdWV1ZV9vayhzdHJwLCBzdHJwLVxcdTAwM2VzdG0ub2Zmc2V0ICsgVExTX0hFQURFUl9TSVpFKSlcXG4gNTMyOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgZmFsc2UpO1xcbiA1MzM6XFx0XFxuIDUzNDpcXHRcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBzdHJwLVxcdTAwM2VhbmNob3IpO1xcbiA1MzU6XFx0XFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4gNTM2OlxcdFxcdFxcdFxcdHJldHVybiBzejtcXG4gNTM3OlxcdFxcbiA1Mzg6XFx0XFx0XFx0c3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuID0gc3o7XFxuIDUzOTpcXHRcXG4gNTQwOlxcdFxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuIHx8IGlucSBcXHUwMDNjIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbilcXG4gNTQxOlxcdFxcdFxcdFxcdHJldHVybiB0bHNfc3RycF9yZWFkX2NvcHkoc3RycCwgdHJ1ZSk7XFxuIDU0MjpcXHRcXHR9XFxuIDU0MzpcXHRcXG4gNTQ0OlxcdFxcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbikpXFxuIDU0NTpcXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4gNTQ2OlxcdFxcbiA1NDc6XFx0XFx0V1JJVEVfT05DRShzdHJwLVxcdTAwM2Vtc2dfcmVhZHksIDEpO1xcbiA1NDg6XFx0XFxuIDU0OTpcXHRcXHRyZXR1cm4gMDtcXG4gNTUwOlxcdH1cXG4gNTUxOlxcdFxcbiA1NTI6XFx0LyogUGFyc2UgcXVldWVkIGRhdGEuIFdoZW4gQGFubm91bmNlIGlzIHRydWUgYW5kIHBhcnNpbmcgcHJvZHVjZXMgYVxcbiA1NTM6XFx0ICogbmV3bHktcmVhZHkgcmVjb3JkLCBmaXJlIHRoZSBjb25zdW1lciBub3RpZmljYXRpb24uIENhbGxlcnMgdGhhdFxcbiA1NTQ6XFx0ICogbmVlZCB0byBub3RpZnkgYSB3YWl0ZXIgYWJvdXQgYSByZWNvcmQgcGFyc2VkIGJ5IGFub3RoZXIgcGF0aFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMToyNC4xMjUzOTUwMTJaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTk0MjE3MzgxODEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBUTFMgQ29ubmVjdGlvbiBGYWlsdXJlIHdpdGggVENQIE92ZXJsYXBzKipcblxuT2theSwgaGVyZSdzIHdoYXQncyBoYXBwZW5pbmcuIExvb2tpbmcgYXQgdGhlIG9sZCBjb2RlLCBiZWZvcmUgdGhlIHBhdGNoLCB0aGUgbG9naWMgY2FsbHMgYHRsc19yeF9tc2dfc2l6ZWAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBUTFMgaGVhZGVyIGZyb20gdGhlIHJlY2VpdmUgcXVldWUuICBUaGUgcHJvYmxlbSBhcmlzZXMgd2hlbiB0aGVyZSBhcmUgb3ZlcmxhcHBpbmcgVENQIHNlZ21lbnRzIOKAkyBjb21tb24gd2l0aCByZXRyYW5zbWlzc2lvbnMg4oCTIGJlY2F1c2UgYHRsc19yeF9tc2dfc2l6ZWAgYXNzdW1lcyBhIGNvbnRpZ3VvdXMgYnVmZmVyLlxuXG5TcGVjaWZpY2FsbHksIGB0bHNfcnhfbXNnX3NpemVgIHVzZXMgYHNrYl9jb3B5X2JpdHNgLiBXaGVuIHRoZSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWlucyBvdmVybGFwcGluZyBTS0JzIChTb2NrZXQgQnVmZmVycyksIGBza2JfY29weV9iaXRzYCBtaWdodCByZWFkIHRoZSAqd3JvbmcqIGJ5dGVzIGZvciB0aGUgVExTIGhlYWRlci4gVGhpcyBjYW4gbGVhZCB0byBhIGNvcnJ1cHRlZCBoZWFkZXIgYmVpbmcgcmVhZC4gSWYgYHRsc19yeF9tc2dfc2l6ZWAgaW50ZXJwcmV0cyB0aGVzZSBpbmNvcnJlY3QgYnl0ZXMgYXMgYW4gaW52YWxpZCBUTFMgaGVhZGVyLCBpdCBjYW4gcmV0dXJuIGFuIGVycm9yIGNvZGUgbGlrZSBgLUVJTlZBTGAuIFRoaXMgZXJyb3IgdGhlbiBidWJibGVzIHVwLCBldmVudHVhbGx5IGNhdXNpbmcgdGhlIFRMUyBjb25uZWN0aW9uIHRvIGZhaWwgb3Igc3RhbGwsIGJ1dCB0aGUgdW5kZXJseWluZyBUQ1AgY29ubmVjdGlvbiBpcyBhY3R1YWxseSBwZXJmZWN0bHkgZmluZS5cblxuVGhlIGJ1ZyBpcyB0aGF0IHdlJ3JlIGFib3J0aW5nIGEgVExTIGNvbm5lY3Rpb24gc3B1cmlvdXNseSB3aGVuIHRoZSBUQ1Agc3RhY2sgaXMgZG9pbmcgaXRzIGpvYiBieSBoYW5kbGluZyByZXRyYW5zbWlzc2lvbnMuIFRoZSBjb3JyZWN0IGFwcHJvYWNoIGlzIHRvIGhhbmRsZSBvdmVybGFwcGluZyBzZWdtZW50cywgd2hpY2ggaXMgY29tbW9uIGluIFRDUCBhbmQgbm90IG5lY2Vzc2FyaWx5IGluZGljYXRpdmUgb2YgYSBwcm9ibGVtLlxuXG5UaGUgZml4IEkndmUgaW1wbGVtZW50ZWQgKGFkZGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgKSBhZGRyZXNzZXMgdGhpcy4gQnkgY2hlY2tpbmcgaWYgdGhlIHJlY2VpdmUgcXVldWUgaXMgXCJPS1wiICpiZWZvcmUqIGF0dGVtcHRpbmcgdG8gcmVhZCB0aGUgaGVhZGVyLCB3ZSBjYW4gbm93IGRldGVjdCB0aGUgcHJlc2VuY2Ugb2Ygb3ZlcmxhcHBpbmcgc2VnbWVudHMuIElmIHRoZSBxdWV1ZSBpcyBub3QgT0ssIHdlIGNhbiBzd2l0Y2ggdG8gYHRsc19zdHJwX3JlYWRfY29weWAsIHdoaWNoIGNvcnJlY3RseSB1c2VzIGB0Y3BfcmVhZF9zb2NrYCB0byByZWFkIHRoZSBkYXRhLCBoYW5kbGluZyB0aGUgb3ZlcmxhcHBpbmcgc2VnbWVudHMuXG5cbkkgd2VudCBiYWNrIGFuZCBjaGVja2VkIGlmIHRoZXJlJ3MgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUsIGJ1dCBpdCdzIG5vdCB0aGUgY2FzZS4gYHNrYl9jb3B5X2JpdHNgIGlzIHNhZmUuIEFsbCB0aGUgZGF0YSBmcm9tIHRoZSBuZXR3b3JrIGlzIGluaXRpYWxpemVkLiBUaGVyZSBpcyBubyBLTVNBTiBidWcgaGVyZS4gSXQncyBhIGxvZ2ljIGJ1ZyByZWxhdGVkIHRvIGhvdyB3ZSBoYW5kbGUgdGhlIG92ZXJsYXBwaW5nIGRhdGEuXG5cbkkgYWxzbyBjaGVja2VkIGlmIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgY291bGQgY2F1c2UgYW4gb3V0LW9mLWJvdW5kcyByZWFkLiBJbiB0aGUgd2hpbGUgbG9vcCwgaWYgYGxlbmAgd2hpY2ggaXMgYHN0cnAtXHUwMDNlc3RtLm9mZnNldCArIFRMU19IRUFERVJfU0laRWAgaXMgbGFyZ2VyIHRoYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZnJhZ19saXN0LCB0aGUgYHNrYmAgYmVjb21lcyBOVUxMLiBUaGVuIGRlcmVmZXJlbmNpbmcgaXQgY2F1c2VzIGEga2VybmVsIGNyYXNoLlxuSW4gdGhlIG5ldyBjb2RlLCBgbGVuYCBpcyBgc3RycC1cdTAwM2VzdG0ub2Zmc2V0ICsgVExTX0hFQURFUl9TSVpFYCwgYW5kIGBpbnFgIGlzIGB0Y3BfaW5xKHN0cnAtXHUwMDNlc2spYC4gU2luY2UgYGlucWAgaXMgdGhlIHN1bSBvZiBgc2tiLVx1MDAzZWxlbmAgYW5kIHNpbmNlIHdlIGNoZWNrIGBpbnEgXHUwMDNlPSBUTFNfSEVBREVSX1NJWkVgIGJlZm9yZSB0aGlzIGNhbGwsIGFuZCBzaW5jZSBpdCBjYWxscyBgdGxzX3N0cnBfcmVhZF9jb3B5YCBpZiBgaW5xIFx1MDAzYyBUTFNfSEVBREVSX1NJWkVgLCBgbGVuYCBpcyBub3QgbGFyZ2VyIHRoYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgYGZyYWdfbGlzdGAgYmVjYXVzZSBgdGNwX2lucWAgaXMgZXhhY3RseSB0aGUgc3VtIG9mIGBza2ItXHUwMDNlbGVuYCBpbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gVGh1cywgYGxlbmAgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gdGhlIGZyYWcgbGlzdCdzIHRvdGFsIGxlbmd0aC5cblxuSW4gc3VtbWFyeSwgdGhlIGtleSBpcyBwcmV2ZW50aW5nIHRoYXQgZXJyb3IgcmV0dXJuIGJ5IGNoZWNraW5nIGZvciBvdmVybGFwICpiZWZvcmUqIHJlYWRpbmcgdGhlIFRMUyBoZWFkZXIsIHRodXMgbWFpbnRhaW5pbmcgdGhlIGludGVncml0eSBvZiB0aGUgVENQIGNvbm5lY3Rpb24gYW5kIGF2b2lkaW5nIHNwdXJpb3VzIGNvbm5lY3Rpb24gZmFpbHVyZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMDcxLCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYwNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjQzLjU0NzEzNzExNFoiLCJTZXEiOjQ0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU3NzgzNzg0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRjcF9pbnFcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L2lwdjQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9pcHY0L3RjcC5jPTYzOT1pbnQgdGNwX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgaW50ICprYXJnKVxcbi0tXFxubmV0L2lwdjQvdGNwLmMtNjUwLVxcdFxcdHNsb3cgPSBsb2NrX3NvY2tfZmFzdChzayk7XFxubmV0L2lwdjQvdGNwLmM6NjUxOlxcdFxcdGFuc3cgPSB0Y3BfaW5xKHNrKTtcXG5uZXQvaXB2NC90Y3AuYy02NTItXFx0XFx0dW5sb2NrX3NvY2tfZmFzdChzaywgc2xvdyk7XFxuLS1cXG5uZXQvaXB2NC90Y3AuYz0xODIzPWludCB0Y3BfcGVla19sZW4oc3RydWN0IHNvY2tldCAqc29jaylcXG5uZXQvaXB2NC90Y3AuYy0xODI0LXtcXG5uZXQvaXB2NC90Y3AuYzoxODI1OlxcdHJldHVybiB0Y3BfaW5xKHNvY2stXFx1MDAzZXNrKTtcXG5uZXQvaXB2NC90Y3AuYy0xODI2LX1cXG4tLVxcbm5ldC9pcHY0L3RjcC5jPTIxOTU9c3RhdGljIGludCB0Y3BfemVyb2NvcHlfcmVjZWl2ZShzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvaXB2NC90Y3AuYy0yMjA5LVxcdHUzMiB0b3RhbF9ieXRlc190b19tYXA7XFxubmV0L2lwdjQvdGNwLmM6MjIxMDpcXHRpbnQgaW5xID0gdGNwX2lucShzayk7XFxubmV0L2lwdjQvdGNwLmMtMjIxMS1cXHRib29sIG1tYXBfbG9ja2VkO1xcbi0tXFxubmV0L2lwdjQvdGNwLmM9MjM0Nj12b2lkIHRjcF9yZWN2X3RpbWVzdGFtcChzdHJ1Y3QgbXNnaGRyICptc2csIGNvbnN0IHN0cnVjdCBzb2NrICpzayxcXG4tLVxcbm5ldC9pcHY0L3RjcC5jLTI0MTItXFxubmV0L2lwdjQvdGNwLmM6MjQxMzpzdGF0aWMgaW50IHRjcF9pbnFfaGludChzdHJ1Y3Qgc29jayAqc2spXFxubmV0L2lwdjQvdGNwLmMtMjQxNC17XFxuLS1cXG5uZXQvaXB2NC90Y3AuYz0yOTMwPWludCB0Y3BfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKVxcbi0tXFxubmV0L2lwdjQvdGNwLmMtMjk1MC1cXHRcXHRpZiAoKGNtc2dfZmxhZ3MgXFx1MDAyNiBUQ1BfQ01TR19JTlEpIHwgbXNnLVxcdTAwM2Vtc2dfZ2V0X2lucSkge1xcbm5ldC9pcHY0L3RjcC5jOjI5NTE6XFx0XFx0XFx0bXNnLVxcdTAwM2Vtc2dfaW5xID0gdGNwX2lucV9oaW50KHNrKTtcXG5uZXQvaXB2NC90Y3AuYy0yOTUyLVxcdFxcdFxcdGlmIChjbXNnX2ZsYWdzIFxcdTAwMjYgVENQX0NNU0dfSU5RKVxcbi0tXFxubmV0L2lwdjQvdGNwLmM9NDQ4MT1pbnQgZG9fdGNwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsXFxuLS1cXG5uZXQvaXB2NC90Y3AuYy00Nzk4LXplcm9jb3B5X3Jjdl9pbnE6XFxubmV0L2lwdjQvdGNwLmM6NDc5OTpcXHRcXHR6Yy5pbnEgPSB0Y3BfaW5xX2hpbnQoc2spO1xcbm5ldC9pcHY0L3RjcC5jLTQ4MDAtemVyb2NvcHlfcmN2X291dDpcXG4tLVxcbm5ldC9pcHY0L3RjcF9icGYuYz0zMzU9c3RhdGljIGludCB0Y3BfYnBmX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgaW50ICprYXJnKVxcbi0tXFxubmV0L2lwdjQvdGNwX2JwZi5jLTM2MC1cXHQgICAgIVJFQURfT05DRShwc29jay1cXHUwMDNlcHJvZ3Muc2tiX3ZlcmRpY3QpKVxcbm5ldC9pcHY0L3RjcF9icGYuYzozNjE6XFx0XFx0KmthcmcgKz0gdGNwX2lucShzayk7XFxubmV0L2lwdjQvdGNwX2JwZi5jLTM2Mi1cXHRza19wc29ja19wdXQoc2ssIHBzb2NrKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6NDQuMDA0OTI2NTc4WiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI4NTY3MzkxNTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqSW52ZXN0aWdhdGluZyBgdGNwX2lucWAqKlxuXG5Pa2F5LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSdtIHRoaW5raW5nLCBiZWZvcmUgSSBwcm9jZWVkIGZ1cnRoZXIsIEkgbmVlZCB0byBuYWlsIGRvd24gZXhhY3RseSB3aGF0IGB0Y3BfaW5xYCByZXByZXNlbnRzLiBJdCdzIGNydWNpYWwgdG8gaGF2ZSBhIHJvY2stc29saWQgZGVmaW5pdGlvbiBoZXJlLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIGxvdy1sZXZlbCBuZXR3b3JrIHBlcmZvcm1hbmNlIG9yIGRpYWdub3N0aWNzLiBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluIEkgdW5kZXJzdGFuZCBpdHMgc3BlY2lmaWMgbWVhbmluZyBpbiB0aGUgY29udGV4dCBJJ20gd29ya2luZyB3aXRoLCB3aGV0aGVyIHRoYXQncyB3aXRoaW4gdGhlIGtlcm5lbCwgaW4gYSBzcGVjaWZpYyBtb25pdG9yaW5nIHRvb2wsIG9yIGluIGEgdGhlb3JldGljYWwgZGlzY3Vzc2lvbi4gQ29udGV4dCBpcyBraW5nLCBhcyBhbHdheXMsIGJ1dCB1bmRlcnN0YW5kaW5nIHRoZSBwcmVjaXNlIHNlbWFudGljcyBvZiBgdGNwX2lucWAgaXMgdGhlIGZvdW5kYXRpb24uIExldCdzIHN0YXJ0IHdpdGggdGhlIHN0YW5kYXJkIGRlZmluaXRpb24sIGFuZCB0aGVuIGRpdmUgaW50byB0aGUgcmVsZXZhbnQgc291cmNlIGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0byBjb25maXJtLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTIyOSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMxOjQ2Ljg2MTY2ODI0WiIsIlNlcSI6NDYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NzI0NzQ1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpbnQgdGNwX2lucVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL25ldC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9uZXQvdGNwLmg9MjczNj1zdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF90Y3BfcHVyZV9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbmluY2x1ZGUvbmV0L3RjcC5oLTI3NDAtXFxuaW5jbHVkZS9uZXQvdGNwLmg6Mjc0MTpzdGF0aWMgaW5saW5lIGludCB0Y3BfaW5xKHN0cnVjdCBzb2NrICpzaylcXG5pbmNsdWRlL25ldC90Y3AuaC0yNzQyLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6NDYuOTQ4OTIxMTU3WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQwMDk0Mjc4ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIGB0Y3BfaW5xYCBWYXJpYWJsZSoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzLiBcIkxldCdzIHJlYWQgYHRjcF9pbnFgXCIg4oCTIHRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIEkgaW1tZWRpYXRlbHkga25vdyB3ZSdyZSB0YWxraW5nIGFib3V0IGEgdmFyaWFibGUsIGxpa2VseSB3aXRoaW4gYSBuZXR3b3JrIHN0YWNrJ3MgaW1wbGVtZW50YXRpb24uIFRoZSBgdGNwX2AgcHJlZml4IHN0cm9uZ2x5IHN1Z2dlc3RzIGl0J3MgcmVsYXRlZCB0byBUQ1AsIGFuZCB0aGUgYGlucWAgc3VmZml4IHByb2JhYmx5IHBvaW50cyB0byBzb21ldGhpbmcgYWJvdXQgdGhlIGluY29taW5nIHF1ZXVlLlxuXG5NeSBicmFpbidzIGFscmVhZHkgc3RhcnRpbmcgdG8gZmlsbCBpbiB0aGUgYmxhbmtzLiBJcyB0aGlzIGEga2VybmVsLWxldmVsIHZhcmlhYmxlPyBVc2VyLXNwYWNlPyBXaGF0IGFyY2hpdGVjdHVyZSBhcmUgd2UgZGVhbGluZyB3aXRoPyBUaGUgc3BlY2lmaWMgY29udGV4dCB3b3VsZCBtYWtlIGEgaHVnZSBkaWZmZXJlbmNlIGluIGhvdyBJIGludGVycHJldCBpdC4gQXJlIHdlIGxvb2tpbmcgYXQgYSBwZXItc29ja2V0IHZhbHVlLCBhIGdsb2JhbCBzeXN0ZW0gc3RhdGlzdGljLCBvciBzb21ldGhpbmcgbW9yZSBudWFuY2VkP1xuXG5JJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGltcGxpY2F0aW9ucy4gYHRjcF9pbnFgIGNvdWxkIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHF1ZXVlZCBmb3IgcmVjZXB0aW9uLCB0aGUgbnVtYmVyIG9mIHBhY2tldHMsIHBlcmhhcHMgYSBjb3VudCBvZiBvdXRzdGFuZGluZyBhY2tub3dsZWRnZW1lbnRzLCBvciBldmVuIGEgbWVhc3VyZSBvZiBidWZmZXJpbmcgcHJlc3N1cmUuIEl04oCZcyBwcm9iYWJseSBhIGNyaXRpY2FsIHBlcmZvcm1hbmNlIG1ldHJpYywgcmVmbGVjdGluZyB0aGUgZWZmaWNpZW5jeSBvZiB0aGUgVENQIHJlY2VpdmUgcGF0aC4gSSdtIGtlZW4gdG8gc2VlIHRoZSBjb2RlIHdoZXJlIGl0J3MgdXNlZC4gQW55IGNvbmdlc3Rpb24gY29udHJvbCBtZWNoYW5pc21zIG1pZ2h0IGhhdmUgYSBkZXBlbmRlbmN5IG9uIHRoZSBpbmZvcm1hdGlvbiBpdCBjb250YWlucy5cblxuVGhlIGNvcmUgcXVlc3Rpb24gbm93IGlzOiBXaGF0IGRvZXMgKml0KiB0ZWxsIHVzPyBXaHkgYXJlIHdlIHJlYWRpbmcgaXQ/IFdoYXQgcHJvYmxlbSBhcmUgd2UgdHJ5aW5nIHRvIHNvbHZlIG9yIHVuZGVyc3RhbmQ/IElzIHRoaXMgcGFydCBvZiBhIGRlYnVnZ2luZyBleGVyY2lzZSwgcGVyZm9ybWFuY2UgdHVuaW5nLCBvciBuZXR3b3JrIG1vbml0b3Jpbmc/IFRoZSByZWFzb25zIGZvciB0aGUgcmVhZGluZyB3aWxsIGhlYXZpbHkgaW5mbHVlbmNlIG15IGFuYWx5c2lzIG9mIGl0LiBJcyB0aGVyZSBzb21ldGhpbmcgd2UgZXhwZWN0IHRvIGZpbmQsIG9yIGFyZSB3ZSBqdXN0IGhvcGluZyB0byBvYnRhaW4gYSBiYXNlbGluZSBudW1iZXIgdG8gYmUgdXNlZCBmb3IgY29tcGFyaXNvbj8gSSdtIGV4Y2l0ZWQgdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gYmVjYXVzZSwgZm9yIG15IGZpZWxkLCB0aGlzIHZhcmlhYmxlIGlzIGFic29sdXRlbHkgdml0YWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1NTUyLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6NTAuOTU4MzUxMTU5WiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0Nzc0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL25ldC90Y3AuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAyNzQxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNzQxOlxcdHN0YXRpYyBpbmxpbmUgaW50IHRjcF9pbnEoc3RydWN0IHNvY2sgKnNrKVxcbjI3NDI6XFx0e1xcbjI3NDM6XFx0XFx0c3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7XFxuMjc0NDpcXHRcXHRpbnQgYW5zdztcXG4yNzQ1OlxcdFxcbjI3NDY6XFx0XFx0aWYgKCgxIFxcdTAwM2NcXHUwMDNjIHNrLVxcdTAwM2Vza19zdGF0ZSkgXFx1MDAyNiAoVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKSB7XFxuMjc0NzpcXHRcXHRcXHRhbnN3ID0gMDtcXG4yNzQ4OlxcdFxcdH0gZWxzZSBpZiAoc29ja19mbGFnKHNrLCBTT0NLX1VSR0lOTElORSkgfHxcXG4yNzQ5OlxcdFxcdFxcdCAgICF0cC1cXHUwMDNldXJnX2RhdGEgfHxcXG4yNzUwOlxcdFxcdFxcdCAgIGJlZm9yZSh0cC1cXHUwMDNldXJnX3NlcSwgdHAtXFx1MDAzZWNvcGllZF9zZXEpIHx8XFxuMjc1MTpcXHRcXHRcXHQgICAhYmVmb3JlKHRwLVxcdTAwM2V1cmdfc2VxLCB0cC1cXHUwMDNlcmN2X254dCkpIHtcXG4yNzUyOlxcdFxcbjI3NTM6XFx0XFx0XFx0YW5zdyA9IHRwLVxcdTAwM2VyY3Zfbnh0IC0gdHAtXFx1MDAzZWNvcGllZF9zZXE7XFxuMjc1NDpcXHRcXG4yNzU1OlxcdFxcdFxcdC8qIFN1YnRyYWN0IDEsIGlmIEZJTiB3YXMgcmVjZWl2ZWQgKi9cXG4yNzU2OlxcdFxcdFxcdGlmIChhbnN3IFxcdTAwMjZcXHUwMDI2IHNvY2tfZmxhZyhzaywgU09DS19ET05FKSlcXG4yNzU3OlxcdFxcdFxcdFxcdGFuc3ctLTtcXG4yNzU4OlxcdFxcdH0gZWxzZSB7XFxuMjc1OTpcXHRcXHRcXHRhbnN3ID0gdHAtXFx1MDAzZXVyZ19zZXEgLSB0cC1cXHUwMDNlY29waWVkX3NlcTtcXG4yNzYwOlxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzE6NTAuOTU4NTAwMTI5WiIsIlNlcSI6NDksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMwMDQwOTg4MzQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBQb3RlbnRpYWwgSXNzdWVzIHdpdGggVExTL1RDUCBIYW5kbGluZyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gSXQgc2VlbXMgd2UncmUgbG9va2luZyBhdCBhIHNjZW5hcmlvIHdoZXJlIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIFRMUyBhbmQgVENQIHJlY2VpdmUgcXVldWVzIG1pZ2h0IGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gaG93IHdlIGhhbmRsZSBvdmVybGFwcGluZyBUQ1Agc2VnbWVudHMuXG5cbkZpcnN0LCBgdGNwX2lucWAgcHJvdmlkZXMgdGhlICpsb2dpY2FsKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSByZWNlaXZlIHF1ZXVlLCBjb25zaWRlcmluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIHNwYWNlLiBIb3dldmVyLCB3aGVuIG92ZXJsYXBwaW5nIFNLQnMgYXJlIHByZXNlbnQsIHRoZSAqcGh5c2ljYWwqIHN1bSBvZiBgc2tiLVx1MDAzZWxlbmAgdmFsdWVzIGNhbiBiZSBsYXJnZXIuIFRoZSBpbXBvcnRhbnQgcG9pbnQgaXMgYGlucWAgKHRoZSBgdGNwX2lucWAgdmFsdWUpIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBpbi1vcmRlciBieXRlcy5cblxuSWYgYGlucWAgaXMgYXQgbGVhc3QgdGhlIHNpemUgb2YgdGhlIFRMUyBoZWFkZXIgKGBUTFNfSEVBREVSX1NJWkVgKSwgd2UgYXJlIHNhZmUgdG8gYmVnaW4gb3VyIHByb2Nlc3NpbmcuIFdlIGtub3cgdGhlIHN1bSBvZiBgc2tiLVx1MDAzZWxlbmAgaXMgYXQgKmxlYXN0KiBlcXVhbCB0byBgaW5xYCwgc28gbm8gbnVsbCBgc2tiYCBpcyBleHBlY3RlZC5cblxuTm93LCB0aGUgb2xkIGNvZGUncyBsb2dpYyBpcyBjb25jZXJuaW5nLiBJZiB0aGUgY2FsY3VsYXRlZCBtZXNzYWdlIHNpemUgYHN6YCAoZGVyaXZlZCBmcm9tIHRoZSBUTFMgaGVhZGVyKSBpcyBsYXJnZXIgdGhhbiBgaW5xYCwgdGhlIGNvZGUgZmFsbHMgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gVGhpcyBmdW5jdGlvbiB1dGlsaXplcyBgdGNwX3JlYWRfc29ja2Agd2hpY2ggaGFuZGxlcyBvdmVybGFwcGluZyBzZWdtZW50cyBwcm9wZXJseS4gVGhlcmVmb3JlLCBpbiB0aGUgKm9sZCogY29kZSwgd2Ugd2VyZSAqbmV2ZXIqIGNhbGxpbmcgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCB3aXRoIGEgc2l6ZSBsYXJnZXIgdGhhbiB3aGF0IHdhcyBhdmFpbGFibGUuXG5cbldoZW4gYGlucSBcdTAwM2U9IHN6YCwgd2UgY2FsbCBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLiBTaW5jZSBgc2tiYCBpcyBuZXZlciBOVUxMIChiZWNhdXNlIHRoZSBwaHlzaWNhbCBieXRlcyBhcmUgYXQgbGVhc3QgdGhlIGxvZ2ljYWwgYnl0ZXMpLCB0aGlzIGNvbmRpdGlvbiBzaG91bGQgd29yay5cblxuSG93ZXZlciwgdGhlIHJlYWwgcHJvYmxlbSBhcmlzZXMgd2hlbiBhbmFseXppbmcgdGhlIHB1cnBvc2Ugb2YgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYC4gSXQgZXhhbWluZXMgdGhlIFRDUCBxdWV1ZS4gVGhlIGtleSBpcyB0aGUgY29uZGl0aW9uIGBUQ1BfU0tCX0NCKHNrYiktXHUwMDNlc2VxICE9IHNlcWAuIElmIHdlIGhhdmUgb3ZlcmxhcHBpbmcgc2VnbWVudHMsIHRoaXMgY29uZGl0aW9uIHdpbGwgYmUgdHJ1ZSwgYXMgVENQIHNlcXVlbmNlIG51bWJlcnMgd2lsbCBub3QgYWxpZ24gYXMgZXhwZWN0ZWQuIFRoaXMgY2hlY2sgaXMgZGVzaWduZWQgdG8gY2F0Y2ggb3ZlcmxhcHBpbmcgc2VnbWVudHMuIElmIG92ZXJsYXBwaW5nIHNlZ21lbnRzIGFyZSBkZXRlY3RlZCwgYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCByZXR1cm5zIGBmYWxzZWAsIGNhdXNpbmcgYSBmYWxsYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCwgd2hpY2ggdXNlcyBgdGNwX3JlYWRfc29ja2AuXG5cblRoZSBjb3JlIGxvZ2ljIG9mIHRoZSBidWcgaXMgdGhhdCB3aXRoIG92ZXJsYXBwaW5nIHNlZ21lbnRzLCBgdGxzX3J4X21zZ19zaXplYCBtaWdodCByZWFkIGdhcmJhZ2UgZGF0YSBmcm9tIG92ZXJsYXBwaW5nIHNlZ21lbnRzIHRvIGRldGVybWluZSBgc3pgLiBUaGlzIGxlYWRzIHRvIGEgc3B1cmlvdXMgY29ubmVjdGlvbiBmYWlsdXJlLCBhcyB0aGUgVExTIGhlYWRlciBtaWdodCBiZSBjb3JydXB0ZWQuXG5cbktBU0FOIGFuZCBLTVNBTiBhcmVuJ3QgbGlrZWx5IHRvIGRldGVjdCBhIGJ1ZyBoZXJlLiBJdCdzIGEgbG9naWMgYnVnIChmdW5jdGlvbmFsKSwgbm90IGEgbWVtb3J5IHNhZmV0eSBpc3N1ZS4gVGhlIGNvZGUgcmVhZHMgaW5pdGlhbGl6ZWQgYnl0ZXMsIGV2ZW4gaWYgdGhlIFwiY29ycmVjdFwiIGJ5dGVzIGFyZSBub3QgcmVhZC4gTm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3MgaXMgb2NjdXJyaW5nLlxuXG5BIGNyaXRpY2FsIHBvaW50OiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGBsZW5gICh0aGUgYW1vdW50IG9mIGRhdGEgd2UgKnRoaW5rKiB3ZSBoYXZlIGF2YWlsYWJsZSkgaW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYCBpcyAqbGVzcyB0aGFuIG9yIGVxdWFsIHRvKiB0aGUgc3VtIG9mIHRoZSBgc2tiLVx1MDAzZWxlbmAgdmFsdWVzLiBXZSBrbm93IHRoaXMgaXMgdHJ1ZSBiZWNhdXNlIHdlIGxpbWl0IHRoZSBgbGVuYCB2YWx1ZSB0byBiZSBubyBtb3JlIHRoYW4gYGlucWAgYnl0ZXMgKHRoZSAqYXZhaWxhYmxlKiBieXRlcykuXG5cbkhvd2V2ZXIsIHdoYXQgaWYgdGhlcmUgYXJlIHplcm8tbGVuZ3RoIHNrYnM/IFdlIGhhdmUgdG8gaGFuZGxlIHRoaXMgaW4gYHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rYC5cblxuV2hhdCBpZiBhbiBgc3pgIGZyb20gYSBtYWxmb3JtZWQgcXVldWUgaXMgbGFyZ2U/IEl0IHNlZW1zIHRoYXQgaW4gdGhpcyBjYXNlIHdlIHJldHVybiB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YC5cblxuU28sIHRoZSBidWcgaXMgYSAqZnVuY3Rpb25hbCogb25lOiBzcHVyaW91cyBjb25uZWN0aW9uIGZhaWx1cmVzIGR1ZSB0byBvdmVybGFwcGluZyBUQ1Agc2VnbWVudHMuIFRoZSBvdmVybGFwcGluZyBzZWdtZW50cyBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IGJ5IHRoZSBUTFMgY29kZSAqYmVmb3JlKiBpdCB0cmllcyB0byBwYXJzZSB0aGUgVExTIGhlYWRlciBhbmQgY2FsY3VsYXRlIHRoZSBUTFMgbWVzc2FnZSBzaXplLiBUaGUgZml4IGlzIHRvIHVzZSBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgICpiZWZvcmUqIHBhcnNpbmcgdGhlIGhlYWRlci4gVGhpcyB3aWxsIGNhdXNlIHVzIHRvIGZhbGwgYmFjayB0byBgdGxzX3N0cnBfcmVhZF9jb3B5YCB0byByZWNvdmVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjMxNCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxNzcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMjoyMC45OTk0OTMyNzVaIiwiU2VxIjo1MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY4MzY1NDQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRsc19zdHJwX2NoZWNrX3F1ZXVlX29rXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC90bHMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC90bHMvdGxzX3N0cnAuYz0zOTA9c3RhdGljIGludCB0bHNfc3RycF9yZWFkX2NvcHkoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIGJvb2wgcXNob3J0KVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTQzMi1cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NDMzOnN0YXRpYyBib29sIHRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwLFxcbm5ldC90bHMvdGxzX3N0cnAuYy00MzQtXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGludCBsZW4pXFxuLS1cXG5uZXQvdGxzL3Rsc19zdHJwLmM9NTEyPXN0YXRpYyBpbnQgdGxzX3N0cnBfcmVhZF9zb2NrKHN0cnVjdCB0bHNfc3RycGFyc2VyICpzdHJwKVxcbi0tXFxubmV0L3Rscy90bHNfc3RycC5jLTUzMC1cXG5uZXQvdGxzL3Rsc19zdHJwLmM6NTMxOlxcdFxcdGlmICghdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soc3RycCwgc3RycC1cXHUwMDNlc3RtLm9mZnNldCArIFRMU19IRUFERVJfU0laRSkpXFxubmV0L3Rscy90bHNfc3RycC5jLTUzMi1cXHRcXHRcXHRyZXR1cm4gdGxzX3N0cnBfcmVhZF9jb3B5KHN0cnAsIGZhbHNlKTtcXG4tLVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NDMtXFxubmV0L3Rscy90bHNfc3RycC5jOjU0NDpcXHRpZiAoIXRsc19zdHJwX2NoZWNrX3F1ZXVlX29rKHN0cnAsIHN0cnAtXFx1MDAzZXN0bS5vZmZzZXQgKyBzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pKVxcbm5ldC90bHMvdGxzX3N0cnAuYy01NDUtXFx0XFx0cmV0dXJuIHRsc19zdHJwX3JlYWRfY29weShzdHJwLCBmYWxzZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMyOjIxLjA2Nzg2NDg4M1oiLCJTZXEiOjUxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTMxODA5MzM0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgVExTIFN0YWxsL0ZhaWx1cmUgQnVnKipcblxuT2theSwgc28gSSBjYW4ndCBkaXJlY3RseSBgZ3JlcHBlcmAgZm9yIHRoZSBjb21taXQgbWVzc2FnZSByZWxhdGVkIHRvIHRoaXMgaXNzdWUsIGFzIHRoYXQgdG9vbCB3b24ndCBkZWx2ZSBpbnRvIHRoZSBnaXQgbG9nLiBCdXQsIEkgY2FuIHdvcmsgaXQgb3V0IGJ5IGluZmVyZW5jZS4gSXQgbG9va3MgbGlrZSB0aGUgaXNzdWUgaXMgbGlrZWx5IHJvb3RlZCBpbiBob3cgYHRsc19yeF9tc2dfc2l6ZWAgaGFuZGxlcyBwb3RlbnRpYWxseSBvdmVybGFwcGluZyBTS0JzIG9uIGEgcXVldWUuXG5cbkhlcmUncyB0aGUgY2hhaW4gb2YgZXZlbnRzOiBJZiBgdGxzX3J4X21zZ19zaXplYCBpcyBjYWxsZWQgb24gYSBxdWV1ZSB3aXRoIG92ZXJsYXBwaW5nIFNLQnMsIGl0IG1pZ2h0IGVuZCB1cCByZWFkaW5nIGEgY29ycnVwdGVkIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNvdWxkIGNhdXNlIGl0IHRvIHJldHVybiBhbiBgLUVJTlZBTGAgZXJyb3IsIHBlcmhhcHMgaW5kaWNhdGluZyBhIGJhZCB2ZXJzaW9uIG9yIHNvbWUgb3RoZXIgY29ycnVwdGlvbi4gV2hlbiBgdGxzX3J4X21zZ19zaXplYCByZXR1cm5zIGAtRUlOVkFMYCwgYHRsc19zdHJwX3JlYWRfc29ja2AgaW4gdHVybiBhbHNvIHJldHVybnMgYC1FSU5WQUxgLiBUaGVuIGB0bHNfc3RycF9jaGVja19yY3ZgIGxvZ2ljIGlzOlxuXG5gYGBjXG5cdGlmICh0bHNfc3RycF9yZWFkX3NvY2soc3RycCkgPT0gLUVOT01FTSlcblx0XHRxdWV1ZV93b3JrKHRsc19zdHJwX3dxLCBcdTAwMjZzdHJwLVx1MDAzZXdvcmspO1xuYGBgXG5cblRodXMsIHRoZSBgLUVJTlZBTGAgKGZyb20gYHRsc19zdHJwX3JlYWRfc29ja2ApIGlzIGlnbm9yZWQsIGJ1dCBgc3RycC1cdTAwM2Vtc2dfcmVhZHlgIGlzIG5vdCBzZXQsIGxlYWRpbmcgdG8gZWl0aGVyIGEgY29ubmVjdGlvbiBzdGFsbCBvciBvdXRyaWdodCBmYWlsdXJlLiBUaGlzIGlzIGRlZmluaXRlbHkgYSBmdW5jdGlvbmFsIGJ1Zy5cblxuTm93LCBJIG5lZWQgdG8gY2hlY2sgc29tZXRoaW5nIGltcG9ydGFudDogSXMgaXQgcG9zc2libGUgdGhhdCBgdGxzX3J4X21zZ19zaXplYCBjb3VsZCBiZSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBMZXQncyB0cmFjZSBpdCB0aHJvdWdoOlxuXG5gYGBjXG5cdGNoYXIgaGVhZGVyW1RMU19IRUFERVJfU0laRSArIFRMU19NQVhfSVZfU0laRV07XG5cdC4uLlxuXHRyZXQgPSBza2JfY29weV9iaXRzKHNrYiwgc3RycC1cdTAwM2VzdG0ub2Zmc2V0LCBoZWFkZXIsIHByb3QtXHUwMDNlcHJlcGVuZF9zaXplKTtcblx0aWYgKHJldCBcdTAwM2MgMClcblx0XHRnb3RvIHJlYWRfZmFpbHVyZTtcbmBgYFxuXG5gc2tiX2NvcHlfYml0c2AgY29waWVzIGBwcm90LVx1MDAzZXByZXBlbmRfc2l6ZWAgYnl0ZXMgaW50byBgaGVhZGVyYC4gYHByb3QtXHUwMDNlcHJlcGVuZF9zaXplYCBpcyBzZXQgdG8gYFRMU19IRUFERVJfU0laRWAsIHdoaWNoIGlzIDUuIFNvLCBpdCdzIGNvcHlpbmcgNSBieXRlcyBpbnRvIGBoZWFkZXJgLiBOb3cgd2UgYWNjZXNzIGBoZWFkZXJbMF1gIHRocm91Z2ggYGhlYWRlcls0XWAuIFRob3NlIDUgYnl0ZXMgKmFyZSogaW5pdGlhbGl6ZWQgYnkgYHNrYl9jb3B5X2JpdHNgLiBUaGUgcmVzdCBvZiBgaGVhZGVyYCBpcyB1bmluaXRpYWxpemVkLCBidXTigKYgV2FpdCBhIHNlYywgZG9lcyB0aGUgcmVzdCBvZiBgaGVhZGVyYCAqZXZlciogZ2V0IGFjY2Vzc2VkPyBObywgYHRsc19yeF9tc2dfc2l6ZWAgb25seSB1c2VzIHRob3NlIGZpcnN0IDUgYnl0ZXMuIFNvLCBubywgdGhpcyBpcyBub3QgYSBzb3VyY2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuXG5cbklzIHRoaXMgYGhlYWRlcmAgdmFyaWFibGUgdXNlZCBhbnl3aGVyZSBlbHNlPyBObywgaXQncyBsb2NhbCB0byBgdGxzX3J4X21zZ19zaXplYC5cblxuQnV0LCB3aGF0IGlmIGBwcm90LVx1MDAzZXByZXBlbmRfc2l6ZWAgd2FzIGxhcmdlciB0aGFuIDU/IE5vcGUsIGl0J3MgYWx3YXlzIHNldCB0byA1IGZvciBib3RoIFRMUyAxLjIgYW5kIDEuMywgYW5kIGl0J3Mgc2V0IGluIGB0bHNfc2V0X3N3X29mZmxvYWRgLiBBbHdheXMgYFRMU19IRUFERVJfU0laRWAuIFRoYXQncyBzZXR0bGVkLlxuXG5Ob3csIGxldCdzIHR1cm4gdG8gYHRsc19zdHJwX3JlYWRfY29weWA6IENvdWxkIGl0IGJlIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnk/XG5cbmBgYGNcblx0Zm9yIChsZW4gPSBuZWVkX3NwYzsgbGVuIFx1MDAzZSAwOyBsZW4gLT0gUEFHRV9TSVpFKSB7XG5cdFx0cGFnZSA9IGFsbG9jX3BhZ2Uoc3RycC1cdTAwM2Vzay1cdTAwM2Vza19hbGxvY2F0aW9uKTtcblx0XHRpZiAoIXBhZ2UpIHtcblx0XHRcdHRsc19zdHJwX2ZsdXNoX2FuY2hvcl9jb3B5KHN0cnApO1xuXHRcdFx0cmV0dXJuIC1FTk9NRU07XG5cdFx0fVxuXG5cdFx0c2tiX2ZpbGxfcGFnZV9kZXNjKHN0cnAtXHUwMDNlYW5jaG9yLCBzaGluZm8tXHUwMDNlbnJfZnJhZ3MrKyxcblx0XHRcdFx0ICAgcGFnZSwgMCwgMCk7XG5cdH1cbmBgYFxuXG5JdCBhbGxvY2F0ZXMgcGFnZXMgd2l0aCBgYWxsb2NfcGFnZWAuICpUaG9zZSogcGFnZXMgYXJlIE5PVCB6ZXJvZWQhIFRoZW4gYHRsc19zdHJwX3JlYWRfY29weWluKHN0cnApYCBpcyBjYWxsZWQuIGB0bHNfc3RycF9yZWFkX2NvcHlpbmAgdXNlcyBgdGNwX3JlYWRfc29ja2AgdG8gY29weSBkYXRhIGZyb20gdGhlIFRDUCByZWNlaXZlIHF1ZXVlIGludG8gdGhlc2UgcGFnZXMuXG5cbmBgYGNcblx0c3RhdGljIGludCB0bHNfc3RycF9jb3B5aW4ocmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBza19idWZmICppbl9za2IsXG5cdFx0XHRcdCAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBpbl9sZW4pXG5cdHtcblx0XHQuLi5cblx0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfVExTX0RFVklDRSkgXHUwMDI2XHUwMDI2IHN0cnAtXHUwMDNlbWl4ZWRfZGVjcnlwdGVkKVxuXHRcdFx0cmV0ID0gdGxzX3N0cnBfY29weWluX3NrYihzdHJwLCBza2IsIGluX3NrYiwgb2Zmc2V0LCBpbl9sZW4pO1xuXHRcdGVsc2Vcblx0XHRcdHJldCA9IHRsc19zdHJwX2NvcHlpbl9mcmFnKHN0cnAsIHNrYiwgaW5fc2tiLCBvZmZzZXQsIGluX2xlbik7XG5gYGBcblxuYHRsc19zdHJwX2NvcHlpbl9mcmFnYCB0aGVuIGNvcGllcyBkYXRhIGZyb20gYGluX1xuXG4iLCJJbnB1dFRva2VucyI6MzA3MTgsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMyOjM2LjM4NTk2MTI1NVoiLCJTZXEiOjUyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NjcyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdGxzL3Rsc19zdHJwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjEwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjEwOlxcdHN0YXRpYyBpbnQgdGxzX3N0cnBfY29weWluX2ZyYWcoc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IsXFxuIDIxMTpcXHRcXHRcXHRcXHRcXHRzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LFxcbiAyMTI6XFx0XFx0XFx0XFx0XFx0c2l6ZV90IGluX2xlbilcXG4gMjEzOlxcdHtcXG4gMjE0OlxcdFxcdHVuc2lnbmVkIGludCBuZnJhZyA9IHNrYi1cXHUwMDNlbGVuIC8gUEFHRV9TSVpFO1xcbiAyMTU6XFx0XFx0c2l6ZV90IGxlbiwgY2h1bms7XFxuIDIxNjpcXHRcXHRza2JfZnJhZ190ICpmcmFnO1xcbiAyMTc6XFx0XFx0aW50IHN6O1xcbiAyMTg6XFx0XFxuIDIxOTpcXHRcXHRpZiAodW5saWtlbHkobmZyYWcgXFx1MDAzZT0gc2tiX3NoaW5mbyhza2IpLVxcdTAwM2Vucl9mcmFncykpIHtcXG4gMjIwOlxcdFxcdFxcdERFQlVHX05FVF9XQVJOX09OX09OQ0UoMSk7XFxuIDIyMTpcXHRcXHRcXHRyZXR1cm4gLUVNU0dTSVpFO1xcbiAyMjI6XFx0XFx0fVxcbiAyMjM6XFx0XFxuIDIyNDpcXHRcXHRmcmFnID0gXFx1MDAyNnNrYl9zaGluZm8oc2tiKS1cXHUwMDNlZnJhZ3NbbmZyYWddO1xcbiAyMjU6XFx0XFxuIDIyNjpcXHRcXHRsZW4gPSBpbl9sZW47XFxuIDIyNzpcXHRcXHQvKiBGaXJzdCBtYWtlIHN1cmUgd2UgZ290IHRoZSBoZWFkZXIgKi9cXG4gMjI4OlxcdFxcdGlmICghc3RycC1cXHUwMDNlc3RtLmZ1bGxfbGVuKSB7XFxuIDIyOTpcXHRcXHRcXHQvKiBBc3N1bWUgb25lIHBhZ2UgaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgaGVhZGVycyAqL1xcbiAyMzA6XFx0XFx0XFx0Y2h1bmsgPVxcdG1pbl90KHNpemVfdCwgbGVuLCBQQUdFX1NJWkUgLSBza2JfZnJhZ19zaXplKGZyYWcpKTtcXG4gMjMxOlxcdFxcdFxcdFdBUk5fT05fT05DRShza2JfY29weV9iaXRzKGluX3NrYiwgb2Zmc2V0LFxcbiAyMzI6XFx0XFx0XFx0XFx0XFx0XFx0ICAgc2tiX2ZyYWdfYWRkcmVzcyhmcmFnKSArXFxuIDIzMzpcXHRcXHRcXHRcXHRcXHRcXHQgICBza2JfZnJhZ19zaXplKGZyYWcpLFxcbiAyMzQ6XFx0XFx0XFx0XFx0XFx0XFx0ICAgY2h1bmspKTtcXG4gMjM1OlxcdFxcbiAyMzY6XFx0XFx0XFx0c2tiLVxcdTAwM2VsZW4gKz0gY2h1bms7XFxuIDIzNzpcXHRcXHRcXHRza2ItXFx1MDAzZWRhdGFfbGVuICs9IGNodW5rO1xcbiAyMzg6XFx0XFx0XFx0c2tiX2ZyYWdfc2l6ZV9hZGQoZnJhZywgY2h1bmspO1xcbiAyMzk6XFx0XFxuIDI0MDpcXHRcXHRcXHRzeiA9IHRsc19yeF9tc2dfc2l6ZShzdHJwLCBza2IpO1xcbiAyNDE6XFx0XFx0XFx0aWYgKHN6IFxcdTAwM2MgMClcXG4gMjQyOlxcdFxcdFxcdFxcdHJldHVybiBzejtcXG4gMjQzOlxcdFxcbiAyNDQ6XFx0XFx0XFx0LyogV2UgbWF5IGhhdmUgb3Zlci1yZWFkLCBzeiA9PSAwIGlzIGd1YXJhbnRlZWQgdW5kZXItcmVhZCAqL1xcbiAyNDU6XFx0XFx0XFx0aWYgKHVubGlrZWx5KHN6IFxcdTAwMjZcXHUwMDI2IHN6IFxcdTAwM2Mgc2tiLVxcdTAwM2VsZW4pKSB7XFxuIDI0NjpcXHRcXHRcXHRcXHRpbnQgb3ZlciA9IHNrYi1cXHUwMDNlbGVuIC0gc3o7XFxuIDI0NzpcXHRcXG4gMjQ4OlxcdFxcdFxcdFxcdFdBUk5fT05fT05DRShvdmVyIFxcdTAwM2UgY2h1bmspO1xcbiAyNDk6XFx0XFx0XFx0XFx0c2tiLVxcdTAwM2VsZW4gLT0gb3ZlcjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzI6MzYuMzg2MDQ5MTM1WiIsIlNlcSI6NTMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjk0ODEzNzM2NDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBUTFMgRnJhZ21lbnQgQ29weWluZyBQcm9jZXNzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYHRsc19zdHJwX2NvcHlpbl9mcmFnYCwgYW5kIGl0J3MgdXNpbmcgYHNrYl9jb3B5X2JpdHNgIHRvIGNvcHkgZGlyZWN0bHkgaW50byB0aGUgcGFnZS4gVGhhdCdzIGEgZGlyZWN0IGNvcHksIGFscmlnaHQhIEl0IGNvcGllcyBgY2h1bmtgIGJ5dGVzIGZyb20gYGluX3NrYmAgaW50byB0aGUgcGFnZSwgc3BlY2lmaWNhbGx5IHVzaW5nIGBza2JfZnJhZ19hZGRyZXNzKGZyYWcpICsgc2tiX2ZyYWdfc2l6ZShmcmFnKWAgYXMgdGhlIGRlc3RpbmF0aW9uLiBUaGVuLCB0aGUgY29kZSBjYWxscyBgdGxzX3J4X21zZ19zaXplYC5cblxuTm93LCBgdGxzX3J4X21zZ19zaXplYCBpcyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBJIHJlbWVtYmVyIHRoYXQgZnVuY3Rpb24gcmVhZHMgdGhlIGhlYWRlciBmcm9tIHRoZSBgc2tiYCB1c2luZyBgc2tiX2NvcHlfYml0c2AsIHNwZWNpZmljYWxseSBmcm9tIHRoZSBgc3RycC1cdTAwM2VhbmNob3JgIFNLQiwgYW5kIHN0YXJ0aW5nIGF0IGBzdHJwLVx1MDAzZXN0bS5vZmZzZXRgIHdoaWNoLCBsb29raW5nIGJhY2ssIGlzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gYHRsc19zdHJwX3JlYWRfY29weWAuIFRoaXMgbWVhbnMgaXQgd2lsbCByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZS4gQW5kIHNpbmNlIGBza2JgIGlzIHRoZSBgc3RycC1cdTAwM2VhbmNob3JgLCBhbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZSB3YXMganVzdCBwb3B1bGF0ZWQgYnkgYHNrYl9jb3B5X2JpdHNgIGZyb20gYGluX3NrYmAsIHRoaXMgbWVhbnMgdGhlIGRhdGEgaXMgaW5pdGlhbGl6ZWQuIEkgc2VlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWQgaGVyZS5cblxuQnV0IHdhaXQsIHdoYXQgaWYgYGNodW5rYCBpcyAqc21hbGxlciogdGhhbiBgVExTX0hFQURFUl9TSVpFYD8gQWgsIEkgc2VlLiBJZiBgY2h1bmtgIGlzIGxlc3MgdGhhbiBgVExTX0hFQURFUl9TSVpFYCwgYHRsc19yeF9tc2dfc2l6ZWAgd291bGQgZW5jb3VudGVyIGEgc2l0dWF0aW9uIHdoZXJlIGl0IHRyaWVzIHRvIHJlYWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGBza2JgJ3MgZGF0YSwgYXMgYHNrYi1cdTAwM2VsZW5gIHdvdWxkIGJlIGVxdWFsIHRvIGBjaHVua2AuIFRoaXMgcmVzdWx0cyBpbiBgdGxzX3J4X21zZ19zaXplYCByZXR1cm5pbmcgemVyby4gSXQgd2lsbCBjb3JyZWN0bHkgbm90IHJlYWQgdGhlIGhlYWRlciwgYW5kIGB0bHNfc3RycF9jb3B5aW5fZnJhZ2AgcmV0dXJucyB0aGUgY29waWVkIGRhdGEgc2l6ZS4gVGhlIGNhbGxlciB0aGVuIGNhbGxzIGB0bHNfc3RycF9jb3B5aW5gIGFnYWluIHdpdGggbW9yZSBkYXRhIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBwYWdlLCB1bnRpbCB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIGZvcm0gYSBUTFMgaGVhZGVyLiBPbmNlIHRoZSBTS0IgaGFzIGF0IGxlYXN0IGBUTFNfSEVBREVSX1NJWkVgIGJ5dGVzLCBgdGxzX3J4X21zZ19zaXplYCB3aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgaGVhZGVyLiBTbyBzdGlsbCwgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZCwgaXQgaXMgaGFuZGxlZCBjb3JyZWN0bHkuXG5cbkFuZCwgd2hhdCBhYm91dCBgc2tiX2NvcHlfYml0c2AgZmFpbGluZz8gSXQgaGFzIGEgYFdBUk5fT05fT05DRWAsIGJ1dCBpdCBzaG91bGRuJ3QgZmFpbCBiZWNhdXNlIGBpbl9za2JgIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhdCBsZWFzdCBgY2h1bmtgIGJ5dGVzIHN0YXJ0aW5nIGF0IGBvZmZzZXRgLiBJdCBzaG91bGQgc3VjY2VlZCwgc28gbm8gaXNzdWUgdGhlcmUuXG5cbk92ZXJhbGwsIGNvbnNpZGVyaW5nIGFsbCB0aGUgY2FzZXMsIEkgYW0gbm90IHNlZWluZyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZC4gVGhlIGNvcHkgcHJvY2VzcyBoYW5kbGVzIGNhc2VzIHdpdGggc21hbGxlciBjaHVua3MgY29ycmVjdGx5LCBhbmQgYHNrYl9jb3B5X2JpdHNgIHNob3VsZCBhbHdheXMgc3VjY2VlZC4gVGhpcyBsb29rcyBzb3VuZC4gSSB3aWxsIG1vdmUgb24gdG8gY2hlY2tpbmcgYHRsc19zdHJwX2NvcHlpbl9za2JgIG5vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzM3NjIsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0wN1QyMDozMjo0NS44Njc0MjU5MTlaIiwiU2VxIjo1NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTg3MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3Rscy90bHNfc3RycC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI4NixcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDI4NjpcXHRzdGF0aWMgaW50IHRsc19zdHJwX2NvcHlpbl9za2Ioc3RydWN0IHRsc19zdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IsXFxuIDI4NzpcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgdW5zaWduZWQgaW50IG9mZnNldCxcXG4gMjg4OlxcdFxcdFxcdFxcdCAgICAgICBzaXplX3QgaW5fbGVuKVxcbiAyODk6XFx0e1xcbiAyOTA6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKm5za2IsICpmaXJzdCwgKmxhc3Q7XFxuIDI5MTpcXHRcXHRzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87XFxuIDI5MjpcXHRcXHRzaXplX3QgY2h1bms7XFxuIDI5MzpcXHRcXHRpbnQgc3o7XFxuIDI5NDpcXHRcXG4gMjk1OlxcdFxcdGlmIChzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pXFxuIDI5NjpcXHRcXHRcXHRjaHVuayA9IHN0cnAtXFx1MDAzZXN0bS5mdWxsX2xlbiAtIHNrYi1cXHUwMDNlbGVuO1xcbiAyOTc6XFx0XFx0ZWxzZVxcbiAyOTg6XFx0XFx0XFx0Y2h1bmsgPSBUTFNfTUFYX1BBWUxPQURfU0laRSArIFBBR0VfU0laRTtcXG4gMjk5OlxcdFxcdGNodW5rID0gbWluKGNodW5rLCBpbl9sZW4pO1xcbiAzMDA6XFx0XFxuIDMwMTpcXHRcXHRuc2tiID0gdGxzX3N0cnBfc2tiX2NvcHkoc3RycCwgaW5fc2tiLCBvZmZzZXQsIGNodW5rKTtcXG4gMzAyOlxcdFxcdGlmICghbnNrYilcXG4gMzAzOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAzMDQ6XFx0XFxuIDMwNTpcXHRcXHRzaGluZm8gPSBza2Jfc2hpbmZvKHNrYik7XFxuIDMwNjpcXHRcXHRpZiAoIXNoaW5mby1cXHUwMDNlZnJhZ19saXN0KSB7XFxuIDMwNzpcXHRcXHRcXHRzaGluZm8tXFx1MDAzZWZyYWdfbGlzdCA9IG5za2I7XFxuIDMwODpcXHRcXHRcXHRuc2tiLVxcdTAwM2VwcmV2ID0gbnNrYjtcXG4gMzA5OlxcdFxcdH0gZWxzZSB7XFxuIDMxMDpcXHRcXHRcXHRmaXJzdCA9IHNoaW5mby1cXHUwMDNlZnJhZ19saXN0O1xcbiAzMTE6XFx0XFx0XFx0bGFzdCA9IGZpcnN0LVxcdTAwM2VwcmV2O1xcbiAzMTI6XFx0XFx0XFx0bGFzdC1cXHUwMDNlbmV4dCA9IG5za2I7XFxuIDMxMzpcXHRcXHRcXHRmaXJzdC1cXHUwMDNlcHJldiA9IG5za2I7XFxuIDMxNDpcXHRcXHR9XFxuIDMxNTpcXHRcXG4gMzE2OlxcdFxcdHNrYi1cXHUwMDNlbGVuICs9IGNodW5rO1xcbiAzMTc6XFx0XFx0c2tiLVxcdTAwM2VkYXRhX2xlbiArPSBjaHVuaztcXG4gMzE4OlxcdFxcbiAzMTk6XFx0XFx0aWYgKCFzdHJwLVxcdTAwM2VzdG0uZnVsbF9sZW4pIHtcXG4gMzIwOlxcdFxcdFxcdHN6ID0gdGxzX3J4X21zZ19zaXplKHN0cnAsIHNrYik7XFxuIDMyMTpcXHRcXHRcXHRpZiAoc3ogXFx1MDAzYyAwKVxcbiAzMjI6XFx0XFx0XFx0XFx0cmV0dXJuIHN6O1xcbiAzMjM6XFx0XFxuIDMyNDpcXHRcXHRcXHQvKiBXZSBtYXkgaGF2ZSBvdmVyLXJlYWQsIHN6ID09IDAgaXMgZ3VhcmFudGVlZCB1bmRlci1yZWFkICovXFxuIDMyNTpcXHRcXHRcXHRpZiAodW5saWtlbHkoc3ogXFx1MDAyNlxcdTAwMjYgc3ogXFx1MDAzYyBza2ItXFx1MDAzZWxlbikpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDdUMjA6MzI6NDUuODY3NTI1ODE5WiIsIlNlcSI6NTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE3MTMyMzQ1MzIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIHRoZSBUTFMgUmVjZWl2ZSBRdWV1ZSBMb2dpYyBCdWcgRml4KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIHBhdGNoIGlzIGFkZHJlc3NpbmcgYSBmdW5jdGlvbmFsIGJ1Zywgbm90IGEgbWVtb3J5IHNhZmV0eSBpc3N1ZS4gVGhlIGNvcmUgb2YgdGhlIHByb2JsZW0gbGllcyBpbiBob3cgdGhlIFRMUyBzdGFjayBoYW5kbGVzIG92ZXJsYXBwaW5nIFRDUCBzZWdtZW50cyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gIGB0bHNfc3RycF9jb3B5aW5fc2tiYCB1c2VzIGB0bHNfc3RycF9za2JfY29weWAgd2hpY2ggYWxsb2NhdGVzIGFuZCBjb3BpZXMgZGF0YSBpbnRvIGEgbmV3IFNLQiwgYXBwZW5kcyBpdCB0byBgZnJhZ19saXN0YCwgYW5kIHRoZW4gY2FsbHMgYHRsc19yeF9tc2dfc2l6ZWAuICBUaGUgcHJvYmxlbSBpcyBgc2tiX2NvcHlfYml0c2AgaXRlcmF0aW5nIG92ZXIgdGhpcyBgZnJhZ19saXN0YCBjb250YWluaW5nIHBvdGVudGlhbGx5IG92ZXJsYXBwaW5nIFNLQnMuIFRoaXMgb3ZlcmxhcCBsZWFkcyB0byBgdGxzX3J4X21zZ19zaXplYCByZWFkaW5nIGEgY29ycnVwdGVkIFRMUyBoZWFkZXIsIGJlY2F1c2UgYHNrYl9jb3B5X2JpdHNgIGJsaW5kbHkgY29waWVzIGJpdHMgZnJvbSB0aG9zZSBvdmVybGFwcGluZyBTS0JzLCB0aHVzIHJlc3VsdGluZyBpbiBhbiBlcnJvciBhbmQgYW4gYWJvcnRlZCBjb25uZWN0aW9uLlxuXG5UaGUgcGF0Y2ggaW50cm9kdWNlcyBhIGNoZWNrIHVzaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9va2AgKmJlZm9yZSogY2FsbGluZyBgdGxzX3J4X21zZ19zaXplYC4gVGhpcyBpcyBrZXkuIElmIHRoZSBxdWV1ZSBpcyBkZWVtZWQgXCJPS1wiIChubyBvdmVybGFwcywgY29uc2lzdGVudCBkZWNyeXB0ZWQgc3RhdHVzKSwgdGhlIGV4aXN0aW5nIGxvZ2ljIHByb2NlZWRzLiBJZiB0aGUgcXVldWUgaXMgKm5vdCogT0ssIHRoZSBjb2RlIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weWAgd2hpY2ggbGV2ZXJhZ2VzIGB0Y3BfcmVhZF9zb2NrYCB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBvdmVybGFwcGluZyBzZWdtZW50cy4gIGB0Y3BfcmVhZF9zb2NrYCBpcyBkZXNpZ25lZCB0byBjb3JyZWN0bHkgbWFuYWdlIHRoZXNlIHNjZW5hcmlvcyBhbmQgcmVhZCB0aGUgYXBwcm9wcmlhdGUgZGF0YS5cblxuTm93LCBsZXQncyBhZGRyZXNzIHRoZSBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zOlxuXG4qICAgKipVbmluaXRpYWxpemVkIG1lbW9yeSByZWFkcz8qKiAgTm8uIFRoZSBkYXRhIGNvcGllZCBieSBgc2tiX2NvcHlfYml0c2AgKmlzKiBpbml0aWFsaXplZCwgYWxiZWl0IGluY29ycmVjdGx5IGR1ZSB0byB0aGUgb3ZlcmxhcC4gVGhlIGNvZGUgaXRzZWxmIGlzbid0IGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHVuaW5pdGlhbGl6ZWQgcmVnaW9ucyBvZiBtZW1vcnkuXG4qICAgKipPdXQtb2YtYm91bmRzIHJlYWRzPyoqIE5vLiBBZ2FpbiwgdGhlIHByb2JsZW0gaXMgd2l0aCB0aGUgZGF0YSBiZWluZyByZWFkLCBub3QgdGhlIGF0dGVtcHQgdG8gcmVhZCBpdCBvdXQgb2YgYm91bmRzLiBUaGUgYnVmZmVycyBpbnZvbHZlZCBhcmUgcHJvcGVybHkgYWxsb2NhdGVkLlxuKiAgICoqTWVtb3J5IHNhZmV0eSBpc3N1ZXMgaW4gZ2VuZXJhbD8qKiBOby4gVGhlIGNvcmUgb2YgdGhlIGlzc3VlIGlzIGEgbG9naWNhbCBmbGF3IGluIGhvdyB0aGUgVExTIGxheWVyIGhhbmRsZXMgb3ZlcmxhcHBpbmcgc2VnbWVudHMsIG5vdCBhIG1lbW9yeSBjb3JydXB0aW9uIHZ1bG5lcmFiaWxpdHkuXG4qICAgKipLTVNBTi9LQVNBTj8qKiBOZWl0aGVyIHdvdWxkIGRldGVjdCBhbnl0aGluZyBoZXJlLCBwcmVjaXNlbHkgYmVjYXVzZSB0aGUgY29kZSBpcyBub3QgZG9pbmcgYW55dGhpbmcgdGhhdCB3b3VsZCB0cmlnZ2VyIHRob3NlIHNhbml0aXplcnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGJ1Zy5cblxuVGhlbiBJIGNvbnNpZGVyZWQgdGhlIGNhc2Ugd2hlcmUgYHRsc19yeF9tc2dfc2l6ZWAgY29tcHV0ZWQgYSBodWdlIGBzemAsIGxlYWRpbmcgdG8gbGFyZ2UgbWVtb3J5IGFsbG9jYXRpb25zLiAgRXZlbiBpZiBgdGxzX3J4X21zZ19zaXplYCByZWFkcyBhIGNvcnJ1cHRlZCBoZWFkZXIgYW5kIHJldHVybnMgYSBodWdlIGBzemAsIHRoZSByZXN1bHRpbmcgYWxsb2NhdGlvbiB2aWEgYHRsc19zdHJwX3JlYWRfY29weWAgaXMgYm91bmRlZCBieSBgVExTX01BWF9QQVlMT0FEX1NJWkUgKyBjaXBoZXJfb3ZlcmhlYWQgKyBwcm90LVx1MDAzZXRhaWxfc2l6ZWAuIFRoYXQncyBhcm91bmQgMTZLQiB3aGljaCBpcyBub3QgdW51c3VhbCwgaXQncyBqdXN0IGEgZmV3IHBhZ2VzLCBzbyBub3QgYSBtZW1vcnkgZXhoYXVzdGlvbiBwcm9ibGVtIGVpdGhlci5cblxuSWYgYHN6YCBpcyBzbWFsbCBhbmQgdGhlIGNoZWNrIGRldGVjdHMgdGhlIG92ZXJsYXAsIGl0IHRoZW4gZmFsbHMgYmFjayB0byB0aGUgYHRsc19zdHJwX3JlYWRfY29weWAgYW5kIHNvIGFnYWluIG5vIGNyYXNoLlxuXG5UaGVyZWZvcmUsIHRoZSBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBhbnkgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgYXQgYWxsOyBpdCdzIHB1cmVseSBhIGZ1bmN0aW9uYWwgYnVnIGZpeC5cblxuVGhlcmVmb3JlLCBJJ20gY29uZmlkZW50IGluIGNvbmNsdWRpbmcgdGhhdCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIGBmYWxzZWAuXG5cbkxldCBtZSByZWl0ZXJhdGUgbXkgcmVhc29uaW5nOiBUaGUgcGF0Y2ggYWRkcyBhIGNoZWNrIChgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgKSBiZWZvcmUgY2FsbGluZyB0aGUgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMgYHRsc19yeF9tc2dfc2l6ZWAuICBUaGlzIGNoZWNrIGRldGVjdHMgdGhlIG92ZXJsYXBwaW5nIHNlZ21lbnRzLiBJZiB0aGUgcXVldWUgaXMgYmFkLCBpdCBmYWxscyBiYWNrIHRvIGEgc2FmZXIgcGF0aCB1c2luZyBgdGxzX3N0cnBfcmVhZF9jb3B5YC4gVGhlcmUgYXJlIG5vIG1lbW9yeSBzYWZldHkgaXNzdWVzLiAgVGhlIGRhdGEgcmVhZCBpcyBpbml0aWFsaXplZCBhbmQgdGhlcmUgYXJlIG5vIG91dCBvZiBib3VuZHMgcmVhZHMuIFRoaXMgaXMgYSBsb2dpYyBmbGF3IG5vdCBhIG1lbW9yeSBjb3JydXB0aW9uIGlzc3VlLCBhbmQgc28gbmVpdGhlciBLTVNBTiBub3IgS0FTQU4gc2hvdWxkIGJlIGVuYWJsZWQuXG5cbioqRmluYWwgRG91YmxlLUNoZWNrKipcblxuTGV0J3MgcXVpY2tseSBjaGVjayBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2tgLlxuXG5UaGUgbG9vcCBpdGVyYXRlcyB0aHJvdWdoIGBza2JgcywgYW5kIGBUQ1BfU0tCX0NCKHNrYilgIGFjY2Vzc2VzIGBza2ItXHUwMDNlY2JgLiBgc2tiLVx1MDAzZWNiYCBpcyBpbml0aWFsaXplZCB3aGVuIHRoZSBgc2tiYCBpcyByZWNlaXZlZCBieSBUQ1AsIHNvIG5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMuXG5cbkFsc28gYHNrYl9jbXBfZGVjcnlwdGVkYCBhY2Nlc3NlcyBgc2tiLVx1MDAzZWRlY3J5cHRlZGAuIGBkZWNyeXB0ZWRgIGlzIGEgYml0ZmllbGQgaW4gYHNrYmAgdGhhdCdzIGluaXRpYWxpemVkLlxuXG5TbyBhZ2FpbiwgZXZlcnl0aGluZyBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4gSSdtIHZlcnkgY29uZmlkZW50IGluIHRoaXMgYXNzZXNzbWVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzU1ODUsIk91dHB1dFRva2VucyI6Mjk2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTExOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA3VDIwOjMzOjAyLjk5OTg3NDMyWiIsIlNlcSI6NTYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjkzNzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBmaXhlcyBhIGxvZ2ljIGJ1ZyBpbiB0aGUgVExTIHN0cnBhcnNlciB3aGVyZSBgdGxzX3J4X21zZ19zaXplKClgIGNvdWxkIGJlIGNhbGxlZCBvbiBhIFRDUCByZWNlaXZlIHF1ZXVlIGNvbnRhaW5pbmcgb3ZlcmxhcHBpbmcgc2VnbWVudHMgKGUuZy4sIGR1ZSB0byByZXRyYW5zbWlzc2lvbnMpLiBXaGVuIHRoaXMgaGFwcGVucywgYHNrYl9jb3B5X2JpdHMoKWAgYmxpbmRseSBpdGVyYXRlcyBvdmVyIHRoZSBgZnJhZ19saXN0YCBhbmQgbWF5IHJlYWQgb3ZlcmxhcHBpbmcgYnl0ZXMsIHJlc3VsdGluZyBpbiBhIGNvcnJ1cHRlZCBUTFMgaGVhZGVyLiBUaGlzIGNvcnJ1cHRlZCBoZWFkZXIgY2F1c2VzIGB0bHNfcnhfbXNnX3NpemUoKWAgdG8gcmV0dXJuIGFuIGVycm9yIChsaWtlIGAtRUlOVkFMYCksIHdoaWNoIHNwdXJpb3VzbHkgYWJvcnRzIHRoZSBUTFMgY29ubmVjdGlvbi5cXG5cXG5CeSBjYWxsaW5nIGB0bHNfc3RycF9jaGVja19xdWV1ZV9vaygpYCBiZWZvcmUgcmVhZGluZyB0aGUgaGVhZGVyLCB0aGUgY29kZSBkZXRlY3RzIG92ZXJsYXBwaW5nIHNlZ21lbnRzIG9yIG1peGVkIGRlY3J5cHRlZCBzdGF0dXMgYW5kIGZhbGxzIGJhY2sgdG8gYHRsc19zdHJwX3JlYWRfY29weSgpYC4gVGhpcyBmYWxsYmFjayB1c2VzIGB0Y3BfcmVhZF9zb2NrKClgIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIG92ZXJsYXBzIGFuZCBjb3B5IHRoZSBsb2dpY2FsIHN0cmVhbSBpbnRvIGEgbGluZWFyIGJ1ZmZlci5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIG1lbW9yeSBzYWZldHkgaXNzdWVzIGludm9sdmVkLiBUaGUgYnl0ZXMgcmVhZCBieSBgc2tiX2NvcHlfYml0cygpYCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgbmV0d29yayBkYXRhOyB0aGV5IGFyZSBzaW1wbHkgdGhlIHdyb25nIGJ5dGVzIGR1ZSB0byB0aGUgb3ZlcmxhcHMuIFRoZXJlZm9yZSwgS01TQU4gKHdoaWNoIGRldGVjdHMgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UpIGlzIG5vdCBhcHBsaWNhYmxlIGhlcmUuIFN0YW5kYXJkIEtBU0FOIHdvdWxkIGFsc28gbm90IGRldGVjdCBhbnl0aGluZywgYXMgdGhlcmUgaXMgbm8gbWVtb3J5IGNvcnJ1cHRpb24gb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggZml4ZXMgYSBsb2dpYyBidWcgaW4gdGhlIFRMUyBzdHJwYXJzZXIgd2hlcmUgYHRsc19yeF9tc2dfc2l6ZSgpYCBjb3VsZCBiZSBjYWxsZWQgb24gYSBUQ1AgcmVjZWl2ZSBxdWV1ZSBjb250YWluaW5nIG92ZXJsYXBwaW5nIHNlZ21lbnRzIChlLmcuLCBkdWUgdG8gcmV0cmFuc21pc3Npb25zKS4gV2hlbiB0aGlzIGhhcHBlbnMsIGBza2JfY29weV9iaXRzKClgIGJsaW5kbHkgaXRlcmF0ZXMgb3ZlciB0aGUgYGZyYWdfbGlzdGAgYW5kIG1heSByZWFkIG92ZXJsYXBwaW5nIGJ5dGVzLCByZXN1bHRpbmcgaW4gYSBjb3JydXB0ZWQgVExTIGhlYWRlci4gVGhpcyBjb3JydXB0ZWQgaGVhZGVyIGNhdXNlcyBgdGxzX3J4X21zZ19zaXplKClgIHRvIHJldHVybiBhbiBlcnJvciAobGlrZSBgLUVJTlZBTGApLCB3aGljaCBzcHVyaW91c2x5IGFib3J0cyB0aGUgVExTIGNvbm5lY3Rpb24uXFxuXFxuQnkgY2FsbGluZyBgdGxzX3N0cnBfY2hlY2tfcXVldWVfb2soKWAgYmVmb3JlIHJlYWRpbmcgdGhlIGhlYWRlciwgdGhlIGNvZGUgZGV0ZWN0cyBvdmVybGFwcGluZyBzZWdtZW50cyBvciBtaXhlZCBkZWNyeXB0ZWQgc3RhdHVzIGFuZCBmYWxscyBiYWNrIHRvIGB0bHNfc3RycF9yZWFkX2NvcHkoKWAuIFRoaXMgZmFsbGJhY2sgdXNlcyBgdGNwX3JlYWRfc29jaygpYCB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBvdmVybGFwcyBhbmQgY29weSB0aGUgbG9naWNhbCBzdHJlYW0gaW50byBhIGxpbmVhciBidWZmZXIuXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciBtZW1vcnkgc2FmZXR5IGlzc3VlcyBpbnZvbHZlZC4gVGhlIGJ5dGVzIHJlYWQgYnkgYHNrYl9jb3B5X2JpdHMoKWAgYXJlIGZ1bGx5IGluaXRpYWxpemVkIG5ldHdvcmsgZGF0YTsgdGhleSBhcmUgc2ltcGx5IHRoZSB3cm9uZyBieXRlcyBkdWUgdG8gdGhlIG92ZXJsYXBzLiBUaGVyZWZvcmUsIEtNU0FOICh3aGljaCBkZXRlY3RzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlKSBpcyBub3QgYXBwbGljYWJsZSBoZXJlLiBTdGFuZGFyZCBLQVNBTiB3b3VsZCBhbHNvIG5vdCBkZXRlY3QgYW55dGhpbmcsIGFzIHRoZXJlIGlzIG5vIG1lbW9yeSBjb3JydXB0aW9uIG9yIG91dC1vZi1ib3VuZHMgYWNjZXNzLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowjbqks[1] Phase: Succeeded StartedAt: 2026-08-07 20:33:14 +0000 UTC FinishedAt: 2026-08-07 20:33:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-07 20:33:14 +0000 UTC FinishedAt: 2026-08-07 20:33:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2] Phase: Succeeded StartedAt: 2026-08-07 20:33:14 +0000 UTC FinishedAt: 2026-08-08 00:15:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-07 20:33:14 +0000 UTC FinishedAt: 2026-08-08 00:15:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-07 20:33:14 +0000 UTC FinishedAt: 2026-08-07 20:33:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-07 20:33:14 +0000 UTC FinishedAt: 2026-08-07 20:33:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowjbqks/series-workflowjbqks-convert-artifact-1666551360/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-07 20:33:24 +0000 UTC FinishedAt: 2026-08-07 20:50:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-07 20:33:24 +0000 UTC FinishedAt: 2026-08-07 20:50:00 +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:*29a19aa7-5f04-4f4c-959f-ccf8f9a3653e,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-workflowjbqks/series-workflowjbqks-convert-artifact-1666551360/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": "1e2d862b-bcb5-43c5-9da8-100f642dc2d2", "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-workflowjbqks/series-workflowjbqks-build-action-130577926/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-07 20:33:24 +0000 UTC FinishedAt: 2026-08-07 20:49:50 +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:*29a19aa7-5f04-4f4c-959f-ccf8f9a3653e,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-workflowjbqks/series-workflowjbqks-convert-artifact-1666551360/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": "1e2d862b-bcb5-43c5-9da8-100f642dc2d2", "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-workflowjbqks/series-workflowjbqks-build-action-130577926/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-07 20:50:00 +0000 UTC FinishedAt: 2026-08-07 20:50:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-07 20:50:00 +0000 UTC FinishedAt: 2026-08-07 20:50:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-07 20:50:00 +0000 UTC FinishedAt: 2026-08-07 20:50:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-07 20:50:00 +0000 UTC FinishedAt: 2026-08-07 20:50:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowjbqks/series-workflowjbqks-convert-artifact-1762185703/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-07 20:50:11 +0000 UTC FinishedAt: 2026-08-07 20:52:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-07 20:50:11 +0000 UTC FinishedAt: 2026-08-07 20:52:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*1e2d862b-bcb5-43c5-9da8-100f642dc2d2,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-workflowjbqks/series-workflowjbqks-build-action-130577926/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-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-07 20:52:11 +0000 UTC FinishedAt: 2026-08-07 20:52:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-07 20:52:11 +0000 UTC FinishedAt: 2026-08-07 20:52:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-07 20:52:11 +0000 UTC FinishedAt: 2026-08-07 21:11:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-07 20:52:11 +0000 UTC FinishedAt: 2026-08-07 21:11:03 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*29a19aa7-5f04-4f4c-959f-ccf8f9a3653e,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-workflowjbqks/series-workflowjbqks-convert-artifact-1762185703/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": "ef6f28cd-0db4-4d02-950c-731dccc12eb4", "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-workflowjbqks/series-workflowjbqks-build-action-1339394411/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-07 20:52:11 +0000 UTC FinishedAt: 2026-08-07 21:10:53 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*29a19aa7-5f04-4f4c-959f-ccf8f9a3653e,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-workflowjbqks/series-workflowjbqks-convert-artifact-1762185703/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": "ef6f28cd-0db4-4d02-950c-731dccc12eb4", "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-workflowjbqks/series-workflowjbqks-build-action-1339394411/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-07 21:11:03 +0000 UTC FinishedAt: 2026-08-07 21:11:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-07 21:11:03 +0000 UTC FinishedAt: 2026-08-07 21:11:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-07 21:11:03 +0000 UTC FinishedAt: 2026-08-07 21:12:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-07 21:11:03 +0000 UTC FinishedAt: 2026-08-07 21:12:43 +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:*ef6f28cd-0db4-4d02-950c-731dccc12eb4,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-workflowjbqks/series-workflowjbqks-build-action-1339394411/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-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-07 21:12:53 +0000 UTC FinishedAt: 2026-08-08 00:15:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-07 21:12:53 +0000 UTC FinishedAt: 2026-08-08 00:15:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*1e2d862b-bcb5-43c5-9da8-100f642dc2d2,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*ef6f28cd-0db4-4d02-950c-731dccc12eb4,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-workflowjbqks/series-workflowjbqks-build-action-130577926/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-workflowjbqks/series-workflowjbqks-build-action-1339394411/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-07 21:12:53 +0000 UTC FinishedAt: 2026-08-07 21:13:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-07 21:12:53 +0000 UTC FinishedAt: 2026-08-07 21:12:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-07 21:12:53 +0000 UTC FinishedAt: 2026-08-07 21:12:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-07 21:12:54 +0000 UTC FinishedAt: 2026-08-07 21:13:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowjbqks/series-workflowjbqks-convert-artifact-3527752512/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-07 21:12:54 +0000 UTC FinishedAt: 2026-08-07 21:12:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-07 21:13:04 +0000 UTC FinishedAt: 2026-08-08 00:15:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjbqks[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["tls_strp_check_rcv","tls_sw_recvmsg","tls_strp_data_ready"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"594d905195024b228c962627ae5ae7c17bd582a4","config_name":"upstream-apparmor-kasan.config","enable_configs":["TLS"],"series_id":"a8897df4-2b76-41d6-be86-9a70a926932e","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-07 21:13:04 +0000 UTC FinishedAt: 2026-08-08 00:15:34 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*1e2d862b-bcb5-43c5-9da8-100f642dc2d2,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*ef6f28cd-0db4-4d02-950c-731dccc12eb4,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-workflowjbqks/series-workflowjbqks-build-action-130577926/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-workflowjbqks/series-workflowjbqks-build-action-1339394411/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-workflowjbqks/series-workflowjbqks-convert-artifact-3527752512/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,}