Name: series-workflow5smd6 Phase: Running StartedAt: 2026-07-23 02:34:58 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5smd6[0] Phase: Running StartedAt: 2026-07-23 02:34:58 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5smd6[0].run-triage Phase: Running StartedAt: 2026-07-23 02:34:58 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow5smd6[0].run-triage(0) Phase: Running StartedAt: 2026-07-23 02:34:58 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "68f078351922afd5d389760cfcd45b23d9107711", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "NUMA" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "68f078351922afd5d389760cfcd45b23d9107711", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "NUMA" ], "series_id": "8e64a7ff-0c8e-4274-95fc-5f3b1a0a1232" }, "track": "KASAN", "fuzz": { "focus": [ "fs", "kvm" ], "focus_symbols": [ "kvm_gmem_create", "__kvm_gmem_create", "kvm_gmem_bind_node", "mpol_bind_node", "__mpol_bind_node", "mpol_set_shared_policy_range" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzIzIDAyOjUyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtOVU1BJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7a3ZtX2dtZW1fY3JlYXRlJiMzNDssCiAgICAmIzM0O19fa3ZtX2dtZW1fY3JlYXRlJiMzNDssCiAgICAmIzM0O2t2bV9nbWVtX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDttcG9sX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDtfX21wb2xfYmluZF9ub2RlJiMzNDssCiAgICAmIzM0O21wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgcHJpdmF0ZSBtZW1vcnkgbm9kZXMgYW5kIGFkZHMgc3VwcG9ydCBmb3IgdGhlbSBhY3Jvc3MgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gV2hpbGUgdGhlIGRyaXZlci1mYWNpbmcgQVBJIGlzIG5vdCB5ZXQgdXNlZCBieSBhbnkgaW4tdHJlZSBkcml2ZXIsIHRoZSBwYXRjaCBhbHNvIGludHJvZHVjZXMgYSBuZXcgS1ZNIGZlYXR1cmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgd2hpY2ggYWxsb3dzIGJpbmRpbmcgYSBndWVzdF9tZW1mZCB0byBhIHNwZWNpZmljIE5VTUEgbm9kZS4gVGhpcyBmZWF0dXJlIGlzIGZ1bGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgaW9jdGwgYW5kIHJlbGllcyBvbiB0aGUgbmV3bHkgYWRkZWQgbXBvbF9iaW5kX25vZGUgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgZnVuY3Rpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gS1ZNIGFuZCBjb3JlIG1tIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yMyAwMjo1MjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGM4YTk3NTk4MzJlZWY3ZDUyNmU3M2U1MjU5MmVjMzBjNjY4MGZlYTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEp1bCAyMyAwMjo1Mjo1NSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZGV2aWNlcy1ub2RlIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMtbm9kZVxuaW5kZXggMmQwZTAyM2YyMmE3MWEuLjhhMzZmYmMzZDQwMjg3IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMtbm9kZVxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMtbm9kZVxuQEAgLTI5LDYgJiM0MzsyOSwxNiBAQCBEZXNjcmlwdGlvbjpcbiBcdFx0Tm9kZXMgdGhhdCBoYXZlIHJlZ3VsYXIgb3IgaGlnaCBtZW1vcnkuXG4gXHRcdERlcGVuZHMgb24gQ09ORklHX0hJR0hNRU0uXG4gXG4mIzQzO1doYXQ6XHRcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9oYXNfcHJpdmF0ZV9tZW1vcnlcbiYjNDM7Q29udGFjdDpcdExpbnV4IE1lbW9yeSBNYW5hZ2VtZW50IGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG4mIzQzO0Rlc2NyaXB0aW9uOlxuJiM0MztcdFx0Tm9kZXMgdGhhdCBoYXZlIHByaXZhdGUgKE5fTUVNT1JZX1BSSVZBVEUpIG1lbW9yeTogbWVtb3J5XG4mIzQzO1x0XHRob3RwbHVnZ2VkIGJ5IGEgZHJpdmVyIG9udG8gYSBDUFUtbGVzcyBub2RlIGFuZCBpc29sYXRlZCBmcm9tXG4mIzQzO1x0XHR0aGUgcGFnZSBhbGxvY2F0b3ImIzM5O3Mgbm9ybWFsIGFuZCBmYWxsYmFjayB6b25lbGlzdHMuICBBIG5vZGUgaXNcbiYjNDM7XHRcdGxpc3RlZCBoZXJlIGZvciBhcyBsb25nIGFzIGl0IGhvbGRzIHByaXZhdGUgbWVtb3J5OyBpdCBpcyBuZXZlclxuJiM0MztcdFx0bGlzdGVkIGluIGhhc19tZW1vcnkgYXQgdGhlIHNhbWUgdGltZSAodGhlIHR3byBzdGF0ZXMgYXJlXG4mIzQzO1x0XHRtdXR1YWxseSBleGNsdXNpdmUpLiAgU2VlIERvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC5cbiYjNDM7XG4gV2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGVYXG4gRGF0ZTpcdFx0T2N0b2JlciAyMDAyXG4gQ29udGFjdDpcdExpbnV4IE1lbW9yeSBNYW5hZ2VtZW50IGxpc3QgXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXHUwMDNlXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL21tL2luZGV4LnJzdFxuaW5kZXggMTNhNzlmNWQwOTJjMGUuLmY2MDcwNGRmNjEwNGMxIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9tbS9pbmRleC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vbW0vaW5kZXgucnN0XG5AQCAtNjUsNiAmIzQzOzY1LDcgQEAgZG9jdW1lbnRhdGlvbiwgb3IgZGVsZXRlZCBpZiBpdCBoYXMgc2VydmVkIGl0cyBwdXJwb3NlLlxuICAgIG1tdV9ub3RpZmllclxuICAgIG11bHRpZ2VuX2xydVxuICAgIG51bWFcbiYjNDM7ICAgbnVtYV9wcml2YXRlX25vZGVzXG4gICAgb3ZlcmNvbW1pdC1hY2NvdW50aW5nXG4gICAgcGFnZV9taWdyYXRpb25cbiAgICBwYWdlX2ZyYWdzXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0XG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjNiMjdhMmUyNGIwODY3XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3RcbkBAIC0wLDAgJiM0MzsxLDE2MCBAQFxuJiM0MzsuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MztcbiYjNDM7PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7UHJpdmF0ZSBtZW1vcnkgbm9kZXNcbiYjNDM7PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7XG4mIzQzO0EgKnByaXZhdGUgbWVtb3J5IG5vZGUqIGlzIGEgTlVNQSBub2RlIHdob3NlIG1lbW9yeSBpcyBob3RwbHVnZ2VkIGJ5IGEgZHJpdmVyXG4mIzQzO2FuZCBkZWxpYmVyYXRlbHkgaGlkZGVuIGZyb20gdGhlIGtlcm5lbCYjMzk7cyBub3JtYWwgbWVtb3J5IG1hbmFnZW1lbnQuICBTdWNoIGFcbiYjNDM7bm9kZSBpcyBtYXJrZWQgYGBOX01FTU9SWV9QUklWQVRFYGAgaW5zdGVhZCBvZiBgYE5fTUVNT1JZYGA7IHRoZSB0d28gc3RhdGVzXG4mIzQzO2FyZSBtdXR1YWxseSBleGNsdXNpdmUsIHNvIGEgcHJpdmF0ZSBub2RlIGlzIG5ldmVyIGNvbnNpZGVyZWQgYnkgdGhlIHBhZ2VcbiYjNDM7YWxsb2NhdG9yJiMzOTtzIG5vcm1hbCBvciBmYWxsYmFjayBwYXRocy5cbiYjNDM7XG4mIzQzO1RoZSBpbnRlbnQgaXMgdG8gZ2l2ZSBhIGRyaXZlciBhIGJsb2NrIG9mIE5VTUEtYWRkcmVzc2FibGUgbWVtb3J5IHRoYXQgdGhlIHJlc3RcbiYjNDM7b2YgdGhlIGtlcm5lbCB3aWxsIG5vdCBhbGxvY2F0ZSBmcm9tIG9uIGl0cyBvd24sIHdoaWxlIHN0aWxsIGxldHRpbmcgdGhhdCBtZW1vcnlcbiYjNDM7YmUgbWFwcGVkIGludG8gcHJvY2Vzc2VzIGFzIG9yZGluYXJ5LCBzdHJ1Y3QtcGFnZSwgTFJVLW1hbmFnZWQgZm9saW9zIC0tIGFuZCB0b1xuJiM0MztsZXQgdGhlIGRyaXZlciByZS1lbmFibGUgaW5kaXZpZHVhbCBtbSBzZXJ2aWNlcyBpdCBpcyBjYXBhYmxlIG9mIGFsbG93aW5nLlxuJiM0MztcbiYjNDM7UHJlY29uZGl0aW9uc1xuJiM0Mzs9PT09PT09PT09PT09XG4mIzQzO1xuJiM0MztgYE5fTUVNT1JZX1BSSVZBVEVgYCBhbmQgYGBOX01FTU9SWWBgIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIHNvIHRoZSBiYWNraW5nXG4mIzQzO21lbW9yeSBtdXN0IGNvbWUgdXAgb24gYSBub2RlIHRoYXQgaGFzIG5vIERSQU0gb2YgaXRzIG93biAob3RoZXJ3aXNlIHRoZSBub2RlXG4mIzQzO3dvdWxkIGFscmVhZHkgYmUgYGBOX01FTU9SWWBgKS5cbiYjNDM7XG4mIzQzO0luIHByYWN0aWNlIHRoZSBtZW1vcnkgaXMgcHJvdmlkZWQgYnkgYSBkZXZpY2UgZHJpdmVyIG9yIGEgREFYIGRldmljZSB3aG9zZVxuJiM0Mzt0YXJnZXQgbm9kZSBoYXMgbm8gb3RoZXIgbWVtb3J5LCBhbmQgdXN1YWxseSBubyBDUFVzLlxuJiM0MztcbiYjNDM7SXNvbGF0aW9uIG1vZGVsXG4mIzQzOz09PT09PT09PT09PT09PVxuJiM0MztcbiYjNDM7SXNvbGF0aW9uIGlzICpvcHQtaW4gYnkgZXhjbHVzaW9uKiBhbmQgaXMgKipzdHJ1Y3R1cmFsKio6IGJ5IGRlZmF1bHQgbm90aGluZyBpblxuJiM0Mzt0aGUga2VybmVsIGNhbiBwbGFjZSBtZW1vcnkgb24gYSBwcml2YXRlIG5vZGUgYmVjYXVzZSB0aGUgbm9kZSBpcyBhYnNlbnQgZnJvbSB0aGVcbiYjNDM7em9uZWxpc3RzIGFuIG9yZGluYXJ5IGFsbG9jYXRpb24gd2Fsa3MuXG4mIzQzO1xuJiM0Mztab25lbGlzdCBleGNsdXNpb25cbiYjNDM7ICAgIFRoZSBrZXJuZWwgcGFnZSBhbGxvY2F0b3IgZGVwZW5kcyBvbiB0aGUgYGBGQUxMQkFDS2BgIGFuZCBgYE5PRkFMTEJBQ0tgYFxuJiM0MzsgICAgem9uZWxpc3RzIHRvIGFsbG9jYXRlIG1lbW9yeS4gIEEgbm9ybWFsIGBgTl9NRU1PUllgYCBub2RlJiMzOTtzIHpvbmVzIChleGNlcHRcbiYjNDM7ICAgIGBgWk9ORV9ERVZJQ0VgYCkgYXBwZWFyIGluIHRoZXNlIGxpc3RzIGFuZCBhbGxvdyBhbGxvY2F0aW9ucyB0byBmYWxsLWJhY2tcbiYjNDM7ICAgIHRvIGxlc3MgcHJlZmVyYWJsZSBsb2NhdGlvbnMgaWYgdGhlIHByZWZlcnJlZCBsb2NhdGlvbiBpcyBwcmVzc3VyZWQuXG4mIzQzO1xuJiM0MzsgICAgYGBfX0dGUF9USElTTk9ERWBgIGlzIHVzZWQgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gdG8gc3dpdGNoIGJldHdlZW5cbiYjNDM7ICAgIGBgRkFMTEJBQ0tgYCBhbmQgYGBOT0ZBTExCQUNLYGAsIHdoZXJlIGBgTk9GQUxMQkFDS2BgIG9ubHkgY29udGFpbnMgdGhlXG4mIzQzOyAgICB6b25lbGlzdHMgb2YgdGhlIHByZWZlcnJlZCBub2RlLlxuJiM0MztcbiYjNDM7ICAgIGBgTl9NRU1PUllfUFJJVkFURWBgIG5vZGVzIGFyZSAqKmV4Y2x1ZGVkKiogZnJvbSBib3RoIGBgRkFMTEJBQ0tgYCBhbmRcbiYjNDM7ICAgIGBgTk9GQUxMQkFDS2BgIHpvbmVsaXN0cy4gIEluc3RlYWQgdGhleSBhcmUgYWRkZWQgdG8gYGBaT05FTElTVF9QUklWQVRFYGAsXG4mIzQzOyAgICB3aGljaCBpbmNsdWRlcyBib3RoIGBgTl9NRU1PUllgYCBhbmQgYGBOX01FTU9SWV9QUklWQVRFYGAgbm9kZXMuICBUaGlzIGlzXG4mIzQzOyAgICB0aGUgb25seSB6b25lbGlzdCB0aGF0IGNvbnRhaW5zIHByaXZhdGUtbm9kZSB6b25lcywgYW5kIHNvIHRoZSBvbmx5IHdheVxuJiM0MzsgICAgdG8gYWNxdWlyZSBwcml2YXRlIG5vZGUgYWxsb2NhdGlvbnMgaXMgdG8gZXhwbGljaXRseSByZXF1ZXN0IHRoYXQgem9uZWxpc3QuXG4mIzQzO1xuJiM0MzsgICAgRXZlbiBhbiBhbGxvY2F0aW9uIGNhcnJ5aW5nIGBgX19HRlBfVEhJU05PREVgYCBjYW5ub3QgYWNjZXNzIHRoZSBub2RlJiMzOTtzXG4mIzQzOyAgICBtZW1vcnkgd2l0aG91dCBhbHNvIGV4cGxpY2l0bHkgcGFzc2luZyB0aGUgcHJpdmF0ZSB6b25lbGlzdC4gIFRoaXMgcHJldmVudHNcbiYjNDM7ICAgIGluY2lkZW50YWwgYWxsb2NhdGlvbiBvZiBwcml2YXRlIG1lbW9yeSBieSB1c2VycyBvZiBwb3NzaWJsZS9vbmxpbmVcbiYjNDM7ICAgIG5vZGVsaXN0cy5cbiYjNDM7XG4mIzQzOyAgICBXaGVuIGBgQ09ORklHX05VTUFgYCBpcyBkaXNhYmxlZCBgYFpPTkVMSVNUX1BSSVZBVEVgYCBhbGlhc2VzXG4mIzQzOyAgICBgYFpPTkVMSVNUX0ZBTExCQUNLYGAgYW5kIGlzIG5ldmVyIHNlbGVjdGVkLlxuJiM0MztcbiYjNDM7VGhlIHVzZXJfbnVtYSBwYXRoXG4mIzQzO1xuJiM0MzsgICAgYGBNUE9MX0ZfUFJJVkFURWBgIGlzIGFuIGludGVybmFsIHVzZXJfbnVtYSBmbGFnIChuZXZlciBhY2NlcHRlZCBmcm9tXG4mIzQzOyAgICB1c2Vyc3BhY2UpIG1hcmtpbmcgdGhhdCBhIG1lbXBvbGljeSBoYXMgYSBwcml2YXRlIG5vZGUgaW4gaXRzIG5vZGVtYXNrLlxuJiM0MztcbiYjNDM7ICAgIFdoZW4gYGBDQVBfVVNFUl9OVU1BYGAgZm9yIGEgcHJpdmF0ZSBub2RlIGlzIHNldCwgdXNlci1zb3VyY2VkIG1lbXBvbGljeVxuJiM0MzsgICAgKGBgc2V0X21lbXBvbGljeSgyKWBgKSBhbmQgbWlncmF0aW9uIChgYG1vdmVfcGFnZXMoMilgYCkgb3BlcmF0aW9ucyBhcmVcbiYjNDM7ICAgIGFsbG93ZWQgdG8gaW5jbHVkZSB0aGF0IG5vZGUgaW4gbm9kZW1hc2tzIGFuZCB0YXJnZXRzIHJlc3BlY3RpdmVseS5cbiYjNDM7XG4mIzQzOyAgICBgYG1iaW5kKE1QT0xfTUZfTU9WRSlgYCBpcyBib3RoIGEgbWVtcG9saWN5IGFuZCBhIG1pZ3JhdGlvbiBvcGVyYXRpb24sXG4mIzQzOyAgICBzbyBwbGFjZW1lbnQgYW5kIG1pZ3JhdGlvbiBzaGFyZSB0aGUgc2FtZSBjYXBhYmlsaXR5LlxuJiM0MztcbiYjNDM7ICAgIFRoZSBtZW1wb2xpY3kgY29tcG9uZW50IHVzZXMgYGBNUE9MX0ZfUFJJVkFURWBgIGF0IGZhdWx0LXRpbWUgdG8gc2VsZWN0XG4mIzQzOyAgICBgYFpPTkVMSVNUX1BSSVZBVEVgYCBhbmQgbWFrZXMgdGhlIG5vZGUmIzM5O3MgbWVtb3J5IGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi5cbiYjNDM7ICAgIEl0IGlzIG90aGVyd2lzZSBhbiBvcmRpbmFyeSwgcmVsYXhhYmxlIG1lbXBvbGljeTogYW4gdW5zYXRpc2ZpYWJsZSByZXF1ZXN0XG4mIzQzOyAgICAoYW4gdW5tb3ZhYmxlIGFsbG9jYXRpb24gb24gYSBtb3ZhYmxlLW9ubHkgcHJpdmF0ZSBub2RlKSBzaW1wbHkgZmFsbHMgYmFjay5cbiYjNDM7XG4mIzQzO1xuJiM0MztjcHVzZXQgaW50ZXJhY3Rpb25cbiYjNDM7PT09PT09PT09PT09PT09PT09XG4mIzQzO1xuJiM0MztjcHVzZXQubWVtcyBkb2VzICoqbm90KiogcGFydGl0aW9uIHByaXZhdGUgbm9kZXMuICBjcHVzZXQgbmVpdGhlciBncmFudHMgbm9yXG4mIzQzO2RlbmllcyBhY2Nlc3MsIGFuZCByZWJpbmRpbmcgY3B1c2V0Lm1lbXMgbm9kZW1hc2tzIGRvIG5vdCBhZmZlY3QgYSBwcml2YXRlIG5vZGUmIzM5O3NcbiYjNDM7cmVzaWRlbmN5IGluIGFueSBub2RlbWFzay5cbiYjNDM7XG4mIzQzO0xpa2V3aXNlLCBhIHByaXZhdGUgbm9kZSYjMzk7cyBpbmNsdXNpb24gaW4gYSBub2RlbWFzayBkb2VzIG5vdCBhZmZlY3QgY3B1c2V0Lm1lbXMmIzM5O1xuJiM0MztmaWx0ZXJpbmcgb2YgYW55IGBgTl9NRU1PUllgYCAtIHRoZXkgcmVtYWluIHBhcnRpdGlvbmVkIGFjY29yZGluZyB0byBjcHVzZXQuXG4mIzQzO1xuJiM0MztcbiYjNDM7UHJvdmlzaW9uaW5nXG4mIzQzOz09PT09PT09PT09PVxuJiM0MztcbiYjNDM7QSBkcml2ZXIgYnJpbmdzIG1lbW9yeSB1cCBhcyBwcml2YXRlIHdpdGg6OlxuJiM0MztcbiYjNDM7ICBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQobmlkLCBzdGFydCwgc2l6ZSwgcmVzb3VyY2VfbmFtZSxcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWhwX2ZsYWdzLCBvbmxpbmVfdHlwZSwgbnApXG4mIzQzO1xuJiM0Mzt3aGljaCBvbmxpbmVzIHRoZSByYW5nZSBhbmQgcmVnaXN0ZXJzIHRoZSBkcml2ZXItb3duZWQgYGBzdHJ1Y3Qgbm9kZV9wcml2YXRlYGBcbiYjNDM7KGBgbnBgYCkgZGVzY3JpYmluZyB0aGUgbm9kZSwgaW5jbHVkaW5nIGl0cyBjYXBhYmlsaXR5IGJpdG1hcCAoc2VlIGJlbG93KS5cbiYjNDM7XG4mIzQzO09ubHkgb25lIGRyaXZlci9zZXJ2aWNlIG1heSByZWdpc3RlciBhIGBgc3RydWN0IG5vZGVfcHJpdmF0ZWBgLCB3aGljaFxuJiM0MztoZWF2aWx5IGltcGxpZXMgYSBcJiMzNDtvbmUtbm9kZS1wZXItZGV2aWNlXCYjMzQ7IGRlc2lnbiBvZiB0aGUgc3lzdGVtLlxuJiM0MztcbiYjNDM7VGhlIG5vZGUgbGVhdmVzIGBgTl9NRU1PUllfUFJJVkFURWBgIG9ubHkgd2hlbiB0aGUgbGFzdCByYW5nZSBpcyBvZmZsaW5lZC5cbiYjNDM7XG4mIzQzOy4uIGtlcm5lbC1kb2M6OiBtbS9tZW1vcnlfaG90cGx1Zy5jXG4mIzQzOyAgIDppZGVudGlmaWVyczogX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkXG4mIzQzO1xuJiM0MzsuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL25vZGUuY1xuJiM0MzsgICA6aWRlbnRpZmllcnM6IG5vZGVfcHJpdmF0ZV9yZWdpc3RlciBub2RlX3ByaXZhdGVfdW5yZWdpc3RlclxuJiM0MztcbiYjNDM7Q2FwYWJpbGl0aWVzIChwZXItc2VydmljZSBvcHQtaW5zKVxuJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4mIzQzO1xuJiM0MztCZWNhdXNlIHRoZSBkZWZhdWx0IGlzIFwmIzM0O25vIG1tIHNlcnZpY2UgdG91Y2hlcyB0aGUgbm9kZVwmIzM0OywgZWFjaCBzZXJ2aWNlIGEgZHJpdmVyXG4mIzQzO3dhbnRzIGJhY2sgaXMgcmVxdWVzdGVkIGV4cGxpY2l0bHkgdGhyb3VnaCBhIGNhcGFiaWxpdHkgYml0IGluXG4mIzQzO2BgbnAtXHUwMDNlY2Fwc2BgLiAgVGhlIG1tIHNpZGUgY2hlY2tzIHRoZSBtYXRjaGluZyBgYG5vZGVfYWxsb3dzXyooKWBgIC9cbiYjNDM7YGBmb2xpb19hbGxvd3NfKigpYGAgcHJlZGljYXRlIGJlZm9yZSBhY3Rpbmc6XG4mIzQzO1xuJiM0MzsuLiBsaXN0LXRhYmxlOjpcbiYjNDM7ICAgOmhlYWRlci1yb3dzOiAxXG4mIzQzOyAgIDp3aWR0aHM6IDM1IDY1XG4mIzQzO1xuJiM0MzsgICAqIC0gQ2FwYWJpbGl0eVxuJiM0MzsgICAgIC0gUmUtZW5hYmxlc1xuJiM0MzsgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX1JFQ0xBSU1gYFxuJiM0MzsgICAgIC0gcmVjbGFpbSBvZiB0aGUgbm9kZSYjMzk7cyBmb2xpb3MsIGJ5IHRoZSBtbSBhbmQgYnkgdXNlcnNwYWNlXG4mIzQzOyAgICAgICBgYE1BRFZfQ09MRGBgIC8gYGBQQUdFT1VUYGAgLyBgYEZSRUVgYCAodXNlcmxhbmQtZHJpdmVuIHJlY2xhaW0pXG4mIzQzOyAgICogLSBgYE5PREVfUFJJVkFURV9DQVBfVVNFUl9OVU1BYGBcbiYjNDM7ICAgICAtIGFsbCB1c2Vyc3BhY2UtZGlyZWN0ZWQgcGxhY2VtZW50IGFuZCBtaWdyYXRpb246IGBgbWJpbmQoKWBgIC9cbiYjNDM7ICAgICAgIGBgc2V0X21lbXBvbGljeSgpYGAgLyBob21lIG5vZGUsIGFuZCBgYG1vdmVfcGFnZXMoKWBgIC9cbiYjNDM7ICAgICAgIGBgbWlncmF0ZV9wYWdlcygpYGAgdG8vZnJvbSB0aGUgbm9kZVxuJiM0MzsgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX0hPVFVOUExVR2BgXG4mIzQzOyAgICAgLSBob3QtdW5wbHVnIHZpYSBtaWdyYXRpb25cbiYjNDM7ICAgKiAtIGBgTk9ERV9QUklWQVRFX0NBUF9ERU1PVElPTmBgXG4mIzQzOyAgICAgLSByZWNsYWltLWRyaXZlbiB0aWVyaW5nIGRlbW90aW9uIG9udG8gdGhlIG5vZGUgKHRoZSBub2RlIGpvaW5zIHRoZVxuJiM0MzsgICAgICAgZGVtb3Rpb24gaGllcmFyY2h5KVxuJiM0MzsgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX05VTUFfQkFMQU5DSU5HYGBcbiYjNDM7ICAgICAtIGFjY2Vzcy1iYXNlZCBOVU1BIGJhbGFuY2luZyBzY2FuL21pZ3JhdGlvbiBvZiB0aGUgbm9kZSYjMzk7cyBmb2xpb3NcbiYjNDM7ICAgKiAtIGBgTk9ERV9QUklWQVRFX0NBUF9MVFBJTmBgXG4mIzQzOyAgICAgLSBgYEZPTExfTE9OR1RFUk1gYCBHVVAgcGluc1xuJiM0MztcbiYjNDM7a2h1Z2VwYWdlZCBuZXZlciBvcGVyYXRlcyBvbiBwcml2YXRlLW5vZGUgZm9saW9zIChsaWtlIFpPTkVfREVWSUNFKSwgYW5kIERBTU9OXG4mIzQzO2RvZXMgbm90IGFjdCBvbiB0aGVtOyBgYE1BRFZfQ09MTEFQU0VgYCBpcyBjb3ZlcmVkIGJ5IGBgQ0FQX1VTRVJfTlVNQWBgLlxuJiM0MztcbiYjNDM7RGVwZW5kZW5jaWVzIGJldHdlZW4gY2FwYWJpbGl0aWVzIGFyZSBlbmZvcmNlZCAqKm9uY2UqKiwgYnlcbiYjNDM7YGBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoKWBgIGF0IGhvdHBsdWcsIHJhdGhlciB0aGFuIGJ5IHdoYXRldmVyIHNldHMgdGhlIGJpdHM6XG4mIzQzO1xuJiM0MzsqIGBgREVNT1RJT05gYCByZXF1aXJlcyBgYFJFQ0xBSU1gYCAoYSBkZW1vdGlvbiB0YXJnZXQgYWNjdW11bGF0ZXMgZGVtb3RlZFxuJiM0MzsgIHBhZ2VzLCBzbyB3aXRob3V0IHJlY2xhaW0gYXMgYSBzYWZldHkgdmFsdmUgaXQgd291bGQganVzdCBmaWxsIHVwKS5cbiYjNDM7XG4mIzQzO0NhcGFiaWxpdHkgZmxhZ3MgYXJlIGV4cGVjdGVkIHRvIGJlIHN0YWJsZSBhdCBydW50aW1lLlxuJiM0MztcbiYjNDM7T2JzZXJ2YWJpbGl0eVxuJiM0Mzs9PT09PT09PT09PT09XG4mIzQzO1xuJiM0MztBIHByaXZhdGUgbm9kZSBpcyByZXBvcnRlZCB0aHJvdWdoOlxuJiM0MztcbiYjNDM7KiBgYC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9oYXNfcHJpdmF0ZV9tZW1vcnlgYFxuJiM0MzsqIGBgL3Byb2MvXHUwMDNjcGlkXHUwMDNlL251bWFfbWFwc2BgIC0tIHBlci1ub2RlIHJlc2lkZW5jeSBpbmNsdWRlcyBwcml2YXRlIG5vZGVzXG4mIzQzOyogYGAvcHJvYy9rY29yZWBgIC0tIHByaXZhdGUtbm9kZSBSQU0gYXBwZWFycyBpbiB0aGUga2NvcmUgUkFNIG1hcFxuJiM0MzsqIG1lbWNnIHBlci1ub2RlIHN0YXRpc3RpY3MgYWNjb3VudCBwcml2YXRlLW5vZGUgbWVtb3J5LlxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9ub2RlLmMgYi9kcml2ZXJzL2Jhc2Uvbm9kZS5jXG5pbmRleCAzZGE5MTkyOWFkNGUzNy4uM2Q2MWNhMWI4MDVkYzAgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Jhc2Uvbm9kZS5jXG5AQCAtMjIsNiAmIzQzOzIyLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1ibG9jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L25vZGVfcHJpdmF0ZS5oXHUwMDNlXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBub2RlX3N1YnN5cyA9IHtcbiBcdC5uYW1lID0gXCYjMzQ7bm9kZVwmIzM0OyxcbkBAIC04NjgsNiAmIzQzOzg2OSwxMjEgQEAgdm9pZCByZWdpc3Rlcl9tZW1vcnlfYmxvY2tzX3VuZGVyX25vZGVfaG90cGx1ZyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbixcbiBcdFx0XHQgICAodm9pZCAqKVx1MDAyNm5pZCwgcmVnaXN0ZXJfbWVtX2Jsb2NrX3VuZGVyX25vZGVfaG90cGx1Zyk7XG4gXHRyZXR1cm47XG4gfVxuJiM0MztcbiYjNDM7c3RhdGljIERFRklORV9NVVRFWChub2RlX3ByaXZhdGVfbG9jayk7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbm9kZV9wcml2YXRlX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgYSBwcml2YXRlIG5vZGVcbiYjNDM7ICogQG5pZDogTm9kZSBpZGVudGlmaWVyXG4mIzQzOyAqIEBucDogVGhlIG5vZGVfcHJpdmF0ZSBzdHJ1Y3R1cmUgKGRyaXZlci1hbGxvY2F0ZWQsIGRyaXZlci1vd25lZClcbiYjNDM7ICpcbiYjNDM7ICogUmVnaXN0ZXIgYW4gb3duZXIgZm9yIGEgcHJpdmF0ZSBub2RlLiBJZiBhbiBvd25lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiYjNDM7ICogKGRpZmZlcmVudCBucCksIHJldHVybiAtRUJVU1kuXG4mIzQzOyAqXG4mIzQzOyAqIFJlLXJlZ2lzdHJhdGlvbiB3aXRoIHRoZSBzYW1lIG5wIGlzIGFsbG93ZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBjYWxsZXIgb3ducyB0aGUgbm9kZV9wcml2YXRlIG1lbW9yeSBhbmQgbXVzdCBlbnN1cmUgaXQgcmVtYWlucyB2YWxpZFxuJiM0MzsgKiB1bnRpbCBhZnRlciBub2RlX3ByaXZhdGVfdW5yZWdpc3RlcigpIHJldHVybnMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLlxuJiM0MzsgKi9cbiYjNDM7aW50IG5vZGVfcHJpdmF0ZV9yZWdpc3RlcihpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBub2RlX3ByaXZhdGUgKmV4aXN0aW5nO1xuJiM0MztcdHBnX2RhdGFfdCAqcGdkYXQ7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4mIzQzO1xuJiM0MztcdGlmICghbnAgfHwgIW5vZGVfcG9zc2libGUobmlkKSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHQvKiBEZW1vdGlvbiBpcyBkcml2ZW4gYnkgcmVjbGFpbSwgc28gaXQgcmVxdWlyZXMgcmVjbGFpbS4gKi9cbiYjNDM7XHRpZiAoKG5wLVx1MDAzZWNhcHMgXHUwMDI2IE5PREVfUFJJVkFURV9DQVBfREVNT1RJT04pIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhKG5wLVx1MDAzZWNhcHMgXHUwMDI2IE5PREVfUFJJVkFURV9DQVBfUkVDTEFJTSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZub2RlX3ByaXZhdGVfbG9jayk7XG4mIzQzO1x0bWVtX2hvdHBsdWdfYmVnaW4oKTtcbiYjNDM7XG4mIzQzO1x0LyogTl9NRU1PUllfUFJJVkFURSBhbmQgTl9NRU1PUlkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqL1xuJiM0MztcdGlmIChub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKSB7XG4mIzQzO1x0XHRyZXQgPSAtRUJVU1k7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7XG4mIzQzO1x0ZXhpc3RpbmcgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHBnZGF0LVx1MDAzZW5vZGVfcHJpdmF0ZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgbG9ja2RlcF9pc19oZWxkKFx1MDAyNm5vZGVfcHJpdmF0ZV9sb2NrKSk7XG4mIzQzO1xuJiM0MztcdC8qIElmIGl0IGV4aXN0cywgcmVzdHJpY3QgdG8gc2luZ2xlIG93bmVyICovXG4mIzQzO1x0aWYgKGV4aXN0aW5nKSB7XG4mIzQzO1x0XHRpZiAoZXhpc3RpbmcgIT0gbnApXG4mIzQzO1x0XHRcdHJldCA9IC1FQlVTWTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmN1X2Fzc2lnbl9wb2ludGVyKHBnZGF0LVx1MDAzZW5vZGVfcHJpdmF0ZSwgbnApO1xuJiM0MztvdXQ6XG4mIzQzO1x0bWVtX2hvdHBsdWdfZG9uZSgpO1xuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZub2RlX3ByaXZhdGVfbG9jayk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChub2RlX3ByaXZhdGVfcmVnaXN0ZXIpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyIC0gVW5yZWdpc3RlciBhIHByaXZhdGUgbm9kZVxuJiM0MzsgKiBAbmlkOiBOb2RlIGlkZW50aWZpZXJcbiYjNDM7ICpcbiYjNDM7ICogVW5yZWdpc3RlciB0aGUgZHJpdmVyIGZyb20gYSBwcml2YXRlIG5vZGUuXG4mIzQzOyAqXG4mIzQzOyAqIE9ubHkgc3VjY2VlZHMgaWYgYWxsIG1lbW9yeSBoYXMgYmVlbiBvZmZsaW5lZCAoTl9NRU1PUllfUFJJVkFURSBjbGVhcmVkKS5cbiYjNDM7ICpcbiYjNDM7ICogTl9NRU1PUllfUFJJVkFURSBzdGF0ZSBpcyBjbGVhcmVkIGJ5IG9mZmxpbmVfcGFnZXMoKSB3aGVuIHRoZSBsYXN0XG4mIzQzOyAqIG1lbW9yeSBpcyBvZmZsaW5lZCwgbm90IGJ5IHRoaXMgZnVuY3Rpb24uXG4mIzQzOyAqXG4mIzQzOyAqIEFmdGVyIHRoaXMgcmV0dXJucywgdGhlIG5vZGVfcHJpdmF0ZSBwb2ludGVyIGlzIG5vIGxvbmdlciB2aXNpYmxlIGFuZFxuJiM0MzsgKiBhbiBSQ1UgZ3JhY2UgcGVyaW9kIGhhcyBlbGFwc2VkLCBzbyB0aGUgZHJpdmVyIG1heSBmcmVlIGl0cyBjb250ZXh0LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgaWYgdW5yZWdpc3RlcmVkLCAtRUJVU1kgaWYgTl9NRU1PUllfUFJJVkFURSBpcyBzdGlsbCBzZXQuXG4mIzQzOyAqL1xuJiM0MztpbnQgbm9kZV9wcml2YXRlX3VucmVnaXN0ZXIoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xuJiM0MztcdHBnX2RhdGFfdCAqcGdkYXQ7XG4mIzQzO1xuJiM0MztcdGlmICghbm9kZV9wb3NzaWJsZShuaWQpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdG11dGV4X2xvY2soXHUwMDI2bm9kZV9wcml2YXRlX2xvY2spO1xuJiM0MztcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XG4mIzQzO1xuJiM0MztcdHBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7XG4mIzQzO1x0bnAgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHBnZGF0LVx1MDAzZW5vZGVfcHJpdmF0ZSxcbiYjNDM7XHRcdFx0XHQgICAgICAgbG9ja2RlcF9pc19oZWxkKFx1MDAyNm5vZGVfcHJpdmF0ZV9sb2NrKSk7XG4mIzQzO1x0aWYgKCFucCkge1xuJiM0MztcdFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuJiM0MztcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNm5vZGVfcHJpdmF0ZV9sb2NrKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBPbmx5IHVucmVnaXN0ZXIgaWYgTl9NRU1PUllfUFJJVkFURSBpcyBjbGVhcmVkIChvbmx5IG9jY3VycyB3aGVuXG4mIzQzO1x0ICogdGhlIGxhc3QgbWVtb3J5IGJsb2NrIGlzIG9mZmxpbmVkIGluIG9mZmxpbmVfcGFnZXMoKSlcbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAobm9kZV9pc19wcml2YXRlKG5pZCkpIHtcbiYjNDM7XHRcdG1lbV9ob3RwbHVnX2RvbmUoKTtcbiYjNDM7XHRcdG11dGV4X3VubG9jayhcdTAwMjZub2RlX3ByaXZhdGVfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmN1X2Fzc2lnbl9wb2ludGVyKHBnZGF0LVx1MDAzZW5vZGVfcHJpdmF0ZSwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdG1lbV9ob3RwbHVnX2RvbmUoKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2bm9kZV9wcml2YXRlX2xvY2spO1xuJiM0MztcbiYjNDM7XHRzeW5jaHJvbml6ZV9yY3UoKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChub2RlX3ByaXZhdGVfdW5yZWdpc3Rlcik7XG4gI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVRyAqL1xuIFxuIC8qKlxuQEAgLTk2Niw2ICYjNDM7MTA4Miw3IEBAIHN0YXRpYyBzdHJ1Y3Qgbm9kZV9hdHRyIG5vZGVfc3RhdGVfYXR0cltdID0ge1xuIFx0W05fSElHSF9NRU1PUlldID0gX05PREVfQVRUUihoYXNfaGlnaF9tZW1vcnksIE5fSElHSF9NRU1PUlkpLFxuICNlbmRpZlxuIFx0W05fTUVNT1JZXSA9IF9OT0RFX0FUVFIoaGFzX21lbW9yeSwgTl9NRU1PUlkpLFxuJiM0MztcdFtOX01FTU9SWV9QUklWQVRFXSA9IF9OT0RFX0FUVFIoaGFzX3ByaXZhdGVfbWVtb3J5LCBOX01FTU9SWV9QUklWQVRFKSxcbiBcdFtOX0NQVV0gPSBfTk9ERV9BVFRSKGhhc19jcHUsIE5fQ1BVKSxcbiBcdFtOX0dFTkVSSUNfSU5JVElBVE9SXSA9IF9OT0RFX0FUVFIoaGFzX2dlbmVyaWNfaW5pdGlhdG9yLFxuIFx0XHRcdFx0XHQgICBOX0dFTkVSSUNfSU5JVElBVE9SKSxcbkBAIC05NzksNiAmIzQzOzEwOTYsNyBAQCBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbm9kZV9zdGF0ZV9hdHRyc1tdID0ge1xuIFx0XHUwMDI2bm9kZV9zdGF0ZV9hdHRyW05fSElHSF9NRU1PUlldLmF0dHIuYXR0cixcbiAjZW5kaWZcbiBcdFx1MDAyNm5vZGVfc3RhdGVfYXR0cltOX01FTU9SWV0uYXR0ci5hdHRyLFxuJiM0MztcdFx1MDAyNm5vZGVfc3RhdGVfYXR0cltOX01FTU9SWV9QUklWQVRFXS5hdHRyLmF0dHIsXG4gXHRcdTAwMjZub2RlX3N0YXRlX2F0dHJbTl9DUFVdLmF0dHIuYXR0cixcbiBcdFx1MDAyNm5vZGVfc3RhdGVfYXR0cltOX0dFTkVSSUNfSU5JVElBVE9SXS5hdHRyLmF0dHIsXG4gXHROVUxMXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9kYXgva21lbS5jIGIvZHJpdmVycy9kYXgva21lbS5jXG5pbmRleCBhNDhkNjk5Y2YzNDRjOS4uYzNmYWYxOGU3Zjg1ZGUgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2RheC9rbWVtLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZGF4L2ttZW0uY1xuQEAgLTEyNiw3ICYjNDM7MTI2LDcgQEAgc3RhdGljIGludCBkYXhfa21lbV9kb19ob3RwbHVnKHN0cnVjdCBkZXZfZGF4ICpkZXZfZGF4LFxuIFx0XHQgKi9cbiBcdFx0cmMgPSBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQoZGF0YS1cdTAwM2VtZ2lkLCByYW5nZS5zdGFydCxcbiBcdFx0XHRcdHJhbmdlX2xlbihcdTAwMjZyYW5nZSksIGttZW1fbmFtZSwgbWhwX2ZsYWdzLFxuLVx0XHRcdFx0b25saW5lX3R5cGUpO1xuJiM0MztcdFx0XHRcdG9ubGluZV90eXBlLCBOVUxMKTtcbiBcbiBcdFx0aWYgKHJjKSB7XG4gXHRcdFx0ZGV2X3dhcm4oZGV2LCBcJiMzNDttYXBwaW5nJWQ6ICUjbGx4LSUjbGx4IG1lbW9yeSBhZGQgZmFpbGVkXFxuXCYjMzQ7LFxuZGlmZiAtLWdpdCBhL2ZzL3Byb2Mva2NvcmUuYyBiL2ZzL3Byb2Mva2NvcmUuY1xuaW5kZXggMzkwNTQ3Yjk5MmFjZDkuLmY2NzE5NGRjMmE5Yjg1IDEwMDY0NFxuLS0tIGEvZnMvcHJvYy9rY29yZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9wcm9jL2tjb3JlLmNcbkBAIC0yNTEsMTEgJiM0MzsyNTEsMTQgQEAgc3RhdGljIGludCBrY29yZV9yYW1fbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KVxuIHtcbiBcdGludCBuaWQsIHJldDtcbiBcdHVuc2lnbmVkIGxvbmcgZW5kX3BmbjtcbiYjNDM7XHRub2RlbWFza190IG1lbTtcbiBcbiBcdC8qIE5vdCBpbml0aWFsaXplZC4uLi51cGRhdGUgbm93ICovXG4gXHQvKiBmaW5kIG91dCBcJiMzNDttYXggcGZuXCYjMzQ7ICovXG4gXHRlbmRfcGZuID0gMDtcbi1cdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkge1xuJiM0MztcdC8qIEluY2x1ZGUgcHJpdmF0ZSBub2RlIG1lbW9yeSBpbiB0aGUgc2NhbiAqL1xuJiM0MztcdG5vZGVzX29yKG1lbSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XG4mIzQzO1x0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgbWVtKSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgbm9kZV9lbmQ7XG4gXHRcdG5vZGVfZW5kID0gbm9kZV9lbmRfcGZuKG5pZCk7XG4gXHRcdGlmIChlbmRfcGZuIFx1MDAzYyBub2RlX2VuZClcbmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbW11LmMgYi9mcy9wcm9jL3Rhc2tfbW11LmNcbmluZGV4IDgxN2UzZTBmOTE5NDMwLi5lMTE2Y2Q1ZjE1N2I5YSAxMDA2NDRcbi0tLSBhL2ZzL3Byb2MvdGFza19tbXUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvcHJvYy90YXNrX21tdS5jXG5AQCAtMzM4OSw3ICYjNDM7MzM4OSw4IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqY2FuX2dhdGhlcl9udW1hX3N0YXRzKHB0ZV90IHB0ZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuIFx0bmlkID0gcGFnZV90b19uaWQocGFnZSk7XG4tXHRpZiAoIW5vZGVfaXNzZXQobmlkLCBub2RlX3N0YXRlc1tOX01FTU9SWV0pKVxuJiM0MztcdGlmICghbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pKVxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbiBcdHJldHVybiBwYWdlO1xuQEAgLTM0MTQsNyAmIzQzOzM0MTUsOCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmNhbl9nYXRoZXJfbnVtYV9zdGF0c19wbWQocG1kX3QgcG1kLFxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbiBcdG5pZCA9IHBhZ2VfdG9fbmlkKHBhZ2UpO1xuLVx0aWYgKCFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKSlcbiYjNDM7XHRpZiAoIW5vZGVfaXNzZXQobmlkLCBub2RlX3N0YXRlc1tOX01FTU9SWV0pIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSlcbiBcdFx0cmV0dXJuIE5VTEw7XG4gXG4gXHRyZXR1cm4gcGFnZTtcbkBAIC0zNjAyLDYgJiM0MzszNjA0LDEwIEBAIHN0YXRpYyBpbnQgc2hvd19udW1hX21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4gXHRcdGlmIChtZC1cdTAwM2Vub2RlW25pZF0pXG4gXHRcdFx0c2VxX3ByaW50ZihtLCBcJiMzNDsgTiVkPSVsdVwmIzM0OywgbmlkLCBtZC1cdTAwM2Vub2RlW25pZF0pO1xuIFxuJiM0MztcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKVxuJiM0MztcdFx0aWYgKG1kLVx1MDAzZW5vZGVbbmlkXSlcbiYjNDM7XHRcdFx0c2VxX3ByaW50ZihtLCBcJiMzNDsgTiVkPSVsdVwmIzM0OywgbmlkLCBtZC1cdTAwM2Vub2RlW25pZF0pO1xuJiM0MztcbiBcdHNlcV9wcmludGYobSwgXCYjMzQ7IGtlcm5lbHBhZ2VzaXplX2tCPSVsdVwmIzM0Oywgdm1hX2tlcm5lbF9wYWdlc2l6ZSh2bWEpIFx1MDAzZVx1MDAzZSAxMCk7XG4gb3V0OlxuIFx0c2VxX3B1dGMobSwgJiMzOTtcXG4mIzM5Oyk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZnAuaCBiL2luY2x1ZGUvbGludXgvZ2ZwLmhcbmluZGV4IDg3MmJjNTNmMzJlYzg3Li5mM2U4NjdkZTc0NGY2ZCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZ2ZwLmhcbkBAIC0yMDQsOSAmIzQzOzIwNCwxNiBAQCBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9mcmVlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvcmRlcikgeyB9XG4gc3RhdGljIGlubGluZSB2b2lkIGFyY2hfYWxsb2NfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKSB7IH1cbiAjZW5kaWZcbiBcbi1zdHJ1Y3QgZm9saW8gKl9fZm9saW9fYWxsb2Nfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLCBpbnQgcHJlZmVycmVkX25pZCxcbi1cdFx0bm9kZW1hc2tfdCAqbm9kZW1hc2spO1xuLSNkZWZpbmUgX19mb2xpb19hbGxvYyguLi4pXHRcdFx0YWxsb2NfaG9va3MoX19mb2xpb19hbGxvY19ub3Byb2YoX19WQV9BUkdTX18pKVxuJiM0MzsvKiBBbGxvY2F0ZSBmcm9tIGFuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZSAoc2VsZWN0cyB0aGUgcHJpdmF0ZSB6b25lbGlzdCkuICovXG4mIzQzO3N0cnVjdCBwYWdlICphbGxvY19wYWdlc19ub2RlX3ByaXZhdGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuJiM0MztcdFx0aW50IG5pZCk7XG4mIzQzOyNkZWZpbmUgYWxsb2NfcGFnZXNfbm9kZV9wcml2YXRlKC4uLilcdFx0XHRcdFxcXG4mIzQzO1x0YWxsb2NfaG9va3MoYWxsb2NfcGFnZXNfbm9kZV9wcml2YXRlX25vcHJvZihfX1ZBX0FSR1NfXykpXG4mIzQzO1xuJiM0MztzdHJ1Y3QgZm9saW8gKmZvbGlvX2FsbG9jX25vZGVfcHJpdmF0ZV9ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRpbnQgbmlkKTtcbiYjNDM7I2RlZmluZSBmb2xpb19hbGxvY19ub2RlX3ByaXZhdGUoLi4uKVx0XHRcdFx0XFxcbiYjNDM7XHRhbGxvY19ob29rcyhmb2xpb19hbGxvY19ub2RlX3ByaXZhdGVfbm9wcm9mKF9fVkFfQVJHU19fKSlcbiBcbiB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXG4gXHRcdFx0XHRub2RlbWFza190ICpub2RlbWFzaywgaW50IG5yX3BhZ2VzLFxuQEAgLTI1MiwxNCAmIzQzOzI1OSw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB3YXJuX2lmX25vZGVfb2ZmbGluZShpbnQgdGhpc19ub2RlLCBnZnBfdCBnZnBfbWFzaylcbiBcdGR1bXBfc3RhY2soKTtcbiB9XG4gXG4tc3RhdGljIGlubGluZVxuLXN0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub2RlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IG5pZClcbi17XG4tXHR3YXJuX2lmX25vZGVfb2ZmbGluZShuaWQsIGdmcCk7XG4tXG4tXHRyZXR1cm4gX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBOVUxMKTtcbi19XG4tXG4mIzQzO3N0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub2RlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IG5pZCk7XG4gI2RlZmluZSAgX19mb2xpb19hbGxvY19ub2RlKC4uLilcdFx0YWxsb2NfaG9va3MoX19mb2xpb19hbGxvY19ub2RlX25vcHJvZihfX1ZBX0FSR1NfXykpXG4gXG4gLypcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhcbmluZGV4IGFiOGNmYWVjODJkMzFlLi5mNjQ0OGE3M2Q0NjRjOCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG5AQCAtNzM5LDYgJiM0Mzs3MzksOSBAQCBzdGF0aWMgaW5saW5lIHU2NCBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSlcbiBcdGlmICgha3ZtIHx8IGt2bV9hcmNoX3N1cHBvcnRzX2dtZW1faW5pdF9zaGFyZWQoa3ZtKSlcbiBcdFx0ZmxhZ3MgfD0gR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRDtcbiBcbiYjNDM7XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQSkpXG4mIzQzO1x0XHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcbiYjNDM7XG4gXHRyZXR1cm4gZmxhZ3M7XG4gfVxuICNlbmRpZlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaFxuaW5kZXggYjM5NjA1ZDMwODk2MzIuLmZjY2ViMGE0MjM1NzliIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmhcbkBAIC0zMDUsNyAmIzQzOzMwNSwxMCBAQCBleHRlcm4gaW50IGFkZF9tZW1vcnlfcmVzb3VyY2UoaW50IG5pZCwgc3RydWN0IHJlc291cmNlICpyZXNvdXJjZSxcbiBcdFx0XHQgICAgICAgbWhwX3QgbWhwX2ZsYWdzKTtcbiBpbnQgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXG4gXHRcdFx0XHRjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lLCBtaHBfdCBtaHBfZmxhZ3MsXG4tXHRcdFx0XHRlbnVtIG1tb3Agb25saW5lX3R5cGUpO1xuJiM0MztcdFx0XHRcdGVudW0gbW1vcCBvbmxpbmVfdHlwZSwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApO1xuJiM0MztpbnQgYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXG4mIzQzO1x0XHRcdFx0ICAgICAgY29uc3QgY2hhciAqcmVzb3VyY2VfbmFtZSwgbWhwX3QgbWhwX2ZsYWdzLFxuJiM0MztcdFx0XHRcdCAgICAgIGVudW0gbW1vcCBvbmxpbmVfdHlwZSwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApO1xuIGV4dGVybiBpbnQgYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxuIFx0XHRcdFx0ICAgICBjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lLFxuIFx0XHRcdFx0ICAgICBtaHBfdCBtaHBfZmxhZ3MpO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG5pbmRleCA2NWM3MzJkNDQwZDJmNC4uMTM0OGU5ZjVmMmNmOTIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oXG5AQCAtNyw2ICYjNDM7Nyw3IEBAXG4gI2RlZmluZSBfTElOVVhfTUVNUE9MSUNZX0ggMVxuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbXpvbmUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JidHJlZS5oXHUwMDNlXG5AQCAtMTI0LDEwICYjNDM7MTI1LDE1IEBAIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpO1xuIHZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbiBpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4gXHRcdFx0ICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xuJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4mIzQzO1x0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbiB2b2lkIG1wb2xfZnJlZV9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCk7XG4gc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4gXHRcdFx0XHRcdCAgICBwZ29mZl90IGlkeCk7XG4gXG4mIzQzO3N0cnVjdCBtZW1wb2xpY3kgKm1wb2xfcHJpdmF0ZV9iaW5kKGludCBuaWQpO1xuJiM0MztzdHJ1Y3QgbWVtcG9saWN5ICptcG9sX2JpbmRfbm9kZShpbnQgbmlkKTtcbiYjNDM7XG4gc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7XG4gc3RydWN0IG1lbXBvbGljeSAqX19nZXRfdm1hX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBwZ29mZl90ICppbHgpO1xuQEAgLTIyNiw2ICYjNDM7MjMyLDE2IEBAIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IGlkeClcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sX3ByaXZhdGVfYmluZChpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfYmluZF9ub2RlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdm1hX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRcdHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG9yZGVyLCBwZ29mZl90ICppbHgpXG4ge1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oXG5pbmRleCA0YzBkZTc4ODJiYmI2NC4uZjM5MzU3MmQ3NDAxZGEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oXG5AQCAtMjYsNiAmIzQzOzI2LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuIFxuJiM0MztzdHJ1Y3Qgbm9kZV9wcml2YXRlO1xuJiM0MztcbiAvKiBGcmVlIG1lbW9yeSBtYW5hZ2VtZW50IC0gem9uZWQgYnVkZHkgYWxsb2NhdG9yLiAgKi9cbiAjaWZuZGVmIENPTkZJR19BUkNIX0ZPUkNFX01BWF9PUkRFUlxuICNkZWZpbmUgTUFYX1BBR0VfT1JERVIgMTBcbkBAIC0xMzkxLDEzICYjNDM7MTM5MywyMiBAQCBlbnVtIHtcbiAjaWZkZWYgQ09ORklHX05VTUFcbiBcdC8qXG4gXHQgKiBUaGUgTlVNQSB6b25lbGlzdHMgYXJlIGRvdWJsZWQgYmVjYXVzZSB3ZSBuZWVkIHpvbmVsaXN0cyB0aGF0XG4tXHQgKiByZXN0cmljdCB0aGUgYWxsb2NhdGlvbnMgdG8gYSBzaW5nbGUgbm9kZSBmb3IgX19HRlBfVEhJU05PREUuXG4mIzQzO1x0ICogcmVzdHJpY3QgdGhlIGFsbG9jYXRpb25zIHRvIGEgc2luZ2xlIG5vZGUgZm9yIF9fR0ZQX1RISVNOT0RFXG4mIzQzO1x0ICogYW5kIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgKGlzb2xhdGVkIGZyb20gZGVmYXVsdCBsaXN0cykuXG4gXHQgKi9cbiBcdFpPTkVMSVNUX05PRkFMTEJBQ0ssXHQvKiB6b25lbGlzdCB3aXRob3V0IGZhbGxiYWNrIChfX0dGUF9USElTTk9ERSkgKi9cbiYjNDM7XHRaT05FTElTVF9QUklWQVRFLFx0LyogTl9NRU1PUllfUFJJVkFURSBhY2Nlc3MsIGZhbGxzIGJhY2sgdG8gRFJBTSAqL1xuJiM0MztcdFpPTkVMSVNUX1BSSVZBVEVfTk9GQUxMQkFDSywgLyogTl9NRU1PUllfUFJJVkFURSBhY2Nlc3MsIF9fR0ZQX1RISVNOT0RFICovXG4gI2VuZGlmXG4gXHRNQVhfWk9ORUxJU1RTXG4gfTtcbiBcbiYjNDM7I2lmbmRlZiBDT05GSUdfTlVNQVxuJiM0MzsvKiBXaXRob3V0IE5VTUEgb25seSBaT05FTElTVF9GQUxMQkFDSyBleGlzdHMgc28gZXZlcnl0aGluZyBjb2xsYXBzZXMgdGhlcmUgKi9cbiYjNDM7I2RlZmluZSBaT05FTElTVF9QUklWQVRFXHRcdFpPTkVMSVNUX0ZBTExCQUNLXG4mIzQzOyNkZWZpbmUgWk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLXHRaT05FTElTVF9GQUxMQkFDS1xuJiM0MzsjZW5kaWZcbiYjNDM7XG4gLypcbiAgKiBUaGlzIHN0cnVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHpvbmUgaW4gYSB6b25lbGlzdC4gSXQgaXMgc3RvcmVkXG4gICogaGVyZSB0byBhdm9pZCBkZXJlZmVyZW5jZXMgaW50byBsYXJnZSBzdHJ1Y3R1cmVzIGFuZCBsb29rdXBzIG9mIHRhYmxlc1xuQEAgLTE1OTcsMTIgJiM0MzsxNjA4LDI1IEBAIHR5cGVkZWYgc3RydWN0IHBnbGlzdF9kYXRhIHtcbiBcdGF0b21pY19sb25nX3RcdFx0dm1fc3RhdFtOUl9WTV9OT0RFX1NUQVRfSVRFTVNdO1xuICNpZmRlZiBDT05GSUdfTlVNQVxuIFx0c3RydWN0IG1lbW9yeV90aWVyIF9fcmN1ICptZW10aWVyO1xuJiM0MztcdHN0cnVjdCBub2RlX3ByaXZhdGUgX19yY3UgKm5vZGVfcHJpdmF0ZTtcbiAjZW5kaWZcbiAjaWZkZWYgQ09ORklHX01FTU9SWV9GQUlMVVJFXG4gXHRzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfc3RhdHMgbWZfc3RhdHM7XG4gI2VuZGlmXG4gfSBwZ19kYXRhX3Q7XG4gXG4mIzQzOyNpZmRlZiBDT05GSUdfTlVNQVxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGdkYXRfaXNfcHJpdmF0ZShwZ19kYXRhX3QgKnBnZGF0KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuICEhcGdkYXQtXHUwMDNlbm9kZV9wcml2YXRlO1xuJiM0Mzt9XG4mIzQzOyNlbHNlXG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwZ2RhdF9pc19wcml2YXRlKHBnX2RhdGFfdCAqcGdkYXQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7I2VuZGlmXG4mIzQzO1xuICNkZWZpbmUgbm9kZV9wcmVzZW50X3BhZ2VzKG5pZClcdChOT0RFX0RBVEEobmlkKS1cdTAwM2Vub2RlX3ByZXNlbnRfcGFnZXMpXG4gI2RlZmluZSBub2RlX3NwYW5uZWRfcGFnZXMobmlkKVx0KE5PREVfREFUQShuaWQpLVx1MDAzZW5vZGVfc3Bhbm5lZF9wYWdlcylcbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oIGIvaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi42ZjU2OGJjMGQ0NmM3OVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaFxuQEAgLTAsMCAmIzQzOzEsMjYyIEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4mIzQzOyNpZm5kZWYgX0xJTlVYX05PREVfUFJJVkFURV9IXG4mIzQzOyNkZWZpbmUgX0xJTlVYX05PREVfUFJJVkFURV9IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L25vZGVtYXNrLmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0cnVjdCBwYWdlO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUGVyLW5vZGUgc2VydmljZSBvcHQtaW5zIChub2RlX3ByaXZhdGUuY2FwcykuICBBIHByaXZhdGUgbm9kZSBpcyBpc29sYXRlZFxuJiM0MzsgKiBmcm9tIGFsbCBnZW5lcmFsIG1tIHNlcnZpY2VzIGJ5IGRlZmF1bHQ7IHRoZSByZWdpc3RlcmluZyBkcml2ZXIgc2V0cyB0aGVzZVxuJiM0MzsgKiB0byBsZXQgc3BlY2lmaWMgc2VydmljZXMgb3BlcmF0ZSBvbiBpdHMgbm9kZS5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgTk9ERV9QUklWQVRFX0NBUF9SRUNMQUlNXHQoMVVMIFx1MDAzY1x1MDAzYyAwKVx0LyogYWxsb3cgbW0gcmVjbGFpbSAqL1xuJiM0MzsjZGVmaW5lIE5PREVfUFJJVkFURV9DQVBfVVNFUl9OVU1BXHQoMVVMIFx1MDAzY1x1MDAzYyAxKVx0LyogYWxsb3cgbWVtcG9saWN5ICovXG4mIzQzOyNkZWZpbmUgTk9ERV9QUklWQVRFX0NBUF9IT1RVTlBMVUdcdCgxVUwgXHUwMDNjXHUwMDNjIDIpXHQvKiBhbGxvdyBob3QtdW5wbHVnICovXG4mIzQzOyNkZWZpbmUgTk9ERV9QUklWQVRFX0NBUF9ERU1PVElPTlx0KDFVTCBcdTAwM2NcdTAwM2MgMylcdC8qIGFsbG93IHRpZXJpbmcgZGVtb3Rpb24gKi9cbiYjNDM7I2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX05VTUFfQkFMQU5DSU5HXHQoMVVMIFx1MDAzY1x1MDAzYyA0KVx0LyogYWxsb3cgTlVNQSBiYWxhbmNpbmcgKi9cbiYjNDM7I2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX0xUUElOXHRcdCgxVUwgXHUwMDNjXHUwMDNjIDUpXHQvKiBhbGxvdyBHVVAgcGlucyAqL1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHN0cnVjdCBub2RlX3ByaXZhdGUgLSBQZXItbm9kZSBjb250YWluZXIgZm9yIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXNcbiYjNDM7ICpcbiYjNDM7ICogQWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIgYW5kIHBhc3NlZCB0byBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoKS5cbiYjNDM7ICogVGhlIGRyaXZlciBvd25zIHRoZSBtZW1vcnkgYW5kIG11c3QgZW5zdXJlIGl0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXJcbiYjNDM7ICogbm9kZV9wcml2YXRlX3VucmVnaXN0ZXIoKSByZXR1cm5zLlxuJiM0MzsgKlxuJiM0MzsgKiBAb3duZXI6IE9wYXF1ZSBkcml2ZXIgaWRlbnRpZmllclxuJiM0MzsgKiBAY2FwczogTk9ERV9QUklWQVRFX0NBUF8qIHNlcnZpY2Ugb3B0LWlucyBmb3IgdGhlIG5vZGUgKHplcm8gYnkgZGVmYXVsdDtcbiYjNDM7ICpcdCAgaW5kaXZpZHVhbCBjYXBhYmlsaXRpZXMgYXJlIGRlZmluZWQgYW5kIGNvbnN1bWVkIGJ5IGxhdGVyIGNoYW5nZXMpXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3Qgbm9kZV9wcml2YXRlIHtcbiYjNDM7XHR2b2lkICpvd25lcjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGNhcHM7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjaWZkZWYgQ09ORklHX05VTUFcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbW16b25lLmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19pc19wcml2YXRlX25vZGUoc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBub2RlX3N0YXRlKGZvbGlvX25pZChmb2xpbyksIE5fTUVNT1JZX1BSSVZBVEUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9pc19wcml2YXRlX25vZGUoc3RydWN0IHBhZ2UgKnBhZ2UpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbm9kZV9zdGF0ZShwYWdlX3RvX25pZChwYWdlKSwgTl9NRU1PUllfUFJJVkFURSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2lzX3ByaXZhdGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBub2RlX2FsbG93c19yZWNsYWltIC0gbWF5IHRoZSBtbSByZWNsYWltIGZyb20gdGhpcyBub2RlP1xuJiM0MzsgKiBAbmlkOiB0aGUgbm9kZSB0byB0ZXN0XG4mIzQzOyAqXG4mIzQzOyAqIE9ubHkgYSBwcml2YXRlIG5vZGUgaXMgZXZlciBleGNsdWRlZC4gIEV2ZXJ5IG90aGVyIG5vZGUgY2FuIHNhZmVseVxuJiM0MzsgKiBiZSBvcGVyYXRlZCBvbiBieSByZWNsYWltLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX3JlY2xhaW0oaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xuJiM0MztcdGJvb2wgcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS1cdTAwM2Vub2RlX3ByaXZhdGUpO1xuJiM0MztcdHJldCA9IG5wIFx1MDAyNlx1MDAyNiAobnAtXHUwMDNlY2FwcyBcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9SRUNMQUlNKTtcbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbm9kZV9hbGxvd3NfdXNlcl9udW1hIC0gbWF5IHVzZXJzcGFjZSBwbGFjZSBvciBtaWdyYXRlIG1lbW9yeSBoZXJlP1xuJiM0MzsgKiBAbmlkOiB0aGUgbm9kZSB0byB0ZXN0XG4mIzQzOyAqXG4mIzQzOyAqIEdhdGUgYWxsIHVzZXJzcGFjZS1kaXJlY3RlZCBtZW1vcnkgb3BlcmF0aW9ucyBvbiBhIHByaXZhdGUgbm9kZS5cbiYjNDM7ICogICAtIG1iaW5kKCkvc2V0X21lbXBvbGljeSgpXG4mIzQzOyAqICAgLSBtb3ZlX3BhZ2VzKCkvbWlncmF0ZV9wYWdlcygpXG4mIzQzOyAqXG4mIzQzOyAqIHJldHVybjogdHJ1ZSBmb3IgTl9NRU1PUlkgYW5kIE5fTUVNT1JZX1BSSVZBVEUgd2l0aCBDQVBfVVNFUl9OVU1BLlxuJiM0MzsgKiAgICAgICAgIGZhbHNlIGZvciBtZW1vcnlsZXNzIG9yIG9wdGVkLW91dCBwcml2YXRlIG5vZGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfdXNlcl9udW1hKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDtcbiYjNDM7XHRib29sIHJldDtcbiYjNDM7XG4mIzQzO1x0aWYgKG5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0bnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktXHUwMDNlbm9kZV9wcml2YXRlKTtcbiYjNDM7XHRyZXQgPSBucCBcdTAwMjZcdTAwMjYgKG5wLVx1MDAzZWNhcHMgXHUwMDI2IE5PREVfUFJJVkFURV9DQVBfVVNFUl9OVU1BKTtcbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbm9kZV9hbGxvd3NfaG90dW5wbHVnIC0gbWF5IGhvdC11bnBsdWcgbWlncmF0ZSB0aGlzIG5vZGUmIzM5O3MgZm9saW9zP1xuJiM0MzsgKiBAbmlkOiB0aGUgbm9kZSB0byB0ZXN0XG4mIzQzOyAqXG4mIzQzOyAqIFRydWUgZm9yIG5vcm1hbCBub2RlcyBhbmQgcHJpdmF0ZSBub2RlcyBvcHRlZCBpbnRvIENBUF9IT1RVTlBMVUcuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfaG90dW5wbHVnKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDtcbiYjNDM7XHRib29sIHJldDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0bnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktXHUwMDNlbm9kZV9wcml2YXRlKTtcbiYjNDM7XHRyZXQgPSBucCBcdTAwMjZcdTAwMjYgKG5wLVx1MDAzZWNhcHMgXHUwMDI2IE5PREVfUFJJVkFURV9DQVBfSE9UVU5QTFVHKTtcbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbm9kZV9hbGxvd3NfZGVtb3Rpb24gLSBtYXkga2VybmVsIHRpZXJpbmcgZGVtb3RlIHRvIHRoaXMgbm9kZT9cbiYjNDM7ICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdFxuJiM0MzsgKlxuJiM0MzsgKiBHb3Zlcm5zIHdoZXRoZXIgYSBwcml2YXRlIG5vZGUgcGFydGljaXBhdGVzIGluIHRoZSBkZW1vdGlvbiBoaWVyYXJjaHkuXG4mIzQzOyAqIERlbW90aW9uIGFjY3VtdWxhdGVzIHBhZ2VzIG9uIHRoZSBub2RlLCBzbyBDQVBfREVNT1RJT04gcmVxdWlyZXMgQ0FQX1JFQ0xBSU1cbiYjNDM7ICogKGVuZm9yY2VkIGF0IHJlZ2lzdHJhdGlvbikgYXMgYSBzYWZldHkgdmFsdmUuXG4mIzQzOyAqXG4mIzQzOyAqIHJldHVybjogdHJ1ZSBmb3Igbm9ybWFsIG5vZGVzIGFuZCBwcml2YXRlIG5vZGVzIG9wdGVkIGludG8gQ0FQX0RFTU9USU9OLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2RlbW90aW9uKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDtcbiYjNDM7XHRib29sIHJldDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0bnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktXHUwMDNlbm9kZV9wcml2YXRlKTtcbiYjNDM7XHRyZXQgPSBucCBcdTAwMjZcdTAwMjYgKG5wLVx1MDAzZWNhcHMgXHUwMDI2IE5PREVfUFJJVkFURV9DQVBfREVNT1RJT04pO1xuJiM0MztcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBub2RlX2FsbG93c19udW1hX2JhbGFuY2luZyAtIG1heSBOVU1BIGJhbGFuY2luZyBzY2FuL21pZ3JhdGUgdGhpcyBub2RlP1xuJiM0MzsgKiBAbmlkOiB0aGUgbm9kZSB0byB0ZXN0XG4mIzQzOyAqXG4mIzQzOyAqIEFjY2Vzcy1iYXNlZCBwcm9tb3Rpb24vbWlncmF0aW9uLiAgVW5saWtlIGRlbW90aW9uIHRoaXMgaXMgbm90IHJlY2xhaW0tZHJpdmVuLFxuJiM0MzsgKiBzbyBDQVBfTlVNQV9CQUxBTkNJTkcgc3RhbmRzIGFsb25lIChubyBDQVBfUkVDTEFJTSBkZXBlbmRlbmN5KS5cbiYjNDM7ICpcbiYjNDM7ICogcmV0dXJuOiB0cnVlIGZvciBub3JtYWwgbm9kZXMgYW5kIHByaXZhdGUgbm9kZXMgb3B0ZWQgaW50byBDQVBfTlVNQV9CQUxBTkNJTkcuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfbnVtYV9iYWxhbmNpbmcoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xuJiM0MztcdGJvb2wgcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS1cdTAwM2Vub2RlX3ByaXZhdGUpO1xuJiM0MztcdHJldCA9IG5wIFx1MDAyNlx1MDAyNiAobnAtXHUwMDNlY2FwcyBcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9OVU1BX0JBTEFOQ0lORyk7XG4mIzQzO1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG5vZGVfYWxsb3dzX2x0cGluIC0gbWF5IGEgZm9saW8gb24gdGhpcyBub2RlIGJlIGxvbmctdGVybSBHVVAtcGlubmVkP1xuJiM0MzsgKiBAbmlkOiB0aGUgbm9kZSB0byB0ZXN0XG4mIzQzOyAqXG4mIzQzOyAqIE9wdGVkLW91dCBwcml2YXRlIG5vZGVzIGNhdXNlIGxvbmd0ZXJtIHBpbnMgdG8gb3V0cmlnaHQgZmFpbCByZWdhcmRsZXNzXG4mIzQzOyAqIG9mIFpPTkUgcGxhY2VtZW50IChOT1JNQUwgd291bGQgYWxsb3csIE1PVkFCTEUgd291bGQgbWlncmF0ZSBmaXJzdCkuXG4mIzQzOyAqXG4mIzQzOyAqIE9wdGVkLWluIHByaXZhdGUgbm9kZXMgYWxsb3cgbG9uZ3Rlcm0gcGlucyB0byBvcGVyYXRlIG5vcm1hbGx5LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2x0cGluKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDtcbiYjNDM7XHRib29sIHJldDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0bnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktXHUwMDNlbm9kZV9wcml2YXRlKTtcbiYjNDM7XHRyZXQgPSBucCBcdTAwMjZcdTAwMjYgKG5wLVx1MDAzZWNhcHMgXHUwMDI2IE5PREVfUFJJVkFURV9DQVBfTFRQSU4pO1xuJiM0MztcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNlbHNlIC8qICFDT05GSUdfTlVNQSAqL1xuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX2lzX3ByaXZhdGVfbm9kZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9pc19wcml2YXRlX25vZGUoc3RydWN0IHBhZ2UgKnBhZ2UpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2lzX3ByaXZhdGUoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX3JlY2xhaW0oaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfdXNlcl9udW1hKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2hvdHVucGx1ZyhpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19kZW1vdGlvbihpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19udW1hX2JhbGFuY2luZyhpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19sdHBpbihpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xuJiM0MztcbiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX05VTUEpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRylcbiYjNDM7XG4mIzQzO2ludCBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoaW50IG5pZCwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApO1xuJiM0MztpbnQgbm9kZV9wcml2YXRlX3VucmVnaXN0ZXIoaW50IG5pZCk7XG4mIzQzO1xuJiM0MzsjZWxzZSAvKiAhQ09ORklHX05VTUEgfHwgIUNPTkZJR19NRU1PUllfSE9UUExVRyAqL1xuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgbm9kZV9wcml2YXRlX3JlZ2lzdGVyKGludCBuaWQsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2VuZGlmIC8qIENPTkZJR19OVU1BIFx1MDAyNlx1MDAyNiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi9cbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBfTElOVVhfTk9ERV9QUklWQVRFX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmggYi9pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmhcbmluZGV4IGI4NDJhYTUyNTU0NjQ0Li5iYTNlNmM1NzBhMTEyZCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbm9kZW1hc2suaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ub2RlbWFzay5oXG5AQCAtMzkxLDYgJiM0MzszOTEsNyBAQCBlbnVtIG5vZGVfc3RhdGVzIHtcbiBcdE5fSElHSF9NRU1PUlkgPSBOX05PUk1BTF9NRU1PUlksXG4gI2VuZGlmXG4gXHROX01FTU9SWSxcdFx0LyogVGhlIG5vZGUgaGFzIG1lbW9yeShyZWd1bGFyLCBoaWdoLCBtb3ZhYmxlKSAqL1xuJiM0MztcdE5fTUVNT1JZX1BSSVZBVEUsXHQvKiBUaGUgbm9kZSYjMzk7cyBtZW1vcnkgaXMgcHJpdmF0ZSAqL1xuIFx0Tl9DUFUsXHRcdC8qIFRoZSBub2RlIGhhcyBvbmUgb3IgbW9yZSBjcHVzICovXG4gXHROX0dFTkVSSUNfSU5JVElBVE9SLFx0LyogVGhlIG5vZGUgaGFzIG9uZSBvciBtb3JlIEdlbmVyaWMgSW5pdGlhdG9ycyAqL1xuIFx0TlJfTk9ERV9TVEFURVNcbkBAIC00NTcsNyAmIzQzOzQ1OCw3IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBub2RlX3NldF9vZmZsaW5lKGludCBuaWQpXG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgbm9kZV9zdGF0ZShpbnQgbm9kZSwgZW51bSBub2RlX3N0YXRlcyBzdGF0ZSlcbiB7XG4tXHRyZXR1cm4gbm9kZSA9PSAwO1xuJiM0MztcdHJldHVybiBub2RlID09IDAgXHUwMDI2XHUwMDI2IHN0YXRlICE9IE5fTUVNT1JZX1BSSVZBVEU7XG4gfVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBub2RlX3NldF9zdGF0ZShpbnQgbm9kZSwgZW51bSBub2RlX3N0YXRlcyBzdGF0ZSlcbkBAIC00NzAsMTEgJiM0Mzs0NzEsMTEgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIG5vZGVfY2xlYXJfc3RhdGUoaW50IG5vZGUsIGVudW0gbm9kZV9zdGF0ZXMgc3RhdGUpXG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgbnVtX25vZGVfc3RhdGUoZW51bSBub2RlX3N0YXRlcyBzdGF0ZSlcbiB7XG4tXHRyZXR1cm4gMTtcbiYjNDM7XHRyZXR1cm4gc3RhdGUgPT0gTl9NRU1PUllfUFJJVkFURSA/IDAgOiAxO1xuIH1cbiBcbiAjZGVmaW5lIGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgX19zdGF0ZSkgXFxcbi1cdGZvciAoIChub2RlKSA9IDA7IChub2RlKSA9PSAwOyAobm9kZSkgPSAxKVxuJiM0MztcdGZvciAoKG5vZGUpID0gMDsgKG5vZGUpID09IDAgXHUwMDI2XHUwMDI2IChfX3N0YXRlKSAhPSBOX01FTU9SWV9QUklWQVRFOyAobm9kZSkgPSAxKVxuIFxuICNkZWZpbmUgZmlyc3Rfb25saW5lX25vZGVcdDBcbiAjZGVmaW5lIGZpcnN0X21lbW9yeV9ub2RlXHQwXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG5pbmRleCA0MTkwMTEwOTdmYThlMi4uYThmZjE1MGUyY2JiNzcgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaFxuQEAgLTE2NTQsMTEgJiM0MzsxNjU0LDE0IEBAIHN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xuICNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFx0XHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRURcdCgxVUxMIFx1MDAzY1x1MDAzYyAxKVxuJiM0MzsjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFXHQoMVVMTCBcdTAwM2NcdTAwM2MgMilcbiBcbiBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCB7XG4gXHRfX3U2NCBzaXplO1xuIFx0X191NjQgZmxhZ3M7XG4tXHRfX3U2NCByZXNlcnZlZFs2XTtcbiYjNDM7XHRfX3UzMiBub2RlO1xuJiM0MztcdF9fdTMyIHBhZDtcbiYjNDM7XHRfX3U2NCByZXNlcnZlZFs1XTtcbiB9O1xuIFxuICNkZWZpbmUgS1ZNX1BSRV9GQVVMVF9NRU1PUllcdF9JT1dSKEtWTUlPLCAweGQ1LCBzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21lbXBvbGljeS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21lbXBvbGljeS5oXG5pbmRleCA3ZjZmYzk1OTk2OTNiNi4uODdhZjE4Yzg0Yjk0NzUgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbWVtcG9saWN5LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9tZW1wb2xpY3kuaFxuQEAgLTY3LDYgJiM0Mzs2Nyw3IEBAIGVudW0gbWVtcG9saWN5X21vZGUge1xuICNkZWZpbmUgTVBPTF9GX1NIQVJFRCAgKDEgXHUwMDNjXHUwMDNjIDApXHQvKiBpZGVudGlmeSBzaGFyZWQgcG9saWNpZXMgKi9cbiAjZGVmaW5lIE1QT0xfRl9NT0ZcdCgxIFx1MDAzY1x1MDAzYyAzKSAvKiB0aGlzIHBvbGljeSB3YW50cyBtaWdyYXRlIG9uIGZhdWx0ICovXG4gI2RlZmluZSBNUE9MX0ZfTU9ST05cdCgxIFx1MDAzY1x1MDAzYyA0KSAvKiBNaWdyYXRlIE9uIHByb3Rub25lIFJlZmVyZW5jZSBPbiBOb2RlICovXG4mIzQzOyNkZWZpbmUgTVBPTF9GX1BSSVZBVEVcdCgxIFx1MDAzY1x1MDAzYyA1KSAvKiBub2RlbWFzayBjb250YWlucyBwcml2YXRlIG5vZGVzICovXG4gXG4gLypcbiAgKiBFbmFibGluZyB6b25lIHJlY2xhaW0gbWVhbnMgdGhlIHBhZ2UgYWxsb2NhdG9yIHdpbGwgYXR0ZW1wdCB0byBmdWxmaWxsXG5kaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC9jcHVzZXQuYyBiL2tlcm5lbC9jZ3JvdXAvY3B1c2V0LmNcbmluZGV4IGVlNDAyNWI5NzA3YTIyLi43OGE0Zjk0ODU2NTYwZCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9jZ3JvdXAvY3B1c2V0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9jZ3JvdXAvY3B1c2V0LmNcbkBAIC0yNiw2ICYjNDM7MjYsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbXBvbGljeS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L25vZGVfcHJpdmF0ZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcmN1cGRhdGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9kZWFkbGluZS5oXHUwMDNlXG5AQCAtMzg3Miw3ICYjNDM7Mzg3Myw4IEBAIHN0YXRpYyB2b2lkIGNwdXNldF9oYW5kbGVfaG90cGx1Zyh2b2lkKVxuIFx0c3RhdGljIERFQ0xBUkVfV09SSyhoa19zZF93b3JrLCBoa19zZF93b3JrZm4pO1xuIFx0c3RhdGljIGNwdW1hc2tfdCBuZXdfY3B1cztcbiBcdHN0YXRpYyBub2RlbWFza190IG5ld19tZW1zO1xuLVx0Ym9vbCBjcHVzX3VwZGF0ZWQsIG1lbXNfdXBkYXRlZDtcbiYjNDM7XHRzdGF0aWMgbm9kZW1hc2tfdCBwcmV2X3ByaXZfbWVtcztcbiYjNDM7XHRib29sIGNwdXNfdXBkYXRlZCwgbWVtc191cGRhdGVkLCBwcml2X3NocmFuaztcbiBcdGJvb2wgb25fZGZsID0gaXNfaW5fdjJfbW9kZSgpO1xuIFx0c3RydWN0IHRtcG1hc2tzIHRtcCwgKnB0bXAgPSBOVUxMO1xuIFxuQEAgLTM4OTUsNiAmIzQzOzM4OTcsMTQgQEAgc3RhdGljIHZvaWQgY3B1c2V0X2hhbmRsZV9ob3RwbHVnKHZvaWQpXG4gXHRcdCAgICAgICAhY3B1bWFza19lbXB0eShzdWJwYXJ0aXRpb25zX2NwdXMpO1xuIFx0bWVtc191cGRhdGVkID0gIW5vZGVzX2VxdWFsKHRvcF9jcHVzZXQuZWZmZWN0aXZlX21lbXMsIG5ld19tZW1zKTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFByaXZhdGUgbm9kZXMgYXJlIG5vdCBwYXJ0aXRpb25lZCBieSBjcHVzZXQsIGJ1dCBpZiBvbmUgbGVhdmVzXG4mIzQzO1x0ICogTl9NRU1PUllfUFJJVkFURSB3ZSBzdGlsbCBuZWVkIHRvIHJ1biBtcG9sX3JlYmluZF8qIHRvIGNsZWFuIHVwXG4mIzQzO1x0ICogbWVtcG9saWNpZXMgdGhhdCBhcmUgYmluZGluZyB0aGVtLlxuJiM0MztcdCAqL1xuJiM0MztcdHByaXZfc2hyYW5rID0gIW5vZGVzX3N1YnNldChwcmV2X3ByaXZfbWVtcywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xuJiM0MztcdHByZXZfcHJpdl9tZW1zID0gbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV07XG4mIzQzO1xuIFx0LyogRm9yIHYxLCBzeW5jaHJvbml6ZSBjcHVzX2FsbG93ZWQgdG8gY3B1X2FjdGl2ZV9tYXNrICovXG4gXHRpZiAoY3B1c191cGRhdGVkKSB7XG4gXHRcdGNwdXNldF9mb3JjZV9yZWJ1aWxkKCk7XG5AQCAtMzkyNyw5ICYjNDM7MzkzNywxMiBAQCBzdGF0aWMgdm9pZCBjcHVzZXRfaGFuZGxlX2hvdHBsdWcodm9pZClcbiBcdFx0XHR0b3BfY3B1c2V0Lm1lbXNfYWxsb3dlZCA9IG5ld19tZW1zO1xuIFx0XHR0b3BfY3B1c2V0LmVmZmVjdGl2ZV9tZW1zID0gbmV3X21lbXM7XG4gXHRcdHNwaW5fdW5sb2NrX2lycShcdTAwMjZjYWxsYmFja19sb2NrKTtcbi1cdFx0Y3B1c2V0X3VwZGF0ZV90YXNrc19ub2RlbWFzayhcdTAwMjZ0b3BfY3B1c2V0KTtcbiBcdH1cbiBcbiYjNDM7XHQvKiBSZWJpbmQgdGFzayBtZW1wb2xpY2llcyBpZiBhbnkgbWVtb3J5IG5vZGUgY2hhbmdlZCBzdGF0ZSAqL1xuJiM0MztcdGlmIChtZW1zX3VwZGF0ZWQgfHwgcHJpdl9zaHJhbmspXG4mIzQzO1x0XHRjcHVzZXRfdXBkYXRlX3Rhc2tzX25vZGVtYXNrKFx1MDAyNnRvcF9jcHVzZXQpO1xuJiM0MztcbiBcdG11dGV4X3VubG9jayhcdTAwMjZjcHVzZXRfbXV0ZXgpO1xuIFxuIFx0LyogaWYgY3B1cyBvciBtZW1zIGNoYW5nZWQsIHdlIG5lZWQgdG8gcHJvcGFnYXRlIHRvIGRlc2NlbmRhbnRzICovXG5AQCAtNDE2MCwxMSAmIzQzOzQxNzMsMTMgQEAgbm9kZW1hc2tfdCBjcHVzZXRfbWVtc19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxuICAqIGNwdXNldF9ub2RlbWFza192YWxpZF9tZW1zX2FsbG93ZWQgLSBjaGVjayBub2RlbWFzayB2cy4gY3VycmVudCBtZW1zX2FsbG93ZWRcbiAgKiBAbm9kZW1hc2s6IHRoZSBub2RlbWFzayB0byBiZSBjaGVja2VkXG4gICpcbi0gKiBBcmUgYW55IG9mIHRoZSBub2RlcyBpbiB0aGUgbm9kZW1hc2sgYWxsb3dlZCBpbiBjdXJyZW50LVx1MDAzZW1lbXNfYWxsb3dlZD9cbiYjNDM7ICogQXJlIGFueSBvZiB0aGUgbm9kZXMgaW4gdGhlIG5vZGVtYXNrIHVzYWJsZT8gIE5fTUVNT1JZIG5vZGVzIG11c3QgYmUgaW5cbiYjNDM7ICogY3VycmVudC1cdTAwM2VtZW1zX2FsbG93ZWQsIHdoaWxlIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgYXJlIGFsd2F5cyB2YWxpZC5cbiAgKi9cbiBpbnQgY3B1c2V0X25vZGVtYXNrX3ZhbGlkX21lbXNfYWxsb3dlZChjb25zdCBub2RlbWFza190ICpub2RlbWFzaylcbiB7XG4tXHRyZXR1cm4gbm9kZXNfaW50ZXJzZWN0cygqbm9kZW1hc2ssIGN1cnJlbnQtXHUwMDNlbWVtc19hbGxvd2VkKTtcbiYjNDM7XHRyZXR1cm4gbm9kZXNfaW50ZXJzZWN0cygqbm9kZW1hc2ssIGN1cnJlbnQtXHUwMDNlbWVtc19hbGxvd2VkKSB8fFxuJiM0MztcdCAgICAgICBub2Rlc19pbnRlcnNlY3RzKCpub2RlbWFzaywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xuIH1cbiBcbiAvKlxuQEAgLTQyMjgsNiAmIzQzOzQyNDMsOSBAQCBib29sIGNwdXNldF9jdXJyZW50X25vZGVfYWxsb3dlZChpbnQgbm9kZSwgZ2ZwX3QgZ2ZwX21hc2spXG4gXG4gXHRpZiAoaW5faW50ZXJydXB0KCkpXG4gXHRcdHJldHVybiB0cnVlO1xuJiM0MztcdC8qIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgYXJlIG5vdCBwYXJ0aXRpb25lZCBieSBjcHVzZXRzLm1lbXMgKi9cbiYjNDM7XHRpZiAobm9kZV9pc19wcml2YXRlKG5vZGUpKVxuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4gXHRpZiAobm9kZV9pc3NldChub2RlLCBjdXJyZW50LVx1MDAzZW1lbXNfYWxsb3dlZCkpXG4gXHRcdHJldHVybiB0cnVlO1xuIFx0LypcbmRpZmYgLS1naXQgYS9tbS9jb21wYWN0aW9uLmMgYi9tbS9jb21wYWN0aW9uLmNcbmluZGV4IDlmODEwNTVhMzU4ZWQxLi5iOWMyNWM1OTk3MzJmZCAxMDA2NDRcbi0tLSBhL21tL2NvbXBhY3Rpb24uY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vY29tcGFjdGlvbi5jXG5AQCAtMjUsNiAmIzQzOzI1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wc2kuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdXNldC5oXHUwMDNlXG4gI2luY2x1ZGUgXCYjMzQ7cGFnZV9hbGxvYy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L25vZGVfcHJpdmF0ZS5oXHUwMDNlXG4gI2luY2x1ZGUgXCYjMzQ7aW50ZXJuYWwuaFwmIzM0O1xuIFxuICNpZmRlZiBDT05GSUdfQ09NUEFDVElPTlxuQEAgLTI0NjIsNiAmIzQzOzI0NjMsOSBAQCBib29sIGNvbXBhY3Rpb25fem9uZWxpc3Rfc3VpdGFibGUoc3RydWN0IGFsbG9jX2NvbnRleHQgKmFjLCBpbnQgb3JkZXIsXG4gXHRcdCAgICAhX19jcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIGdmcF9tYXNrKSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbiYjNDM7XHRcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbSh6b25lX3RvX25pZCh6b25lKSkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiBcdFx0LypcbiBcdFx0ICogRG8gbm90IGNvbnNpZGVyIGFsbCB0aGUgcmVjbGFpbWFibGUgbWVtb3J5IGJlY2F1c2Ugd2UgZG8gbm90XG4gXHRcdCAqIHdhbnQgdG8gdHJhc2gganVzdCBmb3IgYSBzaW5nbGUgaGlnaCBvcmRlciBhbGxvY2F0aW9uIHdoaWNoXG5AQCAtMjg1Myw2ICYjNDM7Mjg1Nyw5IEBAIGVudW0gY29tcGFjdF9yZXN1bHQgdHJ5X3RvX2NvbXBhY3RfcGFnZXMoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcixcbiBcdFx0XHQhX19jcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIGdmcF9tYXNrKSlcbiBcdFx0XHRcdGNvbnRpbnVlO1xuIFxuJiM0MztcdFx0aWYgKCFub2RlX2FsbG93c19yZWNsYWltKHpvbmVfdG9fbmlkKHpvbmUpKSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuIFx0XHRpZiAocHJpbyBcdTAwM2UgTUlOX0NPTVBBQ1RfUFJJT1JJVFlcbiBcdFx0XHRcdFx0XHUwMDI2XHUwMDI2IGNvbXBhY3Rpb25fZGVmZXJyZWQoem9uZSwgb3JkZXIpKSB7XG4gXHRcdFx0cmMgPSBtYXhfdChlbnVtIGNvbXBhY3RfcmVzdWx0LCBDT01QQUNUX0RFRkVSUkVELCByYyk7XG5AQCAtMjkyMiw2ICYjNDM7MjkyOSw5IEBAIHN0YXRpYyBpbnQgY29tcGFjdF9ub2RlKHBnX2RhdGFfdCAqcGdkYXQsIGJvb2wgcHJvYWN0aXZlKVxuIFx0XHQucHJvYWN0aXZlX2NvbXBhY3Rpb24gPSBwcm9hY3RpdmUsXG4gXHR9O1xuIFxuJiM0MztcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbShwZ2RhdC1cdTAwM2Vub2RlX2lkKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiBcdGZvciAoem9uZWlkID0gMDsgem9uZWlkIFx1MDAzYyBNQVhfTlJfWk9ORVM7IHpvbmVpZCYjNDM7JiM0MzspIHtcbiBcdFx0em9uZSA9IFx1MDAyNnBnZGF0LVx1MDAzZW5vZGVfem9uZXNbem9uZWlkXTtcbiBcdFx0aWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSlcbkBAIC0zMDE3LDYgJiM0MzszMDI3LDkgQEAgc3RhdGljIHNzaXplX3QgY29tcGFjdF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsXG4ge1xuIFx0aW50IG5pZCA9IGRldi1cdTAwM2VpZDtcbiBcbiYjNDM7XHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0obmlkKSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiBcdGlmIChuaWQgXHUwMDNlPSAwIFx1MDAyNlx1MDAyNiBuaWQgXHUwMDNjIG5yX25vZGVfaWRzIFx1MDAyNlx1MDAyNiBub2RlX29ubGluZShuaWQpKSB7XG4gXHRcdC8qIEZsdXNoIHBlbmRpbmcgdXBkYXRlcyB0byB0aGUgTFJVIGxpc3RzICovXG4gXHRcdGxydV9hZGRfZHJhaW5fYWxsKCk7XG5kaWZmIC0tZ2l0IGEvbW0vZGFtb24vcGFkZHIuYyBiL21tL2RhbW9uL3BhZGRyLmNcbmluZGV4IGU0Zjk4ZDY3NDYxZjUwLi5iNjY4Y2Y1NWQxYjY3MyAxMDA2NDRcbi0tLSBhL21tL2RhbW9uL3BhZGRyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2RhbW9uL3BhZGRyLmNcbkBAIC0xMiw2ICYjNDM7MTIsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW1faW5saW5lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcJiMzNDsuLi9pbnRlcm5hbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7b3BzLWNvbW1vbi5oXCYjMzQ7XG5AQCAtMjUwLDYgJiM0MzsyNTEsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZGFtb25fcGFfcGFnZW91dChzdHJ1Y3QgZGFtb25fcmVnaW9uICpyLFxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG4gXG4mIzQzO1x0XHQvKiBEQU1PUyBwYWdlb3V0IGlzIHJlY2xhaW07IGdhdGUgYSBwcml2YXRlIG5vZGUgb24gQ0FQX1JFQ0xBSU0gKi9cbiYjNDM7XHRcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbShmb2xpb19uaWQoZm9saW8pKSlcbiYjNDM7XHRcdFx0Z290byBwdXRfZm9saW87XG4mIzQzO1xuIFx0XHRpZiAoZGFtb3NfcGFfZmlsdGVyX291dChzLCBmb2xpbykpXG4gXHRcdFx0Z290byBwdXRfZm9saW87XG4gXHRcdGVsc2VcbkBAIC0zNDQsNiAmIzQzOzM0OSwxMCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBkYW1vbl9wYV9taWdyYXRlKHN0cnVjdCBkYW1vbl9yZWdpb24gKnIsXG4gXHRcdGVsc2VcbiBcdFx0XHQqc3pfZmlsdGVyX3Bhc3NlZCAmIzQzOz0gZm9saW9fc2l6ZShmb2xpbykgLyBhZGRyX3VuaXQ7XG4gXG4mIzQzO1x0XHQvKiBwcml2YXRlIG5vZGVzIGRvIG5vdCBzdXBwb3J0IG1pZ3JhdGlvbiBieSBkZWZhdWx0ICovXG4mIzQzO1x0XHRpZiAoZm9saW9faXNfcHJpdmF0ZV9ub2RlKGZvbGlvKSlcbiYjNDM7XHRcdFx0Z290byBwdXRfZm9saW87XG4mIzQzO1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSlcbiBcdFx0XHRnb3RvIHB1dF9mb2xpbztcbiBcdFx0bGlzdF9hZGQoXHUwMDI2Zm9saW8tXHUwMDNlbHJ1LCBcdTAwMjZmb2xpb19saXN0KTtcbmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jXG5pbmRleCA5OTkwMmMxNTcwM2IwMS4uODIxODM5YjcxM2JiNDUgMTAwNjQ0XG4tLS0gYS9tbS9ndXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwLmNcbkBAIC01NDcsMTAgJiM0Mzs1NDcsMTEgQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqdHJ5X2dyYWJfZm9saW9fZmFzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHJlZnMsXG4gXHQvKlxuIFx0ICogQ2FuJiMzOTt0IGRvIEZPTExfTE9OR1RFUk0gJiM0MzsgRk9MTF9QSU4gZ3VwIGZhc3QgcGF0aCBpZiBub3QgaW4gYVxuIFx0ICogcmlnaHQgem9uZSwgc28gZmFpbCBhbmQgbGV0IHRoZSBjYWxsZXIgZmFsbCBiYWNrIHRvIHRoZSBzbG93XG4tXHQgKiBwYXRoLlxuJiM0MztcdCAqIHBhdGguICBGYWlsIGZvciBub24tb3B0ZWQtaW4gcHJpdmF0ZSBub2RlIGZvbGlvcyBoZXJlIHNvIHRoZVxuJiM0MztcdCAqIHNsb3cgcGF0aCBjYW4gcmVqZWN0IHRoZSBwaW4gZW50aXJlbHkuXG4gXHQgKi9cbiBcdGlmICh1bmxpa2VseSgoZmxhZ3MgXHUwMDI2IEZPTExfTE9OR1RFUk0pIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgICFmb2xpb19pc19sb25ndGVybV9waW5uYWJsZShmb2xpbykpKSB7XG4mIzQzO1x0XHQgICAgICFmb2xpb19hbGxvd3NfbG9uZ3Rlcm1fcGluKGZvbGlvKSkpIHtcbiBcdFx0Zm9saW9fcHV0X3JlZnMoZm9saW8sIHJlZnMpO1xuIFx0XHRyZXR1cm4gTlVMTDtcbiBcdH1cbkBAIC0yMzgyLDEyICYjNDM7MjM4MywzNSBAQCBtaWdyYXRlX2xvbmd0ZXJtX3VucGlubmFibGVfZm9saW9zKHN0cnVjdCBsaXN0X2hlYWQgKm1vdmFibGVfZm9saW9fbGlzdCxcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBUcnVlIGlmIGFueSBmb2xpbyBzaXRzIG9uIGEgcHJpdmF0ZSBub2RlIHdob3NlIGZvbGlvcyBtYXkgbm90IGJlIGxvbmd0ZXJtXG4mIzQzOyAqIHBpbm5lZC4gIFN1Y2ggZm9saW9zIGNhbiBuZWl0aGVyIGJlIHBpbm5lZCBub3IgbWlncmF0ZWQsIHNvIHRoZSB3aG9sZSBwaW5cbiYjNDM7ICogbXVzdCBmYWlsIGJlZm9yZSBtaWdyYXRpb24uICBDaGVja2VkIGJlZm9yZSBhbnkgaXNvbGF0aW9uIG9jY3Vycy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIHBvZnNfaGFzX2x0cGluX2ZvcmJpZGRlbihzdHJ1Y3QgcGFnZXNfb3JfZm9saW9zICpwb2ZzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHRsb25nIGkgPSAwO1xuJiM0MztcbiYjNDM7XHRmb3IgKGZvbGlvID0gcG9mc19nZXRfZm9saW8ocG9mcywgaSk7IGZvbGlvO1xuJiM0MztcdCAgICAgZm9saW8gPSBwb2ZzX25leHRfZm9saW8oZm9saW8sIHBvZnMsIFx1MDAyNmkpKSB7XG4mIzQzO1x0XHRpZiAoZm9saW9fbG9uZ3Rlcm1fcGluX2ZvcmJpZGRlbihmb2xpbykpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGxvbmdcbiBjaGVja19hbmRfbWlncmF0ZV9tb3ZhYmxlX3BhZ2VzX29yX2ZvbGlvcyhzdHJ1Y3QgcGFnZXNfb3JfZm9saW9zICpwb2ZzKVxuIHtcbiBcdExJU1RfSEVBRChtb3ZhYmxlX2ZvbGlvX2xpc3QpO1xuIFx0dW5zaWduZWQgbG9uZyBjb2xsZWN0ZWQ7XG4gXG4mIzQzO1x0aWYgKHBvZnNfaGFzX2x0cGluX2ZvcmJpZGRlbihwb2ZzKSkge1xuJiM0MztcdFx0cG9mc191bnBpbihwb2ZzKTtcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRjb2xsZWN0ZWQgPSBjb2xsZWN0X2xvbmd0ZXJtX3VucGlubmFibGVfZm9saW9zKFx1MDAyNm1vdmFibGVfZm9saW9fbGlzdCxcbiBcdFx0XHRcdFx0XHQgICAgICAgcG9mcyk7XG4gXHRpZiAoIWNvbGxlY3RlZClcbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggMDRlOGE2YjU1MzQzNWYuLjNhZDczNTBmYzQyN2U1IDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTM3LDYgJiM0MzszNyw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZV9vd25lci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc3lzY3RsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9ub2RlX3ByaXZhdGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbXBhdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGdhbGxvYy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGdhbGxvY190YWcuaFx1MDAzZVxuQEAgLTIzMzgsNiAmIzQzOzIzMzksMTAgQEAgYm9vbCBtYWR2aXNlX2ZyZWVfaHVnZV9wbWQoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHR9XG4gXG4gXHRmb2xpbyA9IHBtZF9mb2xpbyhvcmlnX3BtZCk7XG4mIzQzO1xuJiM0MztcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbShmb2xpb19uaWQoZm9saW8pKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiBcdC8qXG4gXHQgKiBJZiBvdGhlciBwcm9jZXNzZXMgYXJlIG1hcHBpbmcgdGhpcyBmb2xpbywgd2UgY291bGRuJiMzOTt0IGRpc2NhcmRcbiBcdCAqIHRoZSBmb2xpbyB1bmxlc3MgdGhleSBhbGwgZG8gTUFEVl9GUkVFIHNvIGxldCYjMzk7cyBza2lwIHRoZSBmb2xpby5cbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggNTFlZTRjMTMxMDkwOGQuLjE3YTdhZWY4YTc4OWRmIDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaFxuQEAgLTEyLDYgJiM0MzsxMiw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21tX2lubGluZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW11X25vdGlmaWVyLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdld2Fsay5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcm1hcC5oXHUwMDNlXG5AQCAtOTgsNiAmIzQzOzk5LDk1IEBAIGV4dGVybiBpbnQgc3lzY3RsX21pbl91bm1hcHBlZF9yYXRpbztcbiBleHRlcm4gaW50IHN5c2N0bF9taW5fc2xhYl9yYXRpbztcbiAjZW5kaWZcbiBcbiYjNDM7LyogZm9saW9faXNfcHJpdmF0ZV9tYW5hZ2VkKCkgLSBmb2xpbyBoYXMgc3BlY2lhbCBtbSBtYW5hZ2VtZW50IHJ1bGVzICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19pc19wcml2YXRlX21hbmFnZWQoc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHwgZm9saW9faXNfcHJpdmF0ZV9ub2RlKGZvbGlvKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHBhZ2VfaXNfcHJpdmF0ZV9tYW5hZ2VkKHN0cnVjdCBwYWdlICpwYWdlKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGZvbGlvX2lzX3ByaXZhdGVfbWFuYWdlZChwYWdlX2ZvbGlvKHBhZ2UpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogZm9saW9fYWxsb3dzX21hZHZpc2UoKSAtIG1heSBtYWR2aXNlIHJlY2xhaW0gaGludHMgYWN0IG9uIHRoaXMgZm9saW8/XG4mIzQzOyAqXG4mIzQzOyAqIG1hZHZpc2UgcmVjbGFpbSBoaW50cyAoQ09MRC9QQUdFT1VUL0ZSRUUpIGFyZSB1c2VybGFuZC1kcml2ZW4gcmVjbGFpbSwgc29cbiYjNDM7ICogdGhleSBmb2xsb3cgcmVjbGFpbSBvcHQtaW46IGZhbHNlIGZvciBaT05FX0RFVklDRSBhbmQgZm9yIE5fTUVNT1JZX1BSSVZBVEVcbiYjNDM7ICogbm9kZXMgd2l0aG91dCBDQVBfUkVDTEFJTSwgdHJ1ZSBmb3IgYWxsIG90aGVyIG5vcm1hbCBmb2xpb3MuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fYWxsb3dzX21hZHZpc2Uoc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7e1xuJiM0MztcdHJldHVybiAhZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgICBub2RlX2FsbG93c19yZWNsYWltKGZvbGlvX25pZChmb2xpbykpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBmb2xpb19hbGxvd3NfbnVtYV9iYWxhbmNlKCkgLSBtYXkgTlVNQSBiYWxhbmNpbmcgc2Nhbi9taWdyYXRlIHRoaXMgZm9saW8/XG4mIzQzOyAqXG4mIzQzOyAqIE5VTUEgYmFsYW5jaW5nIGlzIGFjY2Vzcy1hd2FyZSB0aWVyaW5nIG1pZ3JhdGlvbiwgc28gaXQgZm9sbG93cyB0aGUgdGllcmluZ1xuJiM0MzsgKiBvcHQtaW46IGZhbHNlIGZvciBaT05FX0RFVklDRSBhbmQgZm9yIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgd2l0aG91dFxuJiM0MzsgKiBDQVBfTlVNQV9CQUxBTkNJTkcsIHRydWUgZm9yIGFsbCBvdGhlciBmb2xpb3MuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fYWxsb3dzX251bWFfYmFsYW5jZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuICFmb2xpb19pc196b25lX2RldmljZShmb2xpbykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICAgIG5vZGVfYWxsb3dzX251bWFfYmFsYW5jaW5nKGZvbGlvX25pZChmb2xpbykpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBmb2xpb19hbGxvd3NfY29sbGFwc2UoKSAtIG1heSBjb2xsYXBzZSBmb2xkIHRoaXMgZm9saW8gaW50byBhIFRIUD9cbiYjNDM7ICogQGlzX2todWdlcGFnZWQ6IHRydWUgZm9yIHRoZSBraHVnZXBhZ2VkLCBmYWxzZSBmb3IgTUFEVl9DT0xMQVBTRS5cbiYjNDM7ICpcbiYjNDM7ICogQ29sbGFwc2UgaXMgYSByZXNpZGVuY3kgb3BlcmF0aW9uIGdhdGVkIGJ5IHRoZSBhY3RvciBjYWxsaW5nIGl0OlxuJiM0MzsgKiAgIC0ga2h1Z2VwYWdlZCBuZXZlciBvcGVyYXRlcyBvbiBwcml2YXRlLW5vZGUgZm9saW9zIChsaWtlIFpPTkVfREVWSUNFKVxuJiM0MzsgKiAgIC0gTUFEVl9DT0xMQVBTRSBpcyBnYXRlZCBieSBDQVBfVVNFUl9OVU1BXG4mIzQzOyAqXG4mIzQzOyAqIE5ldmVyIHRydWUgZm9yIFpPTkVfREVWSUNFLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX2FsbG93c19jb2xsYXBzZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGlzX2todWdlcGFnZWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgbmlkID0gZm9saW9fbmlkKGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRpZiAoaXNfa2h1Z2VwYWdlZClcbiYjNDM7XHRcdHJldHVybiAhbm9kZV9pc19wcml2YXRlKG5pZCk7XG4mIzQzO1x0cmV0dXJuIG5vZGVfYWxsb3dzX3VzZXJfbnVtYShuaWQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9hbGxvd3NfY29sbGFwc2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGJvb2wgaXNfa2h1Z2VwYWdlZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmb2xpb19hbGxvd3NfY29sbGFwc2UocGFnZV9mb2xpbyhwYWdlKSwgaXNfa2h1Z2VwYWdlZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIGZvbGlvX2FsbG93c19sb25ndGVybV9waW4oKSAtIG1heSB0aGlzIGZvbGlvIGJlIGxvbmctdGVybSBHVVAtcGlubmVkP1xuJiM0MzsgKlxuJiM0MzsgKiBjaGVja3MgZm9saW9faXNfbG9uZ3Rlcm1fcGlubmFibGUoKSBydWxlcyBwbHVzIHByaXZhdGUgbm9kZSBwZXJtaXNzaW9ucy5cbiYjNDM7ICogcHJpdmF0ZSBub2RlIHBlcm1pc3Npb24gaXMgY2hlY2tlZCBoZXJlIHRvIHJlc29sdmUgY2lyY3VsYXIgaGVhZGVyXG4mIzQzOyAqIGRlcGVuZGVuY2llcyBpbiBmb2xpb19pc19sb25ndGVybV9waW5uYWJsZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19hbGxvd3NfbG9uZ3Rlcm1fcGluKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZm9saW9faXNfbG9uZ3Rlcm1fcGlubmFibGUoZm9saW8pIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgICBub2RlX2FsbG93c19sdHBpbihmb2xpb19uaWQoZm9saW8pKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogZm9saW9fbG9uZ3Rlcm1fcGluX2ZvcmJpZGRlbigpIC0gbXVzdCBhIGxvbmd0ZXJtIHBpbiBvZiB0aGlzIGZvbGlvIGZhaWxcbiYjNDM7ICogb3V0cmlnaHQgKG5laXRoZXIgcGlubmVkIGluIHBsYWNlIG5vciBtaWdyYXRlZCBvZmYgdGhlIG5vZGUpP1xuJiM0MzsgKlxuJiM0MzsgKiBUcnVlIG9ubHkgZm9yIGEgZm9saW8gb24gYSBwcml2YXRlIG5vZGUgdGhhdCBkaWQgbm90IG9wdCBpbnRvIGxvbmd0ZXJtXG4mIzQzOyAqIHBpbm5pbmcgKE5PREVfUFJJVkFURV9DQVBfTFRQSU4pOyBub2RlX2FsbG93c19sdHBpbigpIGlzIHRydWUgZm9yIG9yZGluYXJ5XG4mIzQzOyAqIG5vZGVzIGFuZCBmb3Igb3B0ZWQtaW4gcHJpdmF0ZSBub2Rlcywgc28gdGhpcyBuZXZlciB0cmlwcyB0aGVtLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX2xvbmd0ZXJtX3Bpbl9mb3JiaWRkZW4oc3RydWN0IGZvbGlvICpmb2xpbylcbiYjNDM7e1xuJiM0MztcdHJldHVybiAhbm9kZV9hbGxvd3NfbHRwaW4oZm9saW9fbmlkKGZvbGlvKSk7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBNYWludGFpbnMgc3RhdGUgYWNyb3NzIGEgcGFnZSB0YWJsZSBtb3ZlLiBUaGUgb3BlcmF0aW9uIGFzc3VtZXMgYm90aCBzb3VyY2VcbiAgKiBhbmQgZGVzdGluYXRpb24gVk1BcyBhbHJlYWR5IGV4aXN0IGFuZCBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxuQEAgLTExNDcsNyAmIzQzOzEyMzcsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xuIFxuIGV4dGVybiB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIFx0XHRcdFx0ICBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTtcbi1leHRlcm4gaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKTtcbiYjNDM7ZXh0ZXJuIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcbiYjNDM7XHRcdFx0XHQgIGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpO1xuICNlbHNlXG4gI2RlZmluZSBub2RlX3JlY2xhaW1fbW9kZSAwXG4gXG5AQCAtMTE1Niw3ICYjNDM7MTI0Nyw4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbiB7XG4gXHRyZXR1cm4gMDtcbiB9XG4tc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuJiM0MztcdFx0XHRcdFx0IGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4ge1xuIFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbiB9XG5AQCAtMTI0Miw2ICYjNDM7MTMzNCw3IEBAIHN0cnVjdCBtaWdyYXRpb25fdGFyZ2V0X2NvbnRyb2wge1xuIFx0bm9kZW1hc2tfdCAqbm1hc2s7XG4gXHRnZnBfdCBnZnBfbWFzaztcbiBcdGVudW0gbWlncmF0ZV9yZWFzb24gcmVhc29uO1xuJiM0MztcdHVuc2lnbmVkIGludCBhbGxvY19mbGFncztcbiB9O1xuIFxuIC8qXG5kaWZmIC0tZ2l0IGEvbW0va2h1Z2VwYWdlZC5jIGIvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCAyN2U4ZjMwNzdlODBmZS4uNWYyMDgzOTg1NzczODIgMTAwNjQ0XG4tLS0gYS9tbS9raHVnZXBhZ2VkLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2todWdlcGFnZWQuY1xuQEAgLTcwMCw3ICYjNDM7NzAwLDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgX19jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFx0XHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xuLVx0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XG4mIzQzO1x0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8XG4mIzQzO1x0XHQgICAgdW5saWtlbHkoIXBhZ2VfYWxsb3dzX2NvbGxhcHNlKHBhZ2UsIGNjLVx1MDAzZWlzX2todWdlcGFnZWQpKSkge1xuIFx0XHRcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG5AQCAtMTI0MSw5ICYjNDM7MTI0MiwxNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxuIFx0Z2ZwX3QgZ2ZwID0gKGNjLVx1MDAzZWlzX2todWdlcGFnZWQgPyBhbGxvY19odWdlcGFnZV9raHVnZXBhZ2VkX2dmcG1hc2soKSA6XG4gXHRcdCAgICAgR0ZQX1RSQU5TSFVHRSk7XG4gXHRpbnQgbm9kZSA9IGNvbGxhcHNlX2ZpbmRfdGFyZ2V0X25vZGUoY2MpO1xuJiM0MztcdHVuc2lnbmVkIGludCBhZmxhZ3M7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuJiM0MztcdGJvb2wgYWxsb3c7XG4gXG4tXHRmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgXHUwMDI2Y2MtXHUwMDNlYWxsb2Nfbm1hc2spO1xuJiM0MztcdC8qIFByaXZhdGUgbm9kZSBhY2Nlc3M6IGtodWdlcGFnZWQgbmV2ZXIsIG1hZHZpc2Ugd2l0aCBDQVBfVVNFUl9OVU1BICovXG4mIzQzO1x0YWxsb3cgPSBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkID8gIW5vZGVfaXNfcHJpdmF0ZShub2RlKVxuJiM0MztcdFx0XHRcdCAgOiBub2RlX2FsbG93c191c2VyX251bWEobm9kZSk7XG4mIzQzO1x0YWZsYWdzID0gKGFsbG93IFx1MDAyNlx1MDAyNiBub2RlX2lzX3ByaXZhdGUobm9kZSkpID9cbiYjNDM7XHRcdEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOiBBTExPQ19ERUZBVUxUO1xuJiM0MztcbiYjNDM7XHRmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgXHUwMDI2Y2MtXHUwMDNlYWxsb2Nfbm1hc2ssIGFmbGFncyk7XG4gXHRpZiAoIWZvbGlvKSB7XG4gXHRcdCpmb2xpb3AgPSBOVUxMO1xuIFx0XHRpZiAoaXNfcG1kX29yZGVyKG9yZGVyKSlcbkBAIC0xNjg3LDcgJiM0MzsxNjk2LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdH1cbiBcbiBcdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuJiM0MztcdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fFxuJiM0MztcdFx0ICAgIHVubGlrZWx5KCFwYWdlX2FsbG93c19jb2xsYXBzZShwYWdlLCBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkKSkpIHtcbiBcdFx0XHRyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDtcbiBcdFx0XHRnb3RvIG91dF91bm1hcDtcbiBcdFx0fVxuQEAgLTE5NDQsNyAmIzQzOzE5NTQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCB0cnlfY29sbGFwc2VfcHRlX21hcHBlZF90aHAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnblxuIFx0XHR9XG4gXG4gXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZW50KTtcbi1cdFx0aWYgKFdBUk5fT05fT05DRShwYWdlIFx1MDAyNlx1MDAyNiBpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSlcbiYjNDM7XHRcdGlmIChXQVJOX09OX09OQ0UocGFnZSBcdTAwMjZcdTAwMjYgcGFnZV9pc19wcml2YXRlX21hbmFnZWQocGFnZSkpKVxuIFx0XHRcdHBhZ2UgPSBOVUxMO1xuIFx0XHQvKlxuIFx0XHQgKiBOb3RlIHRoYXQgdXByb2JlLCBkZWJ1Z2dlciwgb3IgTUFQX1BSSVZBVEUgbWF5IGNoYW5nZSB0aGVcbmRpZmYgLS1naXQgYS9tbS9rc20uYyBiL21tL2tzbS5jXG5pbmRleCBiOWIzMmY3YmZiNjkxZS4uZmYyMzEzZmM0NWQ1M2EgMTAwNjQ0XG4tLS0gYS9tbS9rc20uY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0va3NtLmNcbkBAIC04MjcsNyAmIzQzOzgyNyw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZ2V0X21lcmdlYWJsZV9wYWdlKHN0cnVjdCBrc21fcm1hcF9pdGVtICpybWFwX2l0ZW0pXG4gXG4gXHRmb2xpbyA9IGZvbGlvX3dhbGtfc3RhcnQoXHUwMDI2ZncsIHZtYSwgYWRkciwgMCk7XG4gXHRpZiAoZm9saW8pIHtcbi1cdFx0aWYgKCFmb2xpb19pc196b25lX2RldmljZShmb2xpbykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRpZiAoIWZvbGlvX2lzX3ByaXZhdGVfbWFuYWdlZChmb2xpbykgXHUwMDI2XHUwMDI2XG4gXHRcdCAgICBmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4gXHRcdFx0Zm9saW9fZ2V0KGZvbGlvKTtcbiBcdFx0XHRwYWdlID0gZncucGFnZTtcbkBAIC0yNTU5LDcgJiM0MzsyNTU5LDggQEAgc3RhdGljIGludCBrc21fbmV4dF9wYWdlX3BtZF9lbnRyeShwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25cbiBcdFx0XHRcdGdvdG8gbm90X2ZvdW5kX3VubG9jaztcbiBcdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG4tXHRcdFx0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbiYjNDM7XHRcdFx0aWYgKHVubGlrZWx5KGZvbGlvX2lzX3ByaXZhdGVfbWFuYWdlZChmb2xpbykpIHx8XG4mIzQzO1x0XHRcdCAgICAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbiBcdFx0XHRcdGdvdG8gbm90X2ZvdW5kX3VubG9jaztcbiBcbiBcdFx0XHRwYWdlICYjNDM7PSAoKGFkZHIgXHUwMDI2IChQTURfU0laRSAtIDEpKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG5AQCAtMjU4Myw3ICYjNDM7MjU4NCw4IEBAIHN0YXRpYyBpbnQga3NtX25leHRfcGFnZV9wbWRfZW50cnkocG1kX3QgKnBtZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiBcbi1cdFx0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbiYjNDM7XHRcdGlmICh1bmxpa2VseShmb2xpb19pc19wcml2YXRlX21hbmFnZWQoZm9saW8pKSB8fFxuJiM0MztcdFx0ICAgICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRnb3RvIGZvdW5kX3VubG9jaztcbiBcdH1cbmRpZmYgLS1naXQgYS9tbS9tYWR2aXNlLmMgYi9tbS9tYWR2aXNlLmNcbmluZGV4IDA3YTIxY2EzMWJhZDRkLi41NmNhOTc0NTQyNzA3OCAxMDA2NDRcbi0tLSBhL21tL21hZHZpc2UuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWFkdmlzZS5jXG5AQCAtMzIsNiAmIzQzOzMyLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9sZWFmb3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zaG1lbV9mcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW11X25vdGlmaWVyLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2Nhc20vdGxiLmhcdTAwM2VcbiBcbkBAIC0zOTUsNiAmIzQzOzM5Niw5IEBAIHN0YXRpYyBpbnQgbWFkdmlzZV9jb2xkX29yX3BhZ2VvdXRfcHRlX3JhbmdlKHBtZF90ICpwbWQsXG4gXG4gXHRcdGZvbGlvID0gcG1kX2ZvbGlvKG9yaWdfcG1kKTtcbiBcbiYjNDM7XHRcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbShmb2xpb19uaWQoZm9saW8pKSlcbiYjNDM7XHRcdFx0Z290byBodWdlX3VubG9jaztcbiYjNDM7XG4gXHRcdC8qIERvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBtYXBwaW5ncyBvZiB0aGlzIGZvbGlvICovXG4gXHRcdGlmIChmb2xpb19tYXliZV9tYXBwZWRfc2hhcmVkKGZvbGlvKSlcbiBcdFx0XHRnb3RvIGh1Z2VfdW5sb2NrO1xuQEAgLTQ3NCw3ICYjNDM7NDc4LDcgQEAgc3RhdGljIGludCBtYWR2aXNlX2NvbGRfb3JfcGFnZW91dF9wdGVfcmFuZ2UocG1kX3QgKnBtZCxcbiBcdFx0XHRjb250aW51ZTtcbiBcbiBcdFx0Zm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7XG4tXHRcdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuJiM0MztcdFx0aWYgKCFmb2xpbyB8fCAhZm9saW9fYWxsb3dzX21hZHZpc2UoZm9saW8pKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHQvKlxuQEAgLTcwMyw3ICYjNDM7NzA3LDcgQEAgc3RhdGljIGludCBtYWR2aXNlX2ZyZWVfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdFx0fVxuIFxuIFx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbi1cdFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4mIzQzO1x0XHRpZiAoIWZvbGlvIHx8ICFmb2xpb19hbGxvd3NfbWFkdmlzZShmb2xpbykpXG4gXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdC8qXG5kaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC12MS5jIGIvbW0vbWVtY29udHJvbC12MS5jXG5pbmRleCAyZGM1OTk0ODRkMDA2Zi4uNWU0NjRlNTJkZmI5YTggMTAwNjQ0XG4tLS0gYS9tbS9tZW1jb250cm9sLXYxLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbWNvbnRyb2wtdjEuY1xuQEAgLTIxMzIsMTQgJiM0MzsyMTMyLDE4IEBAIHN0YXRpYyBpbnQgbWVtY2dfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxuIFx0Y29uc3Qgc3RydWN0IG51bWFfc3RhdCAqc3RhdDtcbiBcdGludCBuaWQ7XG4gXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fc2VxKG0pO1xuJiM0MztcdG5vZGVtYXNrX3QgcmVwb3J0YWJsZTtcbiBcbiBcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xuIFxuJiM0MztcdC8qIFByaXZhdGUgbm9kZXMgaG9sZCBjZ3JvdXAgbWVtb3J5IHRvbywgcmVwb3J0IHRoZW0uICovXG4mIzQzO1x0bm9kZXNfb3IocmVwb3J0YWJsZSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XG4mIzQzO1xuIFx0Zm9yIChzdGF0ID0gc3RhdHM7IHN0YXQgXHUwMDNjIEFSUkFZX0VORChzdGF0cyk7IHN0YXQmIzQzOyYjNDM7KSB7XG4gXHRcdHNlcV9wcmludGYobSwgXCYjMzQ7JXM9JWx1XCYjMzQ7LCBzdGF0LVx1MDAzZW5hbWUsXG4gXHRcdFx0ICAgbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIHN0YXQtXHUwMDNlbHJ1X21hc2ssXG4gXHRcdFx0XHRcdFx0ICAgZmFsc2UpKTtcbi1cdFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKVxuJiM0MztcdFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcmVwb3J0YWJsZSlcbiBcdFx0XHRzZXFfcHJpbnRmKG0sIFwmIzM0OyBOJWQ9JWx1XCYjMzQ7LCBuaWQsXG4gXHRcdFx0XHQgICBtZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBuaWQsXG4gXHRcdFx0XHRcdFx0XHRzdGF0LVx1MDAzZWxydV9tYXNrLCBmYWxzZSkpO1xuQEAgLTIxNTEsNyAmIzQzOzIxNTUsNyBAQCBzdGF0aWMgaW50IG1lbWNnX251bWFfc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcbiBcdFx0c2VxX3ByaW50ZihtLCBcJiMzNDtoaWVyYXJjaGljYWxfJXM9JWx1XCYjMzQ7LCBzdGF0LVx1MDAzZW5hbWUsXG4gXHRcdFx0ICAgbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIHN0YXQtXHUwMDNlbHJ1X21hc2ssXG4gXHRcdFx0XHRcdFx0ICAgdHJ1ZSkpO1xuLVx0XHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpXG4mIzQzO1x0XHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCByZXBvcnRhYmxlKVxuIFx0XHRcdHNlcV9wcmludGYobSwgXCYjMzQ7IE4lZD0lbHVcJiMzNDssIG5pZCxcbiBcdFx0XHRcdCAgIG1lbV9jZ3JvdXBfbm9kZV9ucl9scnVfcGFnZXMobWVtY2csIG5pZCxcbiBcdFx0XHRcdFx0XHRcdHN0YXQtXHUwMDNlbHJ1X21hc2ssIHRydWUpKTtcbmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmNcbmluZGV4IDgzMTlhZDhjNWMyM2FjLi40ZDc5ZTIzOGJjNTdkOCAxMDA2NDRcbi0tLSBhL21tL21lbWNvbnRyb2wuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtY29udHJvbC5jXG5AQCAtNDQ5Niw2ICYjNDM7NDQ5Niw3IEBAIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY3NzX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpXG4gXHRzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50ID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpO1xuIFx0c3RydWN0IG1lbWNnX3Ztc3RhdHNfcGVyY3B1ICpzdGF0YztcbiBcdHN0cnVjdCBhZ2dyZWdhdGVfY29udHJvbCBhYztcbiYjNDM7XHRub2RlbWFza190IHJlcG9ydGFibGU7XG4gXHRpbnQgbmlkO1xuIFxuIFx0Zmx1c2hfbm1pX3N0YXRzKG1lbWNnLCBwYXJlbnQpO1xuQEAgLTQ1MjQsNyAmIzQzOzQ1MjUsOSBAQCBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2Nzc19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KVxuIFx0fTtcbiBcdG1lbV9jZ3JvdXBfc3RhdF9hZ2dyZWdhdGUoXHUwMDI2YWMpO1xuIFxuLVx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSB7XG4mIzQzO1x0LyogUHJpdmF0ZSBub2RlcyBtdXN0IGFsc28gYmUgYWNjb3VudGVkIG9yIG51bWFfc3RhdCBpcyBtaXNsZWFkaW5nICovXG4mIzQzO1x0bm9kZXNfb3IocmVwb3J0YWJsZSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XG4mIzQzO1x0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcmVwb3J0YWJsZSkge1xuIFx0XHRzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfbm9kZSAqcG4gPSBtZW1jZy1cdTAwM2Vub2RlaW5mb1tuaWRdO1xuIFx0XHRzdHJ1Y3QgbHJ1dmVjX3N0YXRzICpsc3RhdHMgPSBwbi1cdTAwM2VscnV2ZWNfc3RhdHM7XG4gXHRcdHN0cnVjdCBscnV2ZWNfc3RhdHMgKnBsc3RhdHMgPSBOVUxMO1xuQEAgLTQ5NDcsOSAmIzQzOzQ5NTAsMTMgQEAgc3RhdGljIGludCBtZW1vcnlfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxuIHtcbiBcdGludCBpO1xuIFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX3NlcShtKTtcbiYjNDM7XHRub2RlbWFza190IHJlcG9ydGFibGU7XG4gXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiBcbiYjNDM7XHQvKiBQcml2YXRlIG5vZGVzIGhvbGQgY2dyb3VwIG1lbW9yeSB0b28sIHJlcG9ydCB0aGVtLiAqL1xuJiM0MztcdG5vZGVzX29yKHJlcG9ydGFibGUsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xuJiM0MztcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUobWVtb3J5X3N0YXRzKTsgaSYjNDM7JiM0MzspIHtcbiBcdFx0aW50IG5pZDtcbiBcbkBAIC00OTU3LDcgJiM0Mzs0OTY0LDcgQEAgc3RhdGljIGludCBtZW1vcnlfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHRzZXFfcHJpbnRmKG0sIFwmIzM0OyVzXCYjMzQ7LCBtZW1vcnlfc3RhdHNbaV0ubmFtZSk7XG4tXHRcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkge1xuJiM0MztcdFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcmVwb3J0YWJsZSkge1xuIFx0XHRcdHU2NCBzaXplO1xuIFx0XHRcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcbiBcbkBAIC02MDY5LDYgJiM0Mzs2MDc2LDggQEAgdm9pZCBtZW1fY2dyb3VwX25vZGVfZmlsdGVyX2FsbG93ZWQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBub2RlbWFza190ICptYXNrKVxuIFx0ICogbWFzayBpcyBhY2NlcHRhYmxlLlxuIFx0ICovXG4gXHRjcHVzZXRfbm9kZXNfYWxsb3dlZChtZW1jZy1cdTAwM2Vjc3MuY2dyb3VwLCBcdTAwMjZhbGxvd2VkKTtcbiYjNDM7XHQvKiBOX01FTU9SWV9QUklWQVRFIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0LCBpbmNsdWRlIHRoZW0gKi9cbiYjNDM7XHRub2Rlc19vcihhbGxvd2VkLCBhbGxvd2VkLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XG4gXHRub2Rlc19hbmQoKm1hc2ssICptYXNrLCBhbGxvd2VkKTtcbiB9XG4gXG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LXRpZXJzLmMgYi9tbS9tZW1vcnktdGllcnMuY1xuaW5kZXggNTQ4NTFkOGExOTViMDMuLmM2NzMwODBkMTUzZTQxIDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbW9yeS10aWVycy5jXG5AQCAtNyw2ICYjNDM7Nyw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9ub3RpZmllci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvc3lzY3RsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gXG5AQCAtMzE3LDYgJiM0MzszMTgsMjEgQEAgdm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cylcbiBcdHJjdV9yZWFkX3VubG9jaygpO1xuIH1cbiBcbiYjNDM7LyogVGllcmluZyBzZXQ6IE5fTUVNT1JZIHwgKE5fTUVNT1JZX1BSSVZBVEUgdy8gQ0FQX0RFTU9USU9OKSAqL1xuJiM0MztzdGF0aWMgbm9kZW1hc2tfdCB0aWVyYWJsZV9ub2RlcztcbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHVwZGF0ZV90aWVyYWJsZV9ub2Rlcyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IG5vZGU7XG4mIzQzO1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGRfb25jZShcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0dGllcmFibGVfbm9kZXMgPSBub2RlX3N0YXRlc1tOX01FTU9SWV07XG4mIzQzO1x0Zm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWV9QUklWQVRFKVxuJiM0MztcdFx0aWYgKG5vZGVfYWxsb3dzX2RlbW90aW9uKG5vZGUpKVxuJiM0MztcdFx0XHRub2RlX3NldChub2RlLCB0aWVyYWJsZV9ub2Rlcyk7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogbmV4dF9kZW1vdGlvbl9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGUgZGVtb3Rpb24gcGF0aFxuICAqIEBub2RlOiBUaGUgc3RhcnRpbmcgbm9kZSB0byBsb29rdXAgdGhlIG5leHQgbm9kZVxuQEAgLTMzMCw3ICYjNDM7MzQ2LDcgQEAgdm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cylcbiBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXG4ge1xuIFx0c3RydWN0IGRlbW90aW9uX25vZGVzICpuZDtcbi1cdG5vZGVtYXNrX3QgbWFzaztcbiYjNDM7XHRub2RlbWFza190IG1hc2ssIHRpZXJhYmxlO1xuIFxuIFx0aWYgKCFub2RlX2RlbW90aW9uKVxuIFx0XHRyZXR1cm4gTlVNQV9OT19OT0RFO1xuQEAgLTM3MCw3ICYjNDM7Mzg2LDggQEAgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxuIFx0ICogY2xvc2VzdCBkZW1vdGlvbiB0YXJnZXQuXG4gXHQgKi9cbiBcdG5vZGVzX2NvbXBsZW1lbnQobWFzaywgKmFsbG93ZWRfbWFzayk7XG4tXHRyZXR1cm4gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCBcdTAwMjZtYXNrKTtcbiYjNDM7XHR0aWVyYWJsZSA9IHRpZXJhYmxlX25vZGVzO1xuJiM0MztcdHJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNm1hc2ssIFx1MDAyNnRpZXJhYmxlKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuQEAgLTM3OCw3ICYjNDM7Mzk1LDcgQEAgc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuIFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xuIFx0aW50IG5vZGU7XG4gXG4tXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSB7XG4mIzQzO1x0Zm9yX2VhY2hfbm9kZV9tYXNrKG5vZGUsIHRpZXJhYmxlX25vZGVzKSB7XG4gXHRcdG5vZGVfZGVtb3Rpb25bbm9kZV0ucHJlZmVycmVkID0gTk9ERV9NQVNLX05PTkU7XG4gXHRcdC8qXG4gXHRcdCAqIFdlIGFyZSBob2xkaW5nIG1lbW9yeV90aWVyX2xvY2ssIGl0IGlzIHNhZmVcbkBAIC00MDEsNyAmIzQzOzQxOCw3IEBAIHN0YXRpYyB2b2lkIGR1bXBfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuIHtcbiBcdGludCBub2RlO1xuIFxuLVx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkge1xuJiM0MztcdGZvcl9lYWNoX25vZGVfbWFzayhub2RlLCB0aWVyYWJsZV9ub2Rlcykge1xuIFx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXIgPSBfX25vZGVfZ2V0X21lbW9yeV90aWVyKG5vZGUpO1xuIFx0XHRub2RlbWFza190IHByZWZlcnJlZCA9IG5vZGVfZGVtb3Rpb25bbm9kZV0ucHJlZmVycmVkO1xuIFxuQEAgLTQzNSw5ICYjNDM7NDUyLDEwIEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4gXHRpZiAoIW5vZGVfZGVtb3Rpb24pXG4gXHRcdHJldHVybjtcbiBcbiYjNDM7XHR1cGRhdGVfdGllcmFibGVfbm9kZXMoKTtcbiBcdGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHMoKTtcbiBcbi1cdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcbiYjNDM7XHRmb3JfZWFjaF9ub2RlX21hc2sobm9kZSwgdGllcmFibGVfbm9kZXMpIHtcbiBcdFx0YmVzdF9kaXN0YW5jZSA9IC0xO1xuIFx0XHRuZCA9IFx1MDAyNm5vZGVfZGVtb3Rpb25bbm9kZV07XG4gXG5AQCAtNDUwLDEyICYjNDM7NDY4LDEyIEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXG4gXHRcdG1lbXRpZXIgPSBsaXN0X25leHRfZW50cnkobWVtdGllciwgbGlzdCk7XG4gXHRcdHRpZXJfbm9kZXMgPSBnZXRfbWVtdGllcl9ub2RlbWFzayhtZW10aWVyKTtcbiBcdFx0Lypcbi1cdFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZSwgdXNlICYjMzk7dXNlZCYjMzk7IG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0LlxuJiM0MztcdFx0ICogZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbiwgdXNlICYjMzk7dXNlZCYjMzk7IG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0LlxuIFx0XHQgKiBBZGQgYWxsIG1lbW9yeSBub2RlcyBleGNlcHQgdGhlIHNlbGVjdGVkIG1lbW9yeSB0aWVyXG4gXHRcdCAqIG5vZGVsaXN0IHRvIHNraXAgbGlzdCBzbyB0aGF0IHdlIGZpbmQgdGhlIGJlc3Qgbm9kZSBmcm9tIHRoZVxuIFx0XHQgKiBtZW10aWVyIG5vZGVsaXN0LlxuIFx0XHQgKi9cbi1cdFx0bm9kZXNfYW5kbm90KHRpZXJfbm9kZXMsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgdGllcl9ub2Rlcyk7XG4mIzQzO1x0XHRub2Rlc19hbmRub3QodGllcl9ub2RlcywgdGllcmFibGVfbm9kZXMsIHRpZXJfbm9kZXMpO1xuIFxuIFx0XHQvKlxuIFx0XHQgKiBGaW5kIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG1lbW9yeSB0aWVyIG5vZGUgbGlzdCBvZiBzYW1lIGJlc3QgZGlzdGFuY2UuXG5AQCAtNDYzLDcgJiM0Mzs0ODEsOCBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuIFx0XHQgKiBpbiB0aGUgcHJlZmVycmVkIG1hc2sgd2hlbiBhbGxvY2F0aW5nIHBhZ2VzIGR1cmluZyBkZW1vdGlvbi5cbiBcdFx0ICovXG4gXHRcdGRvIHtcbi1cdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMpO1xuJiM0MztcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG4mIzQzO1x0XHRcdFx0XHRcdFx0XHUwMDI2dGllcmFibGVfbm9kZXMpO1xuIFx0XHRcdGlmICh0YXJnZXQgPT0gTlVNQV9OT19OT0RFKVxuIFx0XHRcdFx0YnJlYWs7XG4gXG5AQCAtNTAyLDcgJiM0Mzs1MjEsNyBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuIFx0ICogYWxsb2NhdGlvbiB0byBhIHNldCBvZiBub2RlcyB0aGF0IGlzIGNsb3NlciB0aGUgYWJvdmUgc2VsZWN0ZWRcbiBcdCAqIHByZWZlcnJlZCBub2RlLlxuIFx0ICovXG4tXHRsb3dlcl90aWVyID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldO1xuJiM0MztcdGxvd2VyX3RpZXIgPSB0aWVyYWJsZV9ub2RlcztcbiBcdGxpc3RfZm9yX2VhY2hfZW50cnkobWVtdGllciwgXHUwMDI2bWVtb3J5X3RpZXJzLCBsaXN0KSB7XG4gXHRcdC8qXG4gXHRcdCAqIEtlZXAgcmVtb3ZpbmcgY3VycmVudCB0aWVyIGZyb20gbG93ZXJfdGllciBub2RlcyxcbkBAIC01NDksNyAmIzQzOzU2OCw4IEBAIHN0YXRpYyBzdHJ1Y3QgbWVtb3J5X3RpZXIgKnNldF9ub2RlX21lbW9yeV90aWVyKGludCBub2RlKVxuIFxuIFx0bG9ja2RlcF9hc3NlcnRfaGVsZF9vbmNlKFx1MDAyNm1lbW9yeV90aWVyX2xvY2spO1xuIFxuLVx0aWYgKCFub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSlcbiYjNDM7XHQvKiBJbmNsdWRlIE5fTUVNT1JZIGFuZCBOX01FTU9SWV9QUklWQVRFIHdpdGggQ0FQX0RFTU9USU9OICovXG4mIzQzO1x0aWYgKCFub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSBcdTAwMjZcdTAwMjYgIW5vZGVfYWxsb3dzX2RlbW90aW9uKG5vZGUpKVxuIFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdG10X2NhbGNfYWRpc3RhbmNlKG5vZGUsIFx1MDAyNmFkaXN0KTtcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuaW5kZXggMjI2YWI5Y2IwNzhhZDEuLmU5NTczZjkwZTBkY2QzIDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuQEAgLTM0LDYgJiM0MzszNCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtYmxvY2suaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbXBhY3Rpb24uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JtYXAuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9ub2RlX3ByaXZhdGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZS5oXHUwMDNlXG4gXG5AQCAtMTE2OCw3ICYjNDM7MTE2OSw3IEBAIGludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRtb3ZlX3Bmbl9yYW5nZV90b196b25lKHpvbmUsIHBmbiwgbnJfcGFnZXMsIE5VTEwsIE1JR1JBVEVfTU9WQUJMRSxcbiBcdFx0XHQgICAgICAgdHJ1ZSk7XG4gXG4tXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpIHtcbiYjNDM7XHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkgXHUwMDI2XHUwMDI2ICFub2RlX2lzX3ByaXZhdGUobmlkKSkge1xuIFx0XHQvKiBBZGRpbmcgbWVtb3J5IHRvIHRoZSBub2RlIGZvciB0aGUgZmlyc3QgdGltZSAqL1xuIFx0XHRub2RlX2FyZy5uaWQgPSBuaWQ7XG4gXHRcdHJldCA9IG5vZGVfbm90aWZ5KE5PREVfQURESU5HX0ZJUlNUX01FTU9SWSwgXHUwMDI2bm9kZV9hcmcpO1xuQEAgLTEyMDMsMTMgJiM0MzsxMjA0LDIwIEBAIGludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRvbmxpbmVfcGFnZXNfcmFuZ2UocGZuLCBucl9wYWdlcyk7XG4gXHRhZGp1c3RfcHJlc2VudF9wYWdlX2NvdW50KHBmbl90b19wYWdlKHBmbiksIGdyb3VwLCBucl9wYWdlcyk7XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBOX01FTU9SWSBhbmQgTl9NRU1PUllfUFJJVkFURSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCBkZXRlcm1pbmVcbiYjNDM7XHQgKiB3aGljaCBpcyBjb3JyZWN0IGJhc2VkIG9uIHdoZXRoZXIgdGhlIHBnZGF0LVx1MDAzZXByaXZhdGUgaXMgc2V0LlxuJiM0MztcdCAqL1xuIFx0aWYgKG5vZGVfYXJnLm5pZCBcdTAwM2U9IDApXG4tXHRcdG5vZGVfc2V0X3N0YXRlKG5pZCwgTl9NRU1PUlkpO1xuJiM0MztcdFx0bm9kZV9zZXRfc3RhdGUobmlkLCBwZ2RhdF9pc19wcml2YXRlKE5PREVfREFUQShuaWQpKSA/XG4mIzQzO1x0XHRcdFx0ICAgIE5fTUVNT1JZX1BSSVZBVEUgOiBOX01FTU9SWSk7XG4gXHQvKlxuIFx0ICogQ2hlY2sgd2hldGhlciB3ZSBhcmUgYWRkaW5nIG5vcm1hbCBtZW1vcnkgdG8gdGhlIG5vZGUgZm9yIHRoZSBmaXJzdFxuIFx0ICogdGltZS5cbiBcdCAqL1xuLVx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9OT1JNQUxfTUVNT1JZKSBcdTAwMjZcdTAwMjYgem9uZV9pZHgoem9uZSkgXHUwMDNjPSBaT05FX05PUk1BTClcbiYjNDM7XHRpZiAoIW5vZGVfaXNfcHJpdmF0ZShuaWQpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhbm9kZV9zdGF0ZShuaWQsIE5fTk9STUFMX01FTU9SWSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHpvbmVfaWR4KHpvbmUpIFx1MDAzYz0gWk9ORV9OT1JNQUwpXG4gXHRcdG5vZGVfc2V0X3N0YXRlKG5pZCwgTl9OT1JNQUxfTUVNT1JZKTtcbiBcbiBcdGlmIChuZWVkX3pvbmVsaXN0c19yZWJ1aWxkKVxuQEAgLTEyMjksOCAmIzQzOzEyMzcsMTAgQEAgaW50IG9ubGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdC8qIHJlaW5pdGlhbGlzZSB3YXRlcm1hcmtzIGFuZCB1cGRhdGUgcGNwIGxpbWl0cyAqL1xuIFx0aW5pdF9wZXJfem9uZV93bWFya19taW4oKTtcbiBcbi1cdGtzd2FwZF9ydW4obmlkKTtcbi1cdGtjb21wYWN0ZF9ydW4obmlkKTtcbiYjNDM7XHRpZiAobm9kZV9hbGxvd3NfcmVjbGFpbShuaWQpKSB7XG4mIzQzO1x0XHRrc3dhcGRfcnVuKG5pZCk7XG4mIzQzO1x0XHRrY29tcGFjdGRfcnVuKG5pZCk7XG4mIzQzO1x0fVxuIFxuIFx0aWYgKG5vZGVfYXJnLm5pZCBcdTAwM2U9IDApXG4gXHRcdC8qIEZpcnN0IG1lbW9yeSBhZGRlZCBzdWNjZXNzZnVsbHkuIE5vdGlmeSBjb25zdW1lcnMuICovXG5AQCAtMTY0OCw2ICYjNDM7MTY1OCw4IEBAIEVYUE9SVF9TWU1CT0xfR1BMKGFkZF9tZW1vcnkpO1xuICAqIEByZXNvdXJjZV9uYW1lOiBSZXNvdXJjZSBuYW1lIGluIGZvcm1hdCBcJiMzNDtTeXN0ZW0gUkFNICgkRFJJVkVSKVwmIzM0O1xuICAqIEBtaHBfZmxhZ3M6IE1lbW9yeSBob3RwbHVnIGZsYWdzXG4gICogQG9ubGluZV90eXBlOiBBdXRvLU9ubGluZSBiZWhhdmlvciAob2ZmbGluZSwgb25saW5lLCBrZXJuZWwsIG1vdmFibGUpXG4mIzQzOyAqIEBucDogZHJpdmVyLW93bmVkIG5vZGVfcHJpdmF0ZSB0byBvbmxpbmUgdGhlIG5vZGUgYXMgTl9NRU1PUllfUFJJVkFURSwgb3JcbiYjNDM7ICpcdE5VTEwgZm9yIG9yZGluYXJ5IHN5c3RlbSBSQU1cbiAgKlxuICAqIEFkZCBzcGVjaWFsLCBkcml2ZXItbWFuYWdlZCBtZW1vcnkgdG8gdGhlIHN5c3RlbSBhcyBzeXN0ZW0gUkFNLiBTdWNoXG4gICogbWVtb3J5IGlzIG5vdCBleHBvc2VkIHZpYSB0aGUgcmF3IGZpcm13YXJlLXByb3ZpZGVkIG1lbW1hcCBhcyBzeXN0ZW1cbkBAIC0xNjc0LDkgJiM0MzsxNjg2LDExIEBAIEVYUE9SVF9TWU1CT0xfR1BMKGFkZF9tZW1vcnkpO1xuICAqL1xuIGludCBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSxcbiBcdFx0Y29uc3QgY2hhciAqcmVzb3VyY2VfbmFtZSwgbWhwX3QgbWhwX2ZsYWdzLFxuLVx0XHRlbnVtIG1tb3Agb25saW5lX3R5cGUpXG4mIzQzO1x0XHRlbnVtIG1tb3Agb25saW5lX3R5cGUsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKVxuIHtcbiYjNDM7XHRpbnQgcmVhbF9uaWQgPSBuaWQ7XG4gXHRzdHJ1Y3QgcmVzb3VyY2UgKnJlcztcbiYjNDM7XHRzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cDtcbiBcdGludCByYztcbiBcbiBcdGlmICghcmVzb3VyY2VfbmFtZSB8fFxuQEAgLTE2ODcsNiAmIzQzOzE3MDEsMTkgQEAgaW50IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxuIFx0aWYgKG9ubGluZV90eXBlIFx1MDAzYyBNTU9QX09GRkxJTkUgfHwgb25saW5lX3R5cGUgXHUwMDNlIE1NT1BfT05MSU5FX01PVkFCTEUpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuJiM0MztcdC8qIFJlZ2lzdGVyIGEgcHJpdmF0ZS1ub2RlIG93bmVyIGJlZm9yZSBhZGRpbmcgbWVtb3J5LiAqL1xuJiM0MztcdGlmIChucCkge1xuJiM0MztcdFx0aWYgKG1ocF9mbGFncyBcdTAwMjYgTUhQX05JRF9JU19NR0lEKSB7XG4mIzQzO1x0XHRcdGdyb3VwID0gbWVtb3J5X2dyb3VwX2ZpbmRfYnlfaWQobmlkKTtcbiYjNDM7XHRcdFx0aWYgKCFncm91cClcbiYjNDM7XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRcdFx0cmVhbF9uaWQgPSBncm91cC1cdTAwM2VuaWQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRyYyA9IG5vZGVfcHJpdmF0ZV9yZWdpc3RlcihyZWFsX25pZCwgbnApO1xuJiM0MztcdFx0aWYgKHJjKVxuJiM0MztcdFx0XHRyZXR1cm4gcmM7XG4mIzQzO1x0fVxuJiM0MztcbiBcdGxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcbiBcbiBcdHJlcyA9IHJlZ2lzdGVyX21lbW9yeV9yZXNvdXJjZShzdGFydCwgc2l6ZSwgcmVzb3VyY2VfbmFtZSk7XG5AQCAtMTcwMSwxMCAmIzQzOzE3MjgsNDEgQEAgaW50IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxuIFxuIG91dF91bmxvY2s6XG4gXHR1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcbiYjNDM7XHRpZiAocmMgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IG5wKVxuJiM0MztcdFx0bm9kZV9wcml2YXRlX3VucmVnaXN0ZXIocmVhbF9uaWQpO1xuIFx0cmV0dXJuIHJjO1xuIH1cbiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZCwgXCYjMzQ7a21lbVwmIzM0Oyk7XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQgLSBhZGQgcHJpdmF0ZSBkcml2ZXItbWFuYWdlZCBtZW1vcnlcbiYjNDM7ICogQG5pZDogTlVNQSBub2RlIElEIHdoZXJlIHRoZSBtZW1vcnkgd2lsbCBiZSBhZGRlZFxuJiM0MzsgKiBAc3RhcnQ6IFN0YXJ0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSByYW5nZVxuJiM0MzsgKiBAc2l6ZTogU2l6ZSBvZiB0aGUgbWVtb3J5IHJhbmdlIGluIGJ5dGVzXG4mIzQzOyAqIEByZXNvdXJjZV9uYW1lOiBSZXNvdXJjZSBuYW1lIGluIGZvcm1hdCBcJiMzNDtTeXN0ZW0gUkFNICgkRFJJVkVSKVwmIzM0O1xuJiM0MzsgKiBAbWhwX2ZsYWdzOiBNZW1vcnkgaG90cGx1ZyBmbGFnc1xuJiM0MzsgKiBAb25saW5lX3R5cGU6IEF1dG8tT25saW5lIGJlaGF2aW9yIChvZmZsaW5lLCBvbmxpbmUsIGtlcm5lbCwgbW92YWJsZSlcbiYjNDM7ICogQG5wOiBwcml2YXRlIG5vZGUgY29udGV4dCBmb3IgdGhlIG93bmVyIC0gbWFuZGF0b3J5LlxuJiM0MzsgKlxuJiM0MzsgKiBBZGQgcHJpdmF0ZSBkcml2ZXItbWFuYWdlZCBtZW1vcnkuICBQcml2YXRlIG5vZGUgY29udGV4dCBpcyByZXF1aXJlZCB0b1xuJiM0MzsgKiBhdm9pZCB0aGUgbWVtb3J5IGJlaW5nIGFkZGVkIGFzIGEgbm9ybWFsIE5fTUVNT1JZIG5vZGUuXG4mIzQzOyAqXG4mIzQzOyAqIFNlZSBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQgZm9yIG1vcmUgZGV0YWlscy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cbiYjNDM7ICovXG4mIzQzO2ludCBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSxcbiYjNDM7XHRcdFx0XHQgICAgICBjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lLCBtaHBfdCBtaHBfZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgICAgZW51bSBtbW9wIG9ubGluZV90eXBlLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucClcbiYjNDM7e1xuJiM0MztcdGlmICghbnApXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChuaWQsIHN0YXJ0LCBzaXplLCByZXNvdXJjZV9uYW1lLFxuJiM0MztcdFx0XHRcdFx0ICAgbWhwX2ZsYWdzLCBvbmxpbmVfdHlwZSwgbnApO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZCk7XG4mIzQzO1xuIC8qKlxuICAqIGFkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQgLSBhZGQgZHJpdmVyLW1hbmFnZWQgbWVtb3J5XG4gICogQG5pZDogTlVNQSBub2RlIElEIHdoZXJlIHRoZSBtZW1vcnkgd2lsbCBiZSBhZGRlZFxuQEAgLTE3MjUsNyAmIzQzOzE3ODMsNyBAQCBpbnQgYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxuIHtcbiBcdHJldHVybiBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQobmlkLCBzdGFydCwgc2l6ZSwgcmVzb3VyY2VfbmFtZSxcbiBcdFx0XHRtaHBfZmxhZ3MsXG4tXHRcdFx0bWhwX2dldF9kZWZhdWx0X29ubGluZV90eXBlKCkpO1xuJiM0MztcdFx0XHRtaHBfZ2V0X2RlZmF1bHRfb25saW5lX3R5cGUoKSwgTlVMTCk7XG4gfVxuIEVYUE9SVF9TWU1CT0xfR1BMKGFkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQpO1xuIFxuQEAgLTE4NDMsMTEgJiM0MzsxOTAxLDEyIEBAIHN0YXRpYyBpbnQgc2Nhbl9tb3ZhYmxlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiYjNDM7c3RhdGljIGludCBkb19taWdyYXRlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXG4ge1xuIFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiBcdHVuc2lnbmVkIGxvbmcgcGZuO1xuIFx0TElTVF9IRUFEKHNvdXJjZSk7XG4mIzQzO1x0aW50IGVyciA9IDA7XG4gXHRzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShtaWdyYXRlX3JzLCBERUZBVUxUX1JBVEVMSU1JVF9JTlRFUlZBTCxcbiBcdFx0XHRcdCAgICAgIERFRkFVTFRfUkFURUxJTUlUX0JVUlNUKTtcbiBcbkBAIC0xODg0LDYgJiM0MzsxOTQzLDE1IEBAIHN0YXRpYyB2b2lkIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiBcdFx0XHRnb3RvIHB1dF9mb2xpbztcbiBcdFx0fVxuIFxuJiM0MztcdFx0LyogRmFpbCBvdXRyaWdodCBvbiBwcml2YXRlIG5vZGVzIHcvbyBob3R1bnBsdWcgc3VwcG9ydCAqL1xuJiM0MztcdFx0aWYgKCFub2RlX2FsbG93c19ob3R1bnBsdWcoZm9saW9fbmlkKGZvbGlvKSkpIHtcbiYjNDM7XHRcdFx0cHJfaW5mb19yYXRlbGltaXRlZChcJiMzNDttZW1vcnkgb2ZmbGluZSByZWZ1c2VkOiBub2RlICVkIHBmbiAlbHhcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICAgZm9saW9fbmlkKGZvbGlvKSwgcGZuKTtcbiYjNDM7XHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiYjNDM7XHRcdFx0ZXJyID0gLUVCVVNZO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XG4gXHRcdGlmICghaXNvbGF0ZV9mb2xpb190b19saXN0KGZvbGlvLCBcdTAwMjZzb3VyY2UpKSB7XG4gXHRcdFx0aWYgKF9fcmF0ZWxpbWl0KFx1MDAyNm1pZ3JhdGVfcnMpKSB7XG4gXHRcdFx0XHRwcl93YXJuKFwmIzM0O2ZhaWxlZCB0byBpc29sYXRlIHBmbiAlbHhcXG5cJiMzNDssXG5AQCAtMTkzMSw2ICYjNDM7MTk5OSw3IEBAIHN0YXRpYyB2b2lkIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiBcdFx0XHRwdXRiYWNrX21vdmFibGVfcGFnZXMoXHUwMDI2c291cmNlKTtcbiBcdFx0fVxuIFx0fVxuJiM0MztcdHJldHVybiBlcnI7XG4gfVxuIFxuIHN0YXRpYyBpbnQgX19pbml0IGNtZGxpbmVfcGFyc2VfbW92YWJsZV9ub2RlKGNoYXIgKnApXG5AQCAtMjAyOSw3ICYjNDM7MjA5OCw3IEBAIGludCBvZmZsaW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuIFx0LypcbiBcdCAqIENoZWNrIHdoZXRoZXIgdGhlIG5vZGUgd2lsbCBoYXZlIG5vIHByZXNlbnQgcGFnZXMgYWZ0ZXIgd2Ugb2ZmbGluZVxuIFx0ICogJiMzOTtucl9wYWdlcyYjMzk7IG1vcmUuIElmIHNvLCB3ZSBrbm93IHRoYXQgdGhlIG5vZGUgd2lsbCBiZWNvbWUgZW1wdHksIGFuZFxuLVx0ICogc28gd2Ugd2lsbCBjbGVhciBOX01FTU9SWSBmb3IgaXQuXG4mIzQzO1x0ICogc28gd2Ugd2lsbCBjbGVhciBOX01FTU9SWShfUFJJVkFURSkgZm9yIGl0LlxuIFx0ICovXG4gXHRpZiAobnJfcGFnZXMgXHUwMDNlPSBwZ2RhdC1cdTAwM2Vub2RlX3ByZXNlbnRfcGFnZXMpIHtcbiBcdFx0bm9kZV9hcmcubmlkID0gbm9kZTtcbkBAIC0yMDY3LDEwICYjNDM7MjEzNiwxMSBAQCBpbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdFx0XHRyZXQgPSBzY2FuX21vdmFibGVfcGFnZXMocGZuLCBlbmRfcGZuLCBcdTAwMjZwZm4pO1xuIFx0XHRcdGlmICghcmV0KSB7XG4gXHRcdFx0XHQvKlxuLVx0XHRcdFx0ICogVE9ETzogZmF0YWwgbWlncmF0aW9uIGZhaWx1cmVzIHNob3VsZCBiYWlsXG4tXHRcdFx0XHQgKiBvdXRcbiYjNDM7XHRcdFx0XHQgKiBBIGZhdGFsIG1pZ3JhdGlvbiBmYWlsdXJlIChlLmcuIGEgZm9saW8gb24gYVxuJiM0MztcdFx0XHRcdCAqIG5vbi1taWdyYXRhYmxlIHByaXZhdGUgbm9kZSkgYmFpbHMgb3V0OyB0cmFuc2llbnRcbiYjNDM7XHRcdFx0XHQgKiBmYWlsdXJlcyBsZWF2ZSByZXQgemVybyBhbmQgYXJlIHJldHJpZWQgYmVsb3cuXG4gXHRcdFx0XHQgKi9cbi1cdFx0XHRcdGRvX21pZ3JhdGVfcmFuZ2UocGZuLCBlbmRfcGZuKTtcbiYjNDM7XHRcdFx0XHRyZXQgPSBkb19taWdyYXRlX3JhbmdlKHBmbiwgZW5kX3Bmbik7XG4gXHRcdFx0fVxuIFx0XHR9IHdoaWxlICghcmV0KTtcbiBcbkBAIC0yMTMzLDggJiM0MzsyMjAzLDEwIEBAIGludCBvZmZsaW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuIFx0ICogTWFrZSBzdXJlIHRvIG1hcmsgdGhlIG5vZGUgYXMgbWVtb3J5LWxlc3MgYmVmb3JlIHJlYnVpbGRpbmcgdGhlIHpvbmVcbiBcdCAqIGxpc3QuIE90aGVyd2lzZSB0aGlzIG5vZGUgd291bGQgc3RpbGwgYXBwZWFyIGluIHRoZSBmYWxsYmFjayBsaXN0cy5cbiBcdCAqL1xuLVx0aWYgKG5vZGVfYXJnLm5pZCBcdTAwM2U9IDApXG4mIzQzO1x0aWYgKG5vZGVfYXJnLm5pZCBcdTAwM2U9IDApIHtcbiBcdFx0bm9kZV9jbGVhcl9zdGF0ZShub2RlLCBOX01FTU9SWSk7XG4mIzQzO1x0XHRub2RlX2NsZWFyX3N0YXRlKG5vZGUsIE5fTUVNT1JZX1BSSVZBVEUpO1xuJiM0MztcdH1cbiBcdGlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpIHtcbiBcdFx0em9uZV9wY3BfcmVzZXQoem9uZSk7XG4gXHRcdGJ1aWxkX2FsbF96b25lbGlzdHMoTlVMTCk7XG5AQCAtMjE5OCw2ICYjNDM7MjI3MCwxNSBAQCBzdGF0aWMgaW50IGNvdW50X21lbW9yeV9yYW5nZV9hbHRtYXBzX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfbWVtYmxvY2tfbm9kZXNfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHRub2RlbWFza190ICpub2RlcyA9IGFyZztcbiYjNDM7XG4mIzQzO1x0aWYgKG1lbS1cdTAwM2VuaWQgIT0gTlVNQV9OT19OT0RFKVxuJiM0MztcdFx0bm9kZV9zZXQobWVtLVx1MDAzZW5pZCwgKm5vZGVzKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW50IGNoZWNrX2NwdV9vbl9ub2RlKGludCBuaWQpXG4ge1xuIFx0aW50IGNwdTtcbkBAIC0yNDYxLDEwICYjNDM7MjU0MiwxMSBAQCBFWFBPUlRfU1lNQk9MX0dQTChvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5KTtcbiBpbnQgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMoY29uc3Qgc3RydWN0IHJhbmdlICpyYW5nZXMsXG4gXHRcdHVuc2lnbmVkIGludCBucl9yYW5nZXMpXG4ge1xuJiM0MztcdG5vZGVtYXNrX3Qgbm9kZXMgPSBOT0RFX01BU0tfTk9ORTtcbiBcdHVuc2lnbmVkIGxvbmcgbWJfY291bnQgPSAwO1xuIFx0dWludDhfdCAqb25saW5lX3R5cGVzLCAqdG1wO1xuIFx0dW5zaWduZWQgaW50IGk7XG4tXHRpbnQgcmMgPSAwO1xuJiM0MztcdGludCBuaWQsIHJjID0gMDtcbiBcbiBcdGlmICghcmFuZ2VzIHx8ICFucl9yYW5nZXMpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTI0OTIsNiAmIzQzOzI1NzQsMTEgQEAgaW50IG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzKGNvbnN0IHN0cnVjdCByYW5nZSAqcmFuZ2VzLFxuIFxuIFx0bG9ja19kZXZpY2VfaG90cGx1ZygpO1xuIFxuJiM0MztcdC8qIFJlY29yZCB0aGUgbm9kZXMgZm9yIHRoZSBibG9ja3MgdG8gZHJvcCBwcml2YXRlLW5vZGUgZGF0YSBhZnRlciAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3JhbmdlczsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHR3YWxrX21lbW9yeV9ibG9ja3MocmFuZ2VzW2ldLnN0YXJ0LCByYW5nZV9sZW4oXHUwMDI2cmFuZ2VzW2ldKSxcbiYjNDM7XHRcdFx0XHQgICBcdTAwMjZub2RlcywgY29sbGVjdF9tZW1ibG9ja19ub2Rlc19jYik7XG4mIzQzO1xuIFx0LypcbiBcdCAqIFBoYXNlIDE6IG9mZmxpbmUgZXZlcnkgYmxvY2sgaW4gZXZlcnkgcmFuZ2UuICBBbiBhbHJlYWR5LW9mZmxpbmVcbiBcdCAqIGJsb2NrIGZvbGRzIHRvIHN1Y2Nlc3MsIHNvIG91dC1vZi1iYW5kIG9mZmxpbmluZyBuZXZlciBibG9ja3MgdW5wbHVnLlxuQEAgLTI1MjIsNiAmIzQzOzI2MDksMTAgQEAgaW50IG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzKGNvbnN0IHN0cnVjdCByYW5nZSAqcmFuZ2VzLFxuIG91dF91bmxvY2s6XG4gXHR1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcbiBcbiYjNDM7XHQvKiBEcm9wIHByaXZhdGUgbm9kZSByZWdpc3RyYXRpb24gaWYgdGhleSBhcmUgbm93IG1lbW9yeWxlc3MgKi9cbiYjNDM7XHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBub2RlcylcbiYjNDM7XHRcdG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKG5pZCk7XG4mIzQzO1xuIFx0a2ZyZWUob25saW5lX3R5cGVzKTtcbiBcdHJldHVybiByYztcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuY1xuaW5kZXggNTcyMGY3ZjU0ZDk0MmYuLjIzYzRjMjUwOTc0NTA0IDEwMDY0NFxuLS0tIGEvbW0vbWVtcG9saWN5LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbXBvbGljeS5jXG5AQCAtMTExLDYgJiM0MzsxMTEsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21tdV9ub3RpZmllci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcHJpbnRrLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9sZWFmb3BzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9nY2QuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFx1MDAzY2FzbS90bGJmbHVzaC5oXHUwMDNlXG5AQCAtNDA1LDcgJiM0Mzs0MDYsNyBAQCBzdGF0aWMgaW50IG1wb2xfbmV3X3ByZWZlcnJlZChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxuIHN0YXRpYyBpbnQgbXBvbF9zZXRfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuIFx0XHQgICAgIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzLCBzdHJ1Y3Qgbm9kZW1hc2tfc2NyYXRjaCAqbnNjKVxuIHtcbi1cdGludCByZXQ7XG4mIzQzO1x0aW50IHJldCwgbmlkO1xuIFxuIFx0LypcbiBcdCAqIERlZmF1bHQgKHBvbD09TlVMTCkgcmVzcC4gbG9jYWwgbWVtb3J5IHBvbGljaWVzIGFyZSBub3QgYVxuQEAgLTQzMSw2ICYjNDM7NDMyLDIzIEBAIHN0YXRpYyBpbnQgbXBvbF9zZXRfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuIFx0ZWxzZVxuIFx0XHRwb2wtXHUwMDNldy5jcHVzZXRfbWVtc19hbGxvd2VkID0gY3B1c2V0X2N1cnJlbnRfbWVtc19hbGxvd2VkO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogUHJpdmF0ZSBub2RlcyBhcmUgbm90IGluIGNwdXNldC5tZW1zLCBzbyB0aGV5JiMzOTtyZSBhbHdheXMgc3RyaXBwZWQuXG4mIzQzO1x0ICogRHJpdmVyLWFsbG9jYXRlZCBwb2xpY2llcyAoTVBPTF9GX1BSSVZBVEUpIGFuZCBDQVBfVVNFUl9OVU1BIHByaXZhdGVcbiYjNDM7XHQgKiBub2RlcyBzaG91bGQgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBub2RlbWFzay5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCAqbm9kZXMpIHtcbiYjNDM7XHRcdGlmICghbm9kZV9pc19wcml2YXRlKG5pZCkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0aWYgKChwb2wtXHUwMDNlZmxhZ3MgXHUwMDI2IE1QT0xfRl9QUklWQVRFKSB8fFxuJiM0MztcdFx0ICAgIG5vZGVfYWxsb3dzX3VzZXJfbnVtYShuaWQpKVxuJiM0MztcdFx0XHRub2RlX3NldChuaWQsIG5zYy1cdTAwM2VtYXNrMik7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBJZiBhbnkgcHJpdmF0ZSBub2RlcyBsZWZ0IGluIHRoZSBub2RlbWFzayAtIGFkZCB0aGUgcHJpdmF0ZSBmbGFnICovXG4mIzQzO1x0aWYgKG5vZGVzX2ludGVyc2VjdHMobnNjLVx1MDAzZW1hc2syLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSkpXG4mIzQzO1x0XHRwb2wtXHUwMDNlZmxhZ3MgfD0gTVBPTF9GX1BSSVZBVEU7XG4mIzQzO1xuIFx0cmV0ID0gbXBvbF9vcHNbcG9sLVx1MDAzZW1vZGVdLmNyZWF0ZShwb2wsIFx1MDAyNm5zYy1cdTAwM2VtYXNrMik7XG4gXHRyZXR1cm4gcmV0O1xuIH1cbkBAIC00OTYsNyAmIzQzOzUxNCw3IEBAIHZvaWQgX19tcG9sX3B1dChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4gXHQgKi9cbiBcdGtmcmVlX3JjdShwb2wsIHJjdSk7XG4gfVxuLUVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMoX19tcG9sX3B1dCwgXCYjMzQ7a3ZtXCYjMzQ7KTtcbiYjNDM7RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhfX21wb2xfcHV0LCBcJiMzNDtrdm0sa21lbVwmIzM0Oyk7XG4gXG4gc3RhdGljIHZvaWQgbXBvbF9yZWJpbmRfZGVmYXVsdChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxuIHtcbkBAIC01MDQsMjIgJiM0Mzs1MjIsMzMgQEAgc3RhdGljIHZvaWQgbXBvbF9yZWJpbmRfZGVmYXVsdChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxuIFxuIHN0YXRpYyB2b2lkIG1wb2xfcmViaW5kX25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMpXG4ge1xuLVx0bm9kZW1hc2tfdCB0bXA7XG4mIzQzO1x0bm9kZW1hc2tfdCB0bXAsIHByaXY7XG4mIzQzO1xuJiM0MztcdC8qIHByZXNlcnZlIG9ubGluZSBwcml2YXRlIG5vZGVzIHRvIHJlLWFkZCBsYXRlciAqL1xuJiM0MztcdG5vZGVzX2FuZChwcml2LCBwb2wtXHUwMDNlbm9kZXMsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcbiBcbiBcdGlmIChwb2wtXHUwMDNlZmxhZ3MgXHUwMDI2IE1QT0xfRl9TVEFUSUNfTk9ERVMpXG4gXHRcdG5vZGVzX2FuZCh0bXAsIHBvbC1cdTAwM2V3LnVzZXJfbm9kZW1hc2ssICpub2Rlcyk7XG4tXHRlbHNlIGlmIChwb2wtXHUwMDNlZmxhZ3MgXHUwMDI2IE1QT0xfRl9SRUxBVElWRV9OT0RFUylcbi1cdFx0bXBvbF9yZWxhdGl2ZV9ub2RlbWFzayhcdTAwMjZ0bXAsIFx1MDAyNnBvbC1cdTAwM2V3LnVzZXJfbm9kZW1hc2ssIG5vZGVzKTtcbi1cdGVsc2Uge1xuJiM0MztcdGVsc2UgaWYgKHBvbC1cdTAwM2VmbGFncyBcdTAwMjYgTVBPTF9GX1JFTEFUSVZFX05PREVTKSB7XG4mIzQzO1x0XHQvKiBmb2xkIG9ubHkgdGhlIHB1YmxpYyBwYXJ0OiBhIHByaXZhdGUgbm9kZSBtdXN0IG5vdCB0YWtlIGEgc2xvdCAqL1xuJiM0MztcdFx0bm9kZXNfYW5kKHRtcCwgcG9sLVx1MDAzZXcudXNlcl9ub2RlbWFzaywgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbiYjNDM7XHRcdG1wb2xfcmVsYXRpdmVfbm9kZW1hc2soXHUwMDI2dG1wLCBcdTAwMjZ0bXAsIG5vZGVzKTtcbiYjNDM7XHR9IGVsc2Uge1xuIFx0XHRub2Rlc19yZW1hcCh0bXAsIHBvbC1cdTAwM2Vub2RlcywgcG9sLVx1MDAzZXcuY3B1c2V0X21lbXNfYWxsb3dlZCxcbiBcdFx0XHRcdFx0XHRcdFx0Km5vZGVzKTtcbiBcdFx0cG9sLVx1MDAzZXcuY3B1c2V0X21lbXNfYWxsb3dlZCA9ICpub2RlcztcbiBcdH1cbiBcbi1cdGlmIChub2Rlc19lbXB0eSh0bXApKVxuJiM0MztcdC8qIHByaXZhdGUgbm9kZXMgYXJlIGlkZW50aXR5LW1hcHBlZCBkdXJpbmcgcmVtYXAsIGRyb3AgdGhlbSBoZXJlICovXG4mIzQzO1x0bm9kZXNfYW5kKHRtcCwgdG1wLCBub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuJiM0MztcdGlmIChub2Rlc19lbXB0eSh0bXApIFx1MDAyNlx1MDAyNiBub2Rlc19lbXB0eShwcml2KSlcbiBcdFx0dG1wID0gKm5vZGVzO1xuIFxuLVx0cG9sLVx1MDAzZW5vZGVzID0gdG1wO1xuJiM0MztcdC8qIElmIGFueSBvbmxpbmUgcHJpdmF0ZSBub2RlcyByZW1haW4sIGFkZCB0aGVtIGJhY2sgKi9cbiYjNDM7XHRub2Rlc19vcihwb2wtXHUwMDNlbm9kZXMsIHRtcCwgcHJpdik7XG4mIzQzO1x0LyogSWYgbm8gb25saW5lIHByaXZhdGUgbm9kZXMgcmVtYWluLCBzdHJpcCB0aGUgcHJpdmF0ZSBmbGFnICovXG4mIzQzO1x0aWYgKG5vZGVzX2VtcHR5KHByaXYpKVxuJiM0MztcdFx0cG9sLVx1MDAzZWZsYWdzIFx1MDAyNj0gfk1QT0xfRl9QUklWQVRFO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBtcG9sX3JlYmluZF9wcmVmZXJyZWQoc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuQEAgLTY2OCw2ICYjNDM7Njk3LDggQEAgc3RhdGljIHZvaWQgcXVldWVfZm9saW9zX3BtZChwbWRfdCAqcG1kLCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcbiBcdH1cbiBcdGlmICghcXVldWVfZm9saW9fcmVxdWlyZWQoZm9saW8sIHFwKSlcbiBcdFx0cmV0dXJuO1xuJiM0MztcdGlmICghbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKVxuJiM0MztcdFx0cmV0dXJuO1xuIFx0aWYgKCEocXAtXHUwMDNlZmxhZ3MgXHUwMDI2IChNUE9MX01GX01PVkUgfCBNUE9MX01GX01PVkVfQUxMKSkgfHxcbiBcdCAgICAhdm1hX21pZ3JhdGFibGUod2Fsay1cdTAwM2V2bWEpIHx8XG4gXHQgICAgIW1pZ3JhdGVfZm9saW9fYWRkKGZvbGlvLCBxcC1cdTAwM2VwYWdlbGlzdCwgcXAtXHUwMDNlZmxhZ3MpKVxuQEAgLTcyMiw3ICYjNDM7NzUzLDggQEAgc3RhdGljIGludCBxdWV1ZV9mb2xpb3NfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0fVxuIFx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbi1cdFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4mIzQzO1x0XHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fFxuJiM0MztcdFx0ICAgICFub2RlX2FsbG93c191c2VyX251bWEoZm9saW9fbmlkKGZvbGlvKSkpXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSBcdTAwMjZcdTAwMjYgbWF4X25yICE9IDEpXG4gXHRcdFx0bnIgPSBmb2xpb19wdGVfYmF0Y2goZm9saW8sIHB0ZSwgcHRlbnQsIG1heF9ucik7XG5AQCAtNzk3LDYgJiM0Mzs4MjksOCBAQCBzdGF0aWMgaW50IHF1ZXVlX2ZvbGlvc19odWdldGxiKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgaG1hc2ssXG4gXHRmb2xpbyA9IHBmbl9mb2xpbyhwdGVfcGZuKHB0ZXApKTtcbiBcdGlmICghcXVldWVfZm9saW9fcmVxdWlyZWQoZm9saW8sIHFwKSlcbiBcdFx0Z290byB1bmxvY2s7XG4mIzQzO1x0aWYgKCFub2RlX2FsbG93c191c2VyX251bWEoZm9saW9fbmlkKGZvbGlvKSkpXG4mIzQzO1x0XHRnb3RvIHVubG9jaztcbiBcdGlmICghKGZsYWdzIFx1MDAyNiAoTVBPTF9NRl9NT1ZFIHwgTVBPTF9NRl9NT1ZFX0FMTCkpIHx8XG4gXHQgICAgIXZtYV9taWdyYXRhYmxlKHdhbGstXHUwMDNldm1hKSkge1xuIFx0XHRxcC1cdTAwM2Vucl9mYWlsZWQmIzQzOyYjNDM7O1xuQEAgLTg0MCw3ICYjNDM7ODc0LDcgQEAgYm9vbCBmb2xpb19jYW5fbWFwX3Byb3RfbnVtYShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiB7XG4gXHRpbnQgbmlkO1xuIFxuLVx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHwgZm9saW9fdGVzdF9rc20oZm9saW8pKVxuJiM0MztcdGlmICghZm9saW8gfHwgIWZvbGlvX2FsbG93c19udW1hX2JhbGFuY2UoZm9saW8pIHx8IGZvbGlvX3Rlc3Rfa3NtKGZvbGlvKSlcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuIFx0LyogQWxzbyBza2lwIHNoYXJlZCBjb3B5LW9uLXdyaXRlIGZvbGlvcyAqL1xuQEAgLTExMDYsNiAmIzQzOzExNDAsOTIgQEAgc3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBCdWlsZCBhIHJlZmNvdW50ZWQgTVBPTF9CSU5EIHBvbGljeSB0YXJnZXRpbmcgdGhlIHNpbmdsZSBub2RlIEBuaWQsXG4mIzQzOyAqIGNvbnRleHR1YWxpc2VkIHRvIHRoZSBjYWxsZXImIzM5O3MgY3B1c2V0IGxpa2UgYSB1c2Vyc3BhY2UgbWJpbmQoKS5cbiYjNDM7ICpcbiYjNDM7ICogQGZsYWdzIGlzIE1QT0xfRl9QUklWQVRFIGZvciB0aGUgYW4gZXhwbGljaXQgaW4ta2VybmVsIHVzZXIsIGxldHRpbmdcbiYjNDM7ICogYSBwcml2YXRlIG5vZGUgYmUgYm91bmQgd2l0aG91dCBjaGVja2luZyBDQVBfVVNFUl9OVU1BLiAgT3RoZXJ3aXNlLFxuJiM0MzsgKiBDQVBfVVNFUl9OVU1BIGlzIGVuZm9yY2VkLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKl9fbXBvbF9iaW5kX25vZGUoaW50IG5pZCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4mIzQzO1x0bm9kZW1hc2tfdCBub2RlcztcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXNjcmF0Y2gpXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiYjNDM7XG4mIzQzO1x0bm9kZXNfY2xlYXIobm9kZXMpO1xuJiM0MztcdG5vZGVfc2V0KG5pZCwgbm9kZXMpO1xuJiM0MztcbiYjNDM7XHRwb2wgPSBtcG9sX25ldyhNUE9MX0JJTkQsIGZsYWdzLCBcdTAwMjZub2Rlcyk7XG4mIzQzO1x0aWYgKElTX0VSUihwb2wpKSB7XG4mIzQzO1x0XHROT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7XG4mIzQzO1x0XHRyZXR1cm4gcG9sO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBcdTAwMjZub2Rlcywgc2NyYXRjaCk7XG4mIzQzO1x0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdG1wb2xfcHV0KHBvbCk7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gcG9sO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogbXBvbF9wcml2YXRlX2JpbmQgLSBidWlsZCBhbiBNUE9MX0JJTkQgcG9saWN5IHBpbm5lZCB0byBhIHByaXZhdGUgbm9kZVxuJiM0MzsgKiBAbmlkOiBhbiBOX01FTU9SWV9QUklWQVRFIG5vZGVcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJucyBhIHJlZmNvdW50ZWQgbWVtcG9saWN5IHRoYXQgYmluZHMgYWxsb2NhdGlvbnMgdG8gQG5pZCB3aXRoIHRoZVxuJiM0MzsgKiBwcml2YXRlLXBsYWNlbWVudCBpbnRlbnQgKE1QT0xfRl9QUklWQVRFKS4gIFRoaXMgYmluZHMgdG8gQG5pZCByZWdhcmRsZXNzXG4mIzQzOyAqIG9mIHRoZSBub2RlJiMzOTtzIENBUF9VU0VSX05VTUEsIHByb3ZpZGluZyBhIHByaXZpbGVnZWQgd2F5IGZvciBub2RlLW93bmVyc1xuJiM0MzsgKiB0byBiaW5kIGRyaXZlci9zZXJ2aWNlIG93bmVkIFZNQXMgdG8gdGhlIG5vZGUuXG4mIzQzOyAqXG4mIzQzOyAqIExpa2UgYW55IE1QT0xfQklORCBpdCBpcyByZWxheGFibGU6IGFuIHVuc2F0aXNmaWFibGUgcmVxdWVzdCBmYWxscyBiYWNrXG4mIzQzOyAqIHJhdGhlciB0aGFuIGZhaWxpbmcuXG4mIzQzOyAqXG4mIzQzOyAqIE11c3QgYmUgY2FsbGVkIHdoaWxlIEBuaWQgaXMgTl9NRU1PUllfUFJJVkFURS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGNhbGxlciBvd25zIHRoZSByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB0aGUgcG9saWN5LCBvciBhbiBFUlJfUFRSIG9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgbWVtcG9saWN5ICptcG9sX3ByaXZhdGVfYmluZChpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFub2RlX2lzX3ByaXZhdGUobmlkKSlcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuJiM0MztcdHJldHVybiBfX21wb2xfYmluZF9ub2RlKG5pZCwgTVBPTF9GX1BSSVZBVEUpO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9wcml2YXRlX2JpbmQsIFwmIzM0O2ttZW1cJiMzNDspO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG1wb2xfYmluZF9ub2RlIC0gYnVpbGQgYW4gTVBPTF9CSU5EIHBvbGljeSB0YXJnZXRpbmcgQG5pZCBmb3IgaW4ta2VybmVsIHVzZVxuJiM0MzsgKiBAbmlkOiB0aGUgbm9kZSB0byBiaW5kIHRvXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgYSByZWZjb3VudGVkIE1QT0xfQklORCBwb2xpY3kgdGhhdCBwbGFjZXMgYWxsb2NhdGlvbnMgb24gQG5pZCxcbiYjNDM7ICogY29udGV4dHVhbGlzZWQgdG8gdGhlIGNhbGxlciYjMzk7cyBjcHVzZXQgZXhhY3RseSBsaWtlIGEgdXNlcnNwYWNlIG1iaW5kKCkuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSB1c2VkIGJ5IHNlcnZpY2VzIGltcGxlbnRpbmcgbWVtcG9saWN5IHN1cHBvcnQgd2l0aFxuJiM0MzsgKiB1c2VyLXByb3ZpZGVkIG5vZGUgYmluZGluZ3MuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZSBiaW5kaW5ncyBhcmUgaG9ub3JlZCBpZlxuJiM0MzsgKiB0aGUgbm9kZSBoYXMgQ0FQX1VTRVJfTlVNQSwgb3RoZXJ3aXNlIHJldHVybiAtRUlOVkFMLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHRoZSBwb2xpY3ksIG9yIGFuIEVSUl9QVFIgb24gZmFpbHVyZS5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBtZW1wb2xpY3kgKm1wb2xfYmluZF9ub2RlKGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gX19tcG9sX2JpbmRfbm9kZShuaWQsIDApO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9iaW5kX25vZGUsIFwmIzM0O2t2bVwmIzM0Oyk7XG4mIzQzO1xuIC8qXG4gICogUmV0dXJuIG5vZGVtYXNrIGZvciBwb2xpY3kgZm9yIGdldF9tZW1wb2xpY3koKSBxdWVyeVxuICAqXG5AQCAtMTI5NCw2ICYjNDM7MTQxNCw4IEBAIHN0YXRpYyBsb25nIG1pZ3JhdGVfdG9fbm9kZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaW50IHNvdXJjZSwgaW50IGRlc3QsXG4gXHRcdC5uaWQgPSBkZXN0LFxuIFx0XHQuZ2ZwX21hc2sgPSBHRlBfSElHSFVTRVJfTU9WQUJMRSB8IF9fR0ZQX1RISVNOT0RFLFxuIFx0XHQucmVhc29uID0gTVJfU1lTQ0FMTCxcbiYjNDM7XHRcdC5hbGxvY19mbGFncyA9IG5vZGVfaXNfcHJpdmF0ZShkZXN0KSA/XG4mIzQzO1x0XHRcdCBBTExPQ19aT05FTElTVF9QUklWQVRFIDogQUxMT0NfREVGQVVMVCxcbiBcdH07XG4gXG4gXHRub2Rlc19jbGVhcihubWFzayk7XG5AQCAtMTg2Nyw5ICYjNDM7MTk4OSwxMCBAQCBzdGF0aWMgaW50IGtlcm5lbF9taWdyYXRlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBtYXhub2RlLFxuIFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMO1xuIFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xuIFx0bm9kZW1hc2tfdCB0YXNrX25vZGVzO1xuLVx0aW50IGVycjtcbiYjNDM7XHRub2RlbWFza190IHByaXZfb2s7XG4gXHRub2RlbWFza190ICpvbGQ7XG4gXHRub2RlbWFza190ICpuZXc7XG4mIzQzO1x0aW50IGVyciwgbmlkO1xuIFx0Tk9ERU1BU0tfU0NSQVRDSChzY3JhdGNoKTtcbiBcbiBcdGlmICghc2NyYXRjaClcbkBAIC0xOTA5LDcgJiM0MzsyMDMyLDE0IEBAIHN0YXRpYyBpbnQga2VybmVsX21pZ3JhdGVfcGFnZXMocGlkX3QgcGlkLCB1bnNpZ25lZCBsb25nIG1heG5vZGUsXG4gXHR9XG4gXHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiYjNDM7XHQvKiBQcml2YXRlIG5vZGVzIGFyZSBzdHJpcHBlZCBieSBjcHVzZXQgY2hlY2tzLiBBbGxvdyBlbGlnaWJsZSBvbmVzLiAqL1xuJiM0MztcdG5vZGVzX2NsZWFyKHByaXZfb2spO1xuJiM0MztcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsICpuZXcpXG4mIzQzO1x0XHRpZiAobm9kZV9pc19wcml2YXRlKG5pZCkgXHUwMDI2XHUwMDI2IG5vZGVfYWxsb3dzX3VzZXJfbnVtYShuaWQpKVxuJiM0MztcdFx0XHRub2RlX3NldChuaWQsIHByaXZfb2spO1xuJiM0MztcbiBcdHRhc2tfbm9kZXMgPSBjcHVzZXRfbWVtc19hbGxvd2VkKHRhc2spO1xuJiM0MztcdG5vZGVzX29yKHRhc2tfbm9kZXMsIHRhc2tfbm9kZXMsIHByaXZfb2spO1xuIFx0LyogSXMgdGhlIHVzZXIgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIHRhcmdldCBub2Rlcz8gKi9cbiBcdGlmICghbm9kZXNfc3Vic2V0KCpuZXcsIHRhc2tfbm9kZXMpIFx1MDAyNlx1MDAyNiAhY2FwYWJsZShDQVBfU1lTX05JQ0UpKSB7XG4gXHRcdGVyciA9IC1FUEVSTTtcbkBAIC0xOTE3LDYgJiM0MzsyMDQ3LDcgQEAgc3RhdGljIGludCBrZXJuZWxfbWlncmF0ZV9wYWdlcyhwaWRfdCBwaWQsIHVuc2lnbmVkIGxvbmcgbWF4bm9kZSxcbiBcdH1cbiBcbiBcdHRhc2tfbm9kZXMgPSBjcHVzZXRfbWVtc19hbGxvd2VkKGN1cnJlbnQpO1xuJiM0MztcdG5vZGVzX29yKHRhc2tfbm9kZXMsIHRhc2tfbm9kZXMsIHByaXZfb2spO1xuIFx0aWYgKCFub2Rlc19hbmQoKm5ldywgKm5ldywgdGFza19ub2RlcykpXG4gXHRcdGdvdG8gb3V0X3B1dDtcbiBcbkBAIC0yMDcxLDYgJiM0MzsyMjAyLDM0IEBAIGJvb2wgdm1hX3BvbGljeV9tb2Yoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4gXHRyZXR1cm4gbW9mO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogdHJ1ZSBpZiBhbnkgcG9saWN5ICpwcml2YXRlKiBub2RlIGNhbiBzYXRpc2Z5IGEgIV9fR0ZQX01PVkFCTEUgYWxsb2NhdGlvbi5cbiYjNDM7ICogUG9saWNpZXMgd2l0aG91dCBwcml2YXRlIG5vZGVzICh+TVBPTF9GX1BSSVZBVEUpIGFsd2F5cyByZXR1cm4gZmFsc2UuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgcHJvdmlkZXMgYSB3YXkgZm9yIG90aGVyd2lzZS1ib3VuZCBrZXJuZWwgYWxsb2NhdGlvbnMgdG8gbWFrZSB0aGVpclxuJiM0MzsgKiB3YXkgb250byBwcml2YXRlIG5vZGVzIHdpdGggWk9ORV9OT1JNQUwgbWVtb3J5IHdpdGhvdXQgaGF2aW5nIHRvIGF1ZGl0XG4mIzQzOyAqIGV2ZXJ5IGNhbGxlci4gIFRoZSBjb3N0IGlzIGEgem9uZSBzY2FuIGZvciBwcml2YXRlIG5vZGVzIGluIHRoZSBtYXNrLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgcG9saWN5X3ByaXZhdGVfaGFzX2tlcm5lbF96b25lKGNvbnN0IHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbiYjNDM7e1xuJiM0MztcdGludCBuaWQ7XG4mIzQzO1xuJiM0MztcdGlmICghKHBvbC1cdTAwM2VmbGFncyBcdTAwMjYgTVBPTF9GX1BSSVZBVEUpKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBwb2wtXHUwMDNlbm9kZXMpIHtcbiYjNDM7XHRcdHBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTtcbiYjNDM7XHRcdGVudW0gem9uZV90eXBlIHp0O1xuJiM0MztcbiYjNDM7XHRcdGlmICghbm9kZV9pc19wcml2YXRlKG5pZCkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0Zm9yICh6dCA9IFpPTkVfTk9STUFMOyB6dCBcdTAwM2MgWk9ORV9NT1ZBQkxFOyB6dCYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdGlmIChtYW5hZ2VkX3pvbmUoXHUwMDI2cGdkYXQtXHUwMDNlbm9kZV96b25lc1t6dF0pKVxuJiM0MztcdFx0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gZmFsc2U7XG4mIzQzO31cbiYjNDM7XG4gYm9vbCBhcHBseV9wb2xpY3lfem9uZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3ksIGVudW0gem9uZV90eXBlIHpvbmUpXG4ge1xuIFx0ZW51bSB6b25lX3R5cGUgZHluYW1pY19wb2xpY3lfem9uZSA9IHBvbGljeV96b25lO1xuQEAgLTIwNzgsMTQgJiM0MzsyMjM3LDIyIEBAIGJvb2wgYXBwbHlfcG9saWN5X3pvbmUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBlbnVtIHpvbmVfdHlwZSB6b25lKVxuIFx0QlVHX09OKGR5bmFtaWNfcG9saWN5X3pvbmUgPT0gWk9ORV9NT1ZBQkxFKTtcbiBcbiBcdC8qXG4tXHQgKiBpZiBwb2xpY3ktXHUwMDNlbm9kZXMgaGFzIG1vdmFibGUgbWVtb3J5IG9ubHksXG4tXHQgKiB3ZSBhcHBseSBwb2xpY3kgd2hlbiBnZnBfem9uZShnZnApID0gWk9ORV9NT1ZBQkxFIG9ubHkuXG4mIzQzO1x0ICogZHluYW1pY19wb2xpY3lfem9uZSBpcyB0aGUgbG93ZXN0IHpvbmUgdGhpcyBwb2xpY3kgaXMgZW5mb3JjZWQgZm9yLFxuJiM0MztcdCAqIGFsbG9jYXRpb25zIGJlbG93IGl0IGlnbm9yZSB0aGUgbm9kZW1hc2sgYW5kIGZhbGwgYmFjayBmcmVlbHkuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBJZiBhbGwgcG9saWN5LW5vZGVzIGFyZSBtb3ZhYmxlLW9ubHkgKGFsbCBaT05FX01PVkFCTEUpLCByYWlzZSB0aGVcbiYjNDM7XHQgKiBkeW5hbWljX3BvbGljeV96b25lIHRvIFpPTkVfTU9WQUJMRSBzbyB0aGF0IG9ubHkgbW92YWJsZSBhbGxvY2F0aW9uc1xuJiM0MztcdCAqIHN0YXkgYm91bmQgLSBvdGhlcndpc2UgdGhpcyB3b3VsZCBmb3JjZSBrZXJuZWwtem9uZSBhbGxvY2F0aW9uc1xuJiM0MztcdCAqIChlLmcuIHBhZ2UgdGFibGVzKSBvbnRvIGEgem9uZSB0aGF0IGNhbm5vdCBzYXRpc2Z5IHRoZW0uICBUaGlzXG4mIzQzO1x0ICogcmVzdWx0cyBpbiBhbGxvY2F0aW9uIGZhaWx1cmUgYW5kIHJldHJ5IGxvb3AgKGxpdmVsb2NrKS5cbiBcdCAqXG4tXHQgKiBwb2xpY3ktXHUwMDNlbm9kZXMgaXMgaW50ZXJzZWN0IHdpdGggbm9kZV9zdGF0ZXNbTl9NRU1PUlldLlxuLVx0ICogc28gaWYgdGhlIGZvbGxvd2luZyB0ZXN0IGZhaWxzLCBpdCBpbXBsaWVzXG4tXHQgKiBwb2xpY3ktXHUwMDNlbm9kZXMgaGFzIG1vdmFibGUgbWVtb3J5IG9ubHkuXG4mIzQzO1x0ICogTl9ISUdIX01FTU9SWSB0ZWxscyB1cyBcJiMzNDtoYXMgYSBub24tbW92YWJsZSB6b25lXCYjMzQ7IGZvciBvcmRpbmFyeSBub2Rlcy5cbiYjNDM7XHQgKiBQcml2YXRlIG5vZGVzIGFyZSBkZWxpYmVyYXRlbHkgZXhjbHVkZWQgZnJvbSBOX0hJR0hfTUVNT1JZLCBzbyB3ZVxuJiM0MztcdCAqIG5lZWQgdG8gY2hlY2sgdGhlaXIgYWN0dWFsIHpvbmVzIC0gYSBrZXJuZWwtem9uZWQgcHJpdmF0ZSBub2RlIGNhblxuJiM0MztcdCAqIGhvbGQgdGhlIGFsbG9jYXRpb24gYW5kIG11c3Qga2VlcCB0aGUgcG9saWN5IGFwcGxpZWQuXG4gXHQgKi9cbi1cdGlmICghbm9kZXNfaW50ZXJzZWN0cyhwb2xpY3ktXHUwMDNlbm9kZXMsIG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKSlcbiYjNDM7XHRpZiAoIW5vZGVzX2ludGVyc2VjdHMocG9saWN5LVx1MDAzZW5vZGVzLCBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICFwb2xpY3lfcHJpdmF0ZV9oYXNfa2VybmVsX3pvbmUocG9saWN5KSlcbiBcdFx0ZHluYW1pY19wb2xpY3lfem9uZSA9IFpPTkVfTU9WQUJMRTtcbiBcbiBcdHJldHVybiB6b25lIFx1MDAzZT0gZHluYW1pY19wb2xpY3lfem9uZTtcbkBAIC0yNDA2LDcgJiM0MzsyNTczLDggQEAgYm9vbCBtZW1wb2xpY3lfaW5fb29tX2RvbWFpbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19wcmVmZXJyZWRfbWFueShnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcbi1cdFx0XHRcdFx0XHRpbnQgbmlkLCBub2RlbWFza190ICpub2RlbWFzaylcbiYjNDM7XHRcdFx0XHRcdFx0aW50IG5pZCwgbm9kZW1hc2tfdCAqbm9kZW1hc2ssXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGludCBhZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXHRnZnBfdCBwcmVmZXJyZWRfZ2ZwO1xuQEAgLTI0MjAsMTQgJiM0MzsyNTg4LDIxIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfcHJlZmVycmVkX21hbnkoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4gXHRwcmVmZXJyZWRfZ2ZwID0gZ2ZwIHwgX19HRlBfTk9XQVJOO1xuIFx0cHJlZmVycmVkX2dmcCBcdTAwMjY9IH4oX19HRlBfRElSRUNUX1JFQ0xBSU0gfCBfX0dGUF9OT0ZBSUwpO1xuIFx0cGFnZSA9IF9fYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihwcmVmZXJyZWRfZ2ZwLCBvcmRlciwgbmlkLCBub2RlbWFzayxcbi1cdFx0XHRcdFx0ICAgQUxMT0NfREVGQVVMVCk7XG4mIzQzO1x0XHRcdFx0XHQgICAgIGFmbGFncyk7XG4gXHRpZiAoIXBhZ2UpXG4gXHRcdHBhZ2UgPSBfX2FsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBOVUxMLFxuLVx0XHRcdFx0XHRcdCAgIEFMTE9DX0RFRkFVTFQpO1xuJiM0MztcdFx0XHRcdFx0XHQgICAgIGFmbGFncyk7XG4gXG4gXHRyZXR1cm4gcGFnZTtcbiB9XG4gXG4mIzQzOy8qIEEgcHJpdmF0ZSBwb2xpY3kgYWxsb2NhdGVzIGZyb20gdGhlIHByaXZhdGUgem9uZWxpc3QuICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1wb2xfYWxsb2NfZmxhZ3Moc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIChwb2wtXHUwMDNlZmxhZ3MgXHUwMDI2IE1QT0xfRl9QUklWQVRFKSA/IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOlxuJiM0MztcdFx0XHRcdFx0ICAgICAgIEFMTE9DX0RFRkFVTFQ7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogYWxsb2NfcGFnZXNfbXBvbCAtIEFsbG9jYXRlIHBhZ2VzIGFjY29yZGluZyB0byBOVU1BIG1lbXBvbGljeS5cbiAgKiBAZ2ZwOiBHRlAgZmxhZ3MuXG5AQCAtMjQ0MywxMSAmIzQzOzI2MTgsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19tcG9sKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuIHtcbiBcdG5vZGVtYXNrX3QgKm5vZGVtYXNrO1xuIFx0c3RydWN0IHBhZ2UgKnBhZ2U7XG4mIzQzO1x0dW5zaWduZWQgaW50IGFmbGFncyA9IG1wb2xfYWxsb2NfZmxhZ3MocG9sKTtcbiBcbiBcdG5vZGVtYXNrID0gcG9saWN5X25vZGVtYXNrKGdmcCwgcG9sLCBpbHgsIFx1MDAyNm5pZCk7XG4gXG4gXHRpZiAocG9sLVx1MDAzZW1vZGUgPT0gTVBPTF9QUkVGRVJSRURfTUFOWSlcbi1cdFx0cmV0dXJuIGFsbG9jX3BhZ2VzX3ByZWZlcnJlZF9tYW55KGdmcCwgb3JkZXIsIG5pZCwgbm9kZW1hc2spO1xuJiM0MztcdFx0cmV0dXJuIGFsbG9jX3BhZ2VzX3ByZWZlcnJlZF9tYW55KGdmcCwgb3JkZXIsIG5pZCwgbm9kZW1hc2ssXG4mIzQzO1x0XHRcdFx0XHRcdCAgYWZsYWdzKTtcbiBcbiBcdGlmIChJU19FTkFCTEVEKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgXHUwMDI2XHUwMDI2XG4gXHQgICAgLyogZmlsdGVyIFwmIzM0O2h1Z2VwYWdlXCYjMzQ7IGFsbG9jYXRpb24sIHVubGVzcyBmcm9tIGFsbG9jX3BhZ2VzKCkgKi9cbkBAIC0yNDcxLDcgJiM0MzsyNjQ4LDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19tcG9sKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuIFx0XHRcdCAqL1xuIFx0XHRcdHBhZ2UgPSBfX2FsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YoXG4gXHRcdFx0XHRnZnAgfCBfX0dGUF9USElTTk9ERSB8IF9fR0ZQX05PUkVUUlksIG9yZGVyLFxuLVx0XHRcdFx0bmlkLCBOVUxMLCBBTExPQ19ERUZBVUxUKTtcbiYjNDM7XHRcdFx0XHRuaWQsIE5VTEwsIGFmbGFncyk7XG4gXHRcdFx0aWYgKHBhZ2UgfHwgIShnZnAgXHUwMDI2IF9fR0ZQX0RJUkVDVF9SRUNMQUlNKSlcbiBcdFx0XHRcdHJldHVybiBwYWdlO1xuIFx0XHRcdC8qXG5AQCAtMjQ4Myw3ICYjNDM7MjY2MCw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfbXBvbChnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcbiBcdFx0fVxuIFx0fVxuIFxuLVx0cGFnZSA9IF9fYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihnZnAsIG9yZGVyLCBuaWQsIG5vZGVtYXNrLCBBTExPQ19ERUZBVUxUKTtcbiYjNDM7XHRwYWdlID0gX19hbGxvY19mcm96ZW5fcGFnZXNfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgbm9kZW1hc2ssIGFmbGFncyk7XG4gXG4gXHRpZiAodW5saWtlbHkocG9sLVx1MDAzZW1vZGUgPT0gTVBPTF9JTlRFUkxFQVZFIHx8XG4gXHRcdCAgICAgcG9sLVx1MDAzZW1vZGUgPT0gTVBPTF9XRUlHSFRFRF9JTlRFUkxFQVZFKSBcdTAwMjZcdTAwMjYgcGFnZSkge1xuQEAgLTI1OTIsNiAmIzQzOzI3NjksNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxuIFx0XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRcdHN0cnVjdCBwYWdlICoqcGFnZV9hcnJheSlcbiB7XG4mIzQzO1x0dW5zaWduZWQgaW50IGFmbGFncyA9IG1wb2xfYWxsb2NfZmxhZ3MocG9sKTtcbiBcdGludCBub2RlcztcbiBcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXNfcGVyX25vZGU7XG4gXHRpbnQgZGVsdGE7XG5AQCAtMjYwNSwxNCAmIzQzOzI3ODMsMTQgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19pbnRlcmxlYXZlKGdmcF90IGdmcCxcbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5vZGVzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRpZiAoZGVsdGEpIHtcbi1cdFx0XHRucl9hbGxvY2F0ZWQgPSBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsXG4tXHRcdFx0XHRcdGludGVybGVhdmVfbm9kZXMocG9sKSwgTlVMTCxcbiYjNDM7XHRcdFx0bnJfYWxsb2NhdGVkID0gX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsXG4mIzQzO1x0XHRcdFx0XHRhZmxhZ3MsIGludGVybGVhdmVfbm9kZXMocG9sKSwgTlVMTCxcbiBcdFx0XHRcdFx0bnJfcGFnZXNfcGVyX25vZGUgJiM0MzsgMSxcbiBcdFx0XHRcdFx0cGFnZV9hcnJheSk7XG4gXHRcdFx0ZGVsdGEtLTtcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRucl9hbGxvY2F0ZWQgPSBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsXG4tXHRcdFx0XHRcdGludGVybGVhdmVfbm9kZXMocG9sKSwgTlVMTCxcbiYjNDM7XHRcdFx0bnJfYWxsb2NhdGVkID0gX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsXG4mIzQzO1x0XHRcdFx0XHRhZmxhZ3MsIGludGVybGVhdmVfbm9kZXMocG9sKSwgTlVMTCxcbiBcdFx0XHRcdFx0bnJfcGFnZXNfcGVyX25vZGUsIHBhZ2VfYXJyYXkpO1xuIFx0XHR9XG4gXG5AQCAtMjYyNyw2ICYjNDM7MjgwNSw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZShnZnBfdCBnZnAsXG4gXHRcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdFx0c3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KVxuIHtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgYWZsYWdzID0gbXBvbF9hbGxvY19mbGFncyhwb2wpO1xuIFx0c3RydWN0IHdlaWdodGVkX2ludGVybGVhdmVfc3RhdGUgKnN0YXRlO1xuIFx0c3RydWN0IHRhc2tfc3RydWN0ICptZSA9IGN1cnJlbnQ7XG4gXHR1bnNpZ25lZCBpbnQgY3B1c2V0X21lbXNfY29va2llO1xuQEAgLTI2NjIsOCAmIzQzOzI4NDEsOCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxuIFx0d2VpZ2h0ID0gbWUtXHUwMDNlaWxfd2VpZ2h0O1xuIFx0aWYgKHdlaWdodCBcdTAwMjZcdTAwMjYgbm9kZV9pc3NldChub2RlLCBub2RlcykpIHtcbiBcdFx0bm9kZV9wYWdlcyA9IG1pbihyZW1fcGFnZXMsIHdlaWdodCk7XG4tXHRcdG5yX2FsbG9jYXRlZCA9IF9fYWxsb2NfcGFnZXNfYnVsayhnZnAsIG5vZGUsIE5VTEwsIG5vZGVfcGFnZXMsXG4tXHRcdFx0XHRcdFx0ICBwYWdlX2FycmF5KTtcbiYjNDM7XHRcdG5yX2FsbG9jYXRlZCA9IF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBhZmxhZ3MsIG5vZGUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgTlVMTCwgbm9kZV9wYWdlcywgcGFnZV9hcnJheSk7XG4gXHRcdHBhZ2VfYXJyYXkgJiM0Mzs9IG5yX2FsbG9jYXRlZDtcbiBcdFx0dG90YWxfYWxsb2NhdGVkICYjNDM7PSBucl9hbGxvY2F0ZWQ7XG4gXHRcdC8qIGlmIHRoYXQmIzM5O3MgYWxsIHRoZSBwYWdlcywgbm8gbmVlZCB0byBpbnRlcmxlYXZlICovXG5AQCAtMjcyNyw4ICYjNDM7MjkwNiw4IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZShnZnBfdCBnZnAsXG4gXHRcdC8qIG5vZGVfcGFnZXMgY2FuIGJlIDAgaWYgYW4gYWxsb2NhdGlvbiBmYWlscyBhbmQgcm91bmRzID09IDAgKi9cbiBcdFx0aWYgKCFub2RlX3BhZ2VzKVxuIFx0XHRcdGJyZWFrO1xuLVx0XHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGsoZ2ZwLCBub2RlLCBOVUxMLCBub2RlX3BhZ2VzLFxuLVx0XHRcdFx0XHRcdCAgcGFnZV9hcnJheSk7XG4mIzQzO1x0XHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCwgYWZsYWdzLCBub2RlLFxuJiM0MztcdFx0XHRcdFx0XHQgIE5VTEwsIG5vZGVfcGFnZXMsIHBhZ2VfYXJyYXkpO1xuIFx0XHRwYWdlX2FycmF5ICYjNDM7PSBucl9hbGxvY2F0ZWQ7XG4gXHRcdHRvdGFsX2FsbG9jYXRlZCAmIzQzOz0gbnJfYWxsb2NhdGVkO1xuIFx0XHRpZiAodG90YWxfYWxsb2NhdGVkID09IG5yX3BhZ2VzKVxuQEAgLTI3NDUsMTcgJiM0MzsyOTI0LDE5IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfcHJlZmVycmVkX21hbnkoZ2ZwX3QgZ2ZwLCBpbnQgbmlkLFxuIFx0XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRcdHN0cnVjdCBwYWdlICoqcGFnZV9hcnJheSlcbiB7XG4mIzQzO1x0dW5zaWduZWQgaW50IGFmbGFncyA9IG1wb2xfYWxsb2NfZmxhZ3MocG9sKTtcbiBcdGdmcF90IHByZWZlcnJlZF9nZnA7XG4gXHR1bnNpZ25lZCBsb25nIG5yX2FsbG9jYXRlZCA9IDA7XG4gXG4gXHRwcmVmZXJyZWRfZ2ZwID0gZ2ZwIHwgX19HRlBfTk9XQVJOO1xuIFx0cHJlZmVycmVkX2dmcCBcdTAwMjY9IH4oX19HRlBfRElSRUNUX1JFQ0xBSU0gfCBfX0dGUF9OT0ZBSUwpO1xuIFxuLVx0bnJfYWxsb2NhdGVkICA9IGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKHByZWZlcnJlZF9nZnAsIG5pZCwgXHUwMDI2cG9sLVx1MDAzZW5vZGVzLFxuLVx0XHRcdFx0XHQgICBucl9wYWdlcywgcGFnZV9hcnJheSk7XG4mIzQzO1x0bnJfYWxsb2NhdGVkICA9IF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YocHJlZmVycmVkX2dmcCwgYWZsYWdzLFxuJiM0MztcdFx0XHRcdFx0ICAgbmlkLCBcdTAwMjZwb2wtXHUwMDNlbm9kZXMsIG5yX3BhZ2VzLCBwYWdlX2FycmF5KTtcbiBcbiBcdGlmIChucl9hbGxvY2F0ZWQgXHUwMDNjIG5yX3BhZ2VzKVxuLVx0XHRucl9hbGxvY2F0ZWQgJiM0Mzs9IGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCwgbnVtYV9ub2RlX2lkKCksIE5VTEwsXG4mIzQzO1x0XHRucl9hbGxvY2F0ZWQgJiM0Mzs9IF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBhZmxhZ3MsXG4mIzQzO1x0XHRcdFx0bnVtYV9ub2RlX2lkKCksIE5VTEwsXG4gXHRcdFx0XHRucl9wYWdlcyAtIG5yX2FsbG9jYXRlZCxcbiBcdFx0XHRcdHBhZ2VfYXJyYXkgJiM0MzsgbnJfYWxsb2NhdGVkKTtcbiBcdHJldHVybiBucl9hbGxvY2F0ZWQ7XG5AQCAtMjc5MSw4ICYjNDM7Mjk3Miw4IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19tZW1wb2xpY3lfbm9wcm9mKGdmcF90IGdmcCxcbiBcbiBcdG5pZCA9IG51bWFfbm9kZV9pZCgpO1xuIFx0bm9kZW1hc2sgPSBwb2xpY3lfbm9kZW1hc2soZ2ZwLCBwb2wsIE5PX0lOVEVSTEVBVkVfSU5ERVgsIFx1MDAyNm5pZCk7XG4tXHRyZXR1cm4gYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBuaWQsIG5vZGVtYXNrLFxuLVx0XHRcdFx0ICAgICAgIG5yX3BhZ2VzLCBwYWdlX2FycmF5KTtcbiYjNDM7XHRyZXR1cm4gX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsIG1wb2xfYWxsb2NfZmxhZ3MocG9sKSwgbmlkLFxuJiM0MztcdFx0XHRcdFx0XHRub2RlbWFzaywgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpO1xuIH1cbiBcbiBpbnQgdm1hX2R1cF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICpzcmMsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0KVxuQEAgLTMyNDMsMjQgJiM0MzszNDI0LDQ3IEBAIHZvaWQgbXBvbF9zaGFyZWRfcG9saWN5X2luaXQoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2hhcmVkX3BvbGljeV9pbml0LCBcJiMzNDtrdm1cJiMzNDspO1xuIFxuLWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbi1cdFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuJiM0MzsvKipcbiYjNDM7ICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcFxuJiM0MzsgKiBAc3A6ICAgIHRoZSBzaGFyZWQgcG9saWN5IHRyZWVcbiYjNDM7ICogQHN0YXJ0OiBmaXJzdCBwYWdlIG9mZnNldCAoaW5jbHVzaXZlKVxuJiM0MzsgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSlcbiYjNDM7ICogQHBvbDogICBhIGZ1bGx5LWJ1aWx0LCB2YWxpZGF0ZWQgcG9saWN5LCBvciBOVUxMIHRvIGNsZWFyIHRoZSByYW5nZVxuJiM0MzsgKlxuJiM0MzsgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS5cbiYjNDM7ICogQHNwIHRha2VzIGl0cyBvd24gcmVmZXJlbmNlLCB0aGUgY2FsbGVyIHJldGFpbnMgaXRzIHJlZmVyZW5jZSBvbiBAcG9sLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LlxuJiM0MzsgKlxuJiM0MzsgKiBVbmxpa2UgbXBvbF9zZXRfc2hhcmVkX3BvbGljeSgpLCBubyBWTUEgaXMgcmVxdWlyZWQsIHNvIGEgcmFuZ2UgdGhhdFxuJiM0MzsgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4mIzQzO1x0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4ge1xuLVx0Y29uc3QgcGdvZmZfdCBwZ29mZiA9IHZtYV9zdGFydF9wZ29mZih2bWEpO1xuLVx0Y29uc3QgcGdvZmZfdCBwZ29mZl9lbmQgPSB2bWFfZW5kX3Bnb2ZmKHZtYSk7XG4gXHRzdHJ1Y3Qgc3Bfbm9kZSAqbmV3ID0gTlVMTDtcbiBcdGludCBlcnI7XG4gXG4gXHRpZiAocG9sKSB7XG4tXHRcdG5ldyA9IHNwX2FsbG9jKHBnb2ZmLCBwZ29mZl9lbmQsIHBvbCk7XG4mIzQzO1x0XHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xuIFx0XHRpZiAoIW5ldylcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdH1cbi1cdGVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgcGdvZmYsIHBnb2ZmX2VuZCwgbmV3KTtcbiYjNDM7XHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7XG4gXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG4gXHRcdHNwX2ZyZWUobmV3KTtcbiBcdHJldHVybiBlcnI7XG4gfVxuJiM0MztFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UsIFwmIzM0O2t2bVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4mIzQzO1x0XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLVx1MDAzZXZtX3Bnb2ZmLFxuJiM0MztcdFx0XHRcdFx0ICAgdm1hLVx1MDAzZXZtX3Bnb2ZmICYjNDM7IHZtYV9wYWdlcyh2bWEpLCBwb2wpO1xuJiM0Mzt9XG4gRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5LCBcJiMzNDtrdm1cJiMzNDspO1xuIFxuIC8qIEZyZWUgYSBiYWNraW5nIHBvbGljeSBzdG9yZSBvbiBpbm9kZSBkZWxldGUuICovXG5kaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jXG5pbmRleCBhYjE1YTRkZGRkMDQ3MS4uOWMyZjQ3NGM2OTI1YjMgMTAwNjQ0XG4tLS0gYS9tbS9taWdyYXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21pZ3JhdGUuY1xuQEAgLTIyMzMsNyAmIzQzOzIyMzMsOCBAQCBzdHJ1Y3QgZm9saW8gKmFsbG9jX21pZ3JhdGlvbl90YXJnZXQoc3RydWN0IGZvbGlvICpzcmMsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSlcbiBcdGlmIChpc19oaWdobWVtX2lkeCh6aWR4KSB8fCB6aWR4ID09IFpPTkVfTU9WQUJMRSlcbiBcdFx0Z2ZwX21hc2sgfD0gX19HRlBfSElHSE1FTTtcbiBcbi1cdHJldHVybiBfX2ZvbGlvX2FsbG9jKGdmcF9tYXNrLCBvcmRlciwgbmlkLCBtdGMtXHUwMDNlbm1hc2spO1xuJiM0MztcdHJldHVybiBfX2ZvbGlvX2FsbG9jKGdmcF9tYXNrLCBvcmRlciwgbmlkLCBtdGMtXHUwMDNlbm1hc2ssXG4mIzQzO1x0XHRcdCAgICAgbXRjLVx1MDAzZWFsbG9jX2ZsYWdzKTtcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVElPTlxuQEAgLTIyNTUsNiAmIzQzOzIyNTYsOCBAQCBzdGF0aWMgaW50IGRvX21vdmVfcGFnZXNfdG9fbm9kZShzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlbGlzdCwgaW50IG5vZGUpXG4gXHRcdC5uaWQgPSBub2RlLFxuIFx0XHQuZ2ZwX21hc2sgPSBHRlBfSElHSFVTRVJfTU9WQUJMRSB8IF9fR0ZQX1RISVNOT0RFLFxuIFx0XHQucmVhc29uID0gTVJfU1lTQ0FMTCxcbiYjNDM7XHRcdC5hbGxvY19mbGFncyA9IG5vZGVfaXNfcHJpdmF0ZShub2RlKSA/XG4mIzQzO1x0XHRcdCBBTExPQ19aT05FTElTVF9QUklWQVRFIDogQUxMT0NfREVGQVVMVCxcbiBcdH07XG4gXG4gXHRlcnIgPSBtaWdyYXRlX3BhZ2VzKHBhZ2VsaXN0LCBhbGxvY19taWdyYXRpb25fdGFyZ2V0LCBOVUxMLFxuQEAgLTIyNzAsNyAmIzQzOzIyNzMsOCBAQCBzdGF0aWMgaW50IF9fYWRkX2ZvbGlvX2Zvcl9taWdyYXRpb24oc3RydWN0IGZvbGlvICpmb2xpbywgaW50IG5vZGUsXG4gXHRpZiAoaXNfemVyb19mb2xpbyhmb2xpbykgfHwgaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSlcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXG4tXHRpZiAoZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuJiM0MztcdGlmIChmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHxcbiYjNDM7XHQgICAgIW5vZGVfYWxsb3dzX3VzZXJfbnVtYShmb2xpb19uaWQoZm9saW8pKSlcbiBcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gXG4gXHRpZiAoZm9saW9fbmlkKGZvbGlvKSA9PSBub2RlKVxuQEAgLTIzOTQsMTEgJiM0MzsyMzk4LDE0IEBAIHN0YXRpYyBpbnQgZG9fcGFnZXNfbW92ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgbm9kZW1hc2tfdCB0YXNrX25vZGVzLFxuIFx0XHRlcnIgPSAtRU5PREVWO1xuIFx0XHRpZiAobm9kZSBcdTAwM2MgMCB8fCBub2RlIFx1MDAzZT0gTUFYX05VTU5PREVTKVxuIFx0XHRcdGdvdG8gb3V0X2ZsdXNoO1xuLVx0XHRpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKVxuJiM0MztcbiYjNDM7XHRcdGlmICghbm9kZV9hbGxvd3NfdXNlcl9udW1hKG5vZGUpKVxuIFx0XHRcdGdvdG8gb3V0X2ZsdXNoO1xuIFxuIFx0XHRlcnIgPSAtRUFDQ0VTO1xuLVx0XHRpZiAoIW5vZGVfaXNzZXQobm9kZSwgdGFza19ub2RlcykpXG4mIzQzO1x0XHQvKiBQcml2YXRlIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0Lm1lbSAqL1xuJiM0MztcdFx0aWYgKCFub2RlX2lzX3ByaXZhdGUobm9kZSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgIW5vZGVfaXNzZXQobm9kZSwgdGFza19ub2RlcykpXG4gXHRcdFx0Z290byBvdXRfZmx1c2g7XG4gXG4gXHRcdGlmIChjdXJyZW50X25vZGUgPT0gTlVNQV9OT19OT0RFKSB7XG5AQCAtMjQ3OSw3ICYjNDM7MjQ4Niw5IEBAIHN0YXRpYyB2b2lkIGRvX3BhZ2VzX3N0YXRfYXJyYXkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRcdGlmIChmb2xpbykge1xuIFx0XHRcdGlmIChpc196ZXJvX2ZvbGlvKGZvbGlvKSB8fCBpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxuIFx0XHRcdFx0ZXJyID0gLUVGQVVMVDtcbi1cdFx0XHRlbHNlIGlmIChmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4mIzQzO1x0XHRcdGVsc2UgaWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fFxuJiM0MztcdFx0XHRcdCAoZm9saW9faXNfcHJpdmF0ZV9ub2RlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0XHQgICFub2RlX2FsbG93c191c2VyX251bWEoZm9saW9fbmlkKGZvbGlvKSkpKVxuIFx0XHRcdFx0ZXJyID0gLUVOT0VOVDtcbiBcdFx0XHRlbHNlXG4gXHRcdFx0XHRlcnIgPSBmb2xpb19uaWQoZm9saW8pO1xuZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuY1xuaW5kZXggNzExZjgyMWY3YjNjNzIuLmFkYjUwNjQ3ZDI5Y2FmIDEwMDY0NFxuLS0tIGEvbW0vbW1faW5pdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9tbV9pbml0LmNcbkBAIC0yNzAxLDcgJiM0MzsyNzAxLDcgQEAgdm9pZCBfX2luaXQgbW1fY29yZV9pbml0KHZvaWQpXG4gXHRpbml0X3plcm9fcGFnZV9wZm4oKTtcbiBcbiBcdC8qIEluaXRpYWxpemF0aW9ucyByZWx5aW5nIG9uIFNNUCBzZXR1cCAqL1xuLVx0QlVJTERfQlVHX09OKE1BWF9aT05FTElTVFMgXHUwMDNlIDIpO1xuJiM0MztcdEJVSUxEX0JVR19PTihNQVhfWk9ORUxJU1RTIFx1MDAzZSA0KTtcbiBcdGJ1aWxkX2FsbF96b25lbGlzdHMoTlVMTCk7XG4gXHRwYWdlX2FsbG9jX2luaXRfY3B1aHAoKTtcbiBcdGFsbG9jX3RhZ19zZWNfaW5pdCgpO1xuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuY1xuaW5kZXggMDgxNTdhODI3NzYxNmEuLjM5ZTJkMmE5Y2Q5YmNmIDEwMDY0NFxuLS0tIGEvbW0vcGFnZV9hbGxvYy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9wYWdlX2FsbG9jLmNcbkBAIC01MTAyLDcgJiM0Mzs1MTAyLDcgQEAgc3RhdGljIGlubGluZSBib29sIHByZXBhcmVfYWxsb2NfcGFnZXMoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcixcbiBcdFx0dW5zaWduZWQgaW50ICphbGxvY19mbGFncylcbiB7XG4gXHRhYy1cdTAwM2VoaWdoZXN0X3pvbmVpZHggPSBnZnBfem9uZShnZnBfbWFzayk7XG4tXHRhYy1cdTAwM2V6b25lbGlzdCA9IG5vZGVfem9uZWxpc3QocHJlZmVycmVkX25pZCwgZ2ZwX21hc2spO1xuJiM0MztcdGFjLVx1MDAzZXpvbmVsaXN0ID0gc2VsZWN0X3pvbmVsaXN0KHByZWZlcnJlZF9uaWQsIGdmcF9tYXNrLCBhYy1cdTAwM2VhbGxvY19mbGFncyk7XG4gXHRhYy1cdTAwM2Vub2RlbWFzayA9IG5vZGVtYXNrO1xuIFx0YWMtXHUwMDNlbWlncmF0ZXR5cGUgPSBnZnBfbWlncmF0ZXR5cGUoZ2ZwX21hc2spO1xuIFxuQEAgLTUxNjUsOCAmIzQzOzUxNjUsOCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcHJlcGFyZV9hbGxvY19wYWdlcyhnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyLFxuICAqIEBwYWdlX2FycmF5IHdlcmUgc2V0IHRvICVOVUxMIG9uIGVudHJ5LCB0aGUgc2xvdHMgZnJvbSAwIHRvIHRoZSByZXR1cm4gdmFsdWVcbiAgKiAtIDEgd2lsbCBiZSBmaWxsZWQuXG4gICovXG4tdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxuLVx0XHRcdG5vZGVtYXNrX3QgKm5vZGVtYXNrLCBpbnQgbnJfcGFnZXMsXG4mIzQzO3Vuc2lnbmVkIGxvbmcgX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBhbGxvY19mbGFncyxcbiYjNDM7XHRcdFx0aW50IHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrX3QgKm5vZGVtYXNrLCBpbnQgbnJfcGFnZXMsXG4gXHRcdFx0c3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KVxuIHtcbiBcdHN0cnVjdCBwYWdlICpwYWdlO1xuQEAgLTUxNzQsOCAmIzQzOzUxNzQsOCBAQCB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXG4gXHRzdHJ1Y3Qgem9uZXJlZiAqejtcbiBcdHN0cnVjdCBwZXJfY3B1X3BhZ2VzICpwY3A7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkICpwY3BfbGlzdDtcbi1cdHN0cnVjdCBhbGxvY19jb250ZXh0IGFjO1xuLVx0dW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzID0gQUxMT0NfV01BUktfTE9XO1xuJiM0MztcdHN0cnVjdCBhbGxvY19jb250ZXh0IGFjID0geyAuYWxsb2NfZmxhZ3MgPSBhbGxvY19mbGFncyB9O1xuJiM0MztcdHVuc2lnbmVkIGludCBmYXN0cGF0aF9hbGxvY19mbGFncyA9IGFsbG9jX2ZsYWdzIHwgQUxMT0NfV01BUktfTE9XO1xuIFx0aW50IG5yX3BvcHVsYXRlZCA9IDAsIG5yX2FjY291bnQgPSAwO1xuIFxuIFx0LypcbkBAIC01MjE1LDcgJiM0Mzs1MjE1LDcgQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxuIFxuIFx0LyogTWF5IHNldCBBTExPQ19OT0ZSQUdNRU5ULCBmcmFnbWVudGF0aW9uIHdpbGwgcmV0dXJuIDEgcGFnZS4gKi9cbiBcdGdmcCBcdTAwMjY9IGdmcF9hbGxvd2VkX21hc2s7XG4tXHRpZiAoIXByZXBhcmVfYWxsb2NfcGFnZXMoZ2ZwLCAwLCBwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgXHUwMDI2YWMsIFx1MDAyNmdmcCwgXHUwMDI2YWxsb2NfZmxhZ3MpKVxuJiM0MztcdGlmICghcHJlcGFyZV9hbGxvY19wYWdlcyhnZnAsIDAsIHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrLCBcdTAwMjZhYywgXHUwMDI2Z2ZwLCBcdTAwMjZmYXN0cGF0aF9hbGxvY19mbGFncykpXG4gXHRcdGdvdG8gb3V0O1xuIFxuIFx0LyogRmluZCBhbiBhbGxvd2VkIGxvY2FsIHpvbmUgdGhhdCBtZWV0cyB0aGUgbG93IHdhdGVybWFyay4gKi9cbkBAIC01MjIzLDcgJiM0Mzs1MjIzLDcgQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxuIFx0Zm9yX25leHRfem9uZV96b25lbGlzdF9ub2RlbWFzayh6b25lLCB6LCBhYy5oaWdoZXN0X3pvbmVpZHgsIGFjLm5vZGVtYXNrKSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgbWFyaztcbiBcbi1cdFx0aWYgKGNwdXNldHNfZW5hYmxlZCgpIFx1MDAyNlx1MDAyNiAoYWxsb2NfZmxhZ3MgXHUwMDI2IEFMTE9DX0NQVVNFVCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRpZiAoY3B1c2V0c19lbmFibGVkKCkgXHUwMDI2XHUwMDI2IChmYXN0cGF0aF9hbGxvY19mbGFncyBcdTAwMjYgQUxMT0NfQ1BVU0VUKSBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgICFfX2NwdXNldF96b25lX2FsbG93ZWQoem9uZSwgZ2ZwKSkge1xuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG5AQCAtNTIzMywxNiAmIzQzOzUyMzMsMTcgQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxuIFx0XHRcdGdvdG8gZmFpbGVkO1xuIFx0XHR9XG4gXG4tXHRcdGNvbmRfYWNjZXB0X21lbW9yeSh6b25lLCAwLCBhbGxvY19mbGFncyk7XG4mIzQzO1x0XHRjb25kX2FjY2VwdF9tZW1vcnkoem9uZSwgMCwgZmFzdHBhdGhfYWxsb2NfZmxhZ3MpO1xuIHJldHJ5X3RoaXNfem9uZTpcbi1cdFx0bWFyayA9IHdtYXJrX3BhZ2VzKHpvbmUsIGFsbG9jX2ZsYWdzIFx1MDAyNiBBTExPQ19XTUFSS19NQVNLKSAmIzQzOyBucl9wYWdlcyAtIG5yX3BvcHVsYXRlZDtcbiYjNDM7XHRcdG1hcmsgPSB3bWFya19wYWdlcyh6b25lLCBmYXN0cGF0aF9hbGxvY19mbGFncyBcdTAwMjYgQUxMT0NfV01BUktfTUFTSykgJiM0MztcbiYjNDM7XHRcdCAgICAgICBucl9wYWdlcyAtIG5yX3BvcHVsYXRlZDtcbiBcdFx0aWYgKHpvbmVfd2F0ZXJtYXJrX2Zhc3Qoem9uZSwgMCwgIG1hcmssXG4gXHRcdFx0XHR6b25lbGlzdF96b25lX2lkeChhYy5wcmVmZXJyZWRfem9uZXJlZiksXG4tXHRcdFx0XHRhbGxvY19mbGFncywgZ2ZwKSkge1xuJiM0MztcdFx0XHRcdGZhc3RwYXRoX2FsbG9jX2ZsYWdzLCBnZnApKSB7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbiBcbi1cdFx0aWYgKGNvbmRfYWNjZXB0X21lbW9yeSh6b25lLCAwLCBhbGxvY19mbGFncykpXG4mIzQzO1x0XHRpZiAoY29uZF9hY2NlcHRfbWVtb3J5KHpvbmUsIDAsIGZhc3RwYXRoX2FsbG9jX2ZsYWdzKSlcbiBcdFx0XHRnb3RvIHJldHJ5X3RoaXNfem9uZTtcbiBcbiBcdFx0LyogVHJ5IGFnYWluIGlmIHpvbmUgaGFzIGRlZmVycmVkIHBhZ2VzICovXG5AQCAtNTI3NCw3ICYjNDM7NTI3NSw3IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCxcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0fVxuIFxuLVx0XHRwYWdlID0gX19ybXF1ZXVlX3BjcGxpc3Qoem9uZSwgMCwgYWMubWlncmF0ZXR5cGUsIGFsbG9jX2ZsYWdzLFxuJiM0MztcdFx0cGFnZSA9IF9fcm1xdWV1ZV9wY3BsaXN0KHpvbmUsIDAsIGFjLm1pZ3JhdGV0eXBlLCBmYXN0cGF0aF9hbGxvY19mbGFncyxcbiBcdFx0XHRcdFx0XHRcdFx0cGNwLCBwY3BfbGlzdCk7XG4gXHRcdGlmICh1bmxpa2VseSghcGFnZSkpIHtcbiBcdFx0XHQvKiBUcnkgYW5kIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBwYWdlICovXG5AQCAtNTMwMCwxMSAmIzQzOzUzMDEsMTkgQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxuIFx0cmV0dXJuIG5yX3BvcHVsYXRlZDtcbiBcbiBmYWlsZWQ6XG4tXHRwYWdlID0gX19hbGxvY19wYWdlc19ub3Byb2YoZ2ZwLCAwLCBwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgQUxMT0NfREVGQVVMVCk7XG4mIzQzO1x0cGFnZSA9IF9fYWxsb2NfcGFnZXNfbm9wcm9mKGdmcCwgMCwgcHJlZmVycmVkX25pZCwgbm9kZW1hc2ssIGFsbG9jX2ZsYWdzKTtcbiBcdGlmIChwYWdlKVxuIFx0XHRwYWdlX2FycmF5W25yX3BvcHVsYXRlZCYjNDM7JiM0MztdID0gcGFnZTtcbiBcdGdvdG8gb3V0O1xuIH1cbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCxcbiYjNDM7XHRcdFx0bm9kZW1hc2tfdCAqbm9kZW1hc2ssIGludCBucl9wYWdlcyxcbiYjNDM7XHRcdFx0c3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBBTExPQ19ERUZBVUxULCBwcmVmZXJyZWRfbmlkLFxuJiM0MztcdFx0XHRcdFx0IG5vZGVtYXNrLCBucl9wYWdlcywgcGFnZV9hcnJheSk7XG4mIzQzO31cbiBFWFBPUlRfU1lNQk9MX0dQTChhbGxvY19wYWdlc19idWxrX25vcHJvZik7XG4gXG4gLypcbkBAIC01Mzk5LDcgJiM0Mzs1NDA4LDcgQEAgc3RydWN0IHBhZ2UgKl9fYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcbiBcdHVuc2lnbmVkIGludCBmYXN0cGF0aF9hbGxvY19mbGFncyA9IGFsbG9jX2ZsYWdzO1xuIFxuIFx0LyogT3RoZXIgZmxhZ3MgY291bGQgYmUgc3VwcG9ydGVkIGxhdGVyIGlmIG5lZWRlZC4gKi9cbi1cdGlmIChXQVJOX09OKGFsbG9jX2ZsYWdzIFx1MDAyNiB+KEFMTE9DX05PTE9DSyB8IEFMTE9DX05PX0NPREVUQUcpKSlcbiYjNDM7XHRpZiAoV0FSTl9PTihhbGxvY19mbGFncyBcdTAwMjYgfihBTExPQ19OT0xPQ0sgfCBBTExPQ19OT19DT0RFVEFHIHwgQUxMT0NfWk9ORUxJU1RfUFJJVkFURSkpKVxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbiBcdGlmICghYWxsb2Nfb3JkZXJfYWxsb3dlZChnZnAsIG9yZGVyLCBhbGxvY19mbGFncykpXG5AQCAtNTQ5NSwxMyAmIzQzOzU1MDQsMzYgQEAgc3RydWN0IHBhZ2UgKmFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mKGludCBuaWQsIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXJcbiBFWFBPUlRfU1lNQk9MKGFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mKTtcbiBcbiBzdHJ1Y3QgZm9saW8gKl9fZm9saW9fYWxsb2Nfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLCBpbnQgcHJlZmVycmVkX25pZCxcbi1cdFx0bm9kZW1hc2tfdCAqbm9kZW1hc2spXG4mIzQzO1x0XHRub2RlbWFza190ICpub2RlbWFzaywgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzKVxuIHtcbiBcdHN0cnVjdCBwYWdlICpwYWdlID0gX19hbGxvY19wYWdlc19ub3Byb2YoZ2ZwIHwgX19HRlBfQ09NUCwgb3JkZXIsXG4tXHRcdFx0XHRcdHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrLCBBTExPQ19ERUZBVUxUKTtcbiYjNDM7XHRcdFx0XHRcdHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrLCBhbGxvY19mbGFncyk7XG4gXHRyZXR1cm4gcGFnZV9ybWFwcGFibGVfZm9saW8ocGFnZSk7XG4gfVxuLUVYUE9SVF9TWU1CT0woX19mb2xpb19hbGxvY19ub3Byb2YpO1xuJiM0MztcbiYjNDM7c3RydWN0IGZvbGlvICpfX2ZvbGlvX2FsbG9jX25vZGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLCBpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0d2Fybl9pZl9ub2RlX29mZmxpbmUobmlkLCBnZnApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBOVUxMLCBBTExPQ19ERUZBVUxUKTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MKF9fZm9saW9fYWxsb2Nfbm9kZV9ub3Byb2YpO1xuJiM0MztcbiYjNDM7c3RydWN0IHBhZ2UgKmFsbG9jX3BhZ2VzX25vZGVfcHJpdmF0ZV9ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRpbnQgbmlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIF9fYWxsb2NfcGFnZXNfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgTlVMTCxcbiYjNDM7XHRcdFx0XHQgICBBTExPQ19aT05FTElTVF9QUklWQVRFKTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChhbGxvY19wYWdlc19ub2RlX3ByaXZhdGVfbm9wcm9mKTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBmb2xpbyAqZm9saW9fYWxsb2Nfbm9kZV9wcml2YXRlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcbiYjNDM7XHRcdGludCBuaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBOVUxMLFxuJiM0MztcdFx0XHRcdCAgIEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUpO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGZvbGlvX2FsbG9jX25vZGVfcHJpdmF0ZV9ub3Byb2YpO1xuIFxuIC8qXG4gICogQ29tbW9uIGhlbHBlciBmdW5jdGlvbnMuIE5ldmVyIHVzZSB3aXRoIF9fR0ZQX0hJR0hNRU0gYmVjYXVzZSB0aGUgcmV0dXJuZWRcbkBAIC01ODA1LDkgJiM0Mzs1ODM3LDEwIEBAIHN0YXRpYyBpbnQgbnVtYV96b25lbGlzdF9vcmRlcl9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG4gc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcbiBcbiAvKipcbi0gKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdFxuJiM0MzsgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdFxuICAqIEBub2RlOiBub2RlIHdob3NlIGZhbGxiYWNrIGxpc3Qgd2UmIzM5O3JlIGFwcGVuZGluZ1xuICAqIEB1c2VkX25vZGVfbWFzazogbm9kZW1hc2tfdCBvZiBhbHJlYWR5IHVzZWQgbm9kZXNcbiYjNDM7ICogQGNhbmRpZGF0ZXM6IG5vZGVtYXNrX3Qgb2Ygbm9kZXMgZWxpZ2libGUgZm9yIHNlbGVjdGlvblxuICAqXG4gICogV2UgdXNlIGEgbnVtYmVyIG9mIGZhY3RvcnMgdG8gZGV0ZXJtaW5lIHdoaWNoIGlzIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGRcbiAgKiBhcHBlYXIgb24gYSBnaXZlbiBub2RlJiMzOTtzIGZhbGxiYWNrIGxpc3QuICBUaGUgbm9kZSBzaG91bGQgbm90IGhhdmUgYXBwZWFyZWRcbkBAIC01ODE5LDcgJiM0Mzs1ODUyLDggQEAgc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcbiAgKlxuICAqIFJldHVybjogbm9kZSBpZCBvZiB0aGUgZm91bmQgbm9kZSBvciAlTlVNQV9OT19OT0RFIGlmIG5vIG5vZGUgaXMgZm91bmQuXG4gICovXG4taW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxuJiM0MztpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4mIzQzO1x0XHRcdCAgIGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpXG4ge1xuIFx0aW50IG4sIHZhbDtcbiBcdGludCBtaW5fdmFsID0gSU5UX01BWDtcbkBAIC01ODI5LDEyICYjNDM7NTg2MywxMiBAQCBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4gXHQgKiBVc2UgdGhlIGxvY2FsIG5vZGUgaWYgd2UgaGF2ZW4mIzM5O3QgYWxyZWFkeSwgYnV0IGZvciBtZW1vcnlsZXNzIGxvY2FsXG4gXHQgKiBub2RlLCB3ZSBzaG91bGQgc2tpcCBpdCBhbmQgZmFsbCBiYWNrIHRvIG90aGVyIG5vZGVzLlxuIFx0ICovXG4tXHRpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSBcdTAwMjZcdTAwMjYgbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkpIHtcbiYjNDM7XHRpZiAoIW5vZGVfaXNzZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKSBcdTAwMjZcdTAwMjYgbm9kZV9pc3NldChub2RlLCAqY2FuZGlkYXRlcykpIHtcbiBcdFx0bm9kZV9zZXQobm9kZSwgKnVzZWRfbm9kZV9tYXNrKTtcbiBcdFx0cmV0dXJuIG5vZGU7XG4gXHR9XG4gXG4tXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG4sIE5fTUVNT1JZKSB7XG4mIzQzO1x0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICpjYW5kaWRhdGVzKSB7XG4gXG4gXHRcdC8qIERvbiYjMzk7dCB3YW50IGEgbm9kZSB0byBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgKi9cbiBcdFx0aWYgKG5vZGVfaXNzZXQobiwgKnVzZWRfbm9kZV9tYXNrKSlcbkBAIC01ODczLDEyICYjNDM7NTkwNywxMiBAQCBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4gICogRE1BIHpvbmUsIGlmIGFueS0tYnV0IHJpc2tzIGV4aGF1c3RpbmcgRE1BIHpvbmUuXG4gICovXG4gc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdfZGF0YV90ICpwZ2RhdCwgaW50ICpub2RlX29yZGVyLFxuLVx0XHR1bnNpZ25lZCBucl9ub2RlcylcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBucl9ub2RlcywgaW50IHpsaWR4KVxuIHtcbiBcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcztcbiBcdGludCBpO1xuIFxuLVx0em9uZXJlZnMgPSBwZ2RhdC1cdTAwM2Vub2RlX3pvbmVsaXN0c1taT05FTElTVF9GQUxMQkFDS10uX3pvbmVyZWZzO1xuJiM0MztcdHpvbmVyZWZzID0gcGdkYXQtXHUwMDNlbm9kZV96b25lbGlzdHNbemxpZHhdLl96b25lcmVmcztcbiBcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX25vZGVzOyBpJiM0MzsmIzQzOykge1xuIFx0XHRpbnQgbnJfem9uZXM7XG5AQCAtNTg5OCwzNCAmIzQzOzU5MzIsNDkgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdfZGF0YV90ICpwZ2RhdCwgaW50ICpub2RlX29yZGVyLFxuIHN0YXRpYyB2b2lkIGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuIHtcbiBcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcztcbi1cdGludCBucl96b25lcztcbiYjNDM7XHRpbnQgbnJfem9uZXMgPSAwO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogTk9GQUxMQkFDSzogdGhlIG5vZGUmIzM5O3Mgb3duIHpvbmVzLiBFTVBUWSBmb3IgcHJpdmF0ZSBub2RlcyBzbyBhXG4mIzQzO1x0ICogc3RyYXkgX19HRlBfVEhJU05PREUgYWxsb2NhdGlvbiBjYW4mIzM5O3QgdmlvbGF0ZSBpc29sYXRpb24uXG4mIzQzO1x0ICovXG4gXHR6b25lcmVmcyA9IHBnZGF0LVx1MDAzZW5vZGVfem9uZWxpc3RzW1pPTkVMSVNUX05PRkFMTEJBQ0tdLl96b25lcmVmcztcbiYjNDM7XHRpZiAoIW5vZGVfaXNfcHJpdmF0ZShwZ2RhdC1cdTAwM2Vub2RlX2lkKSlcbiYjNDM7XHRcdG5yX3pvbmVzID0gYnVpbGRfem9uZXJlZnNfbm9kZShwZ2RhdCwgem9uZXJlZnMpO1xuJiM0MztcdHpvbmVyZWZzICYjNDM7PSBucl96b25lcztcbiYjNDM7XHR6b25lcmVmcy1cdTAwM2V6b25lID0gTlVMTDtcbiYjNDM7XHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4mIzQzO1xuJiM0MztcdC8qIFBSSVZBVEVfTk9GQUxMQkFDSzogdGhlIG5vZGUmIzM5O3Mgb3duIHpvbmVzLCBwcml2YXRlIG5vZGVzIGluY2x1ZGVkLiAqL1xuJiM0MztcdHpvbmVyZWZzID0gcGdkYXQtXHUwMDNlbm9kZV96b25lbGlzdHNbWk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLXS5fem9uZXJlZnM7XG4gXHRucl96b25lcyA9IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdkYXQsIHpvbmVyZWZzKTtcbiBcdHpvbmVyZWZzICYjNDM7PSBucl96b25lcztcbiBcdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuIFx0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbiYjNDM7LypcbiYjNDM7ICogQnVpbGQgb25lIG5vZGUtb3JkZXJlZCBmYWxsYmFjayBsaXN0IGZyb20gYSBjYW5kaWRhdGUgbm9kZW1hc2suXG4mIzQzOyAqIHVwZGF0ZV9sb2FkIHJvdW5kLXJvYmlucyBub2RlX2xvYWQgYWNyb3NzIGVxdWlkaXN0YW50IG5vZGVzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxuJiM0MztcdFx0XHRcdGludCB6bGlkeCwgYm9vbCB1cGRhdGVfbG9hZCxcbiYjNDM7XHRcdFx0XHRpbnQgKm5vZGVfb3JkZXIsIGludCAqbnIpXG4ge1xuLVx0c3RhdGljIGludCBub2RlX29yZGVyW01BWF9OVU1OT0RFU107XG4tXHRpbnQgbm9kZSwgbnJfbm9kZXMgPSAwO1xuIFx0bm9kZW1hc2tfdCB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORTtcbi1cdGludCBsb2NhbF9ub2RlLCBwcmV2X25vZGU7XG4tXG4tXHQvKiBOVU1BLWF3YXJlIG9yZGVyaW5nIG9mIG5vZGVzICovXG4tXHRsb2NhbF9ub2RlID0gcGdkYXQtXHUwMDNlbm9kZV9pZDtcbi1cdHByZXZfbm9kZSA9IGxvY2FsX25vZGU7XG4mIzQzO1x0aW50IGxvY2FsX25vZGUgPSBwZ2RhdC1cdTAwM2Vub2RlX2lkO1xuJiM0MztcdGludCBwcmV2X25vZGUgPSBsb2NhbF9ub2RlO1xuJiM0MztcdGludCBub2RlLCBucl9ub2RlcyA9IDA7XG4gXG4tXHRtZW1zZXQobm9kZV9vcmRlciwgMCwgc2l6ZW9mKG5vZGVfb3JkZXIpKTtcbi1cdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGUobG9jYWxfbm9kZSwgXHUwMDI2dXNlZF9tYXNrKSkgXHUwMDNlPSAwKSB7XG4mIzQzO1x0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcdTAwMjZ1c2VkX21hc2ssXG4mIzQzO1x0XHRcdFx0XHQgICAgICBjYW5kaWRhdGVzKSkgXHUwMDNlPSAwKSB7XG4gXHRcdC8qXG4gXHRcdCAqIFdlIGRvbiYjMzk7dCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLlxuIFx0XHQgKiBTbyBhZGRpbmcgcGVuYWx0eSB0byB0aGUgZmlyc3Qgbm9kZSBpbiBzYW1lXG4gXHRcdCAqIGRpc3RhbmNlIGdyb3VwIHRvIG1ha2UgaXQgcm91bmQtcm9iaW4uXG4gXHRcdCAqL1xuLVx0XHRpZiAobm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBub2RlKSAhPVxuJiM0MztcdFx0aWYgKHVwZGF0ZV9sb2FkIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgbm9kZSkgIT1cbiBcdFx0ICAgIG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgcHJldl9ub2RlKSlcbiBcdFx0XHRub2RlX2xvYWRbbm9kZV0gJiM0Mzs9IDE7XG4gXG5AQCAtNTkzMywxMiAmIzQzOzU5ODIsNDcgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4gXHRcdHByZXZfbm9kZSA9IG5vZGU7XG4gXHR9XG4gXG4tXHRidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpO1xuJiM0MztcdGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnZGF0LCBub2RlX29yZGVyLCBucl9ub2RlcywgemxpZHgpO1xuJiM0MztcdCpuciA9IG5yX25vZGVzO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdO1xuJiM0MztcdG5vZGVtYXNrX3QgdGllcl9ub2RlcztcbiYjNDM7XHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG4mIzQzO1x0aW50IG5vZGUsIG5yX25vZGVzID0gMDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogWm9uZWxpc3RzOiBGQUxMQkFDSywgTk9GQUxMQkFDSywgUFJJVkFURVxuJiM0MztcdCAqXG4mIzQzO1x0ICogRkFMTEJBQ0s6ICAgQWxsb2NhdGlvbiBvcmRlciBmb3IgYWxsIG5vZGVzLiAgUHJpdmF0ZSBub2RlcyBoYXZlIGxpc3RzXG4mIzQzO1x0ICogICAgICAgICAgICAgYnV0IG5ldmVyIGFwcGVhciBhcyBhbiBlbnRyeSBpbiBhbnkgbGlzdC4gQWxsb2NhdGlvbnNcbiYjNDM7XHQgKiAgICAgICAgICAgICB0YXJnZXRpbmcgYSBwcml2YXRlIG5vZGUgdy8gRkFMTEJBQ0sgbGFuZCBvbiBOX01FTU9SWS5cbiYjNDM7XHQgKlxuJiM0MztcdCAqIE5PRkFMTEJBQ0s6IEEgbGlzdCBmb3IgZWFjaCBub2RlIGNvbnRhaW5pbmcgb25seSBpdHNlbGYuXG4mIzQzO1x0ICogICAgICAgICAgICAgQWxsb2NhdGlvbnMgdGFyZ2V0aW5nIGEgcHJpdmF0ZSBub2RlIHcvIE5PRkFMTEJBQ0tcbiYjNDM7XHQgKiAgICAgICAgICAgICB3aWxsIGFsd2F5cyBmYWlsICh0aGVpciBOT0ZBTExCQUNLIGlzIGVtcHR5KVxuJiM0MztcdCAqXG4mIzQzO1x0ICogUFJJVkFURTogICAgKE5fTUVNT1JZIHwgTl9NRU1PUllfUFJJVkFURSkgLSBhbGxvd3MgYWNjZXNzIHRvXG4mIzQzO1x0ICogICAgICAgICAgICAgcHJpdmF0ZSBub2RlcywgYW5kIGZhbGxzIGJhY2sgdG8gbm9ybWFsIG1lbW9yeSB1bmxlc3NcbiYjNDM7XHQgKiAgICAgICAgICAgICBfX0dGUF9USElTTk9ERSBvdGhlcndpc2UgY29uc3RyYWlucyBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XG4mIzQzO1x0YnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBaT05FTElTVF9GQUxMQkFDSyxcbiYjNDM7XHRcdFx0ICAgIHRydWUsIG5vZGVfb3JkZXIsIFx1MDAyNm5yX25vZGVzKTtcbiBcdGJ1aWxkX3RoaXNub2RlX3pvbmVsaXN0cyhwZ2RhdCk7XG4mIzQzO1xuIFx0cHJfaW5mbyhcJiMzNDtGYWxsYmFjayBvcmRlciBmb3IgTm9kZSAlZDogXCYjMzQ7LCBsb2NhbF9ub2RlKTtcbiBcdGZvciAobm9kZSA9IDA7IG5vZGUgXHUwMDNjIG5yX25vZGVzOyBub2RlJiM0MzsmIzQzOylcbiBcdFx0cHJfY29udChcJiMzNDslZCBcJiMzNDssIG5vZGVfb3JkZXJbbm9kZV0pO1xuIFx0cHJfY29udChcJiMzNDtcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRub2Rlc19vcih0aWVyX25vZGVzLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcbiYjNDM7XHRidWlsZF9ub2RlX3pvbmVsaXN0KHBnZGF0LCBcdTAwMjZ0aWVyX25vZGVzLCBaT05FTElTVF9QUklWQVRFLCBmYWxzZSxcbiYjNDM7XHRcdFx0ICAgIG5vZGVfb3JkZXIsIFx1MDAyNm5yX25vZGVzKTtcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19IQVZFX01FTU9SWUxFU1NfTk9ERVNcbkBAIC02NTMzLDYgJiM0Mzs2NjE3LDEwIEBAIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZV90b3RhbHJlc2VydmVfcGFnZXModm9pZClcbiBcbiBcdFx0cGdkYXQtXHUwMDNldG90YWxyZXNlcnZlX3BhZ2VzID0gMDtcbiBcbiYjNDM7XHRcdC8qIHByaXZhdGUgbm9kZXMgaGF2ZSB6ZXJvIHdhdGVybWFya3MgKi9cbiYjNDM7XHRcdGlmIChub2RlX2lzX3ByaXZhdGUocGdkYXQtXHUwMDNlbm9kZV9pZCkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgTUFYX05SX1pPTkVTOyBpJiM0MzsmIzQzOykge1xuIFx0XHRcdHN0cnVjdCB6b25lICp6b25lID0gcGdkYXQtXHUwMDNlbm9kZV96b25lcyAmIzQzOyBpO1xuIFx0XHRcdGxvbmcgbWF4ID0gMDtcbkBAIC02NjI1LDkgJiM0Mzs2NzEzLDE1IEBAIHN0YXRpYyB2b2lkIF9fc2V0dXBfcGVyX3pvbmVfd21hcmtzKHZvaWQpXG4gXHRzdHJ1Y3Qgem9uZSAqem9uZTtcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG4gXG4tXHQvKiBDYWxjdWxhdGUgdG90YWwgbnVtYmVyIG9mICFaT05FX0hJR0hNRU0gYW5kICFaT05FX01PVkFCTEUgcGFnZXMgKi9cbiYjNDM7XHQvKlxuJiM0MztcdCAqIENhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2YgIVpPTkVfSElHSE1FTSBhbmQgIVpPTkVfTU9WQUJMRSBwYWdlc1xuJiM0MztcdCAqXG4mIzQzO1x0ICogUHJpdmF0ZSBub2RlcyBhcmUgZXhjbHVkZWQgYmVjYXVzZSB0aGV5IGFyZSBub3QgaW4gdGhlIHJlZ3VsYXJcbiYjNDM7XHQgKiBhbGxvY2F0aW9uIGZhbGxiYWNrIHBhdGggLSBpbmNsdWRpbmcgdGhlbSBkaWx1dGVzIERSQU0gd2F0ZXJtYXJrcy5cbiYjNDM7XHQgKi9cbiBcdGZvcl9lYWNoX3pvbmUoem9uZSkge1xuLVx0XHRpZiAoIWlzX2hpZ2htZW0oem9uZSkgXHUwMDI2XHUwMDI2IHpvbmVfaWR4KHpvbmUpICE9IFpPTkVfTU9WQUJMRSlcbiYjNDM7XHRcdGlmICghaXNfaGlnaG1lbSh6b25lKSBcdTAwMjZcdTAwMjYgem9uZV9pZHgoem9uZSkgIT0gWk9ORV9NT1ZBQkxFIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICFub2RlX2lzX3ByaXZhdGUoem9uZV90b19uaWQoem9uZSkpKVxuIFx0XHRcdGxvd21lbV9wYWdlcyAmIzQzOz0gem9uZV9tYW5hZ2VkX3BhZ2VzKHpvbmUpO1xuIFx0fVxuIFxuQEAgLTY2MzUsNiAmIzQzOzY3MjksMTYgQEAgc3RhdGljIHZvaWQgX19zZXR1cF9wZXJfem9uZV93bWFya3Modm9pZClcbiBcdFx0dTY0IHRtcDtcbiBcbiBcdFx0c3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2em9uZS1cdTAwM2Vsb2NrLCBmbGFncyk7XG4mIzQzO1x0XHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0oem9uZV90b19uaWQoem9uZSkpKSB7XG4mIzQzO1x0XHRcdHpvbmUtXHUwMDNlX3dhdGVybWFya1tXTUFSS19NSU5dID0gMDtcbiYjNDM7XHRcdFx0em9uZS1cdTAwM2Vfd2F0ZXJtYXJrW1dNQVJLX0xPV10gPSAwO1xuJiM0MztcdFx0XHR6b25lLVx1MDAzZV93YXRlcm1hcmtbV01BUktfSElHSF0gPSAwO1xuJiM0MztcdFx0XHR6b25lLVx1MDAzZV93YXRlcm1hcmtbV01BUktfUFJPTU9dID0gMDtcbiYjNDM7XHRcdFx0em9uZS1cdTAwM2V3YXRlcm1hcmtfYm9vc3QgPSAwO1xuJiM0MztcdFx0XHRzcGluX3VubG9ja19pcnFyZXN0b3JlKFx1MDAyNnpvbmUtXHUwMDNlbG9jaywgZmxhZ3MpO1xuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4gXHRcdHRtcCA9ICh1NjQpcGFnZXNfbWluICogem9uZV9tYW5hZ2VkX3BhZ2VzKHpvbmUpO1xuIFx0XHR0bXAgPSBkaXY2NF91bCh0bXAsIGxvd21lbV9wYWdlcyk7XG4gXHRcdGlmIChpc19oaWdobWVtKHpvbmUpIHx8IHpvbmVfaWR4KHpvbmUpID09IFpPTkVfTU9WQUJMRSkge1xuQEAgLTczMDksNiAmIzQzOzc0MTMsMTUgQEAgaW50IGFsbG9jX2NvbnRpZ19mcm96ZW5fcmFuZ2Vfbm9wcm9mKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLFxuIFx0aWYgKF9fYWxsb2NfY29udGlnX3ZlcmlmeV9nZnBfbWFzayhnZnBfbWFzaywgKGdmcF90ICopXHUwMDI2Y2MuZ2ZwX21hc2spKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFByaXZhdGUgbm9kZXMgYXJlIGtlcHQgdW5yZWFjaGFibGUgdmlhIHRoZSB6b25lbGlzdHMsIGJ1dFxuJiM0MztcdCAqIGFsbG9jX2NvbnRpZyB3b3JrcyBkaXJlY3RseSBvbiBhIHpvbmUgZGVyaXZlZCBmcm9tIHRoZSBjYWxsZXImIzM5O3NcbiYjNDM7XHQgKiBwZm4gcmFuZ2UsIGJ5cGFzc2luZyB0aGF0LiAgUmVqZWN0IHRoaXMgb3BlcmF0aW9uIGV4cGxpY2l0bHlcbiYjNDM7XHQgKiByYXRoZXIgdGhhbiBzaWxlbnRseSBjYXJ2aW5nIG1lbW9yeSBvdXQgb2YgYW4gaXNvbGF0ZWQgbm9kZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodW5saWtlbHkobm9kZV9pc19wcml2YXRlKHpvbmVfdG9fbmlkKGNjLnpvbmUpKSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcbiBcdC8qXG4gXHQgKiBXaGF0IHdlIGRvIGhlcmUgaXMgd2UgbWFyayBhbGwgcGFnZWJsb2NrcyBpbiByYW5nZSBhc1xuIFx0ICogTUlHUkFURV9JU09MQVRFLiAgQmVjYXVzZSBwYWdlYmxvY2sgYW5kIG1heCBvcmRlciBwYWdlcyBtYXlcbmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmggYi9tbS9wYWdlX2FsbG9jLmhcbmluZGV4IGI5MjU5ZGVkZGI1OWQ3Li43NDE0NDhkODNjZTc3YyAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfYWxsb2MuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9hbGxvYy5oXG5AQCAtNTcsNiAmIzQzOzU3LDkgQEBcbiAgKi9cbiAjZGVmaW5lIEFMTE9DX05PX0NPREVUQUcgICAgICAgMHgxMDAwXG4gXG4mIzQzOy8qIFNlbGVjdCB0aGUgTl9NRU1PUllfUFJJVkFURSB6b25lbGlzdCBmYW1pbHkgKHNlZSBzZWxlY3Rfem9uZWxpc3QoKSkuICovXG4mIzQzOyNkZWZpbmUgQUxMT0NfWk9ORUxJU1RfUFJJVkFURSAweDIwMDBcbiYjNDM7XG4gLyogRmxhZ3MgdGhhdCBhbGxvdyBhbGxvY2F0aW9ucyBiZWxvdyB0aGUgbWluIHdhdGVybWFyay4gKi9cbiAjZGVmaW5lIEFMTE9DX1JFU0VSVkVTIChBTExPQ19OT05fQkxPQ0t8QUxMT0NfTUlOX1JFU0VSVkV8QUxMT0NfSElHSEFUT01JQ3xBTExPQ19PT00pXG4gXG5AQCAtOTUsNiAmIzQzOzk4LDI5IEBAIHN0cnVjdCBhbGxvY19jb250ZXh0IHtcbiBcdHVuc2lnbmVkIGludCBhbGxvY19mbGFncztcbiB9O1xuIFxuJiM0MzsjaWZkZWYgQ09ORklHX05VTUFcbiYjNDM7c3RhdGljX2Fzc2VydChaT05FTElTVF9QUklWQVRFICYjNDM7IDEgPT0gWk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLKTtcbiYjNDM7I2VuZGlmXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBzZWxlY3Rfem9uZWxpc3QgLSByZXNvbHZlIHRoZSB6b25lbGlzdCBmb3IgYW4gYWxsb2NhdGlvblxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgZGVmYXVsdCBtYXRjaGVzIG5vZGVfem9uZWxpc3QoKTsgQUxMT0NfWk9ORUxJU1RfUFJJVkFURSBzZWxlY3RzIHRoZVxuJiM0MzsgKiBwcml2YXRlLW5vZGUgZmFtaWx5IHNvIGFuIGFsbG9jYXRpb24gbWF5IHJlYWNoIGFuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IHpvbmVsaXN0ICpcbiYjNDM7c2VsZWN0X3pvbmVsaXN0KGludCBuaWQsIGdmcF90IGdmcCwgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzKVxuJiM0Mzt7XG4mIzQzOyNpZmRlZiBDT05GSUdfTlVNQVxuJiM0MztcdGlmIChhbGxvY19mbGFncyBcdTAwMjYgQUxMT0NfWk9ORUxJU1RfUFJJVkFURSkge1xuJiM0MztcdFx0aW50IGlkeCA9IFpPTkVMSVNUX1BSSVZBVEUgJiM0MzsgISEoZ2ZwIFx1MDAyNiBfX0dGUF9USElTTk9ERSk7XG4mIzQzO1xuJiM0MztcdFx0cmV0dXJuIFx1MDAyNk5PREVfREFUQShuaWQpLVx1MDAzZW5vZGVfem9uZWxpc3RzW2lkeF07XG4mIzQzO1x0fVxuJiM0MzsjZW5kaWZcbiYjNDM7XHRyZXR1cm4gbm9kZV96b25lbGlzdChuaWQsIGdmcCk7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9yZGVyIG9mIGEgZnJlZSBwYWdlIGluIHRoZSBidWRkeSBzeXN0ZW0uIEluXG4gICogZ2VuZXJhbCwgcGFnZV96b25lKHBhZ2UpLVx1MDAzZWxvY2sgbXVzdCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIgdG8gcHJldmVudCB0aGVcbkBAIC0yNTgsNiAmIzQzOzI4NCwxNCBAQCBzdHJ1Y3QgcGFnZSAqX19hbGxvY19wYWdlc19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBwcmVmZXJyZWRfblxuIFx0XHRub2RlbWFza190ICpub2RlbWFzaywgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzKTtcbiAjZGVmaW5lIF9fYWxsb2NfcGFnZXMoLi4uKVx0XHRcdGFsbG9jX2hvb2tzKF9fYWxsb2NfcGFnZXNfbm9wcm9mKF9fVkFfQVJHU19fKSlcbiBcbiYjNDM7c3RydWN0IGZvbGlvICpfX2ZvbGlvX2FsbG9jX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IHByZWZlcnJlZF9uaWQsXG4mIzQzO1x0XHRub2RlbWFza190ICpub2RlbWFzaywgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzKTtcbiYjNDM7I2RlZmluZSBfX2ZvbGlvX2FsbG9jKC4uLilcdFx0XHRhbGxvY19ob29rcyhfX2ZvbGlvX2FsbG9jX25vcHJvZihfX1ZBX0FSR1NfXykpXG4mIzQzO1xuJiM0Mzt1bnNpZ25lZCBsb25nIF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MsXG4mIzQzO1x0XHRpbnQgcHJlZmVycmVkX25pZCwgbm9kZW1hc2tfdCAqbm9kZW1hc2ssIGludCBucl9wYWdlcyxcbiYjNDM7XHRcdHN0cnVjdCBwYWdlICoqcGFnZV9hcnJheSk7XG4mIzQzO1xuIGV4dGVybiB2b2lkIHpvbmVfcGNwX3Jlc2V0KHN0cnVjdCB6b25lICp6b25lKTtcbiBleHRlcm4gdm9pZCB6b25lX3BjcF9kaXNhYmxlKHN0cnVjdCB6b25lICp6b25lKTtcbiBleHRlcm4gdm9pZCB6b25lX3BjcF9lbmFibGUoc3RydWN0IHpvbmUgKnpvbmUpO1xuZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmNcbmluZGV4IDliOGVlOTAyZjk3MjhhLi42ZDgxMGE0MmQ0N2Q2NiAxMDA2NDRcbi0tLSBhL21tL3Ztc2Nhbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS92bXNjYW4uY1xuQEAgLTk3NSw2ICYjNDM7OTc1LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgZm9saW8gKmFsbG9jX2RlbW90ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKnNyYyxcbiBcbiBcdG10YyA9IChzdHJ1Y3QgbWlncmF0aW9uX3RhcmdldF9jb250cm9sICopcHJpdmF0ZTtcbiBcbiYjNDM7XHRpZiAobXRjLVx1MDAzZW5tYXNrIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBub2Rlc19pbnRlcnNlY3RzKCptdGMtXHUwMDNlbm1hc2ssIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSlcbiYjNDM7XHRcdG10Yy1cdTAwM2VhbGxvY19mbGFncyA9IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEU7XG4mIzQzO1xuIFx0LypcbiBcdCAqIG1ha2Ugc3VyZSB3ZSBhbGxvY2F0ZSBmcm9tIHRoZSB0YXJnZXQgbm9kZSBmaXJzdCBhbHNvIHRyeWluZyB0b1xuIFx0ICogZGVtb3RlIG9yIHJlY2xhaW0gcGFnZXMgZnJvbSB0aGUgdGFyZ2V0IG5vZGUgdmlhIGtzd2FwZCBpZiB3ZSBhcmVcbkBAIC01NDE2LDYgJiM0Mzs1NDIwLDIxIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxydV9nZW5fYXR0cl9ncm91cCA9IHtcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdmcyBpbnRlcmZhY2VcbiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuIFxuJiM0MzsvKlxuJiM0MzsgKiBOb2RlcyB0aGUgbHJ1X2dlbiBkZWJ1Z2ZzIGludGVyZmFjZSBsaXN0czogb3JkaW5hcnkgbWVtb3J5IG5vZGVzIHBsdXMgYW55XG4mIzQzOyAqIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgb3B0ZWQgaW50byByZWNsYWltLiAgcnVuX2NtZCgpIGFscmVhZHkgYWNjZXB0cyB0aGVcbiYjNDM7ICogbGF0dGVyLCBzbyBrZWVwIHRoZSBsaXN0aW5nIGluIHN5bmMgd2l0aCB3aGF0IGl0IGFjY2VwdHMuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBscnVfZ2VuX3NlcV9ub2Rlcyhub2RlbWFza190ICpub2RlcylcbiYjNDM7e1xuJiM0MztcdGludCBuaWQ7XG4mIzQzO1xuJiM0MztcdCpub2RlcyA9IG5vZGVfc3RhdGVzW05fTUVNT1JZXTtcbiYjNDM7XHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSlcbiYjNDM7XHRcdGlmIChub2RlX2FsbG93c19yZWNsYWltKG5pZCkpXG4mIzQzO1x0XHRcdG5vZGVfc2V0KG5pZCwgKm5vZGVzKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCAqbHJ1X2dlbl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcylcbiB7XG4gXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG5AQCAtNTQyNyw5ICYjNDM7NTQ0NiwxMSBAQCBzdGF0aWMgdm9pZCAqbHJ1X2dlbl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcylcbiBcbiBcdG1lbWNnID0gbWVtX2Nncm91cF9pdGVyKE5VTEwsIE5VTEwsIE5VTEwpO1xuIFx0ZG8ge1xuJiM0MztcdFx0bm9kZW1hc2tfdCBub2RlcztcbiBcdFx0aW50IG5pZDtcbiBcbi1cdFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSB7XG4mIzQzO1x0XHRscnVfZ2VuX3NlcV9ub2RlcyhcdTAwMjZub2Rlcyk7XG4mIzQzO1x0XHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBub2Rlcykge1xuIFx0XHRcdGlmICghbnJfdG9fc2tpcC0tKVxuIFx0XHRcdFx0cmV0dXJuIGdldF9scnV2ZWMobWVtY2csIG5pZCk7XG4gXHRcdH1cbkBAIC01NDUxLDE2ICYjNDM7NTQ3MiwxOCBAQCBzdGF0aWMgdm9pZCAqbHJ1X2dlbl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuIHtcbiBcdGludCBuaWQgPSBscnV2ZWNfcGdkYXQodiktXHUwMDNlbm9kZV9pZDtcbiBcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IGxydXZlY19tZW1jZyh2KTtcbiYjNDM7XHRub2RlbWFza190IG5vZGVzO1xuIFxuIFx0JiM0MzsmIzQzOypwb3M7XG4gXG4tXHRuaWQgPSBuZXh0X21lbW9yeV9ub2RlKG5pZCk7XG4mIzQzO1x0bHJ1X2dlbl9zZXFfbm9kZXMoXHUwMDI2bm9kZXMpO1xuJiM0MztcdG5pZCA9IG5leHRfbm9kZShuaWQsIG5vZGVzKTtcbiBcdGlmIChuaWQgPT0gTUFYX05VTU5PREVTKSB7XG4gXHRcdG1lbWNnID0gbWVtX2Nncm91cF9pdGVyKE5VTEwsIG1lbWNnLCBOVUxMKTtcbiBcdFx0aWYgKCFtZW1jZylcbiBcdFx0XHRyZXR1cm4gTlVMTDtcbiBcbi1cdFx0bmlkID0gZmlyc3RfbWVtb3J5X25vZGU7XG4mIzQzO1x0XHRuaWQgPSBmaXJzdF9ub2RlKG5vZGVzKTtcbiBcdH1cbiBcbiBcdHJldHVybiBnZXRfbHJ1dmVjKG1lbWNnLCBuaWQpO1xuQEAgLTU1MjksMTAgJiM0Mzs1NTUyLDEyIEBAIHN0YXRpYyBpbnQgbHJ1X2dlbl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4gXHRzdHJ1Y3QgbHJ1X2dlbl9mb2xpbyAqbHJ1Z2VuID0gXHUwMDI2bHJ1dmVjLVx1MDAzZWxydWdlbjtcbiBcdGludCBuaWQgPSBscnV2ZWNfcGdkYXQobHJ1dmVjKS1cdTAwM2Vub2RlX2lkO1xuIFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbHJ1dmVjX21lbWNnKGxydXZlYyk7XG4mIzQzO1x0bm9kZW1hc2tfdCBub2RlcztcbiBcdERFRklORV9NQVhfU0VRKGxydXZlYyk7XG4gXHRERUZJTkVfTUlOX1NFUShscnV2ZWMpO1xuIFxuLVx0aWYgKG5pZCA9PSBmaXJzdF9tZW1vcnlfbm9kZSkge1xuJiM0MztcdGxydV9nZW5fc2VxX25vZGVzKFx1MDAyNm5vZGVzKTtcbiYjNDM7XHRpZiAobmlkID09IGZpcnN0X25vZGUobm9kZXMpKSB7XG4gXHRcdGNvbnN0IGNoYXIgKnBhdGggPSBtZW1jZyA/IG0tXHUwMDNlcHJpdmF0ZSA6IFwmIzM0O1wmIzM0OztcbiBcbiAjaWZkZWYgQ09ORklHX01FTUNHXG5AQCAtNTYzMiw3ICYjNDM7NTY1Nyw5IEBAIHN0YXRpYyBpbnQgcnVuX2NtZChjaGFyIGNtZCwgdTY0IG1lbWNnX2lkLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHNlcSxcbiBcdGludCBlcnIgPSAtRUlOVkFMO1xuIFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDtcbiBcbi1cdGlmIChuaWQgXHUwMDNjIDAgfHwgbmlkIFx1MDAzZT0gTUFYX05VTU5PREVTIHx8ICFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKVxuJiM0MztcdGlmIChuaWQgXHUwMDNjIDAgfHwgbmlkIFx1MDAzZT0gTUFYX05VTU5PREVTIHx8XG4mIzQzO1x0ICAgICEobm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSB8fFxuJiM0MztcdCAgICAgIChub2RlX2lzX3ByaXZhdGUobmlkKSBcdTAwMjZcdTAwMjYgbm9kZV9hbGxvd3NfcmVjbGFpbShuaWQpKSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuIFx0aWYgKCFtZW1fY2dyb3VwX2Rpc2FibGVkKCkpIHtcbkBAIC02MTYxLDYgJiM0Mzs2MTg4LDEzIEBAIHN0YXRpYyB2b2lkIHNocmlua19ub2RlKHBnX2RhdGFfdCAqcGdkYXQsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKVxuIFx0c3RydWN0IGxydXZlYyAqdGFyZ2V0X2xydXZlYztcbiBcdGJvb2wgcmVjbGFpbWFibGUgPSBmYWxzZTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFByaXZhdGUgbm9kZXMgZG8gbm90IHN1cHBvcnQgcmVjbGFpbSBieSBkZWZhdWx0LCBmaWx0ZXJpbmcgaGVyZVxuJiM0MztcdCAqIGNhcHR1cmVzIGFsbCBub3JtYWwgcmVjbGFpbSBwYXRocyB0aGF0IG1heSBhdHRlbXB0IGV2aWN0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbShwZ2RhdC1cdTAwM2Vub2RlX2lkKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4gXHRpZiAoKGxydV9nZW5fZW5hYmxlZCgpIHx8IGxydV9nZW5fc3dpdGNoaW5nKCkpIFx1MDAyNlx1MDAyNiByb290X3JlY2xhaW0oc2MpKSB7XG4gXHRcdG1lbXNldChcdTAwMjZzYy1cdTAwM2VuciwgMCwgc2l6ZW9mKHNjLVx1MDAzZW5yKSk7XG4gXHRcdGxydV9nZW5fc2hyaW5rX25vZGUocGdkYXQsIHNjKTtcbkBAIC02NzcxLDYgJiM0Mzs2ODA1LDE2IEBAIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gXHRyZXR1cm4gc2MubnJfcmVjbGFpbWVkO1xuIH1cbiBcbiYjNDM7c3RhdGljIHN0cnVjdCB6b25lbGlzdCAqbWVtY2dfcmVjbGFpbV96b25lbGlzdChpbnQgbmlkLCBnZnBfdCBnZnBfbWFzaylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBhZmxhZ3MgPSBBTExPQ19ERUZBVUxUO1xuJiM0MztcbiYjNDM7XHRpZiAodW5saWtlbHkoIW5vZGVzX2VtcHR5KG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSkpXG4mIzQzO1x0XHRhZmxhZ3MgPSBBTExPQ19aT05FTElTVF9QUklWQVRFO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gc2VsZWN0X3pvbmVsaXN0KG5pZCwgZ2ZwX21hc2ssIGFmbGFncyk7XG4mIzQzO31cbiYjNDM7XG4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiBcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdFx0XHRcdFx0ICAgZ2ZwX3QgZ2ZwX21hc2ssXG5AQCAtNjc5Nyw3ICYjNDM7Njg0MSw4IEBAIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gXHQgKiBlcXVhbCBwcmVzc3VyZSBvbiBhbGwgdGhlIG5vZGVzLiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXRcbiBcdCAqIHRoZSByZWNsYWltIGRvZXMgbm90IGJhaWwgb3V0IGVhcmx5LlxuIFx0ICovXG4tXHRzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0ID0gbm9kZV96b25lbGlzdChudW1hX25vZGVfaWQoKSwgc2MuZ2ZwX21hc2spO1xuJiM0MztcdHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBtZW1jZ19yZWNsYWltX3pvbmVsaXN0KG51bWFfbm9kZV9pZCgpLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgIHNjLmdmcF9tYXNrKTtcbiBcbiBcdHNldF90YXNrX3JlY2xhaW1fc3RhdGUoY3VycmVudCwgXHUwMDI2c2MucmVjbGFpbV9zdGF0ZSk7XG4gXHR0cmFjZV9tbV92bXNjYW5fbWVtY2dfcmVjbGFpbV9iZWdpbihzYy5nZnBfbWFzaywgMCwgbWVtY2cpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm0gYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtXG5pbmRleCA2ZmMzNGU5YmY4ZTFiNC4uZTBkZDc3YzY2NGM3ZWMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtXG5AQCAtMTU1LDYgJiM0MzsxNTUsNyBAQCBURVNUX0dFTl9QUk9HU194ODYgJiM0Mzs9IGFjY2Vzc190cmFja2luZ19wZXJmX3Rlc3RcbiBURVNUX0dFTl9QUk9HU194ODYgJiM0Mzs9IGNvYWxlc2NlZF9pb190ZXN0XG4gVEVTVF9HRU5fUFJPR1NfeDg2ICYjNDM7PSBkaXJ0eV9sb2dfcGVyZl90ZXN0XG4gVEVTVF9HRU5fUFJPR1NfeDg2ICYjNDM7PSBndWVzdF9tZW1mZF90ZXN0XG4mIzQzO1RFU1RfR0VOX1BST0dTX3g4NiAmIzQzOz0gZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3RcbiBURVNUX0dFTl9QUk9HU194ODYgJiM0Mzs9IGhhcmR3YXJlX2Rpc2FibGVfdGVzdFxuIFRFU1RfR0VOX1BST0dTX3g4NiAmIzQzOz0gbW11X3N0cmVzc190ZXN0XG4gVEVTVF9HRU5fUFJPR1NfeDg2ICYjNDM7PSByc2VxX3Rlc3RcbkBAIC0xOTUsNiAmIzQzOzE5Niw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBjb2FsZXNjZWRfaW9fdGVzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBkaXJ0eV9sb2dfcGVyZl90ZXN0XG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IGdldC1yZWctbGlzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBndWVzdF9tZW1mZF90ZXN0XG4mIzQzO1RFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBtbXVfc3RyZXNzX3Rlc3RcbiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gcnNlcV90ZXN0XG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IHN0ZWFsX3RpbWVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjZmMzNiMWFlNmM0MmFjXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3QuY1xuQEAgLTAsMCAmIzQzOzEsMjEzIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIFN0YW5kYWxvbmUgdGVzdCBmb3IgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUuXG4mIzQzOyAqXG4mIzQzOyAqIFZlcmlmaWVzIHRoYXQgYSBndWVzdF9tZW1mZCBjcmVhdGVkIHdpdGggR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgYWxsb2NhdGVzXG4mIzQzOyAqIGl0cyBmb2xpb3Mgb24gdGhlIHJlcXVlc3RlZCBOVU1BIG5vZGUsIHdpdGhvdXQgYW55IHVzZXJzcGFjZSBtYmluZCgpLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgZm9saW8gcGxhY2VtZW50IGlzIGNoZWNrZWQgd2l0aCBtb3ZlX3BhZ2VzKDIpIChzdGF0dXMgcXVlcnkgbW9kZSkuXG4mIzQzOyAqXG4mIzQzOyAqIFNlbGYtY29udGFpbmVkOlxuJiM0MzsgKiAgIC0gaXNzdWVzIHRoZSBLVk0gaW9jdGxzIGRpcmVjdGx5XG4mIzQzOyAqXG4mIzQzOyAqIEJ1aWxkIGluc2lkZSB0aGUgZ3Vlc3Q6XG4mIzQzOyAqICAgZ2NjIC1PMiAtbyBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdCBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdC5jXG4mIzQzOyAqXG4mIzQzOyAqIFVzYWdlOiBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdCBcdTAwM2N0YXJnZXRfbm9kZVx1MDAzZVxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NlcnIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3N5c2NhbGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm0uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MztcbiYjNDM7LyogTWlycm9yIHRoZSAocHJvcG9zZWQpIHVhcGkgYWRkaXRpb25zIGluIGNhc2UgdGhlIGhvc3QgaGVhZGVycyBsYWcuICovXG4mIzQzOyNpZm5kZWYgR1VFU1RfTUVNRkRfRkxBR19NTUFQXG4mIzQzOyNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19NTUFQXHRcdCgxVUxMIFx1MDAzY1x1MDAzYyAwKVxuJiM0MzsjZW5kaWZcbiYjNDM7I2lmbmRlZiBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEXG4mIzQzOyNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRFx0KDFVTEwgXHUwMDNjXHUwMDNjIDEpXG4mIzQzOyNlbmRpZlxuJiM0MzsjaWZuZGVmIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFXG4mIzQzOyNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVcdCgxVUxMIFx1MDAzY1x1MDAzYyAyKVxuJiM0MzsjZW5kaWZcbiYjNDM7I2lmbmRlZiBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTXG4mIzQzOyNkZWZpbmUgS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHU1x0MjQ0XG4mIzQzOyNlbmRpZlxuJiM0MztcbiYjNDM7c3RydWN0IGdtZW1mZF9hcmdzIHtcbiYjNDM7XHRfX3U2NCBzaXplO1xuJiM0MztcdF9fdTY0IGZsYWdzO1xuJiM0MztcdF9fdTMyIG5vZGU7XG4mIzQzO1x0X191MzIgcGFkO1xuJiM0MztcdF9fdTY0IHJlc2VydmVkWzVdO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LyogVHJ1ZSBpZiB0aGUgbm9kZSBoYXMgYW55IG1lbW9yeSAoTWVtVG90YWwgXHUwMDNlIDApLiAqL1xuJiM0MztzdGF0aWMgaW50IG5vZGVfaGFzX21lbW9yeShpbnQgbm9kZSlcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFsxMjhdO1xuJiM0MztcdGNoYXIgbGluZVsyNTZdO1xuJiM0MztcdEZJTEUgKmY7XG4mIzQzO1x0bG9uZyB0b3RhbCA9IC0xO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksXG4mIzQzO1x0XHQgXCYjMzQ7L3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGUlZC9tZW1pbmZvXCYjMzQ7LCBub2RlKTtcbiYjNDM7XHRmID0gZm9wZW4ocGF0aCwgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFmKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbiYjNDM7XHRcdGlmIChzdHJzdHIobGluZSwgXCYjMzQ7TWVtVG90YWw6XCYjMzQ7KSkge1xuJiM0MztcdFx0XHRpZiAoc3NjYW5mKGxpbmUsIFwmIzM0O05vZGUgJSpkIE1lbVRvdGFsOiAlbGQga0JcJiMzNDssIFx1MDAyNnRvdGFsKSA9PSAxKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRmY2xvc2UoZik7XG4mIzQzO1x0cmV0dXJuIHRvdGFsIFx1MDAzZSAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgbG9uZyBtb3ZlX3BhZ2VzX3N0YXR1cyh2b2lkICphZGRyKVxuJiM0Mzt7XG4mIzQzO1x0dm9pZCAqcGFnZXNbMV0gPSB7IGFkZHIgfTtcbiYjNDM7XHRpbnQgc3RhdHVzWzFdID0geyAtMSB9O1xuJiM0MztcdGxvbmcgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBzeXNjYWxsKFNZU19tb3ZlX3BhZ2VzLCAwLCAxLCBwYWdlcywgTlVMTCwgc3RhdHVzLCAwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0ZXJyKDEsIFwmIzM0O21vdmVfcGFnZXNcJiMzNDspO1xuJiM0MztcdHJldHVybiBzdGF0dXNbMF07XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiYjNDM7e1xuJiM0MztcdGludCBrdm0sIHZtLCBnbWVtLCByZXQ7XG4mIzQzO1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0c2l6ZV90IHNpemUgPSBwYWdlX3NpemUgKiA0O1xuJiM0MztcdGludCB0YXJnZXRfbm9kZTtcbiYjNDM7XHRzdHJ1Y3QgZ21lbWZkX2FyZ3MgZ2EgPSB7fTtcbiYjNDM7XHRjaGFyICptZW07XG4mIzQzO1x0c2l6ZV90IGk7XG4mIzQzO1xuJiM0MztcdGlmIChhcmdjICE9IDIpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDt1c2FnZTogJXMgXHUwMDNjdGFyZ2V0X25vZGVcdTAwM2VcXG5cJiMzNDssIGFyZ3ZbMF0pO1xuJiM0MztcdHRhcmdldF9ub2RlID0gYXRvaShhcmd2WzFdKTtcbiYjNDM7XG4mIzQzO1x0a3ZtID0gb3BlbihcJiMzNDsvZGV2L2t2bVwmIzM0OywgT19SRFdSKTtcbiYjNDM7XHRpZiAoa3ZtIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7b3BlbiAvZGV2L2t2bTogJXNcXG5cJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVXNlIGEgZGVmYXVsdCAobm9uLXByb3RlY3RlZCkgVk06IGl0IGhhcyBubyBwcml2YXRlIG1lbW9yeSwgc28gaXRcbiYjNDM7XHQgKiBhZHZlcnRpc2VzIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQsIHdoaWNoIGxldHMgdGhlIGhvc3QgbW1hcCBhbmRcbiYjNDM7XHQgKiBmYXVsdCB0aGUgZ21lbSAobmVlZGVkIHRvIG9ic2VydmUgcGxhY2VtZW50IHdpdGggbW92ZV9wYWdlcygpKS4gIEFcbiYjNDM7XHQgKiBTVy1wcm90ZWN0ZWQgVk0gd291bGQgbm90IGFkdmVydGlzZSBJTklUX1NIQVJFRCBhbmQgdGhlIGhvc3QgZmF1bHRcbiYjNDM7XHQgKiB3b3VsZCBTSUdCVVMuXG4mIzQzO1x0ICovXG4mIzQzO1x0dm0gPSBpb2N0bChrdm0sIEtWTV9DUkVBVEVfVk0sIDBVTCk7XG4mIzQzO1x0aWYgKHZtIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7S1ZNX0NSRUFURV9WTTogJXNcXG5cJiMzNDssIHN0cmVycm9yKGVycm5vKSk7XG4mIzQzO1xuJiM0MztcdHtcbiYjNDM7XHRcdGxvbmcgY2FwcyA9IGlvY3RsKHZtLCBLVk1fQ0hFQ0tfRVhURU5TSU9OLFxuJiM0MztcdFx0XHRcdCAgS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHUyk7XG4mIzQzO1xuJiM0MztcdFx0cHJpbnRmKFwmIzM0O0tWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MgPSAweCVseFxcblwmIzM0OywgY2Fwcyk7XG4mIzQzO1x0XHRpZiAoIShjYXBzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O0JJTkRfTk9ERSBmbGFnIG5vdCBhZHZlcnRpc2VkIChuZWVkIENPTkZJR19OVU1BKVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIShjYXBzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEKSlcbiYjNDM7XHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7SU5JVF9TSEFSRUQgbm90IGFkdmVydGlzZWQ7IGNhbm5vdCBmYXVsdCBmcm9tIGhvc3RcXG5cJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogTmVnYXRpdmU6IHBhZCBtdXN0IGJlIHplcm8uICovXG4mIzQzO1x0Z2EgPSAoc3RydWN0IGdtZW1mZF9hcmdzKXsgLnNpemUgPSBzaXplLFxuJiM0MztcdFx0XHRcdCAgIC5mbGFncyA9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFxuJiM0MztcdFx0XHRcdCAgIC5ub2RlID0gdGFyZ2V0X25vZGUsIC5wYWQgPSAxIH07XG4mIzQzO1x0cmV0ID0gaW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFx1MDAyNmdhKTtcbiYjNDM7XHRpZiAoIShyZXQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCkpXG4mIzQzO1x0XHRlcnJ4KDEsIFwmIzM0O25vbnplcm8gcGFkIHNob3VsZCBiZSByZWplY3RlZCAocmV0PSVkIGVycm5vPSVkKVwmIzM0OywgcmV0LCBlcnJubyk7XG4mIzQzO1x0cHJpbnRmKFwmIzM0O09LOiBub256ZXJvIHBhZCByZWplY3RlZFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qIE5lZ2F0aXZlOiBvdXQtb2YtcmFuZ2Ugbm9kZS4gKi9cbiYjNDM7XHRnYSA9IChzdHJ1Y3QgZ21lbWZkX2FyZ3MpeyAuc2l6ZSA9IHNpemUsXG4mIzQzO1x0XHRcdFx0ICAgLmZsYWdzID0gR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUsXG4mIzQzO1x0XHRcdFx0ICAgLm5vZGUgPSAxIFx1MDAzY1x1MDAzYyAyMCB9O1xuJiM0MztcdHJldCA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZnYSk7XG4mIzQzO1x0aWYgKCEocmV0IFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5WQUwpKVxuJiM0MztcdFx0ZXJyeCgxLCBcJiMzNDtib2d1cyBub2RlIHNob3VsZCBiZSByZWplY3RlZCAocmV0PSVkIGVycm5vPSVkKVwmIzM0OywgcmV0LCBlcnJubyk7XG4mIzQzO1x0cHJpbnRmKFwmIzM0O09LOiBvdXQtb2YtcmFuZ2Ugbm9kZSByZWplY3RlZFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogTmVnYXRpdmU6IG5vZGUgc2V0IHdpdGhvdXQgdGhlIGZsYWcuICBPbmx5IG1lYW5pbmdmdWwgZm9yIGEgbm9uemVyb1xuJiM0MztcdCAqIG5vZGU6IG5vZGUgMCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIFwmIzM0O25vZGUgZmllbGQgdW5zZXRcJiMzNDsuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHRhcmdldF9ub2RlICE9IDApIHtcbiYjNDM7XHRcdGdhID0gKHN0cnVjdCBnbWVtZmRfYXJncyl7IC5zaXplID0gc2l6ZSwgLmZsYWdzID0gMCxcbiYjNDM7XHRcdFx0XHRcdCAgIC5ub2RlID0gdGFyZ2V0X25vZGUgfTtcbiYjNDM7XHRcdHJldCA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZnYSk7XG4mIzQzO1x0XHRpZiAoIShyZXQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCkpXG4mIzQzO1x0XHRcdGVycngoMSwgXCYjMzQ7bm9kZSB3aXRob3V0IGZsYWcgc2hvdWxkIGJlIHJlamVjdGVkIChyZXQ9JWQgZXJybm89JWQpXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgIHJldCwgZXJybm8pO1xuJiM0MztcdFx0cHJpbnRmKFwmIzM0O09LOiBub2RlLXdpdGhvdXQtZmxhZyByZWplY3RlZFxcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBQb3NpdGl2ZTogYmluZCB0byB0YXJnZXRfbm9kZSwgbW1hcCwgZmF1bHQsIHZlcmlmeSBwbGFjZW1lbnQuICovXG4mIzQzO1x0Z2EgPSAoc3RydWN0IGdtZW1mZF9hcmdzKXtcbiYjNDM7XHRcdC5zaXplID0gc2l6ZSxcbiYjNDM7XHRcdC5mbGFncyA9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIHwgR1VFU1RfTUVNRkRfRkxBR19NTUFQIHxcbiYjNDM7XHRcdFx0IEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQsXG4mIzQzO1x0XHQubm9kZSA9IHRhcmdldF9ub2RlLFxuJiM0MztcdH07XG4mIzQzO1x0Z21lbSA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZnYSk7XG4mIzQzO1x0aWYgKGdtZW0gXHUwMDNjIDApIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBBIG5vZGUgdGhhdCBjYW5ub3QgYmUgYm91bmQgLSBtZW1vcnlsZXNzL29mZmxpbmUsIG9yIGEgcHJpdmF0ZVxuJiM0MztcdFx0ICogbm9kZSB0aGF0IGRpZCBub3Qgb3B0IGludG8gdXNlcnNwYWNlIHBsYWNlbWVudCAtIG11c3QgYmVcbiYjNDM7XHRcdCAqIHJlamVjdGVkIGF0IGNyZWF0ZSB3aXRoIEVJTlZBTCAobXBvbF9iaW5kX25vZGUoKSBmYWlscyksIG5vdFxuJiM0MztcdFx0ICogcHJvZHVjZSBhbiBvcGFxdWUgZmFpbHVyZSBsYXRlci5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKCFub2RlX2hhc19tZW1vcnkodGFyZ2V0X25vZGUpIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFSU5WQUwpIHtcbiYjNDM7XHRcdFx0cHJpbnRmKFwmIzM0O09LOiB1bmJpbmRhYmxlIG5vZGUgJWQgcmVqZWN0ZWQgd2l0aCBFSU5WQUxcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICB0YXJnZXRfbm9kZSk7XG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0ZXJyKDEsIFwmIzM0O0tWTV9DUkVBVEVfR1VFU1RfTUVNRkQoYmluZCBub2RlICVkKVwmIzM0OywgdGFyZ2V0X25vZGUpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIW5vZGVfaGFzX21lbW9yeSh0YXJnZXRfbm9kZSkpXG4mIzQzO1x0XHRlcnJ4KDEsIFwmIzM0O0ZBSUw6IHVuYmluZGFibGUgbm9kZSAlZCBzaG91bGQgaGF2ZSBiZWVuIHJlamVjdGVkXCYjMzQ7LFxuJiM0MztcdFx0ICAgICB0YXJnZXRfbm9kZSk7XG4mIzQzO1x0cHJpbnRmKFwmIzM0O09LOiBjcmVhdGVkIGdtZW0gZmQ9JWQgYm91bmQgdG8gbm9kZSAlZFxcblwmIzM0OywgZ21lbSwgdGFyZ2V0X25vZGUpO1xuJiM0MztcbiYjNDM7XHRtZW0gPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGdtZW0sIDApO1xuJiM0MztcdGlmIChtZW0gPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdGVycigxLCBcJiMzNDttbWFwIGdtZW1cJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKiBGYXVsdCBldmVyeSBwYWdlIGluIChubyBtYmluZCBvbiB0aGlzIG1hcHBpbmcpLiAqL1xuJiM0MztcdG1lbXNldChtZW0sIDB4YWEsIHNpemUpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0bG9uZyBub2RlID0gbW92ZV9wYWdlc19zdGF0dXMobWVtICYjNDM7IGkgKiBwYWdlX3NpemUpO1xuJiM0MztcbiYjNDM7XHRcdHByaW50ZihcJiMzNDtwYWdlICV6dSAtXHUwMDNlIG5vZGUgJWxkICh3YW50ICVkKVxcblwmIzM0OywgaSwgbm9kZSwgdGFyZ2V0X25vZGUpO1xuJiM0MztcdFx0aWYgKG5vZGUgIT0gdGFyZ2V0X25vZGUpXG4mIzQzO1x0XHRcdGVycngoMSwgXCYjMzQ7RkFJTDogcGFnZSAlenUgbGFuZGVkIG9uIG5vZGUgJWxkLCB3YW50ZWQgJWRcJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgaSwgbm9kZSwgdGFyZ2V0X25vZGUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHJpbnRmKFwmIzM0O1BBU1M6IGFsbCAlenUgcGFnZXMgb24gbm9kZSAlZCB2aWEgRkxBR19CSU5EX05PREUgKG5vIG1iaW5kKVxcblwmIzM0OyxcbiYjNDM7XHQgICAgICAgc2l6ZSAvIHBhZ2Vfc2l6ZSwgdGFyZ2V0X25vZGUpO1xuJiM0MztcbiYjNDM7XHRtdW5tYXAobWVtLCBzaXplKTtcbiYjNDM7XHRjbG9zZShnbWVtKTtcbiYjNDM7XHRjbG9zZSh2bSk7XG4mIzQzO1x0Y2xvc2Uoa3ZtKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCBmMGU1ZGE0OTA4NjYwNC4uZGUzMjBkZjA4ZTBmZjQgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5AQCAtNDU2LDYgJiM0Mzs0NTYsMjYgQEAgc3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKmt2bV9nbWVtX2dldF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHQgKi9cbiBcdHJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKFx1MDAyNkdNRU1fSShpbm9kZSktXHUwMDNlcG9saWN5LCBwZ29mZik7XG4gfVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0cG9sID0gbXBvbF9iaW5kX25vZGUobm9kZSk7XG4mIzQzO1x0aWYgKElTX0VSUihwb2wpKVxuJiM0MztcdFx0cmV0dXJuIFBUUl9FUlIocG9sKTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZXBvbGljeSwgMCxcbiYjNDM7XHRcdFx0XHRcdCAgTUFYX0xGU19GSUxFU0laRSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcbiYjNDM7XHRtcG9sX3B1dChwb2wpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7I2Vsc2VcbiYjNDM7c3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7fVxuICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2dtZW1fdm1fb3BzID0ge1xuQEAgLTU1Nyw3ICYjNDM7NTc3LDcgQEAgYm9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pXG4gXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4tc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpXG4mIzQzO3N0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzLCBpbnQgbm9kZSlcbiB7XG4gXHRzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9IFwmIzM0O1trdm0tZ21lbV1cJiMzNDs7XG4gXHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xuQEAgLTU5OCw2ICYjNDM7NjE4LDEyIEBAIHN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxuIFxuIFx0R01FTV9JKGlub2RlKS1cdTAwM2VmbGFncyA9IGZsYWdzO1xuIFxuJiM0MztcdGlmIChmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcbiYjNDM7XHRcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XG4mIzQzO1x0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRnb3RvIGVycl9pbm9kZTtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0ZmlsZSA9IGFsbG9jX2ZpbGVfcHNldWRvKGlub2RlLCBrdm1fZ21lbV9tbnQsIG5hbWUsIE9fUkRXUiwgXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XG4gXHRpZiAoSVNfRVJSKGZpbGUpKSB7XG4gXHRcdGVyciA9IFBUUl9FUlIoZmlsZSk7XG5AQCAtNjMwLDYgJiM0Mzs2NTYsNyBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4ge1xuIFx0bG9mZl90IHNpemUgPSBhcmdzLVx1MDAzZXNpemU7XG4gXHR1NjQgZmxhZ3MgPSBhcmdzLVx1MDAzZWZsYWdzO1xuJiM0MztcdGludCBub2RlID0gTlVNQV9OT19OT0RFO1xuIFxuIFx0aWYgKGZsYWdzIFx1MDAyNiB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC02MzcsNyAmIzQzOzY2NCwxNSBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4gXHRpZiAoc2l6ZSBcdTAwM2M9IDAgfHwgIVBBR0VfQUxJR05FRChzaXplKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4tXHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncyk7XG4mIzQzO1x0aWYgKGZsYWdzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xuJiM0MztcdFx0aWYgKGFyZ3MtXHUwMDNlcGFkIHx8IGFyZ3MtXHUwMDNlbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHRub2RlID0gYXJncy1cdTAwM2Vub2RlO1xuJiM0MztcdH0gZWxzZSBpZiAoYXJncy1cdTAwM2Vub2RlIHx8IGFyZ3MtXHUwMDNlcGFkKSB7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzLCBub2RlKTtcbiB9XG4gXG4gaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzIzIDAyOjUyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLVk0mIzM0OywKICAgICYjMzQ7TlVNQSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDtfX2t2bV9nbWVtX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDtrdm1fZ21lbV9iaW5kX25vZGUmIzM0OywKICAgICYjMzQ7bXBvbF9iaW5kX25vZGUmIzM0OywKICAgICYjMzQ7X19tcG9sX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDttcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHByaXZhdGUgbWVtb3J5IG5vZGVzIGFuZCBhZGRzIHN1cHBvcnQgZm9yIHRoZW0gYWNyb3NzIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIFdoaWxlIHRoZSBkcml2ZXItZmFjaW5nIEFQSSBpcyBub3QgeWV0IHVzZWQgYnkgYW55IGluLXRyZWUgZHJpdmVyLCB0aGUgcGF0Y2ggYWxzbyBpbnRyb2R1Y2VzIGEgbmV3IEtWTSBmZWF0dXJlIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIHdoaWNoIGFsbG93cyBiaW5kaW5nIGEgZ3Vlc3RfbWVtZmQgdG8gYSBzcGVjaWZpYyBOVU1BIG5vZGUuIFRoaXMgZmVhdHVyZSBpcyBmdWxseSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIGlvY3RsIGFuZCByZWxpZXMgb24gdGhlIG5ld2x5IGFkZGVkIG1wb2xfYmluZF9ub2RlIGFuZCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlIGZ1bmN0aW9ucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIEtWTSBhbmQgY29yZSBtbSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGM4YTk3NTk4MzJlZWY3ZDUyNmU3M2U1MjU5MmVjMzBjNjY4MGZlYTYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IEp1bCAyMyAwMjo1Mjo1NSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzLW5vZGUgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZGV2aWNlcy1ub2RlCmluZGV4IDJkMGUwMjNmMjJhNzFhLi44YTM2ZmJjM2Q0MDI4NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMtbm9kZQomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZGV2aWNlcy1ub2RlCkBAIC0yOSw2ICYjNDM7MjksMTYgQEAgRGVzY3JpcHRpb246CiAJCU5vZGVzIHRoYXQgaGF2ZSByZWd1bGFyIG9yIGhpZ2ggbWVtb3J5LgogCQlEZXBlbmRzIG9uIENPTkZJR19ISUdITUVNLgogCiYjNDM7V2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9oYXNfcHJpdmF0ZV9tZW1vcnkKJiM0MztDb250YWN0OglMaW51eCBNZW1vcnkgTWFuYWdlbWVudCBsaXN0ICZsdDtsaW51eC1tbUBrdmFjay5vcmcmZ3Q7CiYjNDM7RGVzY3JpcHRpb246CiYjNDM7CQlOb2RlcyB0aGF0IGhhdmUgcHJpdmF0ZSAoTl9NRU1PUllfUFJJVkFURSkgbWVtb3J5OiBtZW1vcnkKJiM0MzsJCWhvdHBsdWdnZWQgYnkgYSBkcml2ZXIgb250byBhIENQVS1sZXNzIG5vZGUgYW5kIGlzb2xhdGVkIGZyb20KJiM0MzsJCXRoZSBwYWdlIGFsbG9jYXRvciYjMzk7cyBub3JtYWwgYW5kIGZhbGxiYWNrIHpvbmVsaXN0cy4gIEEgbm9kZSBpcwomIzQzOwkJbGlzdGVkIGhlcmUgZm9yIGFzIGxvbmcgYXMgaXQgaG9sZHMgcHJpdmF0ZSBtZW1vcnk7IGl0IGlzIG5ldmVyCiYjNDM7CQlsaXN0ZWQgaW4gaGFzX21lbW9yeSBhdCB0aGUgc2FtZSB0aW1lICh0aGUgdHdvIHN0YXRlcyBhcmUKJiM0MzsJCW11dHVhbGx5IGV4Y2x1c2l2ZSkuICBTZWUgRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0LgomIzQzOwogV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlWAogRGF0ZToJCU9jdG9iZXIgMjAwMgogQ29udGFjdDoJTGludXggTWVtb3J5IE1hbmFnZW1lbnQgbGlzdCAmbHQ7bGludXgtbW1Aa3ZhY2sub3JnJmd0OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL21tL2luZGV4LnJzdAppbmRleCAxM2E3OWY1ZDA5MmMwZS4uZjYwNzA0ZGY2MTA0YzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbW0vaW5kZXgucnN0CiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vbW0vaW5kZXgucnN0CkBAIC02NSw2ICYjNDM7NjUsNyBAQCBkb2N1bWVudGF0aW9uLCBvciBkZWxldGVkIGlmIGl0IGhhcyBzZXJ2ZWQgaXRzIHB1cnBvc2UuCiAgICBtbXVfbm90aWZpZXIKICAgIG11bHRpZ2VuX2xydQogICAgbnVtYQomIzQzOyAgIG51bWFfcHJpdmF0ZV9ub2RlcwogICAgb3ZlcmNvbW1pdC1hY2NvdW50aW5nCiAgICBwYWdlX21pZ3JhdGlvbgogICAgcGFnZV9mcmFncwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4zYjI3YTJlMjRiMDg2NwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdApAQCAtMCwwICYjNDM7MSwxNjAgQEAKJiM0MzsuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOz09PT09PT09PT09PT09PT09PT09CiYjNDM7UHJpdmF0ZSBtZW1vcnkgbm9kZXMKJiM0Mzs9PT09PT09PT09PT09PT09PT09PQomIzQzOwomIzQzO0EgKnByaXZhdGUgbWVtb3J5IG5vZGUqIGlzIGEgTlVNQSBub2RlIHdob3NlIG1lbW9yeSBpcyBob3RwbHVnZ2VkIGJ5IGEgZHJpdmVyCiYjNDM7YW5kIGRlbGliZXJhdGVseSBoaWRkZW4gZnJvbSB0aGUga2VybmVsJiMzOTtzIG5vcm1hbCBtZW1vcnkgbWFuYWdlbWVudC4gIFN1Y2ggYQomIzQzO25vZGUgaXMgbWFya2VkIGBgTl9NRU1PUllfUFJJVkFURWBgIGluc3RlYWQgb2YgYGBOX01FTU9SWWBgOyB0aGUgdHdvIHN0YXRlcwomIzQzO2FyZSBtdXR1YWxseSBleGNsdXNpdmUsIHNvIGEgcHJpdmF0ZSBub2RlIGlzIG5ldmVyIGNvbnNpZGVyZWQgYnkgdGhlIHBhZ2UKJiM0MzthbGxvY2F0b3ImIzM5O3Mgbm9ybWFsIG9yIGZhbGxiYWNrIHBhdGhzLgomIzQzOwomIzQzO1RoZSBpbnRlbnQgaXMgdG8gZ2l2ZSBhIGRyaXZlciBhIGJsb2NrIG9mIE5VTUEtYWRkcmVzc2FibGUgbWVtb3J5IHRoYXQgdGhlIHJlc3QKJiM0MztvZiB0aGUga2VybmVsIHdpbGwgbm90IGFsbG9jYXRlIGZyb20gb24gaXRzIG93biwgd2hpbGUgc3RpbGwgbGV0dGluZyB0aGF0IG1lbW9yeQomIzQzO2JlIG1hcHBlZCBpbnRvIHByb2Nlc3NlcyBhcyBvcmRpbmFyeSwgc3RydWN0LXBhZ2UsIExSVS1tYW5hZ2VkIGZvbGlvcyAtLSBhbmQgdG8KJiM0MztsZXQgdGhlIGRyaXZlciByZS1lbmFibGUgaW5kaXZpZHVhbCBtbSBzZXJ2aWNlcyBpdCBpcyBjYXBhYmxlIG9mIGFsbG93aW5nLgomIzQzOwomIzQzO1ByZWNvbmRpdGlvbnMKJiM0Mzs9PT09PT09PT09PT09CiYjNDM7CiYjNDM7YGBOX01FTU9SWV9QUklWQVRFYGAgYW5kIGBgTl9NRU1PUllgYCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCBzbyB0aGUgYmFja2luZwomIzQzO21lbW9yeSBtdXN0IGNvbWUgdXAgb24gYSBub2RlIHRoYXQgaGFzIG5vIERSQU0gb2YgaXRzIG93biAob3RoZXJ3aXNlIHRoZSBub2RlCiYjNDM7d291bGQgYWxyZWFkeSBiZSBgYE5fTUVNT1JZYGApLgomIzQzOwomIzQzO0luIHByYWN0aWNlIHRoZSBtZW1vcnkgaXMgcHJvdmlkZWQgYnkgYSBkZXZpY2UgZHJpdmVyIG9yIGEgREFYIGRldmljZSB3aG9zZQomIzQzO3RhcmdldCBub2RlIGhhcyBubyBvdGhlciBtZW1vcnksIGFuZCB1c3VhbGx5IG5vIENQVXMuCiYjNDM7CiYjNDM7SXNvbGF0aW9uIG1vZGVsCiYjNDM7PT09PT09PT09PT09PT09CiYjNDM7CiYjNDM7SXNvbGF0aW9uIGlzICpvcHQtaW4gYnkgZXhjbHVzaW9uKiBhbmQgaXMgKipzdHJ1Y3R1cmFsKio6IGJ5IGRlZmF1bHQgbm90aGluZyBpbgomIzQzO3RoZSBrZXJuZWwgY2FuIHBsYWNlIG1lbW9yeSBvbiBhIHByaXZhdGUgbm9kZSBiZWNhdXNlIHRoZSBub2RlIGlzIGFic2VudCBmcm9tIHRoZQomIzQzO3pvbmVsaXN0cyBhbiBvcmRpbmFyeSBhbGxvY2F0aW9uIHdhbGtzLgomIzQzOwomIzQzO1pvbmVsaXN0IGV4Y2x1c2lvbgomIzQzOyAgICBUaGUga2VybmVsIHBhZ2UgYWxsb2NhdG9yIGRlcGVuZHMgb24gdGhlIGBgRkFMTEJBQ0tgYCBhbmQgYGBOT0ZBTExCQUNLYGAKJiM0MzsgICAgem9uZWxpc3RzIHRvIGFsbG9jYXRlIG1lbW9yeS4gIEEgbm9ybWFsIGBgTl9NRU1PUllgYCBub2RlJiMzOTtzIHpvbmVzIChleGNlcHQKJiM0MzsgICAgYGBaT05FX0RFVklDRWBgKSBhcHBlYXIgaW4gdGhlc2UgbGlzdHMgYW5kIGFsbG93IGFsbG9jYXRpb25zIHRvIGZhbGwtYmFjawomIzQzOyAgICB0byBsZXNzIHByZWZlcmFibGUgbG9jYXRpb25zIGlmIHRoZSBwcmVmZXJyZWQgbG9jYXRpb24gaXMgcHJlc3N1cmVkLgomIzQzOwomIzQzOyAgICBgYF9fR0ZQX1RISVNOT0RFYGAgaXMgdXNlZCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiB0byBzd2l0Y2ggYmV0d2VlbgomIzQzOyAgICBgYEZBTExCQUNLYGAgYW5kIGBgTk9GQUxMQkFDS2BgLCB3aGVyZSBgYE5PRkFMTEJBQ0tgYCBvbmx5IGNvbnRhaW5zIHRoZQomIzQzOyAgICB6b25lbGlzdHMgb2YgdGhlIHByZWZlcnJlZCBub2RlLgomIzQzOwomIzQzOyAgICBgYE5fTUVNT1JZX1BSSVZBVEVgYCBub2RlcyBhcmUgKipleGNsdWRlZCoqIGZyb20gYm90aCBgYEZBTExCQUNLYGAgYW5kCiYjNDM7ICAgIGBgTk9GQUxMQkFDS2BgIHpvbmVsaXN0cy4gIEluc3RlYWQgdGhleSBhcmUgYWRkZWQgdG8gYGBaT05FTElTVF9QUklWQVRFYGAsCiYjNDM7ICAgIHdoaWNoIGluY2x1ZGVzIGJvdGggYGBOX01FTU9SWWBgIGFuZCBgYE5fTUVNT1JZX1BSSVZBVEVgYCBub2Rlcy4gIFRoaXMgaXMKJiM0MzsgICAgdGhlIG9ubHkgem9uZWxpc3QgdGhhdCBjb250YWlucyBwcml2YXRlLW5vZGUgem9uZXMsIGFuZCBzbyB0aGUgb25seSB3YXkKJiM0MzsgICAgdG8gYWNxdWlyZSBwcml2YXRlIG5vZGUgYWxsb2NhdGlvbnMgaXMgdG8gZXhwbGljaXRseSByZXF1ZXN0IHRoYXQgem9uZWxpc3QuCiYjNDM7CiYjNDM7ICAgIEV2ZW4gYW4gYWxsb2NhdGlvbiBjYXJyeWluZyBgYF9fR0ZQX1RISVNOT0RFYGAgY2Fubm90IGFjY2VzcyB0aGUgbm9kZSYjMzk7cwomIzQzOyAgICBtZW1vcnkgd2l0aG91dCBhbHNvIGV4cGxpY2l0bHkgcGFzc2luZyB0aGUgcHJpdmF0ZSB6b25lbGlzdC4gIFRoaXMgcHJldmVudHMKJiM0MzsgICAgaW5jaWRlbnRhbCBhbGxvY2F0aW9uIG9mIHByaXZhdGUgbWVtb3J5IGJ5IHVzZXJzIG9mIHBvc3NpYmxlL29ubGluZQomIzQzOyAgICBub2RlbGlzdHMuCiYjNDM7CiYjNDM7ICAgIFdoZW4gYGBDT05GSUdfTlVNQWBgIGlzIGRpc2FibGVkIGBgWk9ORUxJU1RfUFJJVkFURWBgIGFsaWFzZXMKJiM0MzsgICAgYGBaT05FTElTVF9GQUxMQkFDS2BgIGFuZCBpcyBuZXZlciBzZWxlY3RlZC4KJiM0MzsKJiM0MztUaGUgdXNlcl9udW1hIHBhdGgKJiM0MzsKJiM0MzsgICAgYGBNUE9MX0ZfUFJJVkFURWBgIGlzIGFuIGludGVybmFsIHVzZXJfbnVtYSBmbGFnIChuZXZlciBhY2NlcHRlZCBmcm9tCiYjNDM7ICAgIHVzZXJzcGFjZSkgbWFya2luZyB0aGF0IGEgbWVtcG9saWN5IGhhcyBhIHByaXZhdGUgbm9kZSBpbiBpdHMgbm9kZW1hc2suCiYjNDM7CiYjNDM7ICAgIFdoZW4gYGBDQVBfVVNFUl9OVU1BYGAgZm9yIGEgcHJpdmF0ZSBub2RlIGlzIHNldCwgdXNlci1zb3VyY2VkIG1lbXBvbGljeQomIzQzOyAgICAoYGBzZXRfbWVtcG9saWN5KDIpYGApIGFuZCBtaWdyYXRpb24gKGBgbW92ZV9wYWdlcygyKWBgKSBvcGVyYXRpb25zIGFyZQomIzQzOyAgICBhbGxvd2VkIHRvIGluY2x1ZGUgdGhhdCBub2RlIGluIG5vZGVtYXNrcyBhbmQgdGFyZ2V0cyByZXNwZWN0aXZlbHkuCiYjNDM7CiYjNDM7ICAgIGBgbWJpbmQoTVBPTF9NRl9NT1ZFKWBgIGlzIGJvdGggYSBtZW1wb2xpY3kgYW5kIGEgbWlncmF0aW9uIG9wZXJhdGlvbiwKJiM0MzsgICAgc28gcGxhY2VtZW50IGFuZCBtaWdyYXRpb24gc2hhcmUgdGhlIHNhbWUgY2FwYWJpbGl0eS4KJiM0MzsKJiM0MzsgICAgVGhlIG1lbXBvbGljeSBjb21wb25lbnQgdXNlcyBgYE1QT0xfRl9QUklWQVRFYGAgYXQgZmF1bHQtdGltZSB0byBzZWxlY3QKJiM0MzsgICAgYGBaT05FTElTVF9QUklWQVRFYGAgYW5kIG1ha2VzIHRoZSBub2RlJiMzOTtzIG1lbW9yeSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCiYjNDM7ICAgIEl0IGlzIG90aGVyd2lzZSBhbiBvcmRpbmFyeSwgcmVsYXhhYmxlIG1lbXBvbGljeTogYW4gdW5zYXRpc2ZpYWJsZSByZXF1ZXN0CiYjNDM7ICAgIChhbiB1bm1vdmFibGUgYWxsb2NhdGlvbiBvbiBhIG1vdmFibGUtb25seSBwcml2YXRlIG5vZGUpIHNpbXBseSBmYWxscyBiYWNrLgomIzQzOwomIzQzOwomIzQzO2NwdXNldCBpbnRlcmFjdGlvbgomIzQzOz09PT09PT09PT09PT09PT09PQomIzQzOwomIzQzO2NwdXNldC5tZW1zIGRvZXMgKipub3QqKiBwYXJ0aXRpb24gcHJpdmF0ZSBub2Rlcy4gIGNwdXNldCBuZWl0aGVyIGdyYW50cyBub3IKJiM0MztkZW5pZXMgYWNjZXNzLCBhbmQgcmViaW5kaW5nIGNwdXNldC5tZW1zIG5vZGVtYXNrcyBkbyBub3QgYWZmZWN0IGEgcHJpdmF0ZSBub2RlJiMzOTtzCiYjNDM7cmVzaWRlbmN5IGluIGFueSBub2RlbWFzay4KJiM0MzsKJiM0MztMaWtld2lzZSwgYSBwcml2YXRlIG5vZGUmIzM5O3MgaW5jbHVzaW9uIGluIGEgbm9kZW1hc2sgZG9lcyBub3QgYWZmZWN0IGNwdXNldC5tZW1zJiMzOTsKJiM0MztmaWx0ZXJpbmcgb2YgYW55IGBgTl9NRU1PUllgYCAtIHRoZXkgcmVtYWluIHBhcnRpdGlvbmVkIGFjY29yZGluZyB0byBjcHVzZXQuCiYjNDM7CiYjNDM7CiYjNDM7UHJvdmlzaW9uaW5nCiYjNDM7PT09PT09PT09PT09CiYjNDM7CiYjNDM7QSBkcml2ZXIgYnJpbmdzIG1lbW9yeSB1cCBhcyBwcml2YXRlIHdpdGg6OgomIzQzOwomIzQzOyAgYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKG5pZCwgc3RhcnQsIHNpemUsIHJlc291cmNlX25hbWUsCiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWhwX2ZsYWdzLCBvbmxpbmVfdHlwZSwgbnApCiYjNDM7CiYjNDM7d2hpY2ggb25saW5lcyB0aGUgcmFuZ2UgYW5kIHJlZ2lzdGVycyB0aGUgZHJpdmVyLW93bmVkIGBgc3RydWN0IG5vZGVfcHJpdmF0ZWBgCiYjNDM7KGBgbnBgYCkgZGVzY3JpYmluZyB0aGUgbm9kZSwgaW5jbHVkaW5nIGl0cyBjYXBhYmlsaXR5IGJpdG1hcCAoc2VlIGJlbG93KS4KJiM0MzsKJiM0MztPbmx5IG9uZSBkcml2ZXIvc2VydmljZSBtYXkgcmVnaXN0ZXIgYSBgYHN0cnVjdCBub2RlX3ByaXZhdGVgYCwgd2hpY2gKJiM0MztoZWF2aWx5IGltcGxpZXMgYSAmIzM0O29uZS1ub2RlLXBlci1kZXZpY2UmIzM0OyBkZXNpZ24gb2YgdGhlIHN5c3RlbS4KJiM0MzsKJiM0MztUaGUgbm9kZSBsZWF2ZXMgYGBOX01FTU9SWV9QUklWQVRFYGAgb25seSB3aGVuIHRoZSBsYXN0IHJhbmdlIGlzIG9mZmxpbmVkLgomIzQzOwomIzQzOy4uIGtlcm5lbC1kb2M6OiBtbS9tZW1vcnlfaG90cGx1Zy5jCiYjNDM7ICAgOmlkZW50aWZpZXJzOiBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQKJiM0MzsKJiM0MzsuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL25vZGUuYwomIzQzOyAgIDppZGVudGlmaWVyczogbm9kZV9wcml2YXRlX3JlZ2lzdGVyIG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyCiYjNDM7CiYjNDM7Q2FwYWJpbGl0aWVzIChwZXItc2VydmljZSBvcHQtaW5zKQomIzQzOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KJiM0MzsKJiM0MztCZWNhdXNlIHRoZSBkZWZhdWx0IGlzICYjMzQ7bm8gbW0gc2VydmljZSB0b3VjaGVzIHRoZSBub2RlJiMzNDssIGVhY2ggc2VydmljZSBhIGRyaXZlcgomIzQzO3dhbnRzIGJhY2sgaXMgcmVxdWVzdGVkIGV4cGxpY2l0bHkgdGhyb3VnaCBhIGNhcGFiaWxpdHkgYml0IGluCiYjNDM7YGBucC0mZ3Q7Y2Fwc2BgLiAgVGhlIG1tIHNpZGUgY2hlY2tzIHRoZSBtYXRjaGluZyBgYG5vZGVfYWxsb3dzXyooKWBgIC8KJiM0MztgYGZvbGlvX2FsbG93c18qKClgYCBwcmVkaWNhdGUgYmVmb3JlIGFjdGluZzoKJiM0MzsKJiM0MzsuLiBsaXN0LXRhYmxlOjoKJiM0MzsgICA6aGVhZGVyLXJvd3M6IDEKJiM0MzsgICA6d2lkdGhzOiAzNSA2NQomIzQzOwomIzQzOyAgICogLSBDYXBhYmlsaXR5CiYjNDM7ICAgICAtIFJlLWVuYWJsZXMKJiM0MzsgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX1JFQ0xBSU1gYAomIzQzOyAgICAgLSByZWNsYWltIG9mIHRoZSBub2RlJiMzOTtzIGZvbGlvcywgYnkgdGhlIG1tIGFuZCBieSB1c2Vyc3BhY2UKJiM0MzsgICAgICAgYGBNQURWX0NPTERgYCAvIGBgUEFHRU9VVGBgIC8gYGBGUkVFYGAgKHVzZXJsYW5kLWRyaXZlbiByZWNsYWltKQomIzQzOyAgICogLSBgYE5PREVfUFJJVkFURV9DQVBfVVNFUl9OVU1BYGAKJiM0MzsgICAgIC0gYWxsIHVzZXJzcGFjZS1kaXJlY3RlZCBwbGFjZW1lbnQgYW5kIG1pZ3JhdGlvbjogYGBtYmluZCgpYGAgLwomIzQzOyAgICAgICBgYHNldF9tZW1wb2xpY3koKWBgIC8gaG9tZSBub2RlLCBhbmQgYGBtb3ZlX3BhZ2VzKClgYCAvCiYjNDM7ICAgICAgIGBgbWlncmF0ZV9wYWdlcygpYGAgdG8vZnJvbSB0aGUgbm9kZQomIzQzOyAgICogLSBgYE5PREVfUFJJVkFURV9DQVBfSE9UVU5QTFVHYGAKJiM0MzsgICAgIC0gaG90LXVucGx1ZyB2aWEgbWlncmF0aW9uCiYjNDM7ICAgKiAtIGBgTk9ERV9QUklWQVRFX0NBUF9ERU1PVElPTmBgCiYjNDM7ICAgICAtIHJlY2xhaW0tZHJpdmVuIHRpZXJpbmcgZGVtb3Rpb24gb250byB0aGUgbm9kZSAodGhlIG5vZGUgam9pbnMgdGhlCiYjNDM7ICAgICAgIGRlbW90aW9uIGhpZXJhcmNoeSkKJiM0MzsgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX05VTUFfQkFMQU5DSU5HYGAKJiM0MzsgICAgIC0gYWNjZXNzLWJhc2VkIE5VTUEgYmFsYW5jaW5nIHNjYW4vbWlncmF0aW9uIG9mIHRoZSBub2RlJiMzOTtzIGZvbGlvcwomIzQzOyAgICogLSBgYE5PREVfUFJJVkFURV9DQVBfTFRQSU5gYAomIzQzOyAgICAgLSBgYEZPTExfTE9OR1RFUk1gYCBHVVAgcGlucwomIzQzOwomIzQzO2todWdlcGFnZWQgbmV2ZXIgb3BlcmF0ZXMgb24gcHJpdmF0ZS1ub2RlIGZvbGlvcyAobGlrZSBaT05FX0RFVklDRSksIGFuZCBEQU1PTgomIzQzO2RvZXMgbm90IGFjdCBvbiB0aGVtOyBgYE1BRFZfQ09MTEFQU0VgYCBpcyBjb3ZlcmVkIGJ5IGBgQ0FQX1VTRVJfTlVNQWBgLgomIzQzOwomIzQzO0RlcGVuZGVuY2llcyBiZXR3ZWVuIGNhcGFiaWxpdGllcyBhcmUgZW5mb3JjZWQgKipvbmNlKiosIGJ5CiYjNDM7YGBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoKWBgIGF0IGhvdHBsdWcsIHJhdGhlciB0aGFuIGJ5IHdoYXRldmVyIHNldHMgdGhlIGJpdHM6CiYjNDM7CiYjNDM7KiBgYERFTU9USU9OYGAgcmVxdWlyZXMgYGBSRUNMQUlNYGAgKGEgZGVtb3Rpb24gdGFyZ2V0IGFjY3VtdWxhdGVzIGRlbW90ZWQKJiM0MzsgIHBhZ2VzLCBzbyB3aXRob3V0IHJlY2xhaW0gYXMgYSBzYWZldHkgdmFsdmUgaXQgd291bGQganVzdCBmaWxsIHVwKS4KJiM0MzsKJiM0MztDYXBhYmlsaXR5IGZsYWdzIGFyZSBleHBlY3RlZCB0byBiZSBzdGFibGUgYXQgcnVudGltZS4KJiM0MzsKJiM0MztPYnNlcnZhYmlsaXR5CiYjNDM7PT09PT09PT09PT09PQomIzQzOwomIzQzO0EgcHJpdmF0ZSBub2RlIGlzIHJlcG9ydGVkIHRocm91Z2g6CiYjNDM7CiYjNDM7KiBgYC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9oYXNfcHJpdmF0ZV9tZW1vcnlgYAomIzQzOyogYGAvcHJvYy8mbHQ7cGlkJmd0Oy9udW1hX21hcHNgYCAtLSBwZXItbm9kZSByZXNpZGVuY3kgaW5jbHVkZXMgcHJpdmF0ZSBub2RlcwomIzQzOyogYGAvcHJvYy9rY29yZWBgIC0tIHByaXZhdGUtbm9kZSBSQU0gYXBwZWFycyBpbiB0aGUga2NvcmUgUkFNIG1hcAomIzQzOyogbWVtY2cgcGVyLW5vZGUgc3RhdGlzdGljcyBhY2NvdW50IHByaXZhdGUtbm9kZSBtZW1vcnkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jIGIvZHJpdmVycy9iYXNlL25vZGUuYwppbmRleCAzZGE5MTkyOWFkNGUzNy4uM2Q2MWNhMWI4MDVkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9ub2RlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9iYXNlL25vZGUuYwpAQCAtMjIsNiAmIzQzOzIyLDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21lbWJsb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L25vZGVfcHJpdmF0ZS5oJmd0OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ1c190eXBlIG5vZGVfc3Vic3lzID0gewogCS5uYW1lID0gJiMzNDtub2RlJiMzNDssCkBAIC04NjgsNiAmIzQzOzg2OSwxMjEgQEAgdm9pZCByZWdpc3Rlcl9tZW1vcnlfYmxvY2tzX3VuZGVyX25vZGVfaG90cGx1ZyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCSAgICh2b2lkICopJmFtcDtuaWQsIHJlZ2lzdGVyX21lbV9ibG9ja191bmRlcl9ub2RlX2hvdHBsdWcpOwogCXJldHVybjsKIH0KJiM0MzsKJiM0MztzdGF0aWMgREVGSU5FX01VVEVYKG5vZGVfcHJpdmF0ZV9sb2NrKTsKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBub2RlX3ByaXZhdGVfcmVnaXN0ZXIgLSBSZWdpc3RlciBhIHByaXZhdGUgbm9kZQomIzQzOyAqIEBuaWQ6IE5vZGUgaWRlbnRpZmllcgomIzQzOyAqIEBucDogVGhlIG5vZGVfcHJpdmF0ZSBzdHJ1Y3R1cmUgKGRyaXZlci1hbGxvY2F0ZWQsIGRyaXZlci1vd25lZCkKJiM0MzsgKgomIzQzOyAqIFJlZ2lzdGVyIGFuIG93bmVyIGZvciBhIHByaXZhdGUgbm9kZS4gSWYgYW4gb3duZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkCiYjNDM7ICogKGRpZmZlcmVudCBucCksIHJldHVybiAtRUJVU1kuCiYjNDM7ICoKJiM0MzsgKiBSZS1yZWdpc3RyYXRpb24gd2l0aCB0aGUgc2FtZSBucCBpcyBhbGxvd2VkLgomIzQzOyAqCiYjNDM7ICogVGhlIGNhbGxlciBvd25zIHRoZSBub2RlX3ByaXZhdGUgbWVtb3J5IGFuZCBtdXN0IGVuc3VyZSBpdCByZW1haW5zIHZhbGlkCiYjNDM7ICogdW50aWwgYWZ0ZXIgbm9kZV9wcml2YXRlX3VucmVnaXN0ZXIoKSByZXR1cm5zLgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuCiYjNDM7ICovCiYjNDM7aW50IG5vZGVfcHJpdmF0ZV9yZWdpc3RlcihpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBub2RlX3ByaXZhdGUgKmV4aXN0aW5nOwomIzQzOwlwZ19kYXRhX3QgKnBnZGF0OwomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJaWYgKCFucCB8fCAhbm9kZV9wb3NzaWJsZShuaWQpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CS8qIERlbW90aW9uIGlzIGRyaXZlbiBieSByZWNsYWltLCBzbyBpdCByZXF1aXJlcyByZWNsYWltLiAqLwomIzQzOwlpZiAoKG5wLSZndDtjYXBzICZhbXA7IE5PREVfUFJJVkFURV9DQVBfREVNT1RJT04pICZhbXA7JmFtcDsKJiM0MzsJICAgICEobnAtJmd0O2NhcHMgJmFtcDsgTk9ERV9QUklWQVRFX0NBUF9SRUNMQUlNKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7bm9kZV9wcml2YXRlX2xvY2spOwomIzQzOwltZW1faG90cGx1Z19iZWdpbigpOwomIzQzOwomIzQzOwkvKiBOX01FTU9SWV9QUklWQVRFIGFuZCBOX01FTU9SWSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCiYjNDM7CWlmIChub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKSB7CiYjNDM7CQlyZXQgPSAtRUJVU1k7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlwZ2RhdCA9IE5PREVfREFUQShuaWQpOwomIzQzOwlleGlzdGluZyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocGdkYXQtJmd0O25vZGVfcHJpdmF0ZSwKJiM0MzsJCQkJCSAgICAgbG9ja2RlcF9pc19oZWxkKCZhbXA7bm9kZV9wcml2YXRlX2xvY2spKTsKJiM0MzsKJiM0MzsJLyogSWYgaXQgZXhpc3RzLCByZXN0cmljdCB0byBzaW5nbGUgb3duZXIgKi8KJiM0MzsJaWYgKGV4aXN0aW5nKSB7CiYjNDM7CQlpZiAoZXhpc3RpbmcgIT0gbnApCiYjNDM7CQkJcmV0ID0gLUVCVVNZOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmN1X2Fzc2lnbl9wb2ludGVyKHBnZGF0LSZndDtub2RlX3ByaXZhdGUsIG5wKTsKJiM0MztvdXQ6CiYjNDM7CW1lbV9ob3RwbHVnX2RvbmUoKTsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7bm9kZV9wcml2YXRlX2xvY2spOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChub2RlX3ByaXZhdGVfcmVnaXN0ZXIpOwomIzQzOwomIzQzOy8qKgomIzQzOyAqIG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyIC0gVW5yZWdpc3RlciBhIHByaXZhdGUgbm9kZQomIzQzOyAqIEBuaWQ6IE5vZGUgaWRlbnRpZmllcgomIzQzOyAqCiYjNDM7ICogVW5yZWdpc3RlciB0aGUgZHJpdmVyIGZyb20gYSBwcml2YXRlIG5vZGUuCiYjNDM7ICoKJiM0MzsgKiBPbmx5IHN1Y2NlZWRzIGlmIGFsbCBtZW1vcnkgaGFzIGJlZW4gb2ZmbGluZWQgKE5fTUVNT1JZX1BSSVZBVEUgY2xlYXJlZCkuCiYjNDM7ICoKJiM0MzsgKiBOX01FTU9SWV9QUklWQVRFIHN0YXRlIGlzIGNsZWFyZWQgYnkgb2ZmbGluZV9wYWdlcygpIHdoZW4gdGhlIGxhc3QKJiM0MzsgKiBtZW1vcnkgaXMgb2ZmbGluZWQsIG5vdCBieSB0aGlzIGZ1bmN0aW9uLgomIzQzOyAqCiYjNDM7ICogQWZ0ZXIgdGhpcyByZXR1cm5zLCB0aGUgbm9kZV9wcml2YXRlIHBvaW50ZXIgaXMgbm8gbG9uZ2VyIHZpc2libGUgYW5kCiYjNDM7ICogYW4gUkNVIGdyYWNlIHBlcmlvZCBoYXMgZWxhcHNlZCwgc28gdGhlIGRyaXZlciBtYXkgZnJlZSBpdHMgY29udGV4dC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBpZiB1bnJlZ2lzdGVyZWQsIC1FQlVTWSBpZiBOX01FTU9SWV9QUklWQVRFIGlzIHN0aWxsIHNldC4KJiM0MzsgKi8KJiM0MztpbnQgbm9kZV9wcml2YXRlX3VucmVnaXN0ZXIoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBub2RlX3ByaXZhdGUgKm5wOwomIzQzOwlwZ19kYXRhX3QgKnBnZGF0OwomIzQzOwomIzQzOwlpZiAoIW5vZGVfcG9zc2libGUobmlkKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7bm9kZV9wcml2YXRlX2xvY2spOwomIzQzOwltZW1faG90cGx1Z19iZWdpbigpOwomIzQzOwomIzQzOwlwZ2RhdCA9IE5PREVfREFUQShuaWQpOwomIzQzOwlucCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocGdkYXQtJmd0O25vZGVfcHJpdmF0ZSwKJiM0MzsJCQkJICAgICAgIGxvY2tkZXBfaXNfaGVsZCgmYW1wO25vZGVfcHJpdmF0ZV9sb2NrKSk7CiYjNDM7CWlmICghbnApIHsKJiM0MzsJCW1lbV9ob3RwbHVnX2RvbmUoKTsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO25vZGVfcHJpdmF0ZV9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE9ubHkgdW5yZWdpc3RlciBpZiBOX01FTU9SWV9QUklWQVRFIGlzIGNsZWFyZWQgKG9ubHkgb2NjdXJzIHdoZW4KJiM0MzsJICogdGhlIGxhc3QgbWVtb3J5IGJsb2NrIGlzIG9mZmxpbmVkIGluIG9mZmxpbmVfcGFnZXMoKSkKJiM0MzsJICovCiYjNDM7CWlmIChub2RlX2lzX3ByaXZhdGUobmlkKSkgewomIzQzOwkJbWVtX2hvdHBsdWdfZG9uZSgpOwomIzQzOwkJbXV0ZXhfdW5sb2NrKCZhbXA7bm9kZV9wcml2YXRlX2xvY2spOwomIzQzOwkJcmV0dXJuIC1FQlVTWTsKJiM0MzsJfQomIzQzOwomIzQzOwlyY3VfYXNzaWduX3BvaW50ZXIocGdkYXQtJmd0O25vZGVfcHJpdmF0ZSwgTlVMTCk7CiYjNDM7CiYjNDM7CW1lbV9ob3RwbHVnX2RvbmUoKTsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7bm9kZV9wcml2YXRlX2xvY2spOwomIzQzOwomIzQzOwlzeW5jaHJvbml6ZV9yY3UoKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKTsKICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi8KIAogLyoqCkBAIC05NjYsNiAmIzQzOzEwODIsNyBAQCBzdGF0aWMgc3RydWN0IG5vZGVfYXR0ciBub2RlX3N0YXRlX2F0dHJbXSA9IHsKIAlbTl9ISUdIX01FTU9SWV0gPSBfTk9ERV9BVFRSKGhhc19oaWdoX21lbW9yeSwgTl9ISUdIX01FTU9SWSksCiAjZW5kaWYKIAlbTl9NRU1PUlldID0gX05PREVfQVRUUihoYXNfbWVtb3J5LCBOX01FTU9SWSksCiYjNDM7CVtOX01FTU9SWV9QUklWQVRFXSA9IF9OT0RFX0FUVFIoaGFzX3ByaXZhdGVfbWVtb3J5LCBOX01FTU9SWV9QUklWQVRFKSwKIAlbTl9DUFVdID0gX05PREVfQVRUUihoYXNfY3B1LCBOX0NQVSksCiAJW05fR0VORVJJQ19JTklUSUFUT1JdID0gX05PREVfQVRUUihoYXNfZ2VuZXJpY19pbml0aWF0b3IsCiAJCQkJCSAgIE5fR0VORVJJQ19JTklUSUFUT1IpLApAQCAtOTc5LDYgJiM0MzsxMDk2LDcgQEAgc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm5vZGVfc3RhdGVfYXR0cnNbXSA9IHsKIAkmYW1wO25vZGVfc3RhdGVfYXR0cltOX0hJR0hfTUVNT1JZXS5hdHRyLmF0dHIsCiAjZW5kaWYKIAkmYW1wO25vZGVfc3RhdGVfYXR0cltOX01FTU9SWV0uYXR0ci5hdHRyLAomIzQzOwkmYW1wO25vZGVfc3RhdGVfYXR0cltOX01FTU9SWV9QUklWQVRFXS5hdHRyLmF0dHIsCiAJJmFtcDtub2RlX3N0YXRlX2F0dHJbTl9DUFVdLmF0dHIuYXR0ciwKIAkmYW1wO25vZGVfc3RhdGVfYXR0cltOX0dFTkVSSUNfSU5JVElBVE9SXS5hdHRyLmF0dHIsCiAJTlVMTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kYXgva21lbS5jIGIvZHJpdmVycy9kYXgva21lbS5jCmluZGV4IGE0OGQ2OTljZjM0NGM5Li5jM2ZhZjE4ZTdmODVkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kYXgva21lbS5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvZGF4L2ttZW0uYwpAQCAtMTI2LDcgJiM0MzsxMjYsNyBAQCBzdGF0aWMgaW50IGRheF9rbWVtX2RvX2hvdHBsdWcoc3RydWN0IGRldl9kYXggKmRldl9kYXgsCiAJCSAqLwogCQlyYyA9IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChkYXRhLSZndDttZ2lkLCByYW5nZS5zdGFydCwKIAkJCQlyYW5nZV9sZW4oJmFtcDtyYW5nZSksIGttZW1fbmFtZSwgbWhwX2ZsYWdzLAotCQkJCW9ubGluZV90eXBlKTsKJiM0MzsJCQkJb25saW5lX3R5cGUsIE5VTEwpOwogCiAJCWlmIChyYykgewogCQkJZGV2X3dhcm4oZGV2LCAmIzM0O21hcHBpbmclZDogJSNsbHgtJSNsbHggbWVtb3J5IGFkZCBmYWlsZWRcbiYjMzQ7LApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9rY29yZS5jIGIvZnMvcHJvYy9rY29yZS5jCmluZGV4IDM5MDU0N2I5OTJhY2Q5Li5mNjcxOTRkYzJhOWI4NSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9rY29yZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3Byb2Mva2NvcmUuYwpAQCAtMjUxLDExICYjNDM7MjUxLDE0IEBAIHN0YXRpYyBpbnQga2NvcmVfcmFtX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIHsKIAlpbnQgbmlkLCByZXQ7CiAJdW5zaWduZWQgbG9uZyBlbmRfcGZuOwomIzQzOwlub2RlbWFza190IG1lbTsKIAogCS8qIE5vdCBpbml0aWFsaXplZC4uLi51cGRhdGUgbm93ICovCiAJLyogZmluZCBvdXQgJiMzNDttYXggcGZuJiMzNDsgKi8KIAllbmRfcGZuID0gMDsKLQlmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpIHsKJiM0MzsJLyogSW5jbHVkZSBwcml2YXRlIG5vZGUgbWVtb3J5IGluIHRoZSBzY2FuICovCiYjNDM7CW5vZGVzX29yKG1lbSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7CiYjNDM7CWZvcl9lYWNoX25vZGVfbWFzayhuaWQsIG1lbSkgewogCQl1bnNpZ25lZCBsb25nIG5vZGVfZW5kOwogCQlub2RlX2VuZCA9IG5vZGVfZW5kX3BmbihuaWQpOwogCQlpZiAoZW5kX3BmbiAmbHQ7IG5vZGVfZW5kKQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX21tdS5jIGIvZnMvcHJvYy90YXNrX21tdS5jCmluZGV4IDgxN2UzZTBmOTE5NDMwLi5lMTE2Y2Q1ZjE1N2I5YSAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX21tdS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtMzM4OSw3ICYjNDM7MzM4OSw4IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqY2FuX2dhdGhlcl9udW1hX3N0YXRzKHB0ZV90IHB0ZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXJldHVybiBOVUxMOwogCiAJbmlkID0gcGFnZV90b19uaWQocGFnZSk7Ci0JaWYgKCFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKSkKJiM0MzsJaWYgKCFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gcGFnZTsKQEAgLTM0MTQsNyAmIzQzOzM0MTUsOCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmNhbl9nYXRoZXJfbnVtYV9zdGF0c19wbWQocG1kX3QgcG1kLAogCQlyZXR1cm4gTlVMTDsKIAogCW5pZCA9IHBhZ2VfdG9fbmlkKHBhZ2UpOwotCWlmICghbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSkpCiYjNDM7CWlmICghbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSkgJmFtcDsmYW1wOwomIzQzOwkgICAgIW5vZGVfaXNzZXQobmlkLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSkpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHBhZ2U7CkBAIC0zNjAyLDYgJiM0MzszNjA0LDEwIEBAIHN0YXRpYyBpbnQgc2hvd19udW1hX21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiAJCWlmIChtZC0mZ3Q7bm9kZVtuaWRdKQogCQkJc2VxX3ByaW50ZihtLCAmIzM0OyBOJWQ9JWx1JiMzNDssIG5pZCwgbWQtJmd0O25vZGVbbmlkXSk7CiAKJiM0MzsJZm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpCiYjNDM7CQlpZiAobWQtJmd0O25vZGVbbmlkXSkKJiM0MzsJCQlzZXFfcHJpbnRmKG0sICYjMzQ7IE4lZD0lbHUmIzM0OywgbmlkLCBtZC0mZ3Q7bm9kZVtuaWRdKTsKJiM0MzsKIAlzZXFfcHJpbnRmKG0sICYjMzQ7IGtlcm5lbHBhZ2VzaXplX2tCPSVsdSYjMzQ7LCB2bWFfa2VybmVsX3BhZ2VzaXplKHZtYSkgJmd0OyZndDsgMTApOwogb3V0OgogCXNlcV9wdXRjKG0sICYjMzk7XG4mIzM5Oyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCA4NzJiYzUzZjMyZWM4Ny4uZjNlODY3ZGU3NDRmNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9nZnAuaApAQCAtMjA0LDkgJiM0MzsyMDQsMTYgQEAgc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZnJlZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3JkZXIpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfYWxsb2NfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKSB7IH0KICNlbmRpZgogCi1zdHJ1Y3QgZm9saW8gKl9fZm9saW9fYWxsb2Nfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLCBpbnQgcHJlZmVycmVkX25pZCwKLQkJbm9kZW1hc2tfdCAqbm9kZW1hc2spOwotI2RlZmluZSBfX2ZvbGlvX2FsbG9jKC4uLikJCQlhbGxvY19ob29rcyhfX2ZvbGlvX2FsbG9jX25vcHJvZihfX1ZBX0FSR1NfXykpCiYjNDM7LyogQWxsb2NhdGUgZnJvbSBhbiBOX01FTU9SWV9QUklWQVRFIG5vZGUgKHNlbGVjdHMgdGhlIHByaXZhdGUgem9uZWxpc3QpLiAqLwomIzQzO3N0cnVjdCBwYWdlICphbGxvY19wYWdlc19ub2RlX3ByaXZhdGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLAomIzQzOwkJaW50IG5pZCk7CiYjNDM7I2RlZmluZSBhbGxvY19wYWdlc19ub2RlX3ByaXZhdGUoLi4uKQkJCQlcCiYjNDM7CWFsbG9jX2hvb2tzKGFsbG9jX3BhZ2VzX25vZGVfcHJpdmF0ZV9ub3Byb2YoX19WQV9BUkdTX18pKQomIzQzOwomIzQzO3N0cnVjdCBmb2xpbyAqZm9saW9fYWxsb2Nfbm9kZV9wcml2YXRlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwKJiM0MzsJCWludCBuaWQpOwomIzQzOyNkZWZpbmUgZm9saW9fYWxsb2Nfbm9kZV9wcml2YXRlKC4uLikJCQkJXAomIzQzOwlhbGxvY19ob29rcyhmb2xpb19hbGxvY19ub2RlX3ByaXZhdGVfbm9wcm9mKF9fVkFfQVJHU19fKSkKIAogdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLAogCQkJCW5vZGVtYXNrX3QgKm5vZGVtYXNrLCBpbnQgbnJfcGFnZXMsCkBAIC0yNTIsMTQgJiM0MzsyNTksNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgd2Fybl9pZl9ub2RlX29mZmxpbmUoaW50IHRoaXNfbm9kZSwgZ2ZwX3QgZ2ZwX21hc2spCiAJZHVtcF9zdGFjaygpOwogfQogCi1zdGF0aWMgaW5saW5lCi1zdHJ1Y3QgZm9saW8gKl9fZm9saW9fYWxsb2Nfbm9kZV9ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBuaWQpCi17Ci0Jd2Fybl9pZl9ub2RlX29mZmxpbmUobmlkLCBnZnApOwotCi0JcmV0dXJuIF9fZm9saW9fYWxsb2Nfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgTlVMTCk7Ci19Ci0KJiM0MztzdHJ1Y3QgZm9saW8gKl9fZm9saW9fYWxsb2Nfbm9kZV9ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBuaWQpOwogI2RlZmluZSAgX19mb2xpb19hbGxvY19ub2RlKC4uLikJCWFsbG9jX2hvb2tzKF9fZm9saW9fYWxsb2Nfbm9kZV9ub3Byb2YoX19WQV9BUkdTX18pKQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCmluZGV4IGFiOGNmYWVjODJkMzFlLi5mNjQ0OGE3M2Q0NjRjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaApAQCAtNzM5LDYgJiM0Mzs3MzksOSBAQCBzdGF0aWMgaW5saW5lIHU2NCBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSkKIAlpZiAoIWt2bSB8fCBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKGt2bSkpCiAJCWZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQ7CiAKJiM0MzsJaWYgKElTX0VOQUJMRUQoQ09ORklHX05VTUEpKQomIzQzOwkJZmxhZ3MgfD0gR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREU7CiYjNDM7CiAJcmV0dXJuIGZsYWdzOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmggYi9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgKaW5kZXggYjM5NjA1ZDMwODk2MzIuLmZjY2ViMGE0MjM1NzliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oCkBAIC0zMDUsNyAmIzQzOzMwNSwxMCBAQCBleHRlcm4gaW50IGFkZF9tZW1vcnlfcmVzb3VyY2UoaW50IG5pZCwgc3RydWN0IHJlc291cmNlICpyZXNvdXJjZSwKIAkJCSAgICAgICBtaHBfdCBtaHBfZmxhZ3MpOwogaW50IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLAogCQkJCWNvbnN0IGNoYXIgKnJlc291cmNlX25hbWUsIG1ocF90IG1ocF9mbGFncywKLQkJCQllbnVtIG1tb3Agb25saW5lX3R5cGUpOwomIzQzOwkJCQllbnVtIG1tb3Agb25saW5lX3R5cGUsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKTsKJiM0MztpbnQgYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsCiYjNDM7CQkJCSAgICAgIGNvbnN0IGNoYXIgKnJlc291cmNlX25hbWUsIG1ocF90IG1ocF9mbGFncywKJiM0MzsJCQkJICAgICAgZW51bSBtbW9wIG9ubGluZV90eXBlLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucCk7CiBleHRlcm4gaW50IGFkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSwKIAkJCQkgICAgIGNvbnN0IGNoYXIgKnJlc291cmNlX25hbWUsCiAJCQkJICAgICBtaHBfdCBtaHBfZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKaW5kZXggNjVjNzMyZDQ0MGQyZjQuLjEzNDhlOWY1ZjJjZjkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKQEAgLTcsNiAmIzQzOzcsNyBAQAogI2RlZmluZSBfTElOVVhfTUVNUE9MSUNZX0ggMQogCiAjaW5jbHVkZSAmbHQ7bGludXgvc2NoZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZXJyLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW16b25lLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3JidHJlZS5oJmd0OwpAQCAtMTI0LDEwICYjNDM7MTI1LDE1IEBAIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpOwogdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpOwogaW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLAogCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpOwomIzQzO2ludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCwKJiM0MzsJCQkJIHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTsKIHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKTsKIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLAogCQkJCQkgICAgcGdvZmZfdCBpZHgpOwogCiYjNDM7c3RydWN0IG1lbXBvbGljeSAqbXBvbF9wcml2YXRlX2JpbmQoaW50IG5pZCk7CiYjNDM7c3RydWN0IG1lbXBvbGljeSAqbXBvbF9iaW5kX25vZGUoaW50IG5pZCk7CiYjNDM7CiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIHN0cnVjdCBtZW1wb2xpY3kgKl9fZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXVuc2lnbmVkIGxvbmcgYWRkciwgcGdvZmZfdCAqaWx4KTsKQEAgLTIyNiw2ICYjNDM7MjMyLDE2IEBAIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IGlkeCkKIAlyZXR1cm4gTlVMTDsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IG1lbXBvbGljeSAqbXBvbF9wcml2YXRlX2JpbmQoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sX2JpbmRfbm9kZShpbnQgbmlkKQomIzQzO3sKJiM0MzsJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1lbXBvbGljeSAqZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgb3JkZXIsIHBnb2ZmX3QgKmlseCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IDRjMGRlNzg4MmJiYjY0Li5mMzkzNTcyZDc0MDFkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC0yNiw2ICYjNDM7MjYsOCBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L3NpemVzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YXNtL3BhZ2UuaCZndDsKIAomIzQzO3N0cnVjdCBub2RlX3ByaXZhdGU7CiYjNDM7CiAvKiBGcmVlIG1lbW9yeSBtYW5hZ2VtZW50IC0gem9uZWQgYnVkZHkgYWxsb2NhdG9yLiAgKi8KICNpZm5kZWYgQ09ORklHX0FSQ0hfRk9SQ0VfTUFYX09SREVSCiAjZGVmaW5lIE1BWF9QQUdFX09SREVSIDEwCkBAIC0xMzkxLDEzICYjNDM7MTM5MywyMiBAQCBlbnVtIHsKICNpZmRlZiBDT05GSUdfTlVNQQogCS8qCiAJICogVGhlIE5VTUEgem9uZWxpc3RzIGFyZSBkb3VibGVkIGJlY2F1c2Ugd2UgbmVlZCB6b25lbGlzdHMgdGhhdAotCSAqIHJlc3RyaWN0IHRoZSBhbGxvY2F0aW9ucyB0byBhIHNpbmdsZSBub2RlIGZvciBfX0dGUF9USElTTk9ERS4KJiM0MzsJICogcmVzdHJpY3QgdGhlIGFsbG9jYXRpb25zIHRvIGEgc2luZ2xlIG5vZGUgZm9yIF9fR0ZQX1RISVNOT0RFCiYjNDM7CSAqIGFuZCBOX01FTU9SWV9QUklWQVRFIG5vZGVzIChpc29sYXRlZCBmcm9tIGRlZmF1bHQgbGlzdHMpLgogCSAqLwogCVpPTkVMSVNUX05PRkFMTEJBQ0ssCS8qIHpvbmVsaXN0IHdpdGhvdXQgZmFsbGJhY2sgKF9fR0ZQX1RISVNOT0RFKSAqLwomIzQzOwlaT05FTElTVF9QUklWQVRFLAkvKiBOX01FTU9SWV9QUklWQVRFIGFjY2VzcywgZmFsbHMgYmFjayB0byBEUkFNICovCiYjNDM7CVpPTkVMSVNUX1BSSVZBVEVfTk9GQUxMQkFDSywgLyogTl9NRU1PUllfUFJJVkFURSBhY2Nlc3MsIF9fR0ZQX1RISVNOT0RFICovCiAjZW5kaWYKIAlNQVhfWk9ORUxJU1RTCiB9OwogCiYjNDM7I2lmbmRlZiBDT05GSUdfTlVNQQomIzQzOy8qIFdpdGhvdXQgTlVNQSBvbmx5IFpPTkVMSVNUX0ZBTExCQUNLIGV4aXN0cyBzbyBldmVyeXRoaW5nIGNvbGxhcHNlcyB0aGVyZSAqLwomIzQzOyNkZWZpbmUgWk9ORUxJU1RfUFJJVkFURQkJWk9ORUxJU1RfRkFMTEJBQ0sKJiM0MzsjZGVmaW5lIFpPTkVMSVNUX1BSSVZBVEVfTk9GQUxMQkFDSwlaT05FTElTVF9GQUxMQkFDSwomIzQzOyNlbmRpZgomIzQzOwogLyoKICAqIFRoaXMgc3RydWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgem9uZSBpbiBhIHpvbmVsaXN0LiBJdCBpcyBzdG9yZWQKICAqIGhlcmUgdG8gYXZvaWQgZGVyZWZlcmVuY2VzIGludG8gbGFyZ2Ugc3RydWN0dXJlcyBhbmQgbG9va3VwcyBvZiB0YWJsZXMKQEAgLTE1OTcsMTIgJiM0MzsxNjA4LDI1IEBAIHR5cGVkZWYgc3RydWN0IHBnbGlzdF9kYXRhIHsKIAlhdG9taWNfbG9uZ190CQl2bV9zdGF0W05SX1ZNX05PREVfU1RBVF9JVEVNU107CiAjaWZkZWYgQ09ORklHX05VTUEKIAlzdHJ1Y3QgbWVtb3J5X3RpZXIgX19yY3UgKm1lbXRpZXI7CiYjNDM7CXN0cnVjdCBub2RlX3ByaXZhdGUgX19yY3UgKm5vZGVfcHJpdmF0ZTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19NRU1PUllfRkFJTFVSRQogCXN0cnVjdCBtZW1vcnlfZmFpbHVyZV9zdGF0cyBtZl9zdGF0czsKICNlbmRpZgogfSBwZ19kYXRhX3Q7CiAKJiM0MzsjaWZkZWYgQ09ORklHX05VTUEKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGdkYXRfaXNfcHJpdmF0ZShwZ19kYXRhX3QgKnBnZGF0KQomIzQzO3sKJiM0MzsJcmV0dXJuICEhcGdkYXQtJmd0O25vZGVfcHJpdmF0ZTsKJiM0Mzt9CiYjNDM7I2Vsc2UKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGdkYXRfaXNfcHJpdmF0ZShwZ19kYXRhX3QgKnBnZGF0KQomIzQzO3sKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsjZW5kaWYKJiM0MzsKICNkZWZpbmUgbm9kZV9wcmVzZW50X3BhZ2VzKG5pZCkJKE5PREVfREFUQShuaWQpLSZndDtub2RlX3ByZXNlbnRfcGFnZXMpCiAjZGVmaW5lIG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpCShOT0RFX0RBVEEobmlkKS0mZ3Q7bm9kZV9zcGFubmVkX3BhZ2VzKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oIGIvaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNmY1NjhiYzBkNDZjNzkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oCkBAIC0wLDAgJiM0MzsxLDI2MiBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCiYjNDM7I2lmbmRlZiBfTElOVVhfTk9ERV9QUklWQVRFX0gKJiM0MzsjZGVmaW5lIF9MSU5VWF9OT0RFX1BSSVZBVEVfSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tbS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ub2RlbWFzay5oJmd0OwomIzQzOwomIzQzO3N0cnVjdCBwYWdlOwomIzQzOwomIzQzOy8qCiYjNDM7ICogUGVyLW5vZGUgc2VydmljZSBvcHQtaW5zIChub2RlX3ByaXZhdGUuY2FwcykuICBBIHByaXZhdGUgbm9kZSBpcyBpc29sYXRlZAomIzQzOyAqIGZyb20gYWxsIGdlbmVyYWwgbW0gc2VydmljZXMgYnkgZGVmYXVsdDsgdGhlIHJlZ2lzdGVyaW5nIGRyaXZlciBzZXRzIHRoZXNlCiYjNDM7ICogdG8gbGV0IHNwZWNpZmljIHNlcnZpY2VzIG9wZXJhdGUgb24gaXRzIG5vZGUuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX1JFQ0xBSU0JKDFVTCAmbHQ7Jmx0OyAwKQkvKiBhbGxvdyBtbSByZWNsYWltICovCiYjNDM7I2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX1VTRVJfTlVNQQkoMVVMICZsdDsmbHQ7IDEpCS8qIGFsbG93IG1lbXBvbGljeSAqLwomIzQzOyNkZWZpbmUgTk9ERV9QUklWQVRFX0NBUF9IT1RVTlBMVUcJKDFVTCAmbHQ7Jmx0OyAyKQkvKiBhbGxvdyBob3QtdW5wbHVnICovCiYjNDM7I2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX0RFTU9USU9OCSgxVUwgJmx0OyZsdDsgMykJLyogYWxsb3cgdGllcmluZyBkZW1vdGlvbiAqLwomIzQzOyNkZWZpbmUgTk9ERV9QUklWQVRFX0NBUF9OVU1BX0JBTEFOQ0lORwkoMVVMICZsdDsmbHQ7IDQpCS8qIGFsbG93IE5VTUEgYmFsYW5jaW5nICovCiYjNDM7I2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX0xUUElOCQkoMVVMICZsdDsmbHQ7IDUpCS8qIGFsbG93IEdVUCBwaW5zICovCiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogc3RydWN0IG5vZGVfcHJpdmF0ZSAtIFBlci1ub2RlIGNvbnRhaW5lciBmb3IgTl9NRU1PUllfUFJJVkFURSBub2RlcwomIzQzOyAqCiYjNDM7ICogQWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIgYW5kIHBhc3NlZCB0byBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoKS4KJiM0MzsgKiBUaGUgZHJpdmVyIG93bnMgdGhlIG1lbW9yeSBhbmQgbXVzdCBlbnN1cmUgaXQgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlcgomIzQzOyAqIG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKCkgcmV0dXJucy4KJiM0MzsgKgomIzQzOyAqIEBvd25lcjogT3BhcXVlIGRyaXZlciBpZGVudGlmaWVyCiYjNDM7ICogQGNhcHM6IE5PREVfUFJJVkFURV9DQVBfKiBzZXJ2aWNlIG9wdC1pbnMgZm9yIHRoZSBub2RlICh6ZXJvIGJ5IGRlZmF1bHQ7CiYjNDM7ICoJICBpbmRpdmlkdWFsIGNhcGFiaWxpdGllcyBhcmUgZGVmaW5lZCBhbmQgY29uc3VtZWQgYnkgbGF0ZXIgY2hhbmdlcykKJiM0MzsgKi8KJiM0MztzdHJ1Y3Qgbm9kZV9wcml2YXRlIHsKJiM0MzsJdm9pZCAqb3duZXI7CiYjNDM7CXVuc2lnbmVkIGxvbmcgY2FwczsKJiM0Mzt9OwomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfTlVNQQomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tbXpvbmUuaCZndDsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9faXNfcHJpdmF0ZV9ub2RlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7ewomIzQzOwlyZXR1cm4gbm9kZV9zdGF0ZShmb2xpb19uaWQoZm9saW8pLCBOX01FTU9SWV9QUklWQVRFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIHBhZ2VfaXNfcHJpdmF0ZV9ub2RlKHN0cnVjdCBwYWdlICpwYWdlKQomIzQzO3sKJiM0MzsJcmV0dXJuIG5vZGVfc3RhdGUocGFnZV90b19uaWQocGFnZSksIE5fTUVNT1JZX1BSSVZBVEUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9pc19wcml2YXRlKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBub2RlX2FsbG93c19yZWNsYWltIC0gbWF5IHRoZSBtbSByZWNsYWltIGZyb20gdGhpcyBub2RlPwomIzQzOyAqIEBuaWQ6IHRoZSBub2RlIHRvIHRlc3QKJiM0MzsgKgomIzQzOyAqIE9ubHkgYSBwcml2YXRlIG5vZGUgaXMgZXZlciBleGNsdWRlZC4gIEV2ZXJ5IG90aGVyIG5vZGUgY2FuIHNhZmVseQomIzQzOyAqIGJlIG9wZXJhdGVkIG9uIGJ5IHJlY2xhaW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX3JlY2xhaW0oaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBub2RlX3ByaXZhdGUgKm5wOwomIzQzOwlib29sIHJldDsKJiM0MzsKJiM0MzsJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwlucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS0mZ3Q7bm9kZV9wcml2YXRlKTsKJiM0MzsJcmV0ID0gbnAgJmFtcDsmYW1wOyAobnAtJmd0O2NhcHMgJmFtcDsgTk9ERV9QUklWQVRFX0NBUF9SRUNMQUlNKTsKJiM0MzsJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIG5vZGVfYWxsb3dzX3VzZXJfbnVtYSAtIG1heSB1c2Vyc3BhY2UgcGxhY2Ugb3IgbWlncmF0ZSBtZW1vcnkgaGVyZT8KJiM0MzsgKiBAbmlkOiB0aGUgbm9kZSB0byB0ZXN0CiYjNDM7ICoKJiM0MzsgKiBHYXRlIGFsbCB1c2Vyc3BhY2UtZGlyZWN0ZWQgbWVtb3J5IG9wZXJhdGlvbnMgb24gYSBwcml2YXRlIG5vZGUuCiYjNDM7ICogICAtIG1iaW5kKCkvc2V0X21lbXBvbGljeSgpCiYjNDM7ICogICAtIG1vdmVfcGFnZXMoKS9taWdyYXRlX3BhZ2VzKCkKJiM0MzsgKgomIzQzOyAqIHJldHVybjogdHJ1ZSBmb3IgTl9NRU1PUlkgYW5kIE5fTUVNT1JZX1BSSVZBVEUgd2l0aCBDQVBfVVNFUl9OVU1BLgomIzQzOyAqICAgICAgICAgZmFsc2UgZm9yIG1lbW9yeWxlc3Mgb3Igb3B0ZWQtb3V0IHByaXZhdGUgbm9kZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfdXNlcl9udW1hKGludCBuaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDsKJiM0MzsJYm9vbCByZXQ7CiYjNDM7CiYjNDM7CWlmIChub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CWlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW5wID0gcmN1X2RlcmVmZXJlbmNlKE5PREVfREFUQShuaWQpLSZndDtub2RlX3ByaXZhdGUpOwomIzQzOwlyZXQgPSBucCAmYW1wOyZhbXA7IChucC0mZ3Q7Y2FwcyAmYW1wOyBOT0RFX1BSSVZBVEVfQ0FQX1VTRVJfTlVNQSk7CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBub2RlX2FsbG93c19ob3R1bnBsdWcgLSBtYXkgaG90LXVucGx1ZyBtaWdyYXRlIHRoaXMgbm9kZSYjMzk7cyBmb2xpb3M/CiYjNDM7ICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdAomIzQzOyAqCiYjNDM7ICogVHJ1ZSBmb3Igbm9ybWFsIG5vZGVzIGFuZCBwcml2YXRlIG5vZGVzIG9wdGVkIGludG8gQ0FQX0hPVFVOUExVRy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfaG90dW5wbHVnKGludCBuaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDsKJiM0MzsJYm9vbCByZXQ7CiYjNDM7CiYjNDM7CWlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJbnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktJmd0O25vZGVfcHJpdmF0ZSk7CiYjNDM7CXJldCA9IG5wICZhbXA7JmFtcDsgKG5wLSZndDtjYXBzICZhbXA7IE5PREVfUFJJVkFURV9DQVBfSE9UVU5QTFVHKTsKJiM0MzsJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIG5vZGVfYWxsb3dzX2RlbW90aW9uIC0gbWF5IGtlcm5lbCB0aWVyaW5nIGRlbW90ZSB0byB0aGlzIG5vZGU/CiYjNDM7ICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdAomIzQzOyAqCiYjNDM7ICogR292ZXJucyB3aGV0aGVyIGEgcHJpdmF0ZSBub2RlIHBhcnRpY2lwYXRlcyBpbiB0aGUgZGVtb3Rpb24gaGllcmFyY2h5LgomIzQzOyAqIERlbW90aW9uIGFjY3VtdWxhdGVzIHBhZ2VzIG9uIHRoZSBub2RlLCBzbyBDQVBfREVNT1RJT04gcmVxdWlyZXMgQ0FQX1JFQ0xBSU0KJiM0MzsgKiAoZW5mb3JjZWQgYXQgcmVnaXN0cmF0aW9uKSBhcyBhIHNhZmV0eSB2YWx2ZS4KJiM0MzsgKgomIzQzOyAqIHJldHVybjogdHJ1ZSBmb3Igbm9ybWFsIG5vZGVzIGFuZCBwcml2YXRlIG5vZGVzIG9wdGVkIGludG8gQ0FQX0RFTU9USU9OLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19kZW1vdGlvbihpbnQgbmlkKQomIzQzO3sKJiM0MzsJc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnA7CiYjNDM7CWJvb2wgcmV0OwomIzQzOwomIzQzOwlpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW5wID0gcmN1X2RlcmVmZXJlbmNlKE5PREVfREFUQShuaWQpLSZndDtub2RlX3ByaXZhdGUpOwomIzQzOwlyZXQgPSBucCAmYW1wOyZhbXA7IChucC0mZ3Q7Y2FwcyAmYW1wOyBOT0RFX1BSSVZBVEVfQ0FQX0RFTU9USU9OKTsKJiM0MzsJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIG5vZGVfYWxsb3dzX251bWFfYmFsYW5jaW5nIC0gbWF5IE5VTUEgYmFsYW5jaW5nIHNjYW4vbWlncmF0ZSB0aGlzIG5vZGU/CiYjNDM7ICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdAomIzQzOyAqCiYjNDM7ICogQWNjZXNzLWJhc2VkIHByb21vdGlvbi9taWdyYXRpb24uICBVbmxpa2UgZGVtb3Rpb24gdGhpcyBpcyBub3QgcmVjbGFpbS1kcml2ZW4sCiYjNDM7ICogc28gQ0FQX05VTUFfQkFMQU5DSU5HIHN0YW5kcyBhbG9uZSAobm8gQ0FQX1JFQ0xBSU0gZGVwZW5kZW5jeSkuCiYjNDM7ICoKJiM0MzsgKiByZXR1cm46IHRydWUgZm9yIG5vcm1hbCBub2RlcyBhbmQgcHJpdmF0ZSBub2RlcyBvcHRlZCBpbnRvIENBUF9OVU1BX0JBTEFOQ0lORy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfbnVtYV9iYWxhbmNpbmcoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBub2RlX3ByaXZhdGUgKm5wOwomIzQzOwlib29sIHJldDsKJiM0MzsKJiM0MzsJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwlucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS0mZ3Q7bm9kZV9wcml2YXRlKTsKJiM0MzsJcmV0ID0gbnAgJmFtcDsmYW1wOyAobnAtJmd0O2NhcHMgJmFtcDsgTk9ERV9QUklWQVRFX0NBUF9OVU1BX0JBTEFOQ0lORyk7CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBub2RlX2FsbG93c19sdHBpbiAtIG1heSBhIGZvbGlvIG9uIHRoaXMgbm9kZSBiZSBsb25nLXRlcm0gR1VQLXBpbm5lZD8KJiM0MzsgKiBAbmlkOiB0aGUgbm9kZSB0byB0ZXN0CiYjNDM7ICoKJiM0MzsgKiBPcHRlZC1vdXQgcHJpdmF0ZSBub2RlcyBjYXVzZSBsb25ndGVybSBwaW5zIHRvIG91dHJpZ2h0IGZhaWwgcmVnYXJkbGVzcwomIzQzOyAqIG9mIFpPTkUgcGxhY2VtZW50IChOT1JNQUwgd291bGQgYWxsb3csIE1PVkFCTEUgd291bGQgbWlncmF0ZSBmaXJzdCkuCiYjNDM7ICoKJiM0MzsgKiBPcHRlZC1pbiBwcml2YXRlIG5vZGVzIGFsbG93IGxvbmd0ZXJtIHBpbnMgdG8gb3BlcmF0ZSBub3JtYWxseS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfbHRwaW4oaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBub2RlX3ByaXZhdGUgKm5wOwomIzQzOwlib29sIHJldDsKJiM0MzsKJiM0MzsJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwlucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS0mZ3Q7bm9kZV9wcml2YXRlKTsKJiM0MzsJcmV0ID0gbnAgJmFtcDsmYW1wOyAobnAtJmd0O2NhcHMgJmFtcDsgTk9ERV9QUklWQVRFX0NBUF9MVFBJTik7CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsjZWxzZSAvKiAhQ09ORklHX05VTUEgKi8KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9faXNfcHJpdmF0ZV9ub2RlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7ewomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2lzX3ByaXZhdGVfbm9kZShzdHJ1Y3QgcGFnZSAqcGFnZSkKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfaXNfcHJpdmF0ZShpbnQgbmlkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfcmVjbGFpbShpbnQgbmlkKQomIzQzO3sKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c191c2VyX251bWEoaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfaG90dW5wbHVnKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2RlbW90aW9uKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX251bWFfYmFsYW5jaW5nKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2x0cGluKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2VuZGlmIC8qIENPTkZJR19OVU1BICovCiYjNDM7CiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX05VTUEpICZhbXA7JmFtcDsgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpCiYjNDM7CiYjNDM7aW50IG5vZGVfcHJpdmF0ZV9yZWdpc3RlcihpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucCk7CiYjNDM7aW50IG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKGludCBuaWQpOwomIzQzOwomIzQzOyNlbHNlIC8qICFDT05GSUdfTlVNQSB8fCAhQ09ORklHX01FTU9SWV9IT1RQTFVHICovCiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgbm9kZV9wcml2YXRlX3JlZ2lzdGVyKGludCBuaWQsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKQomIzQzO3sKJiM0MzsJcmV0dXJuIC1FTk9ERVY7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7I2VuZGlmIC8qIENPTkZJR19OVU1BICZhbXA7JmFtcDsgQ09ORklHX01FTU9SWV9IT1RQTFVHICovCiYjNDM7CiYjNDM7I2VuZGlmIC8qIF9MSU5VWF9OT0RFX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ub2RlbWFzay5oIGIvaW5jbHVkZS9saW51eC9ub2RlbWFzay5oCmluZGV4IGI4NDJhYTUyNTU0NjQ0Li5iYTNlNmM1NzBhMTEyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ub2RlbWFzay5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvbm9kZW1hc2suaApAQCAtMzkxLDYgJiM0MzszOTEsNyBAQCBlbnVtIG5vZGVfc3RhdGVzIHsKIAlOX0hJR0hfTUVNT1JZID0gTl9OT1JNQUxfTUVNT1JZLAogI2VuZGlmCiAJTl9NRU1PUlksCQkvKiBUaGUgbm9kZSBoYXMgbWVtb3J5KHJlZ3VsYXIsIGhpZ2gsIG1vdmFibGUpICovCiYjNDM7CU5fTUVNT1JZX1BSSVZBVEUsCS8qIFRoZSBub2RlJiMzOTtzIG1lbW9yeSBpcyBwcml2YXRlICovCiAJTl9DUFUsCQkvKiBUaGUgbm9kZSBoYXMgb25lIG9yIG1vcmUgY3B1cyAqLwogCU5fR0VORVJJQ19JTklUSUFUT1IsCS8qIFRoZSBub2RlIGhhcyBvbmUgb3IgbW9yZSBHZW5lcmljIEluaXRpYXRvcnMgKi8KIAlOUl9OT0RFX1NUQVRFUwpAQCAtNDU3LDcgJiM0Mzs0NTgsNyBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgbm9kZV9zZXRfb2ZmbGluZShpbnQgbmlkKQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBub2RlX3N0YXRlKGludCBub2RlLCBlbnVtIG5vZGVfc3RhdGVzIHN0YXRlKQogewotCXJldHVybiBub2RlID09IDA7CiYjNDM7CXJldHVybiBub2RlID09IDAgJmFtcDsmYW1wOyBzdGF0ZSAhPSBOX01FTU9SWV9QUklWQVRFOwogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgbm9kZV9zZXRfc3RhdGUoaW50IG5vZGUsIGVudW0gbm9kZV9zdGF0ZXMgc3RhdGUpCkBAIC00NzAsMTEgJiM0Mzs0NzEsMTEgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIG5vZGVfY2xlYXJfc3RhdGUoaW50IG5vZGUsIGVudW0gbm9kZV9zdGF0ZXMgc3RhdGUpCiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IG51bV9ub2RlX3N0YXRlKGVudW0gbm9kZV9zdGF0ZXMgc3RhdGUpCiB7Ci0JcmV0dXJuIDE7CiYjNDM7CXJldHVybiBzdGF0ZSA9PSBOX01FTU9SWV9QUklWQVRFID8gMCA6IDE7CiB9CiAKICNkZWZpbmUgZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBfX3N0YXRlKSBcCi0JZm9yICggKG5vZGUpID0gMDsgKG5vZGUpID09IDA7IChub2RlKSA9IDEpCiYjNDM7CWZvciAoKG5vZGUpID0gMDsgKG5vZGUpID09IDAgJmFtcDsmYW1wOyAoX19zdGF0ZSkgIT0gTl9NRU1PUllfUFJJVkFURTsgKG5vZGUpID0gMSkKIAogI2RlZmluZSBmaXJzdF9vbmxpbmVfbm9kZQkwCiAjZGVmaW5lIGZpcnN0X21lbW9yeV9ub2RlCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaCBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaAppbmRleCA0MTkwMTEwOTdmYThlMi4uYThmZjE1MGUyY2JiNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgKQEAgLTE2NTQsMTEgJiM0MzsxNjU0LDE0IEBAIHN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMgewogI2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZECV9JT1dSKEtWTUlPLCAgMHhkNCwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQpCiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUAkJKDFVTEwgJmx0OyZsdDsgMCkKICNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRAkoMVVMTCAmbHQ7Jmx0OyAxKQomIzQzOyNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUJKDFVTEwgJmx0OyZsdDsgMikKIAogc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgewogCV9fdTY0IHNpemU7CiAJX191NjQgZmxhZ3M7Ci0JX191NjQgcmVzZXJ2ZWRbNl07CiYjNDM7CV9fdTMyIG5vZGU7CiYjNDM7CV9fdTMyIHBhZDsKJiM0MzsJX191NjQgcmVzZXJ2ZWRbNV07CiB9OwogCiAjZGVmaW5lIEtWTV9QUkVfRkFVTFRfTUVNT1JZCV9JT1dSKEtWTUlPLCAweGQ1LCBzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL3VhcGkvbGludXgvbWVtcG9saWN5LmgKaW5kZXggN2Y2ZmM5NTk5NjkzYjYuLjg3YWYxOGM4NGI5NDc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbWVtcG9saWN5LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L21lbXBvbGljeS5oCkBAIC02Nyw2ICYjNDM7NjcsNyBAQCBlbnVtIG1lbXBvbGljeV9tb2RlIHsKICNkZWZpbmUgTVBPTF9GX1NIQVJFRCAgKDEgJmx0OyZsdDsgMCkJLyogaWRlbnRpZnkgc2hhcmVkIHBvbGljaWVzICovCiAjZGVmaW5lIE1QT0xfRl9NT0YJKDEgJmx0OyZsdDsgMykgLyogdGhpcyBwb2xpY3kgd2FudHMgbWlncmF0ZSBvbiBmYXVsdCAqLwogI2RlZmluZSBNUE9MX0ZfTU9ST04JKDEgJmx0OyZsdDsgNCkgLyogTWlncmF0ZSBPbiBwcm90bm9uZSBSZWZlcmVuY2UgT24gTm9kZSAqLwomIzQzOyNkZWZpbmUgTVBPTF9GX1BSSVZBVEUJKDEgJmx0OyZsdDsgNSkgLyogbm9kZW1hc2sgY29udGFpbnMgcHJpdmF0ZSBub2RlcyAqLwogCiAvKgogICogRW5hYmxpbmcgem9uZSByZWNsYWltIG1lYW5zIHRoZSBwYWdlIGFsbG9jYXRvciB3aWxsIGF0dGVtcHQgdG8gZnVsZmlsbApkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC9jcHVzZXQuYyBiL2tlcm5lbC9jZ3JvdXAvY3B1c2V0LmMKaW5kZXggZWU0MDI1Yjk3MDdhMjIuLjc4YTRmOTQ4NTY1NjBkIDEwMDY0NAotLS0gYS9rZXJuZWwvY2dyb3VwL2NwdXNldC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9jZ3JvdXAvY3B1c2V0LmMKQEAgLTI2LDYgJiM0MzsyNiw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtcG9saWN5LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tZW1vcnkuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbm9kZV9wcml2YXRlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcmN1cGRhdGUuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL2RlYWRsaW5lLmgmZ3Q7CkBAIC0zODcyLDcgJiM0MzszODczLDggQEAgc3RhdGljIHZvaWQgY3B1c2V0X2hhbmRsZV9ob3RwbHVnKHZvaWQpCiAJc3RhdGljIERFQ0xBUkVfV09SSyhoa19zZF93b3JrLCBoa19zZF93b3JrZm4pOwogCXN0YXRpYyBjcHVtYXNrX3QgbmV3X2NwdXM7CiAJc3RhdGljIG5vZGVtYXNrX3QgbmV3X21lbXM7Ci0JYm9vbCBjcHVzX3VwZGF0ZWQsIG1lbXNfdXBkYXRlZDsKJiM0MzsJc3RhdGljIG5vZGVtYXNrX3QgcHJldl9wcml2X21lbXM7CiYjNDM7CWJvb2wgY3B1c191cGRhdGVkLCBtZW1zX3VwZGF0ZWQsIHByaXZfc2hyYW5rOwogCWJvb2wgb25fZGZsID0gaXNfaW5fdjJfbW9kZSgpOwogCXN0cnVjdCB0bXBtYXNrcyB0bXAsICpwdG1wID0gTlVMTDsKIApAQCAtMzg5NSw2ICYjNDM7Mzg5NywxNCBAQCBzdGF0aWMgdm9pZCBjcHVzZXRfaGFuZGxlX2hvdHBsdWcodm9pZCkKIAkJICAgICAgICFjcHVtYXNrX2VtcHR5KHN1YnBhcnRpdGlvbnNfY3B1cyk7CiAJbWVtc191cGRhdGVkID0gIW5vZGVzX2VxdWFsKHRvcF9jcHVzZXQuZWZmZWN0aXZlX21lbXMsIG5ld19tZW1zKTsKIAomIzQzOwkvKgomIzQzOwkgKiBQcml2YXRlIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0LCBidXQgaWYgb25lIGxlYXZlcwomIzQzOwkgKiBOX01FTU9SWV9QUklWQVRFIHdlIHN0aWxsIG5lZWQgdG8gcnVuIG1wb2xfcmViaW5kXyogdG8gY2xlYW4gdXAKJiM0MzsJICogbWVtcG9saWNpZXMgdGhhdCBhcmUgYmluZGluZyB0aGVtLgomIzQzOwkgKi8KJiM0MzsJcHJpdl9zaHJhbmsgPSAhbm9kZXNfc3Vic2V0KHByZXZfcHJpdl9tZW1zLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7CiYjNDM7CXByZXZfcHJpdl9tZW1zID0gbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV07CiYjNDM7CiAJLyogRm9yIHYxLCBzeW5jaHJvbml6ZSBjcHVzX2FsbG93ZWQgdG8gY3B1X2FjdGl2ZV9tYXNrICovCiAJaWYgKGNwdXNfdXBkYXRlZCkgewogCQljcHVzZXRfZm9yY2VfcmVidWlsZCgpOwpAQCAtMzkyNyw5ICYjNDM7MzkzNywxMiBAQCBzdGF0aWMgdm9pZCBjcHVzZXRfaGFuZGxlX2hvdHBsdWcodm9pZCkKIAkJCXRvcF9jcHVzZXQubWVtc19hbGxvd2VkID0gbmV3X21lbXM7CiAJCXRvcF9jcHVzZXQuZWZmZWN0aXZlX21lbXMgPSBuZXdfbWVtczsKIAkJc3Bpbl91bmxvY2tfaXJxKCZhbXA7Y2FsbGJhY2tfbG9jayk7Ci0JCWNwdXNldF91cGRhdGVfdGFza3Nfbm9kZW1hc2soJmFtcDt0b3BfY3B1c2V0KTsKIAl9CiAKJiM0MzsJLyogUmViaW5kIHRhc2sgbWVtcG9saWNpZXMgaWYgYW55IG1lbW9yeSBub2RlIGNoYW5nZWQgc3RhdGUgKi8KJiM0MzsJaWYgKG1lbXNfdXBkYXRlZCB8fCBwcml2X3NocmFuaykKJiM0MzsJCWNwdXNldF91cGRhdGVfdGFza3Nfbm9kZW1hc2soJmFtcDt0b3BfY3B1c2V0KTsKJiM0MzsKIAltdXRleF91bmxvY2soJmFtcDtjcHVzZXRfbXV0ZXgpOwogCiAJLyogaWYgY3B1cyBvciBtZW1zIGNoYW5nZWQsIHdlIG5lZWQgdG8gcHJvcGFnYXRlIHRvIGRlc2NlbmRhbnRzICovCkBAIC00MTYwLDExICYjNDM7NDE3MywxMyBAQCBub2RlbWFza190IGNwdXNldF9tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiAgKiBjcHVzZXRfbm9kZW1hc2tfdmFsaWRfbWVtc19hbGxvd2VkIC0gY2hlY2sgbm9kZW1hc2sgdnMuIGN1cnJlbnQgbWVtc19hbGxvd2VkCiAgKiBAbm9kZW1hc2s6IHRoZSBub2RlbWFzayB0byBiZSBjaGVja2VkCiAgKgotICogQXJlIGFueSBvZiB0aGUgbm9kZXMgaW4gdGhlIG5vZGVtYXNrIGFsbG93ZWQgaW4gY3VycmVudC0mZ3Q7bWVtc19hbGxvd2VkPwomIzQzOyAqIEFyZSBhbnkgb2YgdGhlIG5vZGVzIGluIHRoZSBub2RlbWFzayB1c2FibGU/ICBOX01FTU9SWSBub2RlcyBtdXN0IGJlIGluCiYjNDM7ICogY3VycmVudC0mZ3Q7bWVtc19hbGxvd2VkLCB3aGlsZSBOX01FTU9SWV9QUklWQVRFIG5vZGVzIGFyZSBhbHdheXMgdmFsaWQuCiAgKi8KIGludCBjcHVzZXRfbm9kZW1hc2tfdmFsaWRfbWVtc19hbGxvd2VkKGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVtYXNrKQogewotCXJldHVybiBub2Rlc19pbnRlcnNlY3RzKCpub2RlbWFzaywgY3VycmVudC0mZ3Q7bWVtc19hbGxvd2VkKTsKJiM0MzsJcmV0dXJuIG5vZGVzX2ludGVyc2VjdHMoKm5vZGVtYXNrLCBjdXJyZW50LSZndDttZW1zX2FsbG93ZWQpIHx8CiYjNDM7CSAgICAgICBub2Rlc19pbnRlcnNlY3RzKCpub2RlbWFzaywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pOwogfQogCiAvKgpAQCAtNDIyOCw2ICYjNDM7NDI0Myw5IEBAIGJvb2wgY3B1c2V0X2N1cnJlbnRfbm9kZV9hbGxvd2VkKGludCBub2RlLCBnZnBfdCBnZnBfbWFzaykKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcmV0dXJuIHRydWU7CiYjNDM7CS8qIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgYXJlIG5vdCBwYXJ0aXRpb25lZCBieSBjcHVzZXRzLm1lbXMgKi8KJiM0MzsJaWYgKG5vZGVfaXNfcHJpdmF0ZShub2RlKSkKJiM0MzsJCXJldHVybiB0cnVlOwogCWlmIChub2RlX2lzc2V0KG5vZGUsIGN1cnJlbnQtJmd0O21lbXNfYWxsb3dlZCkpCiAJCXJldHVybiB0cnVlOwogCS8qCmRpZmYgLS1naXQgYS9tbS9jb21wYWN0aW9uLmMgYi9tbS9jb21wYWN0aW9uLmMKaW5kZXggOWY4MTA1NWEzNThlZDEuLmI5YzI1YzU5OTczMmZkIDEwMDY0NAotLS0gYS9tbS9jb21wYWN0aW9uLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vY29tcGFjdGlvbi5jCkBAIC0yNSw2ICYjNDM7MjUsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L3BzaS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2NwdXNldC5oJmd0OwogI2luY2x1ZGUgJiMzNDtwYWdlX2FsbG9jLmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ub2RlX3ByaXZhdGUuaCZndDsKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAKICNpZmRlZiBDT05GSUdfQ09NUEFDVElPTgpAQCAtMjQ2Miw2ICYjNDM7MjQ2Myw5IEBAIGJvb2wgY29tcGFjdGlvbl96b25lbGlzdF9zdWl0YWJsZShzdHJ1Y3QgYWxsb2NfY29udGV4dCAqYWMsIGludCBvcmRlciwKIAkJICAgICFfX2NwdXNldF96b25lX2FsbG93ZWQoem9uZSwgZ2ZwX21hc2spKQogCQkJY29udGludWU7CiAKJiM0MzsJCWlmICghbm9kZV9hbGxvd3NfcmVjbGFpbSh6b25lX3RvX25pZCh6b25lKSkpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiAJCS8qCiAJCSAqIERvIG5vdCBjb25zaWRlciBhbGwgdGhlIHJlY2xhaW1hYmxlIG1lbW9yeSBiZWNhdXNlIHdlIGRvIG5vdAogCQkgKiB3YW50IHRvIHRyYXNoIGp1c3QgZm9yIGEgc2luZ2xlIGhpZ2ggb3JkZXIgYWxsb2NhdGlvbiB3aGljaApAQCAtMjg1Myw2ICYjNDM7Mjg1Nyw5IEBAIGVudW0gY29tcGFjdF9yZXN1bHQgdHJ5X3RvX2NvbXBhY3RfcGFnZXMoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlciwKIAkJCSFfX2NwdXNldF96b25lX2FsbG93ZWQoem9uZSwgZ2ZwX21hc2spKQogCQkJCWNvbnRpbnVlOwogCiYjNDM7CQlpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0oem9uZV90b19uaWQoem9uZSkpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwogCQlpZiAocHJpbyAmZ3Q7IE1JTl9DT01QQUNUX1BSSU9SSVRZCiAJCQkJCSZhbXA7JmFtcDsgY29tcGFjdGlvbl9kZWZlcnJlZCh6b25lLCBvcmRlcikpIHsKIAkJCXJjID0gbWF4X3QoZW51bSBjb21wYWN0X3Jlc3VsdCwgQ09NUEFDVF9ERUZFUlJFRCwgcmMpOwpAQCAtMjkyMiw2ICYjNDM7MjkyOSw5IEBAIHN0YXRpYyBpbnQgY29tcGFjdF9ub2RlKHBnX2RhdGFfdCAqcGdkYXQsIGJvb2wgcHJvYWN0aXZlKQogCQkucHJvYWN0aXZlX2NvbXBhY3Rpb24gPSBwcm9hY3RpdmUsCiAJfTsKIAomIzQzOwlpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0ocGdkYXQtJmd0O25vZGVfaWQpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiAJZm9yICh6b25laWQgPSAwOyB6b25laWQgJmx0OyBNQVhfTlJfWk9ORVM7IHpvbmVpZCYjNDM7JiM0MzspIHsKIAkJem9uZSA9ICZhbXA7cGdkYXQtJmd0O25vZGVfem9uZXNbem9uZWlkXTsKIAkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKQEAgLTMwMTcsNiAmIzQzOzMwMjcsOSBAQCBzdGF0aWMgc3NpemVfdCBjb21wYWN0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKIHsKIAlpbnQgbmlkID0gZGV2LSZndDtpZDsKIAomIzQzOwlpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0obmlkKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwogCWlmIChuaWQgJmd0Oz0gMCAmYW1wOyZhbXA7IG5pZCAmbHQ7IG5yX25vZGVfaWRzICZhbXA7JmFtcDsgbm9kZV9vbmxpbmUobmlkKSkgewogCQkvKiBGbHVzaCBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIExSVSBsaXN0cyAqLwogCQlscnVfYWRkX2RyYWluX2FsbCgpOwpkaWZmIC0tZ2l0IGEvbW0vZGFtb24vcGFkZHIuYyBiL21tL2RhbW9uL3BhZGRyLmMKaW5kZXggZTRmOThkNjc0NjFmNTAuLmI2NjhjZjU1ZDFiNjczIDEwMDY0NAotLS0gYS9tbS9kYW1vbi9wYWRkci5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2RhbW9uL3BhZGRyLmMKQEAgLTEyLDYgJiM0MzsxMiw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvc3dhcC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21lbW9yeS10aWVycy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21tX2lubGluZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ub2RlX3ByaXZhdGUuaCZndDsKIAogI2luY2x1ZGUgJiMzNDsuLi9pbnRlcm5hbC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7b3BzLWNvbW1vbi5oJiMzNDsKQEAgLTI1MCw2ICYjNDM7MjUxLDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRhbW9uX3BhX3BhZ2VvdXQoc3RydWN0IGRhbW9uX3JlZ2lvbiAqciwKIAkJCWNvbnRpbnVlOwogCQl9CiAKJiM0MzsJCS8qIERBTU9TIHBhZ2VvdXQgaXMgcmVjbGFpbTsgZ2F0ZSBhIHByaXZhdGUgbm9kZSBvbiBDQVBfUkVDTEFJTSAqLwomIzQzOwkJaWYgKCFub2RlX2FsbG93c19yZWNsYWltKGZvbGlvX25pZChmb2xpbykpKQomIzQzOwkJCWdvdG8gcHV0X2ZvbGlvOwomIzQzOwogCQlpZiAoZGFtb3NfcGFfZmlsdGVyX291dChzLCBmb2xpbykpCiAJCQlnb3RvIHB1dF9mb2xpbzsKIAkJZWxzZQpAQCAtMzQ0LDYgJiM0MzszNDksMTAgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZGFtb25fcGFfbWlncmF0ZShzdHJ1Y3QgZGFtb25fcmVnaW9uICpyLAogCQllbHNlCiAJCQkqc3pfZmlsdGVyX3Bhc3NlZCAmIzQzOz0gZm9saW9fc2l6ZShmb2xpbykgLyBhZGRyX3VuaXQ7CiAKJiM0MzsJCS8qIHByaXZhdGUgbm9kZXMgZG8gbm90IHN1cHBvcnQgbWlncmF0aW9uIGJ5IGRlZmF1bHQgKi8KJiM0MzsJCWlmIChmb2xpb19pc19wcml2YXRlX25vZGUoZm9saW8pKQomIzQzOwkJCWdvdG8gcHV0X2ZvbGlvOwomIzQzOwogCQlpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSkKIAkJCWdvdG8gcHV0X2ZvbGlvOwogCQlsaXN0X2FkZCgmYW1wO2ZvbGlvLSZndDtscnUsICZhbXA7Zm9saW9fbGlzdCk7CmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jCmluZGV4IDk5OTAyYzE1NzAzYjAxLi44MjE4MzliNzEzYmI0NSAxMDA2NDQKLS0tIGEvbW0vZ3VwLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwLmMKQEAgLTU0NywxMCAmIzQzOzU0NywxMSBAQCBzdGF0aWMgc3RydWN0IGZvbGlvICp0cnlfZ3JhYl9mb2xpb19mYXN0KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcmVmcywKIAkvKgogCSAqIENhbiYjMzk7dCBkbyBGT0xMX0xPTkdURVJNICYjNDM7IEZPTExfUElOIGd1cCBmYXN0IHBhdGggaWYgbm90IGluIGEKIAkgKiByaWdodCB6b25lLCBzbyBmYWlsIGFuZCBsZXQgdGhlIGNhbGxlciBmYWxsIGJhY2sgdG8gdGhlIHNsb3cKLQkgKiBwYXRoLgomIzQzOwkgKiBwYXRoLiAgRmFpbCBmb3Igbm9uLW9wdGVkLWluIHByaXZhdGUgbm9kZSBmb2xpb3MgaGVyZSBzbyB0aGUKJiM0MzsJICogc2xvdyBwYXRoIGNhbiByZWplY3QgdGhlIHBpbiBlbnRpcmVseS4KIAkgKi8KIAlpZiAodW5saWtlbHkoKGZsYWdzICZhbXA7IEZPTExfTE9OR1RFUk0pICZhbXA7JmFtcDsKLQkJICAgICAhZm9saW9faXNfbG9uZ3Rlcm1fcGlubmFibGUoZm9saW8pKSkgewomIzQzOwkJICAgICAhZm9saW9fYWxsb3dzX2xvbmd0ZXJtX3Bpbihmb2xpbykpKSB7CiAJCWZvbGlvX3B1dF9yZWZzKGZvbGlvLCByZWZzKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMjM4MiwxMiAmIzQzOzIzODMsMzUgQEAgbWlncmF0ZV9sb25ndGVybV91bnBpbm5hYmxlX2ZvbGlvcyhzdHJ1Y3QgbGlzdF9oZWFkICptb3ZhYmxlX2ZvbGlvX2xpc3QsCiAJcmV0dXJuIHJldDsKIH0KIAomIzQzOy8qCiYjNDM7ICogVHJ1ZSBpZiBhbnkgZm9saW8gc2l0cyBvbiBhIHByaXZhdGUgbm9kZSB3aG9zZSBmb2xpb3MgbWF5IG5vdCBiZSBsb25ndGVybQomIzQzOyAqIHBpbm5lZC4gIFN1Y2ggZm9saW9zIGNhbiBuZWl0aGVyIGJlIHBpbm5lZCBub3IgbWlncmF0ZWQsIHNvIHRoZSB3aG9sZSBwaW4KJiM0MzsgKiBtdXN0IGZhaWwgYmVmb3JlIG1pZ3JhdGlvbi4gIENoZWNrZWQgYmVmb3JlIGFueSBpc29sYXRpb24gb2NjdXJzLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIHBvZnNfaGFzX2x0cGluX2ZvcmJpZGRlbihzdHJ1Y3QgcGFnZXNfb3JfZm9saW9zICpwb2ZzKQomIzQzO3sKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJbG9uZyBpID0gMDsKJiM0MzsKJiM0MzsJZm9yIChmb2xpbyA9IHBvZnNfZ2V0X2ZvbGlvKHBvZnMsIGkpOyBmb2xpbzsKJiM0MzsJICAgICBmb2xpbyA9IHBvZnNfbmV4dF9mb2xpbyhmb2xpbywgcG9mcywgJmFtcDtpKSkgewomIzQzOwkJaWYgKGZvbGlvX2xvbmd0ZXJtX3Bpbl9mb3JiaWRkZW4oZm9saW8pKQomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwl9CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgbG9uZwogY2hlY2tfYW5kX21pZ3JhdGVfbW92YWJsZV9wYWdlc19vcl9mb2xpb3Moc3RydWN0IHBhZ2VzX29yX2ZvbGlvcyAqcG9mcykKIHsKIAlMSVNUX0hFQUQobW92YWJsZV9mb2xpb19saXN0KTsKIAl1bnNpZ25lZCBsb25nIGNvbGxlY3RlZDsKIAomIzQzOwlpZiAocG9mc19oYXNfbHRwaW5fZm9yYmlkZGVuKHBvZnMpKSB7CiYjNDM7CQlwb2ZzX3VucGluKHBvZnMpOwomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CX0KJiM0MzsKIAljb2xsZWN0ZWQgPSBjb2xsZWN0X2xvbmd0ZXJtX3VucGlubmFibGVfZm9saW9zKCZhbXA7bW92YWJsZV9mb2xpb19saXN0LAogCQkJCQkJICAgICAgIHBvZnMpOwogCWlmICghY29sbGVjdGVkKQpkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmMKaW5kZXggMDRlOGE2YjU1MzQzNWYuLjNhZDczNTBmYzQyN2U1IDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTM3LDYgJiM0MzszNyw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvcGFnZV9vd25lci5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NjaGVkL3N5c2N0bC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21lbW9yeS10aWVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ub2RlX3ByaXZhdGUuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9jb21wYXQuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wZ2FsbG9jLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcGdhbGxvY190YWcuaCZndDsKQEAgLTIzMzgsNiAmIzQzOzIzMzksMTAgQEAgYm9vbCBtYWR2aXNlX2ZyZWVfaHVnZV9wbWQoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJfQogCiAJZm9saW8gPSBwbWRfZm9saW8ob3JpZ19wbWQpOwomIzQzOwomIzQzOwlpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0oZm9saW9fbmlkKGZvbGlvKSkpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKIAkvKgogCSAqIElmIG90aGVyIHByb2Nlc3NlcyBhcmUgbWFwcGluZyB0aGlzIGZvbGlvLCB3ZSBjb3VsZG4mIzM5O3QgZGlzY2FyZAogCSAqIHRoZSBmb2xpbyB1bmxlc3MgdGhleSBhbGwgZG8gTUFEVl9GUkVFIHNvIGxldCYjMzk7cyBza2lwIHRoZSBmb2xpby4KZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDUxZWU0YzEzMTA5MDhkLi4xN2E3YWVmOGE3ODlkZiAxMDA2NDQKLS0tIGEvbW0vaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi9tbS9pbnRlcm5hbC5oCkBAIC0xMiw2ICYjNDM7MTIsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L21tLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW1faW5saW5lLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW11X25vdGlmaWVyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L25vZGVfcHJpdmF0ZS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3BhZ2VtYXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wYWdld2Fsay5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3JtYXAuaCZndDsKQEAgLTk4LDYgJiM0Mzs5OSw5NSBAQCBleHRlcm4gaW50IHN5c2N0bF9taW5fdW5tYXBwZWRfcmF0aW87CiBleHRlcm4gaW50IHN5c2N0bF9taW5fc2xhYl9yYXRpbzsKICNlbmRpZgogCiYjNDM7LyogZm9saW9faXNfcHJpdmF0ZV9tYW5hZ2VkKCkgLSBmb2xpbyBoYXMgc3BlY2lhbCBtbSBtYW5hZ2VtZW50IHJ1bGVzICovCiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX2lzX3ByaXZhdGVfbWFuYWdlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCBmb2xpb19pc19wcml2YXRlX25vZGUoZm9saW8pOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9pc19wcml2YXRlX21hbmFnZWQoc3RydWN0IHBhZ2UgKnBhZ2UpCiYjNDM7ewomIzQzOwlyZXR1cm4gZm9saW9faXNfcHJpdmF0ZV9tYW5hZ2VkKHBhZ2VfZm9saW8ocGFnZSkpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGZvbGlvX2FsbG93c19tYWR2aXNlKCkgLSBtYXkgbWFkdmlzZSByZWNsYWltIGhpbnRzIGFjdCBvbiB0aGlzIGZvbGlvPwomIzQzOyAqCiYjNDM7ICogbWFkdmlzZSByZWNsYWltIGhpbnRzIChDT0xEL1BBR0VPVVQvRlJFRSkgYXJlIHVzZXJsYW5kLWRyaXZlbiByZWNsYWltLCBzbwomIzQzOyAqIHRoZXkgZm9sbG93IHJlY2xhaW0gb3B0LWluOiBmYWxzZSBmb3IgWk9ORV9ERVZJQ0UgYW5kIGZvciBOX01FTU9SWV9QUklWQVRFCiYjNDM7ICogbm9kZXMgd2l0aG91dCBDQVBfUkVDTEFJTSwgdHJ1ZSBmb3IgYWxsIG90aGVyIG5vcm1hbCBmb2xpb3MuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX2FsbG93c19tYWR2aXNlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7ewomIzQzOwlyZXR1cm4gIWZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICBub2RlX2FsbG93c19yZWNsYWltKGZvbGlvX25pZChmb2xpbykpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIGZvbGlvX2FsbG93c19udW1hX2JhbGFuY2UoKSAtIG1heSBOVU1BIGJhbGFuY2luZyBzY2FuL21pZ3JhdGUgdGhpcyBmb2xpbz8KJiM0MzsgKgomIzQzOyAqIE5VTUEgYmFsYW5jaW5nIGlzIGFjY2Vzcy1hd2FyZSB0aWVyaW5nIG1pZ3JhdGlvbiwgc28gaXQgZm9sbG93cyB0aGUgdGllcmluZwomIzQzOyAqIG9wdC1pbjogZmFsc2UgZm9yIFpPTkVfREVWSUNFIGFuZCBmb3IgTl9NRU1PUllfUFJJVkFURSBub2RlcyB3aXRob3V0CiYjNDM7ICogQ0FQX05VTUFfQkFMQU5DSU5HLCB0cnVlIGZvciBhbGwgb3RoZXIgZm9saW9zLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19hbGxvd3NfbnVtYV9iYWxhbmNlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7ewomIzQzOwlyZXR1cm4gIWZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICBub2RlX2FsbG93c19udW1hX2JhbGFuY2luZyhmb2xpb19uaWQoZm9saW8pKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBmb2xpb19hbGxvd3NfY29sbGFwc2UoKSAtIG1heSBjb2xsYXBzZSBmb2xkIHRoaXMgZm9saW8gaW50byBhIFRIUD8KJiM0MzsgKiBAaXNfa2h1Z2VwYWdlZDogdHJ1ZSBmb3IgdGhlIGtodWdlcGFnZWQsIGZhbHNlIGZvciBNQURWX0NPTExBUFNFLgomIzQzOyAqCiYjNDM7ICogQ29sbGFwc2UgaXMgYSByZXNpZGVuY3kgb3BlcmF0aW9uIGdhdGVkIGJ5IHRoZSBhY3RvciBjYWxsaW5nIGl0OgomIzQzOyAqICAgLSBraHVnZXBhZ2VkIG5ldmVyIG9wZXJhdGVzIG9uIHByaXZhdGUtbm9kZSBmb2xpb3MgKGxpa2UgWk9ORV9ERVZJQ0UpCiYjNDM7ICogICAtIE1BRFZfQ09MTEFQU0UgaXMgZ2F0ZWQgYnkgQ0FQX1VTRVJfTlVNQQomIzQzOyAqCiYjNDM7ICogTmV2ZXIgdHJ1ZSBmb3IgWk9ORV9ERVZJQ0UuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBib29sIGZvbGlvX2FsbG93c19jb2xsYXBzZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGlzX2todWdlcGFnZWQpCiYjNDM7ewomIzQzOwlpbnQgbmlkID0gZm9saW9fbmlkKGZvbGlvKTsKJiM0MzsKJiM0MzsJaWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJaWYgKGlzX2todWdlcGFnZWQpCiYjNDM7CQlyZXR1cm4gIW5vZGVfaXNfcHJpdmF0ZShuaWQpOwomIzQzOwlyZXR1cm4gbm9kZV9hbGxvd3NfdXNlcl9udW1hKG5pZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2FsbG93c19jb2xsYXBzZShzdHJ1Y3QgcGFnZSAqcGFnZSwgYm9vbCBpc19raHVnZXBhZ2VkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZvbGlvX2FsbG93c19jb2xsYXBzZShwYWdlX2ZvbGlvKHBhZ2UpLCBpc19raHVnZXBhZ2VkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBmb2xpb19hbGxvd3NfbG9uZ3Rlcm1fcGluKCkgLSBtYXkgdGhpcyBmb2xpbyBiZSBsb25nLXRlcm0gR1VQLXBpbm5lZD8KJiM0MzsgKgomIzQzOyAqIGNoZWNrcyBmb2xpb19pc19sb25ndGVybV9waW5uYWJsZSgpIHJ1bGVzIHBsdXMgcHJpdmF0ZSBub2RlIHBlcm1pc3Npb25zLgomIzQzOyAqIHByaXZhdGUgbm9kZSBwZXJtaXNzaW9uIGlzIGNoZWNrZWQgaGVyZSB0byByZXNvbHZlIGNpcmN1bGFyIGhlYWRlcgomIzQzOyAqIGRlcGVuZGVuY2llcyBpbiBmb2xpb19pc19sb25ndGVybV9waW5uYWJsZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fYWxsb3dzX2xvbmd0ZXJtX3BpbihzdHJ1Y3QgZm9saW8gKmZvbGlvKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZvbGlvX2lzX2xvbmd0ZXJtX3Bpbm5hYmxlKGZvbGlvKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgICBub2RlX2FsbG93c19sdHBpbihmb2xpb19uaWQoZm9saW8pKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBmb2xpb19sb25ndGVybV9waW5fZm9yYmlkZGVuKCkgLSBtdXN0IGEgbG9uZ3Rlcm0gcGluIG9mIHRoaXMgZm9saW8gZmFpbAomIzQzOyAqIG91dHJpZ2h0IChuZWl0aGVyIHBpbm5lZCBpbiBwbGFjZSBub3IgbWlncmF0ZWQgb2ZmIHRoZSBub2RlKT8KJiM0MzsgKgomIzQzOyAqIFRydWUgb25seSBmb3IgYSBmb2xpbyBvbiBhIHByaXZhdGUgbm9kZSB0aGF0IGRpZCBub3Qgb3B0IGludG8gbG9uZ3Rlcm0KJiM0MzsgKiBwaW5uaW5nIChOT0RFX1BSSVZBVEVfQ0FQX0xUUElOKTsgbm9kZV9hbGxvd3NfbHRwaW4oKSBpcyB0cnVlIGZvciBvcmRpbmFyeQomIzQzOyAqIG5vZGVzIGFuZCBmb3Igb3B0ZWQtaW4gcHJpdmF0ZSBub2Rlcywgc28gdGhpcyBuZXZlciB0cmlwcyB0aGVtLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19sb25ndGVybV9waW5fZm9yYmlkZGVuKHN0cnVjdCBmb2xpbyAqZm9saW8pCiYjNDM7ewomIzQzOwlyZXR1cm4gIW5vZGVfYWxsb3dzX2x0cGluKGZvbGlvX25pZChmb2xpbykpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBNYWludGFpbnMgc3RhdGUgYWNyb3NzIGEgcGFnZSB0YWJsZSBtb3ZlLiBUaGUgb3BlcmF0aW9uIGFzc3VtZXMgYm90aCBzb3VyY2UKICAqIGFuZCBkZXN0aW5hdGlvbiBWTUFzIGFscmVhZHkgZXhpc3QgYW5kIGFyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCkBAIC0xMTQ3LDcgJiM0MzsxMjM3LDggQEAgZXh0ZXJuIGludCBub2RlX3JlY2xhaW1fbW9kZTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCiAJCQkJICBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTsKLWV4dGVybiBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spOwomIzQzO2V4dGVybiBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssCiYjNDM7CQkJCSAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcyk7CiAjZWxzZQogI2RlZmluZSBub2RlX3JlY2xhaW1fbW9kZSAwCiAKQEAgLTExNTYsNyAmIzQzOzEyNDcsOCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKJiM0MztzdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaywKJiM0MzsJCQkJCSBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKQogewogCXJldHVybiBOVU1BX05PX05PREU7CiB9CkBAIC0xMjQyLDYgJiM0MzsxMzM0LDcgQEAgc3RydWN0IG1pZ3JhdGlvbl90YXJnZXRfY29udHJvbCB7CiAJbm9kZW1hc2tfdCAqbm1hc2s7CiAJZ2ZwX3QgZ2ZwX21hc2s7CiAJZW51bSBtaWdyYXRlX3JlYXNvbiByZWFzb247CiYjNDM7CXVuc2lnbmVkIGludCBhbGxvY19mbGFnczsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmMKaW5kZXggMjdlOGYzMDc3ZTgwZmUuLjVmMjA4Mzk4NTc3MzgyIDEwMDY0NAotLS0gYS9tbS9raHVnZXBhZ2VkLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0va2h1Z2VwYWdlZC5jCkBAIC03MDAsNyAmIzQzOzcwMCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQlnb3RvIG91dDsKIAkJfQogCQlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpOwotCQlpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7CiYjNDM7CQlpZiAodW5saWtlbHkoIXBhZ2UpIHx8CiYjNDM7CQkgICAgdW5saWtlbHkoIXBhZ2VfYWxsb3dzX2NvbGxhcHNlKHBhZ2UsIGNjLSZndDtpc19raHVnZXBhZ2VkKSkpIHsKIAkJCXJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTEyNDEsOSAmIzQzOzEyNDIsMTcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnUKIAlnZnBfdCBnZnAgPSAoY2MtJmd0O2lzX2todWdlcGFnZWQgPyBhbGxvY19odWdlcGFnZV9raHVnZXBhZ2VkX2dmcG1hc2soKSA6CiAJCSAgICAgR0ZQX1RSQU5TSFVHRSk7CiAJaW50IG5vZGUgPSBjb2xsYXBzZV9maW5kX3RhcmdldF9ub2RlKGNjKTsKJiM0MzsJdW5zaWduZWQgaW50IGFmbGFnczsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvOwomIzQzOwlib29sIGFsbG93OwogCi0JZm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsICZhbXA7Y2MtJmd0O2FsbG9jX25tYXNrKTsKJiM0MzsJLyogUHJpdmF0ZSBub2RlIGFjY2Vzczoga2h1Z2VwYWdlZCBuZXZlciwgbWFkdmlzZSB3aXRoIENBUF9VU0VSX05VTUEgKi8KJiM0MzsJYWxsb3cgPSBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCA/ICFub2RlX2lzX3ByaXZhdGUobm9kZSkKJiM0MzsJCQkJICA6IG5vZGVfYWxsb3dzX3VzZXJfbnVtYShub2RlKTsKJiM0MzsJYWZsYWdzID0gKGFsbG93ICZhbXA7JmFtcDsgbm9kZV9pc19wcml2YXRlKG5vZGUpKSA/CiYjNDM7CQlBTExPQ19aT05FTElTVF9QUklWQVRFIDogQUxMT0NfREVGQVVMVDsKJiM0MzsKJiM0MzsJZm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsICZhbXA7Y2MtJmd0O2FsbG9jX25tYXNrLCBhZmxhZ3MpOwogCWlmICghZm9saW8pIHsKIAkJKmZvbGlvcCA9IE5VTEw7CiAJCWlmIChpc19wbWRfb3JkZXIob3JkZXIpKQpAQCAtMTY4Nyw3ICYjNDM7MTY5Niw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQl9CiAKIAkJcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTsKLQkJaWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkgewomIzQzOwkJaWYgKHVubGlrZWx5KCFwYWdlKSB8fAomIzQzOwkJICAgIHVubGlrZWx5KCFwYWdlX2FsbG93c19jb2xsYXBzZShwYWdlLCBjYy0mZ3Q7aXNfa2h1Z2VwYWdlZCkpKSB7CiAJCQlyZXN1bHQgPSBTQ0FOX1BBR0VfTlVMTDsKIAkJCWdvdG8gb3V0X3VubWFwOwogCQl9CkBAIC0xOTQ0LDcgJiM0MzsxOTU0LDcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgdHJ5X2NvbGxhcHNlX3B0ZV9tYXBwZWRfdGhwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ24KIAkJfQogCiAJCXBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZW50KTsKLQkJaWYgKFdBUk5fT05fT05DRShwYWdlICZhbXA7JmFtcDsgaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpCiYjNDM7CQlpZiAoV0FSTl9PTl9PTkNFKHBhZ2UgJmFtcDsmYW1wOyBwYWdlX2lzX3ByaXZhdGVfbWFuYWdlZChwYWdlKSkpCiAJCQlwYWdlID0gTlVMTDsKIAkJLyoKIAkJICogTm90ZSB0aGF0IHVwcm9iZSwgZGVidWdnZXIsIG9yIE1BUF9QUklWQVRFIG1heSBjaGFuZ2UgdGhlCmRpZmYgLS1naXQgYS9tbS9rc20uYyBiL21tL2tzbS5jCmluZGV4IGI5YjMyZjdiZmI2OTFlLi5mZjIzMTNmYzQ1ZDUzYSAxMDA2NDQKLS0tIGEvbW0va3NtLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0va3NtLmMKQEAgLTgyNyw3ICYjNDM7ODI3LDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICpnZXRfbWVyZ2VhYmxlX3BhZ2Uoc3RydWN0IGtzbV9ybWFwX2l0ZW0gKnJtYXBfaXRlbSkKIAogCWZvbGlvID0gZm9saW9fd2Fsa19zdGFydCgmYW1wO2Z3LCB2bWEsIGFkZHIsIDApOwogCWlmIChmb2xpbykgewotCQlpZiAoIWZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSAmYW1wOyZhbXA7CiYjNDM7CQlpZiAoIWZvbGlvX2lzX3ByaXZhdGVfbWFuYWdlZChmb2xpbykgJmFtcDsmYW1wOwogCQkgICAgZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewogCQkJZm9saW9fZ2V0KGZvbGlvKTsKIAkJCXBhZ2UgPSBmdy5wYWdlOwpAQCAtMjU1OSw3ICYjNDM7MjU1OSw4IEBAIHN0YXRpYyBpbnQga3NtX25leHRfcGFnZV9wbWRfZW50cnkocG1kX3QgKnBtZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uCiAJCQkJZ290byBub3RfZm91bmRfdW5sb2NrOwogCQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwogCi0JCQlpZiAoZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQomIzQzOwkJCWlmICh1bmxpa2VseShmb2xpb19pc19wcml2YXRlX21hbmFnZWQoZm9saW8pKSB8fAomIzQzOwkJCSAgICAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKIAkJCQlnb3RvIG5vdF9mb3VuZF91bmxvY2s7CiAKIAkJCXBhZ2UgJiM0Mzs9ICgoYWRkciAmYW1wOyAoUE1EX1NJWkUgLSAxKSkgJmd0OyZndDsgUEFHRV9TSElGVCk7CkBAIC0yNTgzLDcgJiM0MzsyNTg0LDggQEAgc3RhdGljIGludCBrc21fbmV4dF9wYWdlX3BtZF9lbnRyeShwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb24KIAkJCWNvbnRpbnVlOwogCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiAKLQkJaWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKJiM0MzsJCWlmICh1bmxpa2VseShmb2xpb19pc19wcml2YXRlX21hbmFnZWQoZm9saW8pKSB8fAomIzQzOwkJICAgICFmb2xpb190ZXN0X2Fub24oZm9saW8pKQogCQkJY29udGludWU7CiAJCWdvdG8gZm91bmRfdW5sb2NrOwogCX0KZGlmZiAtLWdpdCBhL21tL21hZHZpc2UuYyBiL21tL21hZHZpc2UuYwppbmRleCAwN2EyMWNhMzFiYWQ0ZC4uNTZjYTk3NDU0MjcwNzggMTAwNjQ0Ci0tLSBhL21tL21hZHZpc2UuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9tYWR2aXNlLmMKQEAgLTMyLDYgJiM0MzszMiw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbGVhZm9wcy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NobWVtX2ZzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW11X25vdGlmaWVyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L25vZGVfcHJpdmF0ZS5oJmd0OwogCiAjaW5jbHVkZSAmbHQ7YXNtL3RsYi5oJmd0OwogCkBAIC0zOTUsNiAmIzQzOzM5Niw5IEBAIHN0YXRpYyBpbnQgbWFkdmlzZV9jb2xkX29yX3BhZ2VvdXRfcHRlX3JhbmdlKHBtZF90ICpwbWQsCiAKIAkJZm9saW8gPSBwbWRfZm9saW8ob3JpZ19wbWQpOwogCiYjNDM7CQlpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0oZm9saW9fbmlkKGZvbGlvKSkpCiYjNDM7CQkJZ290byBodWdlX3VubG9jazsKJiM0MzsKIAkJLyogRG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIG1hcHBpbmdzIG9mIHRoaXMgZm9saW8gKi8KIAkJaWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKQogCQkJZ290byBodWdlX3VubG9jazsKQEAgLTQ3NCw3ICYjNDM7NDc4LDcgQEAgc3RhdGljIGludCBtYWR2aXNlX2NvbGRfb3JfcGFnZW91dF9wdGVfcmFuZ2UocG1kX3QgKnBtZCwKIAkJCWNvbnRpbnVlOwogCiAJCWZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpOwotCQlpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSkKJiM0MzsJCWlmICghZm9saW8gfHwgIWZvbGlvX2FsbG93c19tYWR2aXNlKGZvbGlvKSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qCkBAIC03MDMsNyAmIzQzOzcwNyw3IEBAIHN0YXRpYyBpbnQgbWFkdmlzZV9mcmVlX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCX0KIAogCQlmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTsKLQkJaWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpCiYjNDM7CQlpZiAoIWZvbGlvIHx8ICFmb2xpb19hbGxvd3NfbWFkdmlzZShmb2xpbykpCiAJCQljb250aW51ZTsKIAogCQkvKgpkaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC12MS5jIGIvbW0vbWVtY29udHJvbC12MS5jCmluZGV4IDJkYzU5OTQ4NGQwMDZmLi41ZTQ2NGU1MmRmYjlhOCAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC12MS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbWNvbnRyb2wtdjEuYwpAQCAtMjEzMiwxNCAmIzQzOzIxMzIsMTggQEAgc3RhdGljIGludCBtZW1jZ19udW1hX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiAJY29uc3Qgc3RydWN0IG51bWFfc3RhdCAqc3RhdDsKIAlpbnQgbmlkOwogCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9zZXEobSk7CiYjNDM7CW5vZGVtYXNrX3QgcmVwb3J0YWJsZTsKIAogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogCiYjNDM7CS8qIFByaXZhdGUgbm9kZXMgaG9sZCBjZ3JvdXAgbWVtb3J5IHRvbywgcmVwb3J0IHRoZW0uICovCiYjNDM7CW5vZGVzX29yKHJlcG9ydGFibGUsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pOwomIzQzOwogCWZvciAoc3RhdCA9IHN0YXRzOyBzdGF0ICZsdDsgQVJSQVlfRU5EKHN0YXRzKTsgc3RhdCYjNDM7JiM0MzspIHsKIAkJc2VxX3ByaW50ZihtLCAmIzM0OyVzPSVsdSYjMzQ7LCBzdGF0LSZndDtuYW1lLAogCQkJICAgbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIHN0YXQtJmd0O2xydV9tYXNrLAogCQkJCQkJICAgZmFsc2UpKTsKLQkJZm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKQomIzQzOwkJZm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcmVwb3J0YWJsZSkKIAkJCXNlcV9wcmludGYobSwgJiMzNDsgTiVkPSVsdSYjMzQ7LCBuaWQsCiAJCQkJICAgbWVtX2Nncm91cF9ub2RlX25yX2xydV9wYWdlcyhtZW1jZywgbmlkLAogCQkJCQkJCXN0YXQtJmd0O2xydV9tYXNrLCBmYWxzZSkpOwpAQCAtMjE1MSw3ICYjNDM7MjE1NSw3IEBAIHN0YXRpYyBpbnQgbWVtY2dfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogCQlzZXFfcHJpbnRmKG0sICYjMzQ7aGllcmFyY2hpY2FsXyVzPSVsdSYjMzQ7LCBzdGF0LSZndDtuYW1lLAogCQkJICAgbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIHN0YXQtJmd0O2xydV9tYXNrLAogCQkJCQkJICAgdHJ1ZSkpOwotCQlmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpCiYjNDM7CQlmb3JfZWFjaF9ub2RlX21hc2sobmlkLCByZXBvcnRhYmxlKQogCQkJc2VxX3ByaW50ZihtLCAmIzM0OyBOJWQ9JWx1JiMzNDssIG5pZCwKIAkJCQkgICBtZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBuaWQsCiAJCQkJCQkJc3RhdC0mZ3Q7bHJ1X21hc2ssIHRydWUpKTsKZGlmZiAtLWdpdCBhL21tL21lbWNvbnRyb2wuYyBiL21tL21lbWNvbnRyb2wuYwppbmRleCA4MzE5YWQ4YzVjMjNhYy4uNGQ3OWUyMzhiYzU3ZDggMTAwNjQ0Ci0tLSBhL21tL21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9tZW1jb250cm9sLmMKQEAgLTQ0OTYsNiAmIzQzOzQ0OTYsNyBAQCBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2Nzc19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KQogCXN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnQgPSBwYXJlbnRfbWVtX2Nncm91cChtZW1jZyk7CiAJc3RydWN0IG1lbWNnX3Ztc3RhdHNfcGVyY3B1ICpzdGF0YzsKIAlzdHJ1Y3QgYWdncmVnYXRlX2NvbnRyb2wgYWM7CiYjNDM7CW5vZGVtYXNrX3QgcmVwb3J0YWJsZTsKIAlpbnQgbmlkOwogCiAJZmx1c2hfbm1pX3N0YXRzKG1lbWNnLCBwYXJlbnQpOwpAQCAtNDUyNCw3ICYjNDM7NDUyNSw5IEBAIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY3NzX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpCiAJfTsKIAltZW1fY2dyb3VwX3N0YXRfYWdncmVnYXRlKCZhbXA7YWMpOwogCi0JZm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSB7CiYjNDM7CS8qIFByaXZhdGUgbm9kZXMgbXVzdCBhbHNvIGJlIGFjY291bnRlZCBvciBudW1hX3N0YXQgaXMgbWlzbGVhZGluZyAqLwomIzQzOwlub2Rlc19vcihyZXBvcnRhYmxlLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTsKJiM0MzsJZm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcmVwb3J0YWJsZSkgewogCQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfbm9kZSAqcG4gPSBtZW1jZy0mZ3Q7bm9kZWluZm9bbmlkXTsKIAkJc3RydWN0IGxydXZlY19zdGF0cyAqbHN0YXRzID0gcG4tJmd0O2xydXZlY19zdGF0czsKIAkJc3RydWN0IGxydXZlY19zdGF0cyAqcGxzdGF0cyA9IE5VTEw7CkBAIC00OTQ3LDkgJiM0Mzs0OTUwLDEzIEBAIHN0YXRpYyBpbnQgbWVtb3J5X251bWFfc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fc2VxKG0pOwomIzQzOwlub2RlbWFza190IHJlcG9ydGFibGU7CiAKIAltZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTsKIAomIzQzOwkvKiBQcml2YXRlIG5vZGVzIGhvbGQgY2dyb3VwIG1lbW9yeSB0b28sIHJlcG9ydCB0aGVtLiAqLwomIzQzOwlub2Rlc19vcihyZXBvcnRhYmxlLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTsKJiM0MzsKIAlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShtZW1vcnlfc3RhdHMpOyBpJiM0MzsmIzQzOykgewogCQlpbnQgbmlkOwogCkBAIC00OTU3LDcgJiM0Mzs0OTY0LDcgQEAgc3RhdGljIGludCBtZW1vcnlfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogCQkJY29udGludWU7CiAKIAkJc2VxX3ByaW50ZihtLCAmIzM0OyVzJiMzNDssIG1lbW9yeV9zdGF0c1tpXS5uYW1lKTsKLQkJZm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSB7CiYjNDM7CQlmb3JfZWFjaF9ub2RlX21hc2sobmlkLCByZXBvcnRhYmxlKSB7CiAJCQl1NjQgc2l6ZTsKIAkJCXN0cnVjdCBscnV2ZWMgKmxydXZlYzsKIApAQCAtNjA2OSw2ICYjNDM7NjA3Niw4IEBAIHZvaWQgbWVtX2Nncm91cF9ub2RlX2ZpbHRlcl9hbGxvd2VkKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgbm9kZW1hc2tfdCAqbWFzaykKIAkgKiBtYXNrIGlzIGFjY2VwdGFibGUuCiAJICovCiAJY3B1c2V0X25vZGVzX2FsbG93ZWQobWVtY2ctJmd0O2Nzcy5jZ3JvdXAsICZhbXA7YWxsb3dlZCk7CiYjNDM7CS8qIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgYXJlIG5vdCBwYXJ0aXRpb25lZCBieSBjcHVzZXQsIGluY2x1ZGUgdGhlbSAqLwomIzQzOwlub2Rlc19vcihhbGxvd2VkLCBhbGxvd2VkLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7CiAJbm9kZXNfYW5kKCptYXNrLCAqbWFzaywgYWxsb3dlZCk7CiB9CiAKZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmMKaW5kZXggNTQ4NTFkOGExOTViMDMuLmM2NzMwODBkMTUzZTQxIDEwMDY0NAotLS0gYS9tbS9tZW1vcnktdGllcnMuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9tZW1vcnktdGllcnMuYwpAQCAtNyw2ICYjNDM7Nyw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtb3J5LXRpZXJzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbm90aWZpZXIuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC9zeXNjdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbm9kZV9wcml2YXRlLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7CiAKQEAgLTMxNyw2ICYjNDM7MzE4LDIxIEBAIHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKJiM0MzsvKiBUaWVyaW5nIHNldDogTl9NRU1PUlkgfCAoTl9NRU1PUllfUFJJVkFURSB3LyBDQVBfREVNT1RJT04pICovCiYjNDM7c3RhdGljIG5vZGVtYXNrX3QgdGllcmFibGVfbm9kZXM7CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdXBkYXRlX3RpZXJhYmxlX25vZGVzKHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgbm9kZTsKJiM0MzsKJiM0MzsJbG9ja2RlcF9hc3NlcnRfaGVsZF9vbmNlKCZhbXA7bWVtb3J5X3RpZXJfbG9jayk7CiYjNDM7CiYjNDM7CXRpZXJhYmxlX25vZGVzID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldOwomIzQzOwlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZX1BSSVZBVEUpCiYjNDM7CQlpZiAobm9kZV9hbGxvd3NfZGVtb3Rpb24obm9kZSkpCiYjNDM7CQkJbm9kZV9zZXQobm9kZSwgdGllcmFibGVfbm9kZXMpOwomIzQzO30KJiM0MzsKIC8qKgogICogbmV4dF9kZW1vdGlvbl9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGUgZGVtb3Rpb24gcGF0aAogICogQG5vZGU6IFRoZSBzdGFydGluZyBub2RlIHRvIGxvb2t1cCB0aGUgbmV4dCBub2RlCkBAIC0zMzAsNyAmIzQzOzM0Niw3IEBAIHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpCiBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spCiB7CiAJc3RydWN0IGRlbW90aW9uX25vZGVzICpuZDsKLQlub2RlbWFza190IG1hc2s7CiYjNDM7CW5vZGVtYXNrX3QgbWFzaywgdGllcmFibGU7CiAKIAlpZiAoIW5vZGVfZGVtb3Rpb24pCiAJCXJldHVybiBOVU1BX05PX05PREU7CkBAIC0zNzAsNyAmIzQzOzM4Niw4IEBAIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaykKIAkgKiBjbG9zZXN0IGRlbW90aW9uIHRhcmdldC4KIAkgKi8KIAlub2Rlc19jb21wbGVtZW50KG1hc2ssICphbGxvd2VkX21hc2spOwotCXJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlKG5vZGUsICZhbXA7bWFzayk7CiYjNDM7CXRpZXJhYmxlID0gdGllcmFibGVfbm9kZXM7CiYjNDM7CXJldHVybiBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsICZhbXA7bWFzaywgJmFtcDt0aWVyYWJsZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZCkKQEAgLTM3OCw3ICYjNDM7Mzk1LDcgQEAgc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKQogCXN0cnVjdCBtZW1vcnlfdGllciAqbWVtdGllcjsKIAlpbnQgbm9kZTsKIAotCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHsKJiM0MzsJZm9yX2VhY2hfbm9kZV9tYXNrKG5vZGUsIHRpZXJhYmxlX25vZGVzKSB7CiAJCW5vZGVfZGVtb3Rpb25bbm9kZV0ucHJlZmVycmVkID0gTk9ERV9NQVNLX05PTkU7CiAJCS8qCiAJCSAqIFdlIGFyZSBob2xkaW5nIG1lbW9yeV90aWVyX2xvY2ssIGl0IGlzIHNhZmUKQEAgLTQwMSw3ICYjNDM7NDE4LDcgQEAgc3RhdGljIHZvaWQgZHVtcF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpCiB7CiAJaW50IG5vZGU7CiAKLQlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSB7CiYjNDM7CWZvcl9lYWNoX25vZGVfbWFzayhub2RlLCB0aWVyYWJsZV9ub2RlcykgewogCQlzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXIgPSBfX25vZGVfZ2V0X21lbW9yeV90aWVyKG5vZGUpOwogCQlub2RlbWFza190IHByZWZlcnJlZCA9IG5vZGVfZGVtb3Rpb25bbm9kZV0ucHJlZmVycmVkOwogCkBAIC00MzUsOSAmIzQzOzQ1MiwxMCBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKQogCWlmICghbm9kZV9kZW1vdGlvbikKIAkJcmV0dXJuOwogCiYjNDM7CXVwZGF0ZV90aWVyYWJsZV9ub2RlcygpOwogCWRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHMoKTsKIAotCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHsKJiM0MzsJZm9yX2VhY2hfbm9kZV9tYXNrKG5vZGUsIHRpZXJhYmxlX25vZGVzKSB7CiAJCWJlc3RfZGlzdGFuY2UgPSAtMTsKIAkJbmQgPSAmYW1wO25vZGVfZGVtb3Rpb25bbm9kZV07CiAKQEAgLTQ1MCwxMiAmIzQzOzQ2OCwxMiBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKQogCQltZW10aWVyID0gbGlzdF9uZXh0X2VudHJ5KG1lbXRpZXIsIGxpc3QpOwogCQl0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7CiAJCS8qCi0JCSAqIGZpbmRfbmV4dF9iZXN0X25vZGUsIHVzZSAmIzM5O3VzZWQmIzM5OyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC4KJiM0MzsJCSAqIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4sIHVzZSAmIzM5O3VzZWQmIzM5OyBub2RlbWFzayBhcyBhIHNraXAgbGlzdC4KIAkJICogQWRkIGFsbCBtZW1vcnkgbm9kZXMgZXhjZXB0IHRoZSBzZWxlY3RlZCBtZW1vcnkgdGllcgogCQkgKiBub2RlbGlzdCB0byBza2lwIGxpc3Qgc28gdGhhdCB3ZSBmaW5kIHRoZSBiZXN0IG5vZGUgZnJvbSB0aGUKIAkJICogbWVtdGllciBub2RlbGlzdC4KIAkJICovCi0JCW5vZGVzX2FuZG5vdCh0aWVyX25vZGVzLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIHRpZXJfbm9kZXMpOwomIzQzOwkJbm9kZXNfYW5kbm90KHRpZXJfbm9kZXMsIHRpZXJhYmxlX25vZGVzLCB0aWVyX25vZGVzKTsKIAogCQkvKgogCQkgKiBGaW5kIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG1lbW9yeSB0aWVyIG5vZGUgbGlzdCBvZiBzYW1lIGJlc3QgZGlzdGFuY2UuCkBAIC00NjMsNyAmIzQzOzQ4MSw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpCiAJCSAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLgogCQkgKi8KIAkJZG8gewotCQkJdGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCAmYW1wO3RpZXJfbm9kZXMpOwomIzQzOwkJCXRhcmdldCA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obm9kZSwgJmFtcDt0aWVyX25vZGVzLAomIzQzOwkJCQkJCQkmYW1wO3RpZXJhYmxlX25vZGVzKTsKIAkJCWlmICh0YXJnZXQgPT0gTlVNQV9OT19OT0RFKQogCQkJCWJyZWFrOwogCkBAIC01MDIsNyAmIzQzOzUyMSw3IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpCiAJICogYWxsb2NhdGlvbiB0byBhIHNldCBvZiBub2RlcyB0aGF0IGlzIGNsb3NlciB0aGUgYWJvdmUgc2VsZWN0ZWQKIAkgKiBwcmVmZXJyZWQgbm9kZS4KIAkgKi8KLQlsb3dlcl90aWVyID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldOwomIzQzOwlsb3dlcl90aWVyID0gdGllcmFibGVfbm9kZXM7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtZW10aWVyLCAmYW1wO21lbW9yeV90aWVycywgbGlzdCkgewogCQkvKgogCQkgKiBLZWVwIHJlbW92aW5nIGN1cnJlbnQgdGllciBmcm9tIGxvd2VyX3RpZXIgbm9kZXMsCkBAIC01NDksNyAmIzQzOzU2OCw4IEBAIHN0YXRpYyBzdHJ1Y3QgbWVtb3J5X3RpZXIgKnNldF9ub2RlX21lbW9yeV90aWVyKGludCBub2RlKQogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZF9vbmNlKCZhbXA7bWVtb3J5X3RpZXJfbG9jayk7CiAKLQlpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKQomIzQzOwkvKiBJbmNsdWRlIE5fTUVNT1JZIGFuZCBOX01FTU9SWV9QUklWQVRFIHdpdGggQ0FQX0RFTU9USU9OICovCiYjNDM7CWlmICghbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkgJmFtcDsmYW1wOyAhbm9kZV9hbGxvd3NfZGVtb3Rpb24obm9kZSkpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJbXRfY2FsY19hZGlzdGFuY2Uobm9kZSwgJmFtcDthZGlzdCk7CmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwppbmRleCAyMjZhYjljYjA3OGFkMS4uZTk1NzNmOTBlMGRjZDMgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMzQsNiAmIzQzOzM0LDcgQEAKICNpbmNsdWRlICZsdDtsaW51eC9tZW1ibG9jay5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2NvbXBhY3Rpb24uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9ybWFwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L25vZGVfcHJpdmF0ZS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L25vZGUuaCZndDsKIApAQCAtMTE2OCw3ICYjNDM7MTE2OSw3IEBAIGludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCiAJbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSh6b25lLCBwZm4sIG5yX3BhZ2VzLCBOVUxMLCBNSUdSQVRFX01PVkFCTEUsCiAJCQkgICAgICAgdHJ1ZSk7CiAKLQlpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpIHsKJiM0MzsJaWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpICZhbXA7JmFtcDsgIW5vZGVfaXNfcHJpdmF0ZShuaWQpKSB7CiAJCS8qIEFkZGluZyBtZW1vcnkgdG8gdGhlIG5vZGUgZm9yIHRoZSBmaXJzdCB0aW1lICovCiAJCW5vZGVfYXJnLm5pZCA9IG5pZDsKIAkJcmV0ID0gbm9kZV9ub3RpZnkoTk9ERV9BRERJTkdfRklSU1RfTUVNT1JZLCAmYW1wO25vZGVfYXJnKTsKQEAgLTEyMDMsMTMgJiM0MzsxMjA0LDIwIEBAIGludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCiAJb25saW5lX3BhZ2VzX3JhbmdlKHBmbiwgbnJfcGFnZXMpOwogCWFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2UocGZuKSwgZ3JvdXAsIG5yX3BhZ2VzKTsKIAomIzQzOwkvKgomIzQzOwkgKiBOX01FTU9SWSBhbmQgTl9NRU1PUllfUFJJVkFURSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCBkZXRlcm1pbmUKJiM0MzsJICogd2hpY2ggaXMgY29ycmVjdCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBwZ2RhdC0mZ3Q7cHJpdmF0ZSBpcyBzZXQuCiYjNDM7CSAqLwogCWlmIChub2RlX2FyZy5uaWQgJmd0Oz0gMCkKLQkJbm9kZV9zZXRfc3RhdGUobmlkLCBOX01FTU9SWSk7CiYjNDM7CQlub2RlX3NldF9zdGF0ZShuaWQsIHBnZGF0X2lzX3ByaXZhdGUoTk9ERV9EQVRBKG5pZCkpID8KJiM0MzsJCQkJICAgIE5fTUVNT1JZX1BSSVZBVEUgOiBOX01FTU9SWSk7CiAJLyoKIAkgKiBDaGVjayB3aGV0aGVyIHdlIGFyZSBhZGRpbmcgbm9ybWFsIG1lbW9yeSB0byB0aGUgbm9kZSBmb3IgdGhlIGZpcnN0CiAJICogdGltZS4KIAkgKi8KLQlpZiAoIW5vZGVfc3RhdGUobmlkLCBOX05PUk1BTF9NRU1PUlkpICZhbXA7JmFtcDsgem9uZV9pZHgoem9uZSkgJmx0Oz0gWk9ORV9OT1JNQUwpCiYjNDM7CWlmICghbm9kZV9pc19wcml2YXRlKG5pZCkgJmFtcDsmYW1wOwomIzQzOwkgICAgIW5vZGVfc3RhdGUobmlkLCBOX05PUk1BTF9NRU1PUlkpICZhbXA7JmFtcDsKJiM0MzsJICAgIHpvbmVfaWR4KHpvbmUpICZsdDs9IFpPTkVfTk9STUFMKQogCQlub2RlX3NldF9zdGF0ZShuaWQsIE5fTk9STUFMX01FTU9SWSk7CiAKIAlpZiAobmVlZF96b25lbGlzdHNfcmVidWlsZCkKQEAgLTEyMjksOCAmIzQzOzEyMzcsMTAgQEAgaW50IG9ubGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKIAkvKiByZWluaXRpYWxpc2Ugd2F0ZXJtYXJrcyBhbmQgdXBkYXRlIHBjcCBsaW1pdHMgKi8KIAlpbml0X3Blcl96b25lX3dtYXJrX21pbigpOwogCi0Ja3N3YXBkX3J1bihuaWQpOwotCWtjb21wYWN0ZF9ydW4obmlkKTsKJiM0MzsJaWYgKG5vZGVfYWxsb3dzX3JlY2xhaW0obmlkKSkgewomIzQzOwkJa3N3YXBkX3J1bihuaWQpOwomIzQzOwkJa2NvbXBhY3RkX3J1bihuaWQpOwomIzQzOwl9CiAKIAlpZiAobm9kZV9hcmcubmlkICZndDs9IDApCiAJCS8qIEZpcnN0IG1lbW9yeSBhZGRlZCBzdWNjZXNzZnVsbHkuIE5vdGlmeSBjb25zdW1lcnMuICovCkBAIC0xNjQ4LDYgJiM0MzsxNjU4LDggQEAgRVhQT1JUX1NZTUJPTF9HUEwoYWRkX21lbW9yeSk7CiAgKiBAcmVzb3VyY2VfbmFtZTogUmVzb3VyY2UgbmFtZSBpbiBmb3JtYXQgJiMzNDtTeXN0ZW0gUkFNICgkRFJJVkVSKSYjMzQ7CiAgKiBAbWhwX2ZsYWdzOiBNZW1vcnkgaG90cGx1ZyBmbGFncwogICogQG9ubGluZV90eXBlOiBBdXRvLU9ubGluZSBiZWhhdmlvciAob2ZmbGluZSwgb25saW5lLCBrZXJuZWwsIG1vdmFibGUpCiYjNDM7ICogQG5wOiBkcml2ZXItb3duZWQgbm9kZV9wcml2YXRlIHRvIG9ubGluZSB0aGUgbm9kZSBhcyBOX01FTU9SWV9QUklWQVRFLCBvcgomIzQzOyAqCU5VTEwgZm9yIG9yZGluYXJ5IHN5c3RlbSBSQU0KICAqCiAgKiBBZGQgc3BlY2lhbCwgZHJpdmVyLW1hbmFnZWQgbWVtb3J5IHRvIHRoZSBzeXN0ZW0gYXMgc3lzdGVtIFJBTS4gU3VjaAogICogbWVtb3J5IGlzIG5vdCBleHBvc2VkIHZpYSB0aGUgcmF3IGZpcm13YXJlLXByb3ZpZGVkIG1lbW1hcCBhcyBzeXN0ZW0KQEAgLTE2NzQsOSAmIzQzOzE2ODYsMTEgQEAgRVhQT1JUX1NZTUJPTF9HUEwoYWRkX21lbW9yeSk7CiAgKi8KIGludCBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSwKIAkJY29uc3QgY2hhciAqcmVzb3VyY2VfbmFtZSwgbWhwX3QgbWhwX2ZsYWdzLAotCQllbnVtIG1tb3Agb25saW5lX3R5cGUpCiYjNDM7CQllbnVtIG1tb3Agb25saW5lX3R5cGUsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKQogewomIzQzOwlpbnQgcmVhbF9uaWQgPSBuaWQ7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiYjNDM7CXN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwOwogCWludCByYzsKIAogCWlmICghcmVzb3VyY2VfbmFtZSB8fApAQCAtMTY4Nyw2ICYjNDM7MTcwMSwxOSBAQCBpbnQgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsCiAJaWYgKG9ubGluZV90eXBlICZsdDsgTU1PUF9PRkZMSU5FIHx8IG9ubGluZV90eXBlICZndDsgTU1PUF9PTkxJTkVfTU9WQUJMRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKJiM0MzsJLyogUmVnaXN0ZXIgYSBwcml2YXRlLW5vZGUgb3duZXIgYmVmb3JlIGFkZGluZyBtZW1vcnkuICovCiYjNDM7CWlmIChucCkgewomIzQzOwkJaWYgKG1ocF9mbGFncyAmYW1wOyBNSFBfTklEX0lTX01HSUQpIHsKJiM0MzsJCQlncm91cCA9IG1lbW9yeV9ncm91cF9maW5kX2J5X2lkKG5pZCk7CiYjNDM7CQkJaWYgKCFncm91cCkKJiM0MzsJCQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQkJcmVhbF9uaWQgPSBncm91cC0mZ3Q7bmlkOwomIzQzOwkJfQomIzQzOwkJcmMgPSBub2RlX3ByaXZhdGVfcmVnaXN0ZXIocmVhbF9uaWQsIG5wKTsKJiM0MzsJCWlmIChyYykKJiM0MzsJCQlyZXR1cm4gcmM7CiYjNDM7CX0KJiM0MzsKIAlsb2NrX2RldmljZV9ob3RwbHVnKCk7CiAKIAlyZXMgPSByZWdpc3Rlcl9tZW1vcnlfcmVzb3VyY2Uoc3RhcnQsIHNpemUsIHJlc291cmNlX25hbWUpOwpAQCAtMTcwMSwxMCAmIzQzOzE3MjgsNDEgQEAgaW50IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLAogCiBvdXRfdW5sb2NrOgogCXVubG9ja19kZXZpY2VfaG90cGx1ZygpOwomIzQzOwlpZiAocmMgJmx0OyAwICZhbXA7JmFtcDsgbnApCiYjNDM7CQlub2RlX3ByaXZhdGVfdW5yZWdpc3RlcihyZWFsX25pZCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQsICYjMzQ7a21lbSYjMzQ7KTsKIAomIzQzOy8qKgomIzQzOyAqIGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZCAtIGFkZCBwcml2YXRlIGRyaXZlci1tYW5hZ2VkIG1lbW9yeQomIzQzOyAqIEBuaWQ6IE5VTUEgbm9kZSBJRCB3aGVyZSB0aGUgbWVtb3J5IHdpbGwgYmUgYWRkZWQKJiM0MzsgKiBAc3RhcnQ6IFN0YXJ0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSByYW5nZQomIzQzOyAqIEBzaXplOiBTaXplIG9mIHRoZSBtZW1vcnkgcmFuZ2UgaW4gYnl0ZXMKJiM0MzsgKiBAcmVzb3VyY2VfbmFtZTogUmVzb3VyY2UgbmFtZSBpbiBmb3JtYXQgJiMzNDtTeXN0ZW0gUkFNICgkRFJJVkVSKSYjMzQ7CiYjNDM7ICogQG1ocF9mbGFnczogTWVtb3J5IGhvdHBsdWcgZmxhZ3MKJiM0MzsgKiBAb25saW5lX3R5cGU6IEF1dG8tT25saW5lIGJlaGF2aW9yIChvZmZsaW5lLCBvbmxpbmUsIGtlcm5lbCwgbW92YWJsZSkKJiM0MzsgKiBAbnA6IHByaXZhdGUgbm9kZSBjb250ZXh0IGZvciB0aGUgb3duZXIgLSBtYW5kYXRvcnkuCiYjNDM7ICoKJiM0MzsgKiBBZGQgcHJpdmF0ZSBkcml2ZXItbWFuYWdlZCBtZW1vcnkuICBQcml2YXRlIG5vZGUgY29udGV4dCBpcyByZXF1aXJlZCB0bwomIzQzOyAqIGF2b2lkIHRoZSBtZW1vcnkgYmVpbmcgYWRkZWQgYXMgYSBub3JtYWwgTl9NRU1PUlkgbm9kZS4KJiM0MzsgKgomIzQzOyAqIFNlZSBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQgZm9yIG1vcmUgZGV0YWlscy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiYjNDM7ICovCiYjNDM7aW50IGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLAomIzQzOwkJCQkgICAgICBjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lLCBtaHBfdCBtaHBfZmxhZ3MsCiYjNDM7CQkJCSAgICAgIGVudW0gbW1vcCBvbmxpbmVfdHlwZSwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApCiYjNDM7ewomIzQzOwlpZiAoIW5wKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CXJldHVybiBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQobmlkLCBzdGFydCwgc2l6ZSwgcmVzb3VyY2VfbmFtZSwKJiM0MzsJCQkJCSAgIG1ocF9mbGFncywgb25saW5lX3R5cGUsIG5wKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKTsKJiM0MzsKIC8qKgogICogYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZCAtIGFkZCBkcml2ZXItbWFuYWdlZCBtZW1vcnkKICAqIEBuaWQ6IE5VTUEgbm9kZSBJRCB3aGVyZSB0aGUgbWVtb3J5IHdpbGwgYmUgYWRkZWQKQEAgLTE3MjUsNyAmIzQzOzE3ODMsNyBAQCBpbnQgYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLAogewogCXJldHVybiBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQobmlkLCBzdGFydCwgc2l6ZSwgcmVzb3VyY2VfbmFtZSwKIAkJCW1ocF9mbGFncywKLQkJCW1ocF9nZXRfZGVmYXVsdF9vbmxpbmVfdHlwZSgpKTsKJiM0MzsJCQltaHBfZ2V0X2RlZmF1bHRfb25saW5lX3R5cGUoKSwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKTsKIApAQCAtMTg0MywxMSAmIzQzOzE5MDEsMTIgQEAgc3RhdGljIGludCBzY2FuX21vdmFibGVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKJiM0MztzdGF0aWMgaW50IGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKIHsKIAlzdHJ1Y3QgZm9saW8gKmZvbGlvOwogCXVuc2lnbmVkIGxvbmcgcGZuOwogCUxJU1RfSEVBRChzb3VyY2UpOwomIzQzOwlpbnQgZXJyID0gMDsKIAlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShtaWdyYXRlX3JzLCBERUZBVUxUX1JBVEVMSU1JVF9JTlRFUlZBTCwKIAkJCQkgICAgICBERUZBVUxUX1JBVEVMSU1JVF9CVVJTVCk7CiAKQEAgLTE4ODQsNiAmIzQzOzE5NDMsMTUgQEAgc3RhdGljIHZvaWQgZG9fbWlncmF0ZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQogCQkJZ290byBwdXRfZm9saW87CiAJCX0KIAomIzQzOwkJLyogRmFpbCBvdXRyaWdodCBvbiBwcml2YXRlIG5vZGVzIHcvbyBob3R1bnBsdWcgc3VwcG9ydCAqLwomIzQzOwkJaWYgKCFub2RlX2FsbG93c19ob3R1bnBsdWcoZm9saW9fbmlkKGZvbGlvKSkpIHsKJiM0MzsJCQlwcl9pbmZvX3JhdGVsaW1pdGVkKCYjMzQ7bWVtb3J5IG9mZmxpbmUgcmVmdXNlZDogbm9kZSAlZCBwZm4gJWx4XG4mIzM0OywKJiM0MzsJCQkJCSAgICBmb2xpb19uaWQoZm9saW8pLCBwZm4pOwomIzQzOwkJCWZvbGlvX3B1dChmb2xpbyk7CiYjNDM7CQkJZXJyID0gLUVCVVNZOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwogCQlpZiAoIWlzb2xhdGVfZm9saW9fdG9fbGlzdChmb2xpbywgJmFtcDtzb3VyY2UpKSB7CiAJCQlpZiAoX19yYXRlbGltaXQoJmFtcDttaWdyYXRlX3JzKSkgewogCQkJCXByX3dhcm4oJiMzNDtmYWlsZWQgdG8gaXNvbGF0ZSBwZm4gJWx4XG4mIzM0OywKQEAgLTE5MzEsNiAmIzQzOzE5OTksNyBAQCBzdGF0aWMgdm9pZCBkb19taWdyYXRlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiAJCQlwdXRiYWNrX21vdmFibGVfcGFnZXMoJmFtcDtzb3VyY2UpOwogCQl9CiAJfQomIzQzOwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBjbWRsaW5lX3BhcnNlX21vdmFibGVfbm9kZShjaGFyICpwKQpAQCAtMjAyOSw3ICYjNDM7MjA5OCw3IEBAIGludCBvZmZsaW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB0aGUgbm9kZSB3aWxsIGhhdmUgbm8gcHJlc2VudCBwYWdlcyBhZnRlciB3ZSBvZmZsaW5lCiAJICogJiMzOTtucl9wYWdlcyYjMzk7IG1vcmUuIElmIHNvLCB3ZSBrbm93IHRoYXQgdGhlIG5vZGUgd2lsbCBiZWNvbWUgZW1wdHksIGFuZAotCSAqIHNvIHdlIHdpbGwgY2xlYXIgTl9NRU1PUlkgZm9yIGl0LgomIzQzOwkgKiBzbyB3ZSB3aWxsIGNsZWFyIE5fTUVNT1JZKF9QUklWQVRFKSBmb3IgaXQuCiAJICovCiAJaWYgKG5yX3BhZ2VzICZndDs9IHBnZGF0LSZndDtub2RlX3ByZXNlbnRfcGFnZXMpIHsKIAkJbm9kZV9hcmcubmlkID0gbm9kZTsKQEAgLTIwNjcsMTAgJiM0MzsyMTM2LDExIEBAIGludCBvZmZsaW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAogCQkJcmV0ID0gc2Nhbl9tb3ZhYmxlX3BhZ2VzKHBmbiwgZW5kX3BmbiwgJmFtcDtwZm4pOwogCQkJaWYgKCFyZXQpIHsKIAkJCQkvKgotCQkJCSAqIFRPRE86IGZhdGFsIG1pZ3JhdGlvbiBmYWlsdXJlcyBzaG91bGQgYmFpbAotCQkJCSAqIG91dAomIzQzOwkJCQkgKiBBIGZhdGFsIG1pZ3JhdGlvbiBmYWlsdXJlIChlLmcuIGEgZm9saW8gb24gYQomIzQzOwkJCQkgKiBub24tbWlncmF0YWJsZSBwcml2YXRlIG5vZGUpIGJhaWxzIG91dDsgdHJhbnNpZW50CiYjNDM7CQkJCSAqIGZhaWx1cmVzIGxlYXZlIHJldCB6ZXJvIGFuZCBhcmUgcmV0cmllZCBiZWxvdy4KIAkJCQkgKi8KLQkJCQlkb19taWdyYXRlX3JhbmdlKHBmbiwgZW5kX3Bmbik7CiYjNDM7CQkJCXJldCA9IGRvX21pZ3JhdGVfcmFuZ2UocGZuLCBlbmRfcGZuKTsKIAkJCX0KIAkJfSB3aGlsZSAoIXJldCk7CiAKQEAgLTIxMzMsOCAmIzQzOzIyMDMsMTAgQEAgaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCiAJICogTWFrZSBzdXJlIHRvIG1hcmsgdGhlIG5vZGUgYXMgbWVtb3J5LWxlc3MgYmVmb3JlIHJlYnVpbGRpbmcgdGhlIHpvbmUKIAkgKiBsaXN0LiBPdGhlcndpc2UgdGhpcyBub2RlIHdvdWxkIHN0aWxsIGFwcGVhciBpbiB0aGUgZmFsbGJhY2sgbGlzdHMuCiAJICovCi0JaWYgKG5vZGVfYXJnLm5pZCAmZ3Q7PSAwKQomIzQzOwlpZiAobm9kZV9hcmcubmlkICZndDs9IDApIHsKIAkJbm9kZV9jbGVhcl9zdGF0ZShub2RlLCBOX01FTU9SWSk7CiYjNDM7CQlub2RlX2NsZWFyX3N0YXRlKG5vZGUsIE5fTUVNT1JZX1BSSVZBVEUpOwomIzQzOwl9CiAJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkgewogCQl6b25lX3BjcF9yZXNldCh6b25lKTsKIAkJYnVpbGRfYWxsX3pvbmVsaXN0cyhOVUxMKTsKQEAgLTIxOTgsNiAmIzQzOzIyNzAsMTUgQEAgc3RhdGljIGludCBjb3VudF9tZW1vcnlfcmFuZ2VfYWx0bWFwc19jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZykKIAlyZXR1cm4gMDsKIH0KIAomIzQzO3N0YXRpYyBpbnQgY29sbGVjdF9tZW1ibG9ja19ub2Rlc19jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CW5vZGVtYXNrX3QgKm5vZGVzID0gYXJnOwomIzQzOwomIzQzOwlpZiAobWVtLSZndDtuaWQgIT0gTlVNQV9OT19OT0RFKQomIzQzOwkJbm9kZV9zZXQobWVtLSZndDtuaWQsICpub2Rlcyk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgY2hlY2tfY3B1X29uX25vZGUoaW50IG5pZCkKIHsKIAlpbnQgY3B1OwpAQCAtMjQ2MSwxMCAmIzQzOzI1NDIsMTEgQEAgRVhQT1JUX1NZTUJPTF9HUEwob2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeSk7CiBpbnQgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMoY29uc3Qgc3RydWN0IHJhbmdlICpyYW5nZXMsCiAJCXVuc2lnbmVkIGludCBucl9yYW5nZXMpCiB7CiYjNDM7CW5vZGVtYXNrX3Qgbm9kZXMgPSBOT0RFX01BU0tfTk9ORTsKIAl1bnNpZ25lZCBsb25nIG1iX2NvdW50ID0gMDsKIAl1aW50OF90ICpvbmxpbmVfdHlwZXMsICp0bXA7CiAJdW5zaWduZWQgaW50IGk7Ci0JaW50IHJjID0gMDsKJiM0MzsJaW50IG5pZCwgcmMgPSAwOwogCiAJaWYgKCFyYW5nZXMgfHwgIW5yX3JhbmdlcykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNDkyLDYgJiM0MzsyNTc0LDExIEBAIGludCBvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5X3Jhbmdlcyhjb25zdCBzdHJ1Y3QgcmFuZ2UgKnJhbmdlcywKIAogCWxvY2tfZGV2aWNlX2hvdHBsdWcoKTsKIAomIzQzOwkvKiBSZWNvcmQgdGhlIG5vZGVzIGZvciB0aGUgYmxvY2tzIHRvIGRyb3AgcHJpdmF0ZS1ub2RlIGRhdGEgYWZ0ZXIgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3JhbmdlczsgaSYjNDM7JiM0MzspCiYjNDM7CQl3YWxrX21lbW9yeV9ibG9ja3MocmFuZ2VzW2ldLnN0YXJ0LCByYW5nZV9sZW4oJmFtcDtyYW5nZXNbaV0pLAomIzQzOwkJCQkgICAmYW1wO25vZGVzLCBjb2xsZWN0X21lbWJsb2NrX25vZGVzX2NiKTsKJiM0MzsKIAkvKgogCSAqIFBoYXNlIDE6IG9mZmxpbmUgZXZlcnkgYmxvY2sgaW4gZXZlcnkgcmFuZ2UuICBBbiBhbHJlYWR5LW9mZmxpbmUKIAkgKiBibG9jayBmb2xkcyB0byBzdWNjZXNzLCBzbyBvdXQtb2YtYmFuZCBvZmZsaW5pbmcgbmV2ZXIgYmxvY2tzIHVucGx1Zy4KQEAgLTI1MjIsNiAmIzQzOzI2MDksMTAgQEAgaW50IG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzKGNvbnN0IHN0cnVjdCByYW5nZSAqcmFuZ2VzLAogb3V0X3VubG9jazoKIAl1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTsKIAomIzQzOwkvKiBEcm9wIHByaXZhdGUgbm9kZSByZWdpc3RyYXRpb24gaWYgdGhleSBhcmUgbm93IG1lbW9yeWxlc3MgKi8KJiM0MzsJZm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgbm9kZXMpCiYjNDM7CQlub2RlX3ByaXZhdGVfdW5yZWdpc3RlcihuaWQpOwomIzQzOwogCWtmcmVlKG9ubGluZV90eXBlcyk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCA1NzIwZjdmNTRkOTQyZi4uMjNjNGMyNTA5NzQ1MDQgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbXBvbGljeS5jCkBAIC0xMTEsNiAmIzQzOzExMSw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbW11X25vdGlmaWVyLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcHJpbnRrLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbGVhZm9wcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ub2RlX3ByaXZhdGUuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9nY2QuaCZndDsKIAogI2luY2x1ZGUgJmx0O2FzbS90bGJmbHVzaC5oJmd0OwpAQCAtNDA1LDcgJiM0Mzs0MDYsNyBAQCBzdGF0aWMgaW50IG1wb2xfbmV3X3ByZWZlcnJlZChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKQogc3RhdGljIGludCBtcG9sX3NldF9ub2RlbWFzayhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsCiAJCSAgICAgY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMsIHN0cnVjdCBub2RlbWFza19zY3JhdGNoICpuc2MpCiB7Ci0JaW50IHJldDsKJiM0MzsJaW50IHJldCwgbmlkOwogCiAJLyoKIAkgKiBEZWZhdWx0IChwb2w9PU5VTEwpIHJlc3AuIGxvY2FsIG1lbW9yeSBwb2xpY2llcyBhcmUgbm90IGEKQEAgLTQzMSw2ICYjNDM7NDMyLDIzIEBAIHN0YXRpYyBpbnQgbXBvbF9zZXRfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLAogCWVsc2UKIAkJcG9sLSZndDt3LmNwdXNldF9tZW1zX2FsbG93ZWQgPSBjcHVzZXRfY3VycmVudF9tZW1zX2FsbG93ZWQ7CiAKJiM0MzsJLyoKJiM0MzsJICogUHJpdmF0ZSBub2RlcyBhcmUgbm90IGluIGNwdXNldC5tZW1zLCBzbyB0aGV5JiMzOTtyZSBhbHdheXMgc3RyaXBwZWQuCiYjNDM7CSAqIERyaXZlci1hbGxvY2F0ZWQgcG9saWNpZXMgKE1QT0xfRl9QUklWQVRFKSBhbmQgQ0FQX1VTRVJfTlVNQSBwcml2YXRlCiYjNDM7CSAqIG5vZGVzIHNob3VsZCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIG5vZGVtYXNrLgomIzQzOwkgKi8KJiM0MzsJZm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgKm5vZGVzKSB7CiYjNDM7CQlpZiAoIW5vZGVfaXNfcHJpdmF0ZShuaWQpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJaWYgKChwb2wtJmd0O2ZsYWdzICZhbXA7IE1QT0xfRl9QUklWQVRFKSB8fAomIzQzOwkJICAgIG5vZGVfYWxsb3dzX3VzZXJfbnVtYShuaWQpKQomIzQzOwkJCW5vZGVfc2V0KG5pZCwgbnNjLSZndDttYXNrMik7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogSWYgYW55IHByaXZhdGUgbm9kZXMgbGVmdCBpbiB0aGUgbm9kZW1hc2sgLSBhZGQgdGhlIHByaXZhdGUgZmxhZyAqLwomIzQzOwlpZiAobm9kZXNfaW50ZXJzZWN0cyhuc2MtJmd0O21hc2syLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSkpCiYjNDM7CQlwb2wtJmd0O2ZsYWdzIHw9IE1QT0xfRl9QUklWQVRFOwomIzQzOwogCXJldCA9IG1wb2xfb3BzW3BvbC0mZ3Q7bW9kZV0uY3JlYXRlKHBvbCwgJmFtcDtuc2MtJmd0O21hc2syKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDk2LDcgJiM0Mzs1MTQsNyBAQCB2b2lkIF9fbXBvbF9wdXQoc3RydWN0IG1lbXBvbGljeSAqcG9sKQogCSAqLwogCWtmcmVlX3JjdShwb2wsIHJjdSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKF9fbXBvbF9wdXQsICYjMzQ7a3ZtJiMzNDspOwomIzQzO0VYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMoX19tcG9sX3B1dCwgJiMzNDtrdm0sa21lbSYjMzQ7KTsKIAogc3RhdGljIHZvaWQgbXBvbF9yZWJpbmRfZGVmYXVsdChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKQogewpAQCAtNTA0LDIyICYjNDM7NTIyLDMzIEBAIHN0YXRpYyB2b2lkIG1wb2xfcmViaW5kX2RlZmF1bHQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBjb25zdCBub2RlbWFza190ICpub2RlcykKIAogc3RhdGljIHZvaWQgbXBvbF9yZWJpbmRfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLCBjb25zdCBub2RlbWFza190ICpub2RlcykKIHsKLQlub2RlbWFza190IHRtcDsKJiM0MzsJbm9kZW1hc2tfdCB0bXAsIHByaXY7CiYjNDM7CiYjNDM7CS8qIHByZXNlcnZlIG9ubGluZSBwcml2YXRlIG5vZGVzIHRvIHJlLWFkZCBsYXRlciAqLwomIzQzOwlub2Rlc19hbmQocHJpdiwgcG9sLSZndDtub2Rlcywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pOwogCiAJaWYgKHBvbC0mZ3Q7ZmxhZ3MgJmFtcDsgTVBPTF9GX1NUQVRJQ19OT0RFUykKIAkJbm9kZXNfYW5kKHRtcCwgcG9sLSZndDt3LnVzZXJfbm9kZW1hc2ssICpub2Rlcyk7Ci0JZWxzZSBpZiAocG9sLSZndDtmbGFncyAmYW1wOyBNUE9MX0ZfUkVMQVRJVkVfTk9ERVMpCi0JCW1wb2xfcmVsYXRpdmVfbm9kZW1hc2soJmFtcDt0bXAsICZhbXA7cG9sLSZndDt3LnVzZXJfbm9kZW1hc2ssIG5vZGVzKTsKLQllbHNlIHsKJiM0MzsJZWxzZSBpZiAocG9sLSZndDtmbGFncyAmYW1wOyBNUE9MX0ZfUkVMQVRJVkVfTk9ERVMpIHsKJiM0MzsJCS8qIGZvbGQgb25seSB0aGUgcHVibGljIHBhcnQ6IGEgcHJpdmF0ZSBub2RlIG11c3Qgbm90IHRha2UgYSBzbG90ICovCiYjNDM7CQlub2Rlc19hbmQodG1wLCBwb2wtJmd0O3cudXNlcl9ub2RlbWFzaywgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKTsKJiM0MzsJCW1wb2xfcmVsYXRpdmVfbm9kZW1hc2soJmFtcDt0bXAsICZhbXA7dG1wLCBub2Rlcyk7CiYjNDM7CX0gZWxzZSB7CiAJCW5vZGVzX3JlbWFwKHRtcCwgcG9sLSZndDtub2RlcywgcG9sLSZndDt3LmNwdXNldF9tZW1zX2FsbG93ZWQsCiAJCQkJCQkJCSpub2Rlcyk7CiAJCXBvbC0mZ3Q7dy5jcHVzZXRfbWVtc19hbGxvd2VkID0gKm5vZGVzOwogCX0KIAotCWlmIChub2Rlc19lbXB0eSh0bXApKQomIzQzOwkvKiBwcml2YXRlIG5vZGVzIGFyZSBpZGVudGl0eS1tYXBwZWQgZHVyaW5nIHJlbWFwLCBkcm9wIHRoZW0gaGVyZSAqLwomIzQzOwlub2Rlc19hbmQodG1wLCB0bXAsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSk7CiYjNDM7CWlmIChub2Rlc19lbXB0eSh0bXApICZhbXA7JmFtcDsgbm9kZXNfZW1wdHkocHJpdikpCiAJCXRtcCA9ICpub2RlczsKIAotCXBvbC0mZ3Q7bm9kZXMgPSB0bXA7CiYjNDM7CS8qIElmIGFueSBvbmxpbmUgcHJpdmF0ZSBub2RlcyByZW1haW4sIGFkZCB0aGVtIGJhY2sgKi8KJiM0MzsJbm9kZXNfb3IocG9sLSZndDtub2RlcywgdG1wLCBwcml2KTsKJiM0MzsJLyogSWYgbm8gb25saW5lIHByaXZhdGUgbm9kZXMgcmVtYWluLCBzdHJpcCB0aGUgcHJpdmF0ZSBmbGFnICovCiYjNDM7CWlmIChub2Rlc19lbXB0eShwcml2KSkKJiM0MzsJCXBvbC0mZ3Q7ZmxhZ3MgJmFtcDs9IH5NUE9MX0ZfUFJJVkFURTsKIH0KIAogc3RhdGljIHZvaWQgbXBvbF9yZWJpbmRfcHJlZmVycmVkKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwKQEAgLTY2OCw2ICYjNDM7Njk3LDggQEAgc3RhdGljIHZvaWQgcXVldWVfZm9saW9zX3BtZChwbWRfdCAqcG1kLCBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKIAl9CiAJaWYgKCFxdWV1ZV9mb2xpb19yZXF1aXJlZChmb2xpbywgcXApKQogCQlyZXR1cm47CiYjNDM7CWlmICghbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKQomIzQzOwkJcmV0dXJuOwogCWlmICghKHFwLSZndDtmbGFncyAmYW1wOyAoTVBPTF9NRl9NT1ZFIHwgTVBPTF9NRl9NT1ZFX0FMTCkpIHx8CiAJICAgICF2bWFfbWlncmF0YWJsZSh3YWxrLSZndDt2bWEpIHx8CiAJICAgICFtaWdyYXRlX2ZvbGlvX2FkZChmb2xpbywgcXAtJmd0O3BhZ2VsaXN0LCBxcC0mZ3Q7ZmxhZ3MpKQpAQCAtNzIyLDcgJiM0Mzs3NTMsOCBAQCBzdGF0aWMgaW50IHF1ZXVlX2ZvbGlvc19wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJY29udGludWU7CiAJCX0KIAkJZm9saW8gPSB2bV9ub3JtYWxfZm9saW8odm1hLCBhZGRyLCBwdGVudCk7Ci0JCWlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKQomIzQzOwkJaWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHwKJiM0MzsJCSAgICAhbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKQogCQkJY29udGludWU7CiAJCWlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSAmYW1wOyZhbXA7IG1heF9uciAhPSAxKQogCQkJbnIgPSBmb2xpb19wdGVfYmF0Y2goZm9saW8sIHB0ZSwgcHRlbnQsIG1heF9ucik7CkBAIC03OTcsNiAmIzQzOzgyOSw4IEBAIHN0YXRpYyBpbnQgcXVldWVfZm9saW9zX2h1Z2V0bGIocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBobWFzaywKIAlmb2xpbyA9IHBmbl9mb2xpbyhwdGVfcGZuKHB0ZXApKTsKIAlpZiAoIXF1ZXVlX2ZvbGlvX3JlcXVpcmVkKGZvbGlvLCBxcCkpCiAJCWdvdG8gdW5sb2NrOwomIzQzOwlpZiAoIW5vZGVfYWxsb3dzX3VzZXJfbnVtYShmb2xpb19uaWQoZm9saW8pKSkKJiM0MzsJCWdvdG8gdW5sb2NrOwogCWlmICghKGZsYWdzICZhbXA7IChNUE9MX01GX01PVkUgfCBNUE9MX01GX01PVkVfQUxMKSkgfHwKIAkgICAgIXZtYV9taWdyYXRhYmxlKHdhbGstJmd0O3ZtYSkpIHsKIAkJcXAtJmd0O25yX2ZhaWxlZCYjNDM7JiM0Mzs7CkBAIC04NDAsNyAmIzQzOzg3NCw3IEBAIGJvb2wgZm9saW9fY2FuX21hcF9wcm90X251bWEoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiB7CiAJaW50IG5pZDsKIAotCWlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8IGZvbGlvX3Rlc3Rfa3NtKGZvbGlvKSkKJiM0MzsJaWYgKCFmb2xpbyB8fCAhZm9saW9fYWxsb3dzX251bWFfYmFsYW5jZShmb2xpbykgfHwgZm9saW9fdGVzdF9rc20oZm9saW8pKQogCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBBbHNvIHNraXAgc2hhcmVkIGNvcHktb24td3JpdGUgZm9saW9zICovCkBAIC0xMTA2LDYgJiM0MzsxMTQwLDkyIEBAIHN0YXRpYyBsb25nIGRvX3NldF9tZW1wb2xpY3kodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsCiAJcmV0dXJuIHJldDsKIH0KIAomIzQzOy8qCiYjNDM7ICogQnVpbGQgYSByZWZjb3VudGVkIE1QT0xfQklORCBwb2xpY3kgdGFyZ2V0aW5nIHRoZSBzaW5nbGUgbm9kZSBAbmlkLAomIzQzOyAqIGNvbnRleHR1YWxpc2VkIHRvIHRoZSBjYWxsZXImIzM5O3MgY3B1c2V0IGxpa2UgYSB1c2Vyc3BhY2UgbWJpbmQoKS4KJiM0MzsgKgomIzQzOyAqIEBmbGFncyBpcyBNUE9MX0ZfUFJJVkFURSBmb3IgdGhlIGFuIGV4cGxpY2l0IGluLWtlcm5lbCB1c2VyLCBsZXR0aW5nCiYjNDM7ICogYSBwcml2YXRlIG5vZGUgYmUgYm91bmQgd2l0aG91dCBjaGVja2luZyBDQVBfVVNFUl9OVU1BLiAgT3RoZXJ3aXNlLAomIzQzOyAqIENBUF9VU0VSX05VTUEgaXMgZW5mb3JjZWQuCiYjNDM7ICoKJiM0MzsgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICpfX21wb2xfYmluZF9ub2RlKGludCBuaWQsIHVuc2lnbmVkIHNob3J0IGZsYWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbXBvbGljeSAqcG9sOwomIzQzOwlub2RlbWFza190IG5vZGVzOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlOT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpOwomIzQzOwomIzQzOwlpZiAoIXNjcmF0Y2gpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKJiM0MzsKJiM0MzsJbm9kZXNfY2xlYXIobm9kZXMpOwomIzQzOwlub2RlX3NldChuaWQsIG5vZGVzKTsKJiM0MzsKJiM0MzsJcG9sID0gbXBvbF9uZXcoTVBPTF9CSU5ELCBmbGFncywgJmFtcDtub2Rlcyk7CiYjNDM7CWlmIChJU19FUlIocG9sKSkgewomIzQzOwkJTk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpOwomIzQzOwkJcmV0dXJuIHBvbDsKJiM0MzsJfQomIzQzOwomIzQzOwllcnIgPSBtcG9sX3NldF9ub2RlbWFzayhwb2wsICZhbXA7bm9kZXMsIHNjcmF0Y2gpOwomIzQzOwlOT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7CiYjNDM7CWlmIChlcnIpIHsKJiM0MzsJCW1wb2xfcHV0KHBvbCk7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUihlcnIpOwomIzQzOwl9CiYjNDM7CXJldHVybiBwb2w7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIG1wb2xfcHJpdmF0ZV9iaW5kIC0gYnVpbGQgYW4gTVBPTF9CSU5EIHBvbGljeSBwaW5uZWQgdG8gYSBwcml2YXRlIG5vZGUKJiM0MzsgKiBAbmlkOiBhbiBOX01FTU9SWV9QUklWQVRFIG5vZGUKJiM0MzsgKgomIzQzOyAqIFJldHVybnMgYSByZWZjb3VudGVkIG1lbXBvbGljeSB0aGF0IGJpbmRzIGFsbG9jYXRpb25zIHRvIEBuaWQgd2l0aCB0aGUKJiM0MzsgKiBwcml2YXRlLXBsYWNlbWVudCBpbnRlbnQgKE1QT0xfRl9QUklWQVRFKS4gIFRoaXMgYmluZHMgdG8gQG5pZCByZWdhcmRsZXNzCiYjNDM7ICogb2YgdGhlIG5vZGUmIzM5O3MgQ0FQX1VTRVJfTlVNQSwgcHJvdmlkaW5nIGEgcHJpdmlsZWdlZCB3YXkgZm9yIG5vZGUtb3duZXJzCiYjNDM7ICogdG8gYmluZCBkcml2ZXIvc2VydmljZSBvd25lZCBWTUFzIHRvIHRoZSBub2RlLgomIzQzOyAqCiYjNDM7ICogTGlrZSBhbnkgTVBPTF9CSU5EIGl0IGlzIHJlbGF4YWJsZTogYW4gdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IGZhbGxzIGJhY2sKJiM0MzsgKiByYXRoZXIgdGhhbiBmYWlsaW5nLgomIzQzOyAqCiYjNDM7ICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgQG5pZCBpcyBOX01FTU9SWV9QUklWQVRFLgomIzQzOyAqCiYjNDM7ICogVGhlIGNhbGxlciBvd25zIHRoZSByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIHBvbGljeSwgb3IgYW4gRVJSX1BUUiBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0cnVjdCBtZW1wb2xpY3kgKm1wb2xfcHJpdmF0ZV9iaW5kKGludCBuaWQpCiYjNDM7ewomIzQzOwlpZiAoIW5vZGVfaXNfcHJpdmF0ZShuaWQpKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiYjNDM7CXJldHVybiBfX21wb2xfYmluZF9ub2RlKG5pZCwgTVBPTF9GX1BSSVZBVEUpOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfcHJpdmF0ZV9iaW5kLCAmIzM0O2ttZW0mIzM0Oyk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogbXBvbF9iaW5kX25vZGUgLSBidWlsZCBhbiBNUE9MX0JJTkQgcG9saWN5IHRhcmdldGluZyBAbmlkIGZvciBpbi1rZXJuZWwgdXNlCiYjNDM7ICogQG5pZDogdGhlIG5vZGUgdG8gYmluZCB0bwomIzQzOyAqCiYjNDM7ICogUmV0dXJucyBhIHJlZmNvdW50ZWQgTVBPTF9CSU5EIHBvbGljeSB0aGF0IHBsYWNlcyBhbGxvY2F0aW9ucyBvbiBAbmlkLAomIzQzOyAqIGNvbnRleHR1YWxpc2VkIHRvIHRoZSBjYWxsZXImIzM5O3MgY3B1c2V0IGV4YWN0bHkgbGlrZSBhIHVzZXJzcGFjZSBtYmluZCgpLgomIzQzOyAqCiYjNDM7ICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIHVzZWQgYnkgc2VydmljZXMgaW1wbGVudGluZyBtZW1wb2xpY3kgc3VwcG9ydCB3aXRoCiYjNDM7ICogdXNlci1wcm92aWRlZCBub2RlIGJpbmRpbmdzLiBOX01FTU9SWV9QUklWQVRFIG5vZGUgYmluZGluZ3MgYXJlIGhvbm9yZWQgaWYKJiM0MzsgKiB0aGUgbm9kZSBoYXMgQ0FQX1VTRVJfTlVNQSwgb3RoZXJ3aXNlIHJldHVybiAtRUlOVkFMLgomIzQzOyAqCiYjNDM7ICogVGhlIGNhbGxlciBvd25zIHRoZSByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogdGhlIHBvbGljeSwgb3IgYW4gRVJSX1BUUiBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO3N0cnVjdCBtZW1wb2xpY3kgKm1wb2xfYmluZF9ub2RlKGludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gX19tcG9sX2JpbmRfbm9kZShuaWQsIDApOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfYmluZF9ub2RlLCAmIzM0O2t2bSYjMzQ7KTsKJiM0MzsKIC8qCiAgKiBSZXR1cm4gbm9kZW1hc2sgZm9yIHBvbGljeSBmb3IgZ2V0X21lbXBvbGljeSgpIHF1ZXJ5CiAgKgpAQCAtMTI5NCw2ICYjNDM7MTQxNCw4IEBAIHN0YXRpYyBsb25nIG1pZ3JhdGVfdG9fbm9kZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaW50IHNvdXJjZSwgaW50IGRlc3QsCiAJCS5uaWQgPSBkZXN0LAogCQkuZ2ZwX21hc2sgPSBHRlBfSElHSFVTRVJfTU9WQUJMRSB8IF9fR0ZQX1RISVNOT0RFLAogCQkucmVhc29uID0gTVJfU1lTQ0FMTCwKJiM0MzsJCS5hbGxvY19mbGFncyA9IG5vZGVfaXNfcHJpdmF0ZShkZXN0KSA/CiYjNDM7CQkJIEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOiBBTExPQ19ERUZBVUxULAogCX07CiAKIAlub2Rlc19jbGVhcihubWFzayk7CkBAIC0xODY3LDkgJiM0MzsxOTg5LDEwIEBAIHN0YXRpYyBpbnQga2VybmVsX21pZ3JhdGVfcGFnZXMocGlkX3QgcGlkLCB1bnNpZ25lZCBsb25nIG1heG5vZGUsCiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAlub2RlbWFza190IHRhc2tfbm9kZXM7Ci0JaW50IGVycjsKJiM0MzsJbm9kZW1hc2tfdCBwcml2X29rOwogCW5vZGVtYXNrX3QgKm9sZDsKIAlub2RlbWFza190ICpuZXc7CiYjNDM7CWludCBlcnIsIG5pZDsKIAlOT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpOwogCiAJaWYgKCFzY3JhdGNoKQpAQCAtMTkwOSw3ICYjNDM7MjAzMiwxNCBAQCBzdGF0aWMgaW50IGtlcm5lbF9taWdyYXRlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBtYXhub2RlLAogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAomIzQzOwkvKiBQcml2YXRlIG5vZGVzIGFyZSBzdHJpcHBlZCBieSBjcHVzZXQgY2hlY2tzLiBBbGxvdyBlbGlnaWJsZSBvbmVzLiAqLwomIzQzOwlub2Rlc19jbGVhcihwcml2X29rKTsKJiM0MzsJZm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgKm5ldykKJiM0MzsJCWlmIChub2RlX2lzX3ByaXZhdGUobmlkKSAmYW1wOyZhbXA7IG5vZGVfYWxsb3dzX3VzZXJfbnVtYShuaWQpKQomIzQzOwkJCW5vZGVfc2V0KG5pZCwgcHJpdl9vayk7CiYjNDM7CiAJdGFza19ub2RlcyA9IGNwdXNldF9tZW1zX2FsbG93ZWQodGFzayk7CiYjNDM7CW5vZGVzX29yKHRhc2tfbm9kZXMsIHRhc2tfbm9kZXMsIHByaXZfb2spOwogCS8qIElzIHRoZSB1c2VyIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSB0YXJnZXQgbm9kZXM/ICovCiAJaWYgKCFub2Rlc19zdWJzZXQoKm5ldywgdGFza19ub2RlcykgJmFtcDsmYW1wOyAhY2FwYWJsZShDQVBfU1lTX05JQ0UpKSB7CiAJCWVyciA9IC1FUEVSTTsKQEAgLTE5MTcsNiAmIzQzOzIwNDcsNyBAQCBzdGF0aWMgaW50IGtlcm5lbF9taWdyYXRlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBtYXhub2RlLAogCX0KIAogCXRhc2tfbm9kZXMgPSBjcHVzZXRfbWVtc19hbGxvd2VkKGN1cnJlbnQpOwomIzQzOwlub2Rlc19vcih0YXNrX25vZGVzLCB0YXNrX25vZGVzLCBwcml2X29rKTsKIAlpZiAoIW5vZGVzX2FuZCgqbmV3LCAqbmV3LCB0YXNrX25vZGVzKSkKIAkJZ290byBvdXRfcHV0OwogCkBAIC0yMDcxLDYgJiM0MzsyMjAyLDM0IEBAIGJvb2wgdm1hX3BvbGljeV9tb2Yoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiAJcmV0dXJuIG1vZjsKIH0KIAomIzQzOy8qCiYjNDM7ICogdHJ1ZSBpZiBhbnkgcG9saWN5ICpwcml2YXRlKiBub2RlIGNhbiBzYXRpc2Z5IGEgIV9fR0ZQX01PVkFCTEUgYWxsb2NhdGlvbi4KJiM0MzsgKiBQb2xpY2llcyB3aXRob3V0IHByaXZhdGUgbm9kZXMgKH5NUE9MX0ZfUFJJVkFURSkgYWx3YXlzIHJldHVybiBmYWxzZS4KJiM0MzsgKgomIzQzOyAqIFRoaXMgcHJvdmlkZXMgYSB3YXkgZm9yIG90aGVyd2lzZS1ib3VuZCBrZXJuZWwgYWxsb2NhdGlvbnMgdG8gbWFrZSB0aGVpcgomIzQzOyAqIHdheSBvbnRvIHByaXZhdGUgbm9kZXMgd2l0aCBaT05FX05PUk1BTCBtZW1vcnkgd2l0aG91dCBoYXZpbmcgdG8gYXVkaXQKJiM0MzsgKiBldmVyeSBjYWxsZXIuICBUaGUgY29zdCBpcyBhIHpvbmUgc2NhbiBmb3IgcHJpdmF0ZSBub2RlcyBpbiB0aGUgbWFzay4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBwb2xpY3lfcHJpdmF0ZV9oYXNfa2VybmVsX3pvbmUoY29uc3Qgc3RydWN0IG1lbXBvbGljeSAqcG9sKQomIzQzO3sKJiM0MzsJaW50IG5pZDsKJiM0MzsKJiM0MzsJaWYgKCEocG9sLSZndDtmbGFncyAmYW1wOyBNUE9MX0ZfUFJJVkFURSkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWZvcl9lYWNoX25vZGVfbWFzayhuaWQsIHBvbC0mZ3Q7bm9kZXMpIHsKJiM0MzsJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKJiM0MzsJCWVudW0gem9uZV90eXBlIHp0OwomIzQzOwomIzQzOwkJaWYgKCFub2RlX2lzX3ByaXZhdGUobmlkKSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZvciAoenQgPSBaT05FX05PUk1BTDsgenQgJmx0OyBaT05FX01PVkFCTEU7IHp0JiM0MzsmIzQzOykKJiM0MzsJCQlpZiAobWFuYWdlZF96b25lKCZhbXA7cGdkYXQtJmd0O25vZGVfem9uZXNbenRdKSkKJiM0MzsJCQkJcmV0dXJuIHRydWU7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKIGJvb2wgYXBwbHlfcG9saWN5X3pvbmUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBlbnVtIHpvbmVfdHlwZSB6b25lKQogewogCWVudW0gem9uZV90eXBlIGR5bmFtaWNfcG9saWN5X3pvbmUgPSBwb2xpY3lfem9uZTsKQEAgLTIwNzgsMTQgJiM0MzsyMjM3LDIyIEBAIGJvb2wgYXBwbHlfcG9saWN5X3pvbmUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBlbnVtIHpvbmVfdHlwZSB6b25lKQogCUJVR19PTihkeW5hbWljX3BvbGljeV96b25lID09IFpPTkVfTU9WQUJMRSk7CiAKIAkvKgotCSAqIGlmIHBvbGljeS0mZ3Q7bm9kZXMgaGFzIG1vdmFibGUgbWVtb3J5IG9ubHksCi0JICogd2UgYXBwbHkgcG9saWN5IHdoZW4gZ2ZwX3pvbmUoZ2ZwKSA9IFpPTkVfTU9WQUJMRSBvbmx5LgomIzQzOwkgKiBkeW5hbWljX3BvbGljeV96b25lIGlzIHRoZSBsb3dlc3Qgem9uZSB0aGlzIHBvbGljeSBpcyBlbmZvcmNlZCBmb3IsCiYjNDM7CSAqIGFsbG9jYXRpb25zIGJlbG93IGl0IGlnbm9yZSB0aGUgbm9kZW1hc2sgYW5kIGZhbGwgYmFjayBmcmVlbHkuCiYjNDM7CSAqCiYjNDM7CSAqIElmIGFsbCBwb2xpY3ktbm9kZXMgYXJlIG1vdmFibGUtb25seSAoYWxsIFpPTkVfTU9WQUJMRSksIHJhaXNlIHRoZQomIzQzOwkgKiBkeW5hbWljX3BvbGljeV96b25lIHRvIFpPTkVfTU9WQUJMRSBzbyB0aGF0IG9ubHkgbW92YWJsZSBhbGxvY2F0aW9ucwomIzQzOwkgKiBzdGF5IGJvdW5kIC0gb3RoZXJ3aXNlIHRoaXMgd291bGQgZm9yY2Uga2VybmVsLXpvbmUgYWxsb2NhdGlvbnMKJiM0MzsJICogKGUuZy4gcGFnZSB0YWJsZXMpIG9udG8gYSB6b25lIHRoYXQgY2Fubm90IHNhdGlzZnkgdGhlbS4gIFRoaXMKJiM0MzsJICogcmVzdWx0cyBpbiBhbGxvY2F0aW9uIGZhaWx1cmUgYW5kIHJldHJ5IGxvb3AgKGxpdmVsb2NrKS4KIAkgKgotCSAqIHBvbGljeS0mZ3Q7bm9kZXMgaXMgaW50ZXJzZWN0IHdpdGggbm9kZV9zdGF0ZXNbTl9NRU1PUlldLgotCSAqIHNvIGlmIHRoZSBmb2xsb3dpbmcgdGVzdCBmYWlscywgaXQgaW1wbGllcwotCSAqIHBvbGljeS0mZ3Q7bm9kZXMgaGFzIG1vdmFibGUgbWVtb3J5IG9ubHkuCiYjNDM7CSAqIE5fSElHSF9NRU1PUlkgdGVsbHMgdXMgJiMzNDtoYXMgYSBub24tbW92YWJsZSB6b25lJiMzNDsgZm9yIG9yZGluYXJ5IG5vZGVzLgomIzQzOwkgKiBQcml2YXRlIG5vZGVzIGFyZSBkZWxpYmVyYXRlbHkgZXhjbHVkZWQgZnJvbSBOX0hJR0hfTUVNT1JZLCBzbyB3ZQomIzQzOwkgKiBuZWVkIHRvIGNoZWNrIHRoZWlyIGFjdHVhbCB6b25lcyAtIGEga2VybmVsLXpvbmVkIHByaXZhdGUgbm9kZSBjYW4KJiM0MzsJICogaG9sZCB0aGUgYWxsb2NhdGlvbiBhbmQgbXVzdCBrZWVwIHRoZSBwb2xpY3kgYXBwbGllZC4KIAkgKi8KLQlpZiAoIW5vZGVzX2ludGVyc2VjdHMocG9saWN5LSZndDtub2Rlcywgbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV0pKQomIzQzOwlpZiAoIW5vZGVzX2ludGVyc2VjdHMocG9saWN5LSZndDtub2Rlcywgbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV0pICZhbXA7JmFtcDsKJiM0MzsJICAgICFwb2xpY3lfcHJpdmF0ZV9oYXNfa2VybmVsX3pvbmUocG9saWN5KSkKIAkJZHluYW1pY19wb2xpY3lfem9uZSA9IFpPTkVfTU9WQUJMRTsKIAogCXJldHVybiB6b25lICZndDs9IGR5bmFtaWNfcG9saWN5X3pvbmU7CkBAIC0yNDA2LDcgJiM0MzsyNTczLDggQEAgYm9vbCBtZW1wb2xpY3lfaW5fb29tX2RvbWFpbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIH0KIAogc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19wcmVmZXJyZWRfbWFueShnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwKLQkJCQkJCWludCBuaWQsIG5vZGVtYXNrX3QgKm5vZGVtYXNrKQomIzQzOwkJCQkJCWludCBuaWQsIG5vZGVtYXNrX3QgKm5vZGVtYXNrLAomIzQzOwkJCQkJCXVuc2lnbmVkIGludCBhZmxhZ3MpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJZ2ZwX3QgcHJlZmVycmVkX2dmcDsKQEAgLTI0MjAsMTQgJiM0MzsyNTg4LDIxIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfcHJlZmVycmVkX21hbnkoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsCiAJcHJlZmVycmVkX2dmcCA9IGdmcCB8IF9fR0ZQX05PV0FSTjsKIAlwcmVmZXJyZWRfZ2ZwICZhbXA7PSB+KF9fR0ZQX0RJUkVDVF9SRUNMQUlNIHwgX19HRlBfTk9GQUlMKTsKIAlwYWdlID0gX19hbGxvY19mcm96ZW5fcGFnZXNfbm9wcm9mKHByZWZlcnJlZF9nZnAsIG9yZGVyLCBuaWQsIG5vZGVtYXNrLAotCQkJCQkgICBBTExPQ19ERUZBVUxUKTsKJiM0MzsJCQkJCSAgICAgYWZsYWdzKTsKIAlpZiAoIXBhZ2UpCiAJCXBhZ2UgPSBfX2FsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBOVUxMLAotCQkJCQkJICAgQUxMT0NfREVGQVVMVCk7CiYjNDM7CQkJCQkJICAgICBhZmxhZ3MpOwogCiAJcmV0dXJuIHBhZ2U7CiB9CiAKJiM0MzsvKiBBIHByaXZhdGUgcG9saWN5IGFsbG9jYXRlcyBmcm9tIHRoZSBwcml2YXRlIHpvbmVsaXN0LiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1wb2xfYWxsb2NfZmxhZ3Moc3RydWN0IG1lbXBvbGljeSAqcG9sKQomIzQzO3sKJiM0MzsJcmV0dXJuIChwb2wtJmd0O2ZsYWdzICZhbXA7IE1QT0xfRl9QUklWQVRFKSA/IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOgomIzQzOwkJCQkJICAgICAgIEFMTE9DX0RFRkFVTFQ7CiYjNDM7fQomIzQzOwogLyoqCiAgKiBhbGxvY19wYWdlc19tcG9sIC0gQWxsb2NhdGUgcGFnZXMgYWNjb3JkaW5nIHRvIE5VTUEgbWVtcG9saWN5LgogICogQGdmcDogR0ZQIGZsYWdzLgpAQCAtMjQ0MywxMSAmIzQzOzI2MTgsMTMgQEAgc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19tcG9sKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLAogewogCW5vZGVtYXNrX3QgKm5vZGVtYXNrOwogCXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwl1bnNpZ25lZCBpbnQgYWZsYWdzID0gbXBvbF9hbGxvY19mbGFncyhwb2wpOwogCiAJbm9kZW1hc2sgPSBwb2xpY3lfbm9kZW1hc2soZ2ZwLCBwb2wsIGlseCwgJmFtcDtuaWQpOwogCiAJaWYgKHBvbC0mZ3Q7bW9kZSA9PSBNUE9MX1BSRUZFUlJFRF9NQU5ZKQotCQlyZXR1cm4gYWxsb2NfcGFnZXNfcHJlZmVycmVkX21hbnkoZ2ZwLCBvcmRlciwgbmlkLCBub2RlbWFzayk7CiYjNDM7CQlyZXR1cm4gYWxsb2NfcGFnZXNfcHJlZmVycmVkX21hbnkoZ2ZwLCBvcmRlciwgbmlkLCBub2RlbWFzaywKJiM0MzsJCQkJCQkgIGFmbGFncyk7CiAKIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICZhbXA7JmFtcDsKIAkgICAgLyogZmlsdGVyICYjMzQ7aHVnZXBhZ2UmIzM0OyBhbGxvY2F0aW9uLCB1bmxlc3MgZnJvbSBhbGxvY19wYWdlcygpICovCkBAIC0yNDcxLDcgJiM0MzsyNjQ4LDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19tcG9sKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLAogCQkJICovCiAJCQlwYWdlID0gX19hbGxvY19mcm96ZW5fcGFnZXNfbm9wcm9mKAogCQkJCWdmcCB8IF9fR0ZQX1RISVNOT0RFIHwgX19HRlBfTk9SRVRSWSwgb3JkZXIsCi0JCQkJbmlkLCBOVUxMLCBBTExPQ19ERUZBVUxUKTsKJiM0MzsJCQkJbmlkLCBOVUxMLCBhZmxhZ3MpOwogCQkJaWYgKHBhZ2UgfHwgIShnZnAgJmFtcDsgX19HRlBfRElSRUNUX1JFQ0xBSU0pKQogCQkJCXJldHVybiBwYWdlOwogCQkJLyoKQEAgLTI0ODMsNyAmIzQzOzI2NjAsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmFsbG9jX3BhZ2VzX21wb2woZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsCiAJCX0KIAl9CiAKLQlwYWdlID0gX19hbGxvY19mcm96ZW5fcGFnZXNfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgbm9kZW1hc2ssIEFMTE9DX0RFRkFVTFQpOwomIzQzOwlwYWdlID0gX19hbGxvY19mcm96ZW5fcGFnZXNfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgbm9kZW1hc2ssIGFmbGFncyk7CiAKIAlpZiAodW5saWtlbHkocG9sLSZndDttb2RlID09IE1QT0xfSU5URVJMRUFWRSB8fAogCQkgICAgIHBvbC0mZ3Q7bW9kZSA9PSBNUE9MX1dFSUdIVEVEX0lOVEVSTEVBVkUpICZhbXA7JmFtcDsgcGFnZSkgewpAQCAtMjU5Miw2ICYjNDM7Mjc2OSw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfaW50ZXJsZWF2ZShnZnBfdCBnZnAsCiAJCXN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKIAkJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KQogewomIzQzOwl1bnNpZ25lZCBpbnQgYWZsYWdzID0gbXBvbF9hbGxvY19mbGFncyhwb2wpOwogCWludCBub2RlczsKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzX3Blcl9ub2RlOwogCWludCBkZWx0YTsKQEAgLTI2MDUsMTQgJiM0MzsyNzgzLDE0IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfaW50ZXJsZWF2ZShnZnBfdCBnZnAsCiAKIAlmb3IgKGkgPSAwOyBpICZsdDsgbm9kZXM7IGkmIzQzOyYjNDM7KSB7CiAJCWlmIChkZWx0YSkgewotCQkJbnJfYWxsb2NhdGVkID0gYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLAotCQkJCQlpbnRlcmxlYXZlX25vZGVzKHBvbCksIE5VTEwsCiYjNDM7CQkJbnJfYWxsb2NhdGVkID0gX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsCiYjNDM7CQkJCQlhZmxhZ3MsIGludGVybGVhdmVfbm9kZXMocG9sKSwgTlVMTCwKIAkJCQkJbnJfcGFnZXNfcGVyX25vZGUgJiM0MzsgMSwKIAkJCQkJcGFnZV9hcnJheSk7CiAJCQlkZWx0YS0tOwogCQl9IGVsc2UgewotCQkJbnJfYWxsb2NhdGVkID0gYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLAotCQkJCQlpbnRlcmxlYXZlX25vZGVzKHBvbCksIE5VTEwsCiYjNDM7CQkJbnJfYWxsb2NhdGVkID0gX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsCiYjNDM7CQkJCQlhZmxhZ3MsIGludGVybGVhdmVfbm9kZXMocG9sKSwgTlVMTCwKIAkJCQkJbnJfcGFnZXNfcGVyX25vZGUsIHBhZ2VfYXJyYXkpOwogCQl9CiAKQEAgLTI2MjcsNiAmIzQzOzI4MDUsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLAogCQlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCiAJCXN0cnVjdCBwYWdlICoqcGFnZV9hcnJheSkKIHsKJiM0MzsJdW5zaWduZWQgaW50IGFmbGFncyA9IG1wb2xfYWxsb2NfZmxhZ3MocG9sKTsKIAlzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7CiAJc3RydWN0IHRhc2tfc3RydWN0ICptZSA9IGN1cnJlbnQ7CiAJdW5zaWduZWQgaW50IGNwdXNldF9tZW1zX2Nvb2tpZTsKQEAgLTI2NjIsOCAmIzQzOzI4NDEsOCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLAogCXdlaWdodCA9IG1lLSZndDtpbF93ZWlnaHQ7CiAJaWYgKHdlaWdodCAmYW1wOyZhbXA7IG5vZGVfaXNzZXQobm9kZSwgbm9kZXMpKSB7CiAJCW5vZGVfcGFnZXMgPSBtaW4ocmVtX3BhZ2VzLCB3ZWlnaHQpOwotCQlucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGsoZ2ZwLCBub2RlLCBOVUxMLCBub2RlX3BhZ2VzLAotCQkJCQkJICBwYWdlX2FycmF5KTsKJiM0MzsJCW5yX2FsbG9jYXRlZCA9IF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBhZmxhZ3MsIG5vZGUsCiYjNDM7CQkJCQkJICBOVUxMLCBub2RlX3BhZ2VzLCBwYWdlX2FycmF5KTsKIAkJcGFnZV9hcnJheSAmIzQzOz0gbnJfYWxsb2NhdGVkOwogCQl0b3RhbF9hbGxvY2F0ZWQgJiM0Mzs9IG5yX2FsbG9jYXRlZDsKIAkJLyogaWYgdGhhdCYjMzk7cyBhbGwgdGhlIHBhZ2VzLCBubyBuZWVkIHRvIGludGVybGVhdmUgKi8KQEAgLTI3MjcsOCAmIzQzOzI5MDYsOCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLAogCQkvKiBub2RlX3BhZ2VzIGNhbiBiZSAwIGlmIGFuIGFsbG9jYXRpb24gZmFpbHMgYW5kIHJvdW5kcyA9PSAwICovCiAJCWlmICghbm9kZV9wYWdlcykKIAkJCWJyZWFrOwotCQlucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGsoZ2ZwLCBub2RlLCBOVUxMLCBub2RlX3BhZ2VzLAotCQkJCQkJICBwYWdlX2FycmF5KTsKJiM0MzsJCW5yX2FsbG9jYXRlZCA9IF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBhZmxhZ3MsIG5vZGUsCiYjNDM7CQkJCQkJICBOVUxMLCBub2RlX3BhZ2VzLCBwYWdlX2FycmF5KTsKIAkJcGFnZV9hcnJheSAmIzQzOz0gbnJfYWxsb2NhdGVkOwogCQl0b3RhbF9hbGxvY2F0ZWQgJiM0Mzs9IG5yX2FsbG9jYXRlZDsKIAkJaWYgKHRvdGFsX2FsbG9jYXRlZCA9PSBucl9wYWdlcykKQEAgLTI3NDUsMTcgJiM0MzsyOTI0LDE5IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfcHJlZmVycmVkX21hbnkoZ2ZwX3QgZ2ZwLCBpbnQgbmlkLAogCQlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCiAJCXN0cnVjdCBwYWdlICoqcGFnZV9hcnJheSkKIHsKJiM0MzsJdW5zaWduZWQgaW50IGFmbGFncyA9IG1wb2xfYWxsb2NfZmxhZ3MocG9sKTsKIAlnZnBfdCBwcmVmZXJyZWRfZ2ZwOwogCXVuc2lnbmVkIGxvbmcgbnJfYWxsb2NhdGVkID0gMDsKIAogCXByZWZlcnJlZF9nZnAgPSBnZnAgfCBfX0dGUF9OT1dBUk47CiAJcHJlZmVycmVkX2dmcCAmYW1wOz0gfihfX0dGUF9ESVJFQ1RfUkVDTEFJTSB8IF9fR0ZQX05PRkFJTCk7CiAKLQlucl9hbGxvY2F0ZWQgID0gYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YocHJlZmVycmVkX2dmcCwgbmlkLCAmYW1wO3BvbC0mZ3Q7bm9kZXMsCi0JCQkJCSAgIG5yX3BhZ2VzLCBwYWdlX2FycmF5KTsKJiM0MzsJbnJfYWxsb2NhdGVkICA9IF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YocHJlZmVycmVkX2dmcCwgYWZsYWdzLAomIzQzOwkJCQkJICAgbmlkLCAmYW1wO3BvbC0mZ3Q7bm9kZXMsIG5yX3BhZ2VzLCBwYWdlX2FycmF5KTsKIAogCWlmIChucl9hbGxvY2F0ZWQgJmx0OyBucl9wYWdlcykKLQkJbnJfYWxsb2NhdGVkICYjNDM7PSBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsIG51bWFfbm9kZV9pZCgpLCBOVUxMLAomIzQzOwkJbnJfYWxsb2NhdGVkICYjNDM7PSBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCwgYWZsYWdzLAomIzQzOwkJCQludW1hX25vZGVfaWQoKSwgTlVMTCwKIAkJCQlucl9wYWdlcyAtIG5yX2FsbG9jYXRlZCwKIAkJCQlwYWdlX2FycmF5ICYjNDM7IG5yX2FsbG9jYXRlZCk7CiAJcmV0dXJuIG5yX2FsbG9jYXRlZDsKQEAgLTI3OTEsOCAmIzQzOzI5NzIsOCBAQCB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbWVtcG9saWN5X25vcHJvZihnZnBfdCBnZnAsCiAKIAluaWQgPSBudW1hX25vZGVfaWQoKTsKIAlub2RlbWFzayA9IHBvbGljeV9ub2RlbWFzayhnZnAsIHBvbCwgTk9fSU5URVJMRUFWRV9JTkRFWCwgJmFtcDtuaWQpOwotCXJldHVybiBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsIG5pZCwgbm9kZW1hc2ssCi0JCQkJICAgICAgIG5yX3BhZ2VzLCBwYWdlX2FycmF5KTsKJiM0MzsJcmV0dXJuIF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBtcG9sX2FsbG9jX2ZsYWdzKHBvbCksIG5pZCwKJiM0MzsJCQkJCQlub2RlbWFzaywgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpOwogfQogCiBpbnQgdm1hX2R1cF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICpzcmMsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0KQpAQCAtMzI0MywyNCAmIzQzOzM0MjQsNDcgQEAgdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpCiB9CiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2hhcmVkX3BvbGljeV9pbml0LCAmIzM0O2t2bSYjMzQ7KTsKIAotaW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLAotCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbCkKJiM0MzsvKioKJiM0MzsgKiBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlIC0gaW5zdGFsbCBAcG9sIG92ZXIgW0BzdGFydCwgQGVuZCkgb2YgQHNwCiYjNDM7ICogQHNwOiAgICB0aGUgc2hhcmVkIHBvbGljeSB0cmVlCiYjNDM7ICogQHN0YXJ0OiBmaXJzdCBwYWdlIG9mZnNldCAoaW5jbHVzaXZlKQomIzQzOyAqIEBlbmQ6ICAgbGFzdCBwYWdlIG9mZnNldCAoZXhjbHVzaXZlKQomIzQzOyAqIEBwb2w6ICAgYSBmdWxseS1idWlsdCwgdmFsaWRhdGVkIHBvbGljeSwgb3IgTlVMTCB0byBjbGVhciB0aGUgcmFuZ2UKJiM0MzsgKgomIzQzOyAqIEluc3RhbGxzIEBwb2wgb3ZlciB0aGUgZ2l2ZW4gcmFuZ2UsIHJlcGxhY2luZyBhbnkgb3ZlcmxhcHBpbmcgcG9saWN5LgomIzQzOyAqIEBzcCB0YWtlcyBpdHMgb3duIHJlZmVyZW5jZSwgdGhlIGNhbGxlciByZXRhaW5zIGl0cyByZWZlcmVuY2Ugb24gQHBvbC4KJiM0MzsgKgomIzQzOyAqIFRoZSBwb2xpY3kgaXMgbm90IHJlY29uc3RydWN0ZWQsIHNvIHRoZSBwb2xpY3kgaXMgcHJlc2VydmVkIGV4YWN0bHkuCiYjNDM7ICoKJiM0MzsgKiBVbmxpa2UgbXBvbF9zZXRfc2hhcmVkX3BvbGljeSgpLCBubyBWTUEgaXMgcmVxdWlyZWQsIHNvIGEgcmFuZ2UgdGhhdAomIzQzOyAqIGlzIG5ldmVyIG1hcHBlZCBpbnRvIGEgVk1BIGNhbiBiZSBjb3ZlcmVkLCBpbmNsdWRpbmcgdGhlIHdob2xlIGZpbGUuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuCiYjNDM7ICovCiYjNDM7aW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LAomIzQzOwkJCQkgcGdvZmZfdCBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbCkKIHsKLQljb25zdCBwZ29mZl90IHBnb2ZmID0gdm1hX3N0YXJ0X3Bnb2ZmKHZtYSk7Ci0JY29uc3QgcGdvZmZfdCBwZ29mZl9lbmQgPSB2bWFfZW5kX3Bnb2ZmKHZtYSk7CiAJc3RydWN0IHNwX25vZGUgKm5ldyA9IE5VTEw7CiAJaW50IGVycjsKIAogCWlmIChwb2wpIHsKLQkJbmV3ID0gc3BfYWxsb2MocGdvZmYsIHBnb2ZmX2VuZCwgcG9sKTsKJiM0MzsJCW5ldyA9IHNwX2FsbG9jKHN0YXJ0LCBlbmQsIHBvbCk7CiAJCWlmICghbmV3KQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWVyciA9IHNoYXJlZF9wb2xpY3lfcmVwbGFjZShzcCwgcGdvZmYsIHBnb2ZmX2VuZCwgbmV3KTsKJiM0MzsJZXJyID0gc2hhcmVkX3BvbGljeV9yZXBsYWNlKHNwLCBzdGFydCwgZW5kLCBuZXcpOwogCWlmIChlcnIgJmFtcDsmYW1wOyBuZXcpCiAJCXNwX2ZyZWUobmV3KTsKIAlyZXR1cm4gZXJyOwogfQomIzQzO0VYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSwgJiMzNDtrdm0mIzM0Oyk7CiYjNDM7CiYjNDM7aW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLAomIzQzOwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpCiYjNDM7ewomIzQzOwlyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzcCwgdm1hLSZndDt2bV9wZ29mZiwKJiM0MzsJCQkJCSAgIHZtYS0mZ3Q7dm1fcGdvZmYgJiM0Mzsgdm1hX3BhZ2VzKHZtYSksIHBvbCk7CiYjNDM7fQogRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5LCAmIzM0O2t2bSYjMzQ7KTsKIAogLyogRnJlZSBhIGJhY2tpbmcgcG9saWN5IHN0b3JlIG9uIGlub2RlIGRlbGV0ZS4gKi8KZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCBhYjE1YTRkZGRkMDQ3MS4uOWMyZjQ3NGM2OTI1YjMgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9taWdyYXRlLmMKQEAgLTIyMzMsNyAmIzQzOzIyMzMsOCBAQCBzdHJ1Y3QgZm9saW8gKmFsbG9jX21pZ3JhdGlvbl90YXJnZXQoc3RydWN0IGZvbGlvICpzcmMsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSkKIAlpZiAoaXNfaGlnaG1lbV9pZHgoemlkeCkgfHwgemlkeCA9PSBaT05FX01PVkFCTEUpCiAJCWdmcF9tYXNrIHw9IF9fR0ZQX0hJR0hNRU07CiAKLQlyZXR1cm4gX19mb2xpb19hbGxvYyhnZnBfbWFzaywgb3JkZXIsIG5pZCwgbXRjLSZndDtubWFzayk7CiYjNDM7CXJldHVybiBfX2ZvbGlvX2FsbG9jKGdmcF9tYXNrLCBvcmRlciwgbmlkLCBtdGMtJmd0O25tYXNrLAomIzQzOwkJCSAgICAgbXRjLSZndDthbGxvY19mbGFncyk7CiB9CiAKICNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT04KQEAgLTIyNTUsNiAmIzQzOzIyNTYsOCBAQCBzdGF0aWMgaW50IGRvX21vdmVfcGFnZXNfdG9fbm9kZShzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlbGlzdCwgaW50IG5vZGUpCiAJCS5uaWQgPSBub2RlLAogCQkuZ2ZwX21hc2sgPSBHRlBfSElHSFVTRVJfTU9WQUJMRSB8IF9fR0ZQX1RISVNOT0RFLAogCQkucmVhc29uID0gTVJfU1lTQ0FMTCwKJiM0MzsJCS5hbGxvY19mbGFncyA9IG5vZGVfaXNfcHJpdmF0ZShub2RlKSA/CiYjNDM7CQkJIEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOiBBTExPQ19ERUZBVUxULAogCX07CiAKIAllcnIgPSBtaWdyYXRlX3BhZ2VzKHBhZ2VsaXN0LCBhbGxvY19taWdyYXRpb25fdGFyZ2V0LCBOVUxMLApAQCAtMjI3MCw3ICYjNDM7MjI3Myw4IEBAIHN0YXRpYyBpbnQgX19hZGRfZm9saW9fZm9yX21pZ3JhdGlvbihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbm9kZSwKIAlpZiAoaXNfemVyb19mb2xpbyhmb2xpbykgfHwgaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKQomIzQzOwlpZiAoZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8CiYjNDM7CSAgICAhbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWlmIChmb2xpb19uaWQoZm9saW8pID09IG5vZGUpCkBAIC0yMzk0LDExICYjNDM7MjM5OCwxNCBAQCBzdGF0aWMgaW50IGRvX3BhZ2VzX21vdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIG5vZGVtYXNrX3QgdGFza19ub2RlcywKIAkJZXJyID0gLUVOT0RFVjsKIAkJaWYgKG5vZGUgJmx0OyAwIHx8IG5vZGUgJmd0Oz0gTUFYX05VTU5PREVTKQogCQkJZ290byBvdXRfZmx1c2g7Ci0JCWlmICghbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkpCiYjNDM7CiYjNDM7CQlpZiAoIW5vZGVfYWxsb3dzX3VzZXJfbnVtYShub2RlKSkKIAkJCWdvdG8gb3V0X2ZsdXNoOwogCiAJCWVyciA9IC1FQUNDRVM7Ci0JCWlmICghbm9kZV9pc3NldChub2RlLCB0YXNrX25vZGVzKSkKJiM0MzsJCS8qIFByaXZhdGUgbm9kZXMgYXJlIG5vdCBwYXJ0aXRpb25lZCBieSBjcHVzZXQubWVtICovCiYjNDM7CQlpZiAoIW5vZGVfaXNfcHJpdmF0ZShub2RlKSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgIW5vZGVfaXNzZXQobm9kZSwgdGFza19ub2RlcykpCiAJCQlnb3RvIG91dF9mbHVzaDsKIAogCQlpZiAoY3VycmVudF9ub2RlID09IE5VTUFfTk9fTk9ERSkgewpAQCAtMjQ3OSw3ICYjNDM7MjQ4Niw5IEBAIHN0YXRpYyB2b2lkIGRvX3BhZ2VzX3N0YXRfYXJyYXkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCiAJCWlmIChmb2xpbykgewogCQkJaWYgKGlzX3plcm9fZm9saW8oZm9saW8pIHx8IGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpCiAJCQkJZXJyID0gLUVGQVVMVDsKLQkJCWVsc2UgaWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSkKJiM0MzsJCQllbHNlIGlmIChmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHwKJiM0MzsJCQkJIChmb2xpb19pc19wcml2YXRlX25vZGUoZm9saW8pICZhbXA7JmFtcDsKJiM0MzsJCQkJICAhbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKSkKIAkJCQllcnIgPSAtRU5PRU5UOwogCQkJZWxzZQogCQkJCWVyciA9IGZvbGlvX25pZChmb2xpbyk7CmRpZmYgLS1naXQgYS9tbS9tbV9pbml0LmMgYi9tbS9tbV9pbml0LmMKaW5kZXggNzExZjgyMWY3YjNjNzIuLmFkYjUwNjQ3ZDI5Y2FmIDEwMDY0NAotLS0gYS9tbS9tbV9pbml0LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbW1faW5pdC5jCkBAIC0yNzAxLDcgJiM0MzsyNzAxLDcgQEAgdm9pZCBfX2luaXQgbW1fY29yZV9pbml0KHZvaWQpCiAJaW5pdF96ZXJvX3BhZ2VfcGZuKCk7CiAKIAkvKiBJbml0aWFsaXphdGlvbnMgcmVseWluZyBvbiBTTVAgc2V0dXAgKi8KLQlCVUlMRF9CVUdfT04oTUFYX1pPTkVMSVNUUyAmZ3Q7IDIpOwomIzQzOwlCVUlMRF9CVUdfT04oTUFYX1pPTkVMSVNUUyAmZ3Q7IDQpOwogCWJ1aWxkX2FsbF96b25lbGlzdHMoTlVMTCk7CiAJcGFnZV9hbGxvY19pbml0X2NwdWhwKCk7CiAJYWxsb2NfdGFnX3NlY19pbml0KCk7CmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggMDgxNTdhODI3NzYxNmEuLjM5ZTJkMmE5Y2Q5YmNmIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vcGFnZV9hbGxvYy5jCkBAIC01MTAyLDcgJiM0Mzs1MTAyLDcgQEAgc3RhdGljIGlubGluZSBib29sIHByZXBhcmVfYWxsb2NfcGFnZXMoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlciwKIAkJdW5zaWduZWQgaW50ICphbGxvY19mbGFncykKIHsKIAlhYy0mZ3Q7aGlnaGVzdF96b25laWR4ID0gZ2ZwX3pvbmUoZ2ZwX21hc2spOwotCWFjLSZndDt6b25lbGlzdCA9IG5vZGVfem9uZWxpc3QocHJlZmVycmVkX25pZCwgZ2ZwX21hc2spOwomIzQzOwlhYy0mZ3Q7em9uZWxpc3QgPSBzZWxlY3Rfem9uZWxpc3QocHJlZmVycmVkX25pZCwgZ2ZwX21hc2ssIGFjLSZndDthbGxvY19mbGFncyk7CiAJYWMtJmd0O25vZGVtYXNrID0gbm9kZW1hc2s7CiAJYWMtJmd0O21pZ3JhdGV0eXBlID0gZ2ZwX21pZ3JhdGV0eXBlKGdmcF9tYXNrKTsKIApAQCAtNTE2NSw4ICYjNDM7NTE2NSw4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwcmVwYXJlX2FsbG9jX3BhZ2VzKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsCiAgKiBAcGFnZV9hcnJheSB3ZXJlIHNldCB0byAlTlVMTCBvbiBlbnRyeSwgdGhlIHNsb3RzIGZyb20gMCB0byB0aGUgcmV0dXJuIHZhbHVlCiAgKiAtIDEgd2lsbCBiZSBmaWxsZWQuCiAgKi8KLXVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCwKLQkJCW5vZGVtYXNrX3QgKm5vZGVtYXNrLCBpbnQgbnJfcGFnZXMsCiYjNDM7dW5zaWduZWQgbG9uZyBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzLAomIzQzOwkJCWludCBwcmVmZXJyZWRfbmlkLCBub2RlbWFza190ICpub2RlbWFzaywgaW50IG5yX3BhZ2VzLAogCQkJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KQogewogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtNTE3NCw4ICYjNDM7NTE3NCw4IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCwKIAlzdHJ1Y3Qgem9uZXJlZiAqejsKIAlzdHJ1Y3QgcGVyX2NwdV9wYWdlcyAqcGNwOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBjcF9saXN0OwotCXN0cnVjdCBhbGxvY19jb250ZXh0IGFjOwotCXVuc2lnbmVkIGludCBhbGxvY19mbGFncyA9IEFMTE9DX1dNQVJLX0xPVzsKJiM0MzsJc3RydWN0IGFsbG9jX2NvbnRleHQgYWMgPSB7IC5hbGxvY19mbGFncyA9IGFsbG9jX2ZsYWdzIH07CiYjNDM7CXVuc2lnbmVkIGludCBmYXN0cGF0aF9hbGxvY19mbGFncyA9IGFsbG9jX2ZsYWdzIHwgQUxMT0NfV01BUktfTE9XOwogCWludCBucl9wb3B1bGF0ZWQgPSAwLCBucl9hY2NvdW50ID0gMDsKIAogCS8qCkBAIC01MjE1LDcgJiM0Mzs1MjE1LDcgQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLAogCiAJLyogTWF5IHNldCBBTExPQ19OT0ZSQUdNRU5ULCBmcmFnbWVudGF0aW9uIHdpbGwgcmV0dXJuIDEgcGFnZS4gKi8KIAlnZnAgJmFtcDs9IGdmcF9hbGxvd2VkX21hc2s7Ci0JaWYgKCFwcmVwYXJlX2FsbG9jX3BhZ2VzKGdmcCwgMCwgcHJlZmVycmVkX25pZCwgbm9kZW1hc2ssICZhbXA7YWMsICZhbXA7Z2ZwLCAmYW1wO2FsbG9jX2ZsYWdzKSkKJiM0MzsJaWYgKCFwcmVwYXJlX2FsbG9jX3BhZ2VzKGdmcCwgMCwgcHJlZmVycmVkX25pZCwgbm9kZW1hc2ssICZhbXA7YWMsICZhbXA7Z2ZwLCAmYW1wO2Zhc3RwYXRoX2FsbG9jX2ZsYWdzKSkKIAkJZ290byBvdXQ7CiAKIAkvKiBGaW5kIGFuIGFsbG93ZWQgbG9jYWwgem9uZSB0aGF0IG1lZXRzIHRoZSBsb3cgd2F0ZXJtYXJrLiAqLwpAQCAtNTIyMyw3ICYjNDM7NTIyMyw3IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCwKIAlmb3JfbmV4dF96b25lX3pvbmVsaXN0X25vZGVtYXNrKHpvbmUsIHosIGFjLmhpZ2hlc3Rfem9uZWlkeCwgYWMubm9kZW1hc2spIHsKIAkJdW5zaWduZWQgbG9uZyBtYXJrOwogCi0JCWlmIChjcHVzZXRzX2VuYWJsZWQoKSAmYW1wOyZhbXA7IChhbGxvY19mbGFncyAmYW1wOyBBTExPQ19DUFVTRVQpICZhbXA7JmFtcDsKJiM0MzsJCWlmIChjcHVzZXRzX2VuYWJsZWQoKSAmYW1wOyZhbXA7IChmYXN0cGF0aF9hbGxvY19mbGFncyAmYW1wOyBBTExPQ19DUFVTRVQpICZhbXA7JmFtcDsKIAkJICAgICFfX2NwdXNldF96b25lX2FsbG93ZWQoem9uZSwgZ2ZwKSkgewogCQkJY29udGludWU7CiAJCX0KQEAgLTUyMzMsMTYgJiM0Mzs1MjMzLDE3IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCwKIAkJCWdvdG8gZmFpbGVkOwogCQl9CiAKLQkJY29uZF9hY2NlcHRfbWVtb3J5KHpvbmUsIDAsIGFsbG9jX2ZsYWdzKTsKJiM0MzsJCWNvbmRfYWNjZXB0X21lbW9yeSh6b25lLCAwLCBmYXN0cGF0aF9hbGxvY19mbGFncyk7CiByZXRyeV90aGlzX3pvbmU6Ci0JCW1hcmsgPSB3bWFya19wYWdlcyh6b25lLCBhbGxvY19mbGFncyAmYW1wOyBBTExPQ19XTUFSS19NQVNLKSAmIzQzOyBucl9wYWdlcyAtIG5yX3BvcHVsYXRlZDsKJiM0MzsJCW1hcmsgPSB3bWFya19wYWdlcyh6b25lLCBmYXN0cGF0aF9hbGxvY19mbGFncyAmYW1wOyBBTExPQ19XTUFSS19NQVNLKSAmIzQzOwomIzQzOwkJICAgICAgIG5yX3BhZ2VzIC0gbnJfcG9wdWxhdGVkOwogCQlpZiAoem9uZV93YXRlcm1hcmtfZmFzdCh6b25lLCAwLCAgbWFyaywKIAkJCQl6b25lbGlzdF96b25lX2lkeChhYy5wcmVmZXJyZWRfem9uZXJlZiksCi0JCQkJYWxsb2NfZmxhZ3MsIGdmcCkpIHsKJiM0MzsJCQkJZmFzdHBhdGhfYWxsb2NfZmxhZ3MsIGdmcCkpIHsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGNvbmRfYWNjZXB0X21lbW9yeSh6b25lLCAwLCBhbGxvY19mbGFncykpCiYjNDM7CQlpZiAoY29uZF9hY2NlcHRfbWVtb3J5KHpvbmUsIDAsIGZhc3RwYXRoX2FsbG9jX2ZsYWdzKSkKIAkJCWdvdG8gcmV0cnlfdGhpc196b25lOwogCiAJCS8qIFRyeSBhZ2FpbiBpZiB6b25lIGhhcyBkZWZlcnJlZCBwYWdlcyAqLwpAQCAtNTI3NCw3ICYjNDM7NTI3NSw3IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCwKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJcGFnZSA9IF9fcm1xdWV1ZV9wY3BsaXN0KHpvbmUsIDAsIGFjLm1pZ3JhdGV0eXBlLCBhbGxvY19mbGFncywKJiM0MzsJCXBhZ2UgPSBfX3JtcXVldWVfcGNwbGlzdCh6b25lLCAwLCBhYy5taWdyYXRldHlwZSwgZmFzdHBhdGhfYWxsb2NfZmxhZ3MsCiAJCQkJCQkJCXBjcCwgcGNwX2xpc3QpOwogCQlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CiAJCQkvKiBUcnkgYW5kIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBwYWdlICovCkBAIC01MzAwLDExICYjNDM7NTMwMSwxOSBAQCB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsCiAJcmV0dXJuIG5yX3BvcHVsYXRlZDsKIAogZmFpbGVkOgotCXBhZ2UgPSBfX2FsbG9jX3BhZ2VzX25vcHJvZihnZnAsIDAsIHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrLCBBTExPQ19ERUZBVUxUKTsKJiM0MzsJcGFnZSA9IF9fYWxsb2NfcGFnZXNfbm9wcm9mKGdmcCwgMCwgcHJlZmVycmVkX25pZCwgbm9kZW1hc2ssIGFsbG9jX2ZsYWdzKTsKIAlpZiAocGFnZSkKIAkJcGFnZV9hcnJheVtucl9wb3B1bGF0ZWQmIzQzOyYjNDM7XSA9IHBhZ2U7CiAJZ290byBvdXQ7CiB9CiYjNDM7CiYjNDM7dW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLAomIzQzOwkJCW5vZGVtYXNrX3QgKm5vZGVtYXNrLCBpbnQgbnJfcGFnZXMsCiYjNDM7CQkJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KQomIzQzO3sKJiM0MzsJcmV0dXJuIF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBBTExPQ19ERUZBVUxULCBwcmVmZXJyZWRfbmlkLAomIzQzOwkJCQkJIG5vZGVtYXNrLCBucl9wYWdlcywgcGFnZV9hcnJheSk7CiYjNDM7fQogRVhQT1JUX1NZTUJPTF9HUEwoYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YpOwogCiAvKgpAQCAtNTM5OSw3ICYjNDM7NTQwOCw3IEBAIHN0cnVjdCBwYWdlICpfX2FsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsCiAJdW5zaWduZWQgaW50IGZhc3RwYXRoX2FsbG9jX2ZsYWdzID0gYWxsb2NfZmxhZ3M7CiAKIAkvKiBPdGhlciBmbGFncyBjb3VsZCBiZSBzdXBwb3J0ZWQgbGF0ZXIgaWYgbmVlZGVkLiAqLwotCWlmIChXQVJOX09OKGFsbG9jX2ZsYWdzICZhbXA7IH4oQUxMT0NfTk9MT0NLIHwgQUxMT0NfTk9fQ09ERVRBRykpKQomIzQzOwlpZiAoV0FSTl9PTihhbGxvY19mbGFncyAmYW1wOyB+KEFMTE9DX05PTE9DSyB8IEFMTE9DX05PX0NPREVUQUcgfCBBTExPQ19aT05FTElTVF9QUklWQVRFKSkpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKCFhbGxvY19vcmRlcl9hbGxvd2VkKGdmcCwgb3JkZXIsIGFsbG9jX2ZsYWdzKSkKQEAgLTU0OTUsMTMgJiM0Mzs1NTA0LDM2IEBAIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19ub2RlX25vcHJvZihpbnQgbmlkLCBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyCiBFWFBPUlRfU1lNQk9MKGFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mKTsKIAogc3RydWN0IGZvbGlvICpfX2ZvbGlvX2FsbG9jX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IHByZWZlcnJlZF9uaWQsCi0JCW5vZGVtYXNrX3QgKm5vZGVtYXNrKQomIzQzOwkJbm9kZW1hc2tfdCAqbm9kZW1hc2ssIHVuc2lnbmVkIGludCBhbGxvY19mbGFncykKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IF9fYWxsb2NfcGFnZXNfbm9wcm9mKGdmcCB8IF9fR0ZQX0NPTVAsIG9yZGVyLAotCQkJCQlwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgQUxMT0NfREVGQVVMVCk7CiYjNDM7CQkJCQlwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgYWxsb2NfZmxhZ3MpOwogCXJldHVybiBwYWdlX3JtYXBwYWJsZV9mb2xpbyhwYWdlKTsKIH0KLUVYUE9SVF9TWU1CT0woX19mb2xpb19hbGxvY19ub3Byb2YpOwomIzQzOwomIzQzO3N0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub2RlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IG5pZCkKJiM0Mzt7CiYjNDM7CXdhcm5faWZfbm9kZV9vZmZsaW5lKG5pZCwgZ2ZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIF9fZm9saW9fYWxsb2Nfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgTlVMTCwgQUxMT0NfREVGQVVMVCk7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0woX19mb2xpb19hbGxvY19ub2RlX25vcHJvZik7CiYjNDM7CiYjNDM7c3RydWN0IHBhZ2UgKmFsbG9jX3BhZ2VzX25vZGVfcHJpdmF0ZV9ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsCiYjNDM7CQlpbnQgbmlkKQomIzQzO3sKJiM0MzsJcmV0dXJuIF9fYWxsb2NfcGFnZXNfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgTlVMTCwKJiM0MzsJCQkJICAgQUxMT0NfWk9ORUxJU1RfUFJJVkFURSk7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGFsbG9jX3BhZ2VzX25vZGVfcHJpdmF0ZV9ub3Byb2YpOwomIzQzOwomIzQzO3N0cnVjdCBmb2xpbyAqZm9saW9fYWxsb2Nfbm9kZV9wcml2YXRlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwKJiM0MzsJCWludCBuaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBOVUxMLAomIzQzOwkJCQkgICBBTExPQ19aT05FTElTVF9QUklWQVRFKTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoZm9saW9fYWxsb2Nfbm9kZV9wcml2YXRlX25vcHJvZik7CiAKIC8qCiAgKiBDb21tb24gaGVscGVyIGZ1bmN0aW9ucy4gTmV2ZXIgdXNlIHdpdGggX19HRlBfSElHSE1FTSBiZWNhdXNlIHRoZSByZXR1cm5lZApAQCAtNTgwNSw5ICYjNDM7NTgzNywxMCBAQCBzdGF0aWMgaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTsKIAogLyoqCi0gKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdAomIzQzOyAqIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4gLSBmaW5kIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGEgZ2l2ZW4gbm9kZSYjMzk7cyBmYWxsYmFjayBsaXN0CiAgKiBAbm9kZTogbm9kZSB3aG9zZSBmYWxsYmFjayBsaXN0IHdlJiMzOTtyZSBhcHBlbmRpbmcKICAqIEB1c2VkX25vZGVfbWFzazogbm9kZW1hc2tfdCBvZiBhbHJlYWR5IHVzZWQgbm9kZXMKJiM0MzsgKiBAY2FuZGlkYXRlczogbm9kZW1hc2tfdCBvZiBub2RlcyBlbGlnaWJsZSBmb3Igc2VsZWN0aW9uCiAgKgogICogV2UgdXNlIGEgbnVtYmVyIG9mIGZhY3RvcnMgdG8gZGV0ZXJtaW5lIHdoaWNoIGlzIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQKICAqIGFwcGVhciBvbiBhIGdpdmVuIG5vZGUmIzM5O3MgZmFsbGJhY2sgbGlzdC4gIFRoZSBub2RlIHNob3VsZCBub3QgaGF2ZSBhcHBlYXJlZApAQCAtNTgxOSw3ICYjNDM7NTg1Miw4IEBAIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107CiAgKgogICogUmV0dXJuOiBub2RlIGlkIG9mIHRoZSBmb3VuZCBub2RlIG9yICVOVU1BX05PX05PREUgaWYgbm8gbm9kZSBpcyBmb3VuZC4KICAqLwotaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKQomIzQzO2ludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaywKJiM0MzsJCQkgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKQogewogCWludCBuLCB2YWw7CiAJaW50IG1pbl92YWwgPSBJTlRfTUFYOwpAQCAtNTgyOSwxMiAmIzQzOzU4NjMsMTIgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKQogCSAqIFVzZSB0aGUgbG9jYWwgbm9kZSBpZiB3ZSBoYXZlbiYjMzk7dCBhbHJlYWR5LCBidXQgZm9yIG1lbW9yeWxlc3MgbG9jYWwKIAkgKiBub2RlLCB3ZSBzaG91bGQgc2tpcCBpdCBhbmQgZmFsbCBiYWNrIHRvIG90aGVyIG5vZGVzLgogCSAqLwotCWlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spICZhbXA7JmFtcDsgbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkpIHsKJiM0MzsJaWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgJmFtcDsmYW1wOyBub2RlX2lzc2V0KG5vZGUsICpjYW5kaWRhdGVzKSkgewogCQlub2RlX3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spOwogCQlyZXR1cm4gbm9kZTsKIAl9CiAKLQlmb3JfZWFjaF9ub2RlX3N0YXRlKG4sIE5fTUVNT1JZKSB7CiYjNDM7CWZvcl9lYWNoX25vZGVfbWFzayhuLCAqY2FuZGlkYXRlcykgewogCiAJCS8qIERvbiYjMzk7dCB3YW50IGEgbm9kZSB0byBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgKi8KIAkJaWYgKG5vZGVfaXNzZXQobiwgKnVzZWRfbm9kZV9tYXNrKSkKQEAgLTU4NzMsMTIgJiM0Mzs1OTA3LDEyIEBAIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKICAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgogICovCiBzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsCi0JCXVuc2lnbmVkIG5yX25vZGVzKQomIzQzOwkJdW5zaWduZWQgaW50IG5yX25vZGVzLCBpbnQgemxpZHgpCiB7CiAJc3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzOwogCWludCBpOwogCi0Jem9uZXJlZnMgPSBwZ2RhdC0mZ3Q7bm9kZV96b25lbGlzdHNbWk9ORUxJU1RfRkFMTEJBQ0tdLl96b25lcmVmczsKJiM0MzsJem9uZXJlZnMgPSBwZ2RhdC0mZ3Q7bm9kZV96b25lbGlzdHNbemxpZHhdLl96b25lcmVmczsKIAogCWZvciAoaSA9IDA7IGkgJmx0OyBucl9ub2RlczsgaSYjNDM7JiM0MzspIHsKIAkJaW50IG5yX3pvbmVzOwpAQCAtNTg5OCwzNCAmIzQzOzU5MzIsNDkgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdfZGF0YV90ICpwZ2RhdCwgaW50ICpub2RlX29yZGVyLAogc3RhdGljIHZvaWQgYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCiB7CiAJc3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzOwotCWludCBucl96b25lczsKJiM0MzsJaW50IG5yX3pvbmVzID0gMDsKIAomIzQzOwkvKgomIzQzOwkgKiBOT0ZBTExCQUNLOiB0aGUgbm9kZSYjMzk7cyBvd24gem9uZXMuIEVNUFRZIGZvciBwcml2YXRlIG5vZGVzIHNvIGEKJiM0MzsJICogc3RyYXkgX19HRlBfVEhJU05PREUgYWxsb2NhdGlvbiBjYW4mIzM5O3QgdmlvbGF0ZSBpc29sYXRpb24uCiYjNDM7CSAqLwogCXpvbmVyZWZzID0gcGdkYXQtJmd0O25vZGVfem9uZWxpc3RzW1pPTkVMSVNUX05PRkFMTEJBQ0tdLl96b25lcmVmczsKJiM0MzsJaWYgKCFub2RlX2lzX3ByaXZhdGUocGdkYXQtJmd0O25vZGVfaWQpKQomIzQzOwkJbnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKHBnZGF0LCB6b25lcmVmcyk7CiYjNDM7CXpvbmVyZWZzICYjNDM7PSBucl96b25lczsKJiM0MzsJem9uZXJlZnMtJmd0O3pvbmUgPSBOVUxMOwomIzQzOwl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwomIzQzOwomIzQzOwkvKiBQUklWQVRFX05PRkFMTEJBQ0s6IHRoZSBub2RlJiMzOTtzIG93biB6b25lcywgcHJpdmF0ZSBub2RlcyBpbmNsdWRlZC4gKi8KJiM0MzsJem9uZXJlZnMgPSBwZ2RhdC0mZ3Q7bm9kZV96b25lbGlzdHNbWk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLXS5fem9uZXJlZnM7CiAJbnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKHBnZGF0LCB6b25lcmVmcyk7CiAJem9uZXJlZnMgJiM0Mzs9IG5yX3pvbmVzOwogCXpvbmVyZWZzLSZndDt6b25lID0gTlVMTDsKIAl6b25lcmVmcy0mZ3Q7em9uZV9pZHggPSAwOwogfQogCi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKJiM0MzsvKgomIzQzOyAqIEJ1aWxkIG9uZSBub2RlLW9yZGVyZWQgZmFsbGJhY2sgbGlzdCBmcm9tIGEgY2FuZGlkYXRlIG5vZGVtYXNrLgomIzQzOyAqIHVwZGF0ZV9sb2FkIHJvdW5kLXJvYmlucyBub2RlX2xvYWQgYWNyb3NzIGVxdWlkaXN0YW50IG5vZGVzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGJ1aWxkX25vZGVfem9uZWxpc3QocGdfZGF0YV90ICpwZ2RhdCwgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcywKJiM0MzsJCQkJaW50IHpsaWR4LCBib29sIHVwZGF0ZV9sb2FkLAomIzQzOwkJCQlpbnQgKm5vZGVfb3JkZXIsIGludCAqbnIpCiB7Ci0Jc3RhdGljIGludCBub2RlX29yZGVyW01BWF9OVU1OT0RFU107Ci0JaW50IG5vZGUsIG5yX25vZGVzID0gMDsKIAlub2RlbWFza190IHVzZWRfbWFzayA9IE5PREVfTUFTS19OT05FOwotCWludCBsb2NhbF9ub2RlLCBwcmV2X25vZGU7Ci0KLQkvKiBOVU1BLWF3YXJlIG9yZGVyaW5nIG9mIG5vZGVzICovCi0JbG9jYWxfbm9kZSA9IHBnZGF0LSZndDtub2RlX2lkOwotCXByZXZfbm9kZSA9IGxvY2FsX25vZGU7CiYjNDM7CWludCBsb2NhbF9ub2RlID0gcGdkYXQtJmd0O25vZGVfaWQ7CiYjNDM7CWludCBwcmV2X25vZGUgPSBsb2NhbF9ub2RlOwomIzQzOwlpbnQgbm9kZSwgbnJfbm9kZXMgPSAwOwogCi0JbWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7Ci0Jd2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShsb2NhbF9ub2RlLCAmYW1wO3VzZWRfbWFzaykpICZndDs9IDApIHsKJiM0MzsJd2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCAmYW1wO3VzZWRfbWFzaywKJiM0MzsJCQkJCSAgICAgIGNhbmRpZGF0ZXMpKSAmZ3Q7PSAwKSB7CiAJCS8qCiAJCSAqIFdlIGRvbiYjMzk7dCB3YW50IHRvIHByZXNzdXJlIGEgcGFydGljdWxhciBub2RlLgogCQkgKiBTbyBhZGRpbmcgcGVuYWx0eSB0byB0aGUgZmlyc3Qgbm9kZSBpbiBzYW1lCiAJCSAqIGRpc3RhbmNlIGdyb3VwIHRvIG1ha2UgaXQgcm91bmQtcm9iaW4uCiAJCSAqLwotCQlpZiAobm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBub2RlKSAhPQomIzQzOwkJaWYgKHVwZGF0ZV9sb2FkICZhbXA7JmFtcDsKJiM0MzsJCSAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIG5vZGUpICE9CiAJCSAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpCiAJCQlub2RlX2xvYWRbbm9kZV0gJiM0Mzs9IDE7CiAKQEAgLTU5MzMsMTIgJiM0Mzs1OTgyLDQ3IEBAIHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQogCQlwcmV2X25vZGUgPSBub2RlOwogCX0KIAotCWJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnZGF0LCBub2RlX29yZGVyLCBucl9ub2Rlcyk7CiYjNDM7CWJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnZGF0LCBub2RlX29yZGVyLCBucl9ub2RlcywgemxpZHgpOwomIzQzOwkqbnIgPSBucl9ub2RlczsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCiYjNDM7ewomIzQzOwlzdGF0aWMgaW50IG5vZGVfb3JkZXJbTUFYX05VTU5PREVTXTsKJiM0MzsJbm9kZW1hc2tfdCB0aWVyX25vZGVzOwomIzQzOwlpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LSZndDtub2RlX2lkOwomIzQzOwlpbnQgbm9kZSwgbnJfbm9kZXMgPSAwOwomIzQzOwomIzQzOwltZW1zZXQobm9kZV9vcmRlciwgMCwgc2l6ZW9mKG5vZGVfb3JkZXIpKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogWm9uZWxpc3RzOiBGQUxMQkFDSywgTk9GQUxMQkFDSywgUFJJVkFURQomIzQzOwkgKgomIzQzOwkgKiBGQUxMQkFDSzogICBBbGxvY2F0aW9uIG9yZGVyIGZvciBhbGwgbm9kZXMuICBQcml2YXRlIG5vZGVzIGhhdmUgbGlzdHMKJiM0MzsJICogICAgICAgICAgICAgYnV0IG5ldmVyIGFwcGVhciBhcyBhbiBlbnRyeSBpbiBhbnkgbGlzdC4gQWxsb2NhdGlvbnMKJiM0MzsJICogICAgICAgICAgICAgdGFyZ2V0aW5nIGEgcHJpdmF0ZSBub2RlIHcvIEZBTExCQUNLIGxhbmQgb24gTl9NRU1PUlkuCiYjNDM7CSAqCiYjNDM7CSAqIE5PRkFMTEJBQ0s6IEEgbGlzdCBmb3IgZWFjaCBub2RlIGNvbnRhaW5pbmcgb25seSBpdHNlbGYuCiYjNDM7CSAqICAgICAgICAgICAgIEFsbG9jYXRpb25zIHRhcmdldGluZyBhIHByaXZhdGUgbm9kZSB3LyBOT0ZBTExCQUNLCiYjNDM7CSAqICAgICAgICAgICAgIHdpbGwgYWx3YXlzIGZhaWwgKHRoZWlyIE5PRkFMTEJBQ0sgaXMgZW1wdHkpCiYjNDM7CSAqCiYjNDM7CSAqIFBSSVZBVEU6ICAgIChOX01FTU9SWSB8IE5fTUVNT1JZX1BSSVZBVEUpIC0gYWxsb3dzIGFjY2VzcyB0bwomIzQzOwkgKiAgICAgICAgICAgICBwcml2YXRlIG5vZGVzLCBhbmQgZmFsbHMgYmFjayB0byBub3JtYWwgbWVtb3J5IHVubGVzcwomIzQzOwkgKiAgICAgICAgICAgICBfX0dGUF9USElTTk9ERSBvdGhlcndpc2UgY29uc3RyYWlucyBpdC4KJiM0MzsJICovCiYjNDM7CiYjNDM7CWJ1aWxkX25vZGVfem9uZWxpc3QocGdkYXQsICZhbXA7bm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBaT05FTElTVF9GQUxMQkFDSywKJiM0MzsJCQkgICAgdHJ1ZSwgbm9kZV9vcmRlciwgJmFtcDtucl9ub2Rlcyk7CiAJYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTsKJiM0MzsKIAlwcl9pbmZvKCYjMzQ7RmFsbGJhY2sgb3JkZXIgZm9yIE5vZGUgJWQ6ICYjMzQ7LCBsb2NhbF9ub2RlKTsKIAlmb3IgKG5vZGUgPSAwOyBub2RlICZsdDsgbnJfbm9kZXM7IG5vZGUmIzQzOyYjNDM7KQogCQlwcl9jb250KCYjMzQ7JWQgJiMzNDssIG5vZGVfb3JkZXJbbm9kZV0pOwogCXByX2NvbnQoJiMzNDtcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJbm9kZXNfb3IodGllcl9ub2Rlcywgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7CiYjNDM7CWJ1aWxkX25vZGVfem9uZWxpc3QocGdkYXQsICZhbXA7dGllcl9ub2RlcywgWk9ORUxJU1RfUFJJVkFURSwgZmFsc2UsCiYjNDM7CQkJICAgIG5vZGVfb3JkZXIsICZhbXA7bnJfbm9kZXMpOwogfQogCiAjaWZkZWYgQ09ORklHX0hBVkVfTUVNT1JZTEVTU19OT0RFUwpAQCAtNjUzMyw2ICYjNDM7NjYxNywxMCBAQCBzdGF0aWMgdm9pZCBjYWxjdWxhdGVfdG90YWxyZXNlcnZlX3BhZ2VzKHZvaWQpCiAKIAkJcGdkYXQtJmd0O3RvdGFscmVzZXJ2ZV9wYWdlcyA9IDA7CiAKJiM0MzsJCS8qIHByaXZhdGUgbm9kZXMgaGF2ZSB6ZXJvIHdhdGVybWFya3MgKi8KJiM0MzsJCWlmIChub2RlX2lzX3ByaXZhdGUocGdkYXQtJmd0O25vZGVfaWQpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwogCQlmb3IgKGkgPSAwOyBpICZsdDsgTUFYX05SX1pPTkVTOyBpJiM0MzsmIzQzOykgewogCQkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0mZ3Q7bm9kZV96b25lcyAmIzQzOyBpOwogCQkJbG9uZyBtYXggPSAwOwpAQCAtNjYyNSw5ICYjNDM7NjcxMywxNSBAQCBzdGF0aWMgdm9pZCBfX3NldHVwX3Blcl96b25lX3dtYXJrcyh2b2lkKQogCXN0cnVjdCB6b25lICp6b25lOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiBDYWxjdWxhdGUgdG90YWwgbnVtYmVyIG9mICFaT05FX0hJR0hNRU0gYW5kICFaT05FX01PVkFCTEUgcGFnZXMgKi8KJiM0MzsJLyoKJiM0MzsJICogQ2FsY3VsYXRlIHRvdGFsIG51bWJlciBvZiAhWk9ORV9ISUdITUVNIGFuZCAhWk9ORV9NT1ZBQkxFIHBhZ2VzCiYjNDM7CSAqCiYjNDM7CSAqIFByaXZhdGUgbm9kZXMgYXJlIGV4Y2x1ZGVkIGJlY2F1c2UgdGhleSBhcmUgbm90IGluIHRoZSByZWd1bGFyCiYjNDM7CSAqIGFsbG9jYXRpb24gZmFsbGJhY2sgcGF0aCAtIGluY2x1ZGluZyB0aGVtIGRpbHV0ZXMgRFJBTSB3YXRlcm1hcmtzLgomIzQzOwkgKi8KIAlmb3JfZWFjaF96b25lKHpvbmUpIHsKLQkJaWYgKCFpc19oaWdobWVtKHpvbmUpICZhbXA7JmFtcDsgem9uZV9pZHgoem9uZSkgIT0gWk9ORV9NT1ZBQkxFKQomIzQzOwkJaWYgKCFpc19oaWdobWVtKHpvbmUpICZhbXA7JmFtcDsgem9uZV9pZHgoem9uZSkgIT0gWk9ORV9NT1ZBQkxFICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhbm9kZV9pc19wcml2YXRlKHpvbmVfdG9fbmlkKHpvbmUpKSkKIAkJCWxvd21lbV9wYWdlcyAmIzQzOz0gem9uZV9tYW5hZ2VkX3BhZ2VzKHpvbmUpOwogCX0KIApAQCAtNjYzNSw2ICYjNDM7NjcyOSwxNiBAQCBzdGF0aWMgdm9pZCBfX3NldHVwX3Blcl96b25lX3dtYXJrcyh2b2lkKQogCQl1NjQgdG1wOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZhbXA7em9uZS0mZ3Q7bG9jaywgZmxhZ3MpOwomIzQzOwkJaWYgKCFub2RlX2FsbG93c19yZWNsYWltKHpvbmVfdG9fbmlkKHpvbmUpKSkgewomIzQzOwkJCXpvbmUtJmd0O193YXRlcm1hcmtbV01BUktfTUlOXSA9IDA7CiYjNDM7CQkJem9uZS0mZ3Q7X3dhdGVybWFya1tXTUFSS19MT1ddID0gMDsKJiM0MzsJCQl6b25lLSZndDtfd2F0ZXJtYXJrW1dNQVJLX0hJR0hdID0gMDsKJiM0MzsJCQl6b25lLSZndDtfd2F0ZXJtYXJrW1dNQVJLX1BST01PXSA9IDA7CiYjNDM7CQkJem9uZS0mZ3Q7d2F0ZXJtYXJrX2Jvb3N0ID0gMDsKJiM0MzsJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbXA7em9uZS0mZ3Q7bG9jaywgZmxhZ3MpOwomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwogCQl0bXAgPSAodTY0KXBhZ2VzX21pbiAqIHpvbmVfbWFuYWdlZF9wYWdlcyh6b25lKTsKIAkJdG1wID0gZGl2NjRfdWwodG1wLCBsb3dtZW1fcGFnZXMpOwogCQlpZiAoaXNfaGlnaG1lbSh6b25lKSB8fCB6b25lX2lkeCh6b25lKSA9PSBaT05FX01PVkFCTEUpIHsKQEAgLTczMDksNiAmIzQzOzc0MTMsMTUgQEAgaW50IGFsbG9jX2NvbnRpZ19mcm96ZW5fcmFuZ2Vfbm9wcm9mKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAogCWlmIChfX2FsbG9jX2NvbnRpZ192ZXJpZnlfZ2ZwX21hc2soZ2ZwX21hc2ssIChnZnBfdCAqKSZhbXA7Y2MuZ2ZwX21hc2spKQogCQlyZXR1cm4gLUVJTlZBTDsKIAomIzQzOwkvKgomIzQzOwkgKiBQcml2YXRlIG5vZGVzIGFyZSBrZXB0IHVucmVhY2hhYmxlIHZpYSB0aGUgem9uZWxpc3RzLCBidXQKJiM0MzsJICogYWxsb2NfY29udGlnIHdvcmtzIGRpcmVjdGx5IG9uIGEgem9uZSBkZXJpdmVkIGZyb20gdGhlIGNhbGxlciYjMzk7cwomIzQzOwkgKiBwZm4gcmFuZ2UsIGJ5cGFzc2luZyB0aGF0LiAgUmVqZWN0IHRoaXMgb3BlcmF0aW9uIGV4cGxpY2l0bHkKJiM0MzsJICogcmF0aGVyIHRoYW4gc2lsZW50bHkgY2FydmluZyBtZW1vcnkgb3V0IG9mIGFuIGlzb2xhdGVkIG5vZGUuCiYjNDM7CSAqLwomIzQzOwlpZiAodW5saWtlbHkobm9kZV9pc19wcml2YXRlKHpvbmVfdG9fbmlkKGNjLnpvbmUpKSkpCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwogCS8qCiAJICogV2hhdCB3ZSBkbyBoZXJlIGlzIHdlIG1hcmsgYWxsIHBhZ2VibG9ja3MgaW4gcmFuZ2UgYXMKIAkgKiBNSUdSQVRFX0lTT0xBVEUuICBCZWNhdXNlIHBhZ2VibG9jayBhbmQgbWF4IG9yZGVyIHBhZ2VzIG1heQpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5oIGIvbW0vcGFnZV9hbGxvYy5oCmluZGV4IGI5MjU5ZGVkZGI1OWQ3Li43NDE0NDhkODNjZTc3YyAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL3BhZ2VfYWxsb2MuaApAQCAtNTcsNiAmIzQzOzU3LDkgQEAKICAqLwogI2RlZmluZSBBTExPQ19OT19DT0RFVEFHICAgICAgIDB4MTAwMAogCiYjNDM7LyogU2VsZWN0IHRoZSBOX01FTU9SWV9QUklWQVRFIHpvbmVsaXN0IGZhbWlseSAoc2VlIHNlbGVjdF96b25lbGlzdCgpKS4gKi8KJiM0MzsjZGVmaW5lIEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgMHgyMDAwCiYjNDM7CiAvKiBGbGFncyB0aGF0IGFsbG93IGFsbG9jYXRpb25zIGJlbG93IHRoZSBtaW4gd2F0ZXJtYXJrLiAqLwogI2RlZmluZSBBTExPQ19SRVNFUlZFUyAoQUxMT0NfTk9OX0JMT0NLfEFMTE9DX01JTl9SRVNFUlZFfEFMTE9DX0hJR0hBVE9NSUN8QUxMT0NfT09NKQogCkBAIC05NSw2ICYjNDM7OTgsMjkgQEAgc3RydWN0IGFsbG9jX2NvbnRleHQgewogCXVuc2lnbmVkIGludCBhbGxvY19mbGFnczsKIH07CiAKJiM0MzsjaWZkZWYgQ09ORklHX05VTUEKJiM0MztzdGF0aWNfYXNzZXJ0KFpPTkVMSVNUX1BSSVZBVEUgJiM0MzsgMSA9PSBaT05FTElTVF9QUklWQVRFX05PRkFMTEJBQ0spOwomIzQzOyNlbmRpZgomIzQzOwomIzQzOy8qCiYjNDM7ICogc2VsZWN0X3pvbmVsaXN0IC0gcmVzb2x2ZSB0aGUgem9uZWxpc3QgZm9yIGFuIGFsbG9jYXRpb24KJiM0MzsgKgomIzQzOyAqIFRoZSBkZWZhdWx0IG1hdGNoZXMgbm9kZV96b25lbGlzdCgpOyBBTExPQ19aT05FTElTVF9QUklWQVRFIHNlbGVjdHMgdGhlCiYjNDM7ICogcHJpdmF0ZS1ub2RlIGZhbWlseSBzbyBhbiBhbGxvY2F0aW9uIG1heSByZWFjaCBhbiBOX01FTU9SWV9QUklWQVRFIG5vZGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZWxpc3QgKgomIzQzO3NlbGVjdF96b25lbGlzdChpbnQgbmlkLCBnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBhbGxvY19mbGFncykKJiM0Mzt7CiYjNDM7I2lmZGVmIENPTkZJR19OVU1BCiYjNDM7CWlmIChhbGxvY19mbGFncyAmYW1wOyBBTExPQ19aT05FTElTVF9QUklWQVRFKSB7CiYjNDM7CQlpbnQgaWR4ID0gWk9ORUxJU1RfUFJJVkFURSAmIzQzOyAhIShnZnAgJmFtcDsgX19HRlBfVEhJU05PREUpOwomIzQzOwomIzQzOwkJcmV0dXJuICZhbXA7Tk9ERV9EQVRBKG5pZCktJmd0O25vZGVfem9uZWxpc3RzW2lkeF07CiYjNDM7CX0KJiM0MzsjZW5kaWYKJiM0MzsJcmV0dXJuIG5vZGVfem9uZWxpc3QobmlkLCBnZnApOwomIzQzO30KJiM0MzsKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9yZGVyIG9mIGEgZnJlZSBwYWdlIGluIHRoZSBidWRkeSBzeXN0ZW0uIEluCiAgKiBnZW5lcmFsLCBwYWdlX3pvbmUocGFnZSktJmd0O2xvY2sgbXVzdCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIgdG8gcHJldmVudCB0aGUKQEAgLTI1OCw2ICYjNDM7Mjg0LDE0IEBAIHN0cnVjdCBwYWdlICpfX2FsbG9jX3BhZ2VzX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IHByZWZlcnJlZF9uCiAJCW5vZGVtYXNrX3QgKm5vZGVtYXNrLCB1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MpOwogI2RlZmluZSBfX2FsbG9jX3BhZ2VzKC4uLikJCQlhbGxvY19ob29rcyhfX2FsbG9jX3BhZ2VzX25vcHJvZihfX1ZBX0FSR1NfXykpCiAKJiM0MztzdHJ1Y3QgZm9saW8gKl9fZm9saW9fYWxsb2Nfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLCBpbnQgcHJlZmVycmVkX25pZCwKJiM0MzsJCW5vZGVtYXNrX3QgKm5vZGVtYXNrLCB1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MpOwomIzQzOyNkZWZpbmUgX19mb2xpb19hbGxvYyguLi4pCQkJYWxsb2NfaG9va3MoX19mb2xpb19hbGxvY19ub3Byb2YoX19WQV9BUkdTX18pKQomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcgX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBhbGxvY19mbGFncywKJiM0MzsJCWludCBwcmVmZXJyZWRfbmlkLCBub2RlbWFza190ICpub2RlbWFzaywgaW50IG5yX3BhZ2VzLAomIzQzOwkJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KTsKJiM0MzsKIGV4dGVybiB2b2lkIHpvbmVfcGNwX3Jlc2V0KHN0cnVjdCB6b25lICp6b25lKTsKIGV4dGVybiB2b2lkIHpvbmVfcGNwX2Rpc2FibGUoc3RydWN0IHpvbmUgKnpvbmUpOwogZXh0ZXJuIHZvaWQgem9uZV9wY3BfZW5hYmxlKHN0cnVjdCB6b25lICp6b25lKTsKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggOWI4ZWU5MDJmOTcyOGEuLjZkODEwYTQyZDQ3ZDY2IDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYwomIzQzOyYjNDM7JiM0MzsgYi9tbS92bXNjYW4uYwpAQCAtOTc1LDYgJiM0Mzs5NzUsMTAgQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqYWxsb2NfZGVtb3RlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqc3JjLAogCiAJbXRjID0gKHN0cnVjdCBtaWdyYXRpb25fdGFyZ2V0X2NvbnRyb2wgKilwcml2YXRlOwogCiYjNDM7CWlmIChtdGMtJmd0O25tYXNrICZhbXA7JmFtcDsKJiM0MzsJICAgIG5vZGVzX2ludGVyc2VjdHMoKm10Yy0mZ3Q7bm1hc2ssIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSkKJiM0MzsJCW10Yy0mZ3Q7YWxsb2NfZmxhZ3MgPSBBTExPQ19aT05FTElTVF9QUklWQVRFOwomIzQzOwogCS8qCiAJICogbWFrZSBzdXJlIHdlIGFsbG9jYXRlIGZyb20gdGhlIHRhcmdldCBub2RlIGZpcnN0IGFsc28gdHJ5aW5nIHRvCiAJICogZGVtb3RlIG9yIHJlY2xhaW0gcGFnZXMgZnJvbSB0aGUgdGFyZ2V0IG5vZGUgdmlhIGtzd2FwZCBpZiB3ZSBhcmUKQEAgLTU0MTYsNiAmIzQzOzU0MjAsMjEgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbHJ1X2dlbl9hdHRyX2dyb3VwID0gewogICogICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnZnMgaW50ZXJmYWNlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiYjNDM7LyoKJiM0MzsgKiBOb2RlcyB0aGUgbHJ1X2dlbiBkZWJ1Z2ZzIGludGVyZmFjZSBsaXN0czogb3JkaW5hcnkgbWVtb3J5IG5vZGVzIHBsdXMgYW55CiYjNDM7ICogTl9NRU1PUllfUFJJVkFURSBub2RlcyBvcHRlZCBpbnRvIHJlY2xhaW0uICBydW5fY21kKCkgYWxyZWFkeSBhY2NlcHRzIHRoZQomIzQzOyAqIGxhdHRlciwgc28ga2VlcCB0aGUgbGlzdGluZyBpbiBzeW5jIHdpdGggd2hhdCBpdCBhY2NlcHRzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGxydV9nZW5fc2VxX25vZGVzKG5vZGVtYXNrX3QgKm5vZGVzKQomIzQzO3sKJiM0MzsJaW50IG5pZDsKJiM0MzsKJiM0MzsJKm5vZGVzID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldOwomIzQzOwlmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkKJiM0MzsJCWlmIChub2RlX2FsbG93c19yZWNsYWltKG5pZCkpCiYjNDM7CQkJbm9kZV9zZXQobmlkLCAqbm9kZXMpOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkICpscnVfZ2VuX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKQEAgLTU0MjcsOSAmIzQzOzU0NDYsMTEgQEAgc3RhdGljIHZvaWQgKmxydV9nZW5fc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiAKIAltZW1jZyA9IG1lbV9jZ3JvdXBfaXRlcihOVUxMLCBOVUxMLCBOVUxMKTsKIAlkbyB7CiYjNDM7CQlub2RlbWFza190IG5vZGVzOwogCQlpbnQgbmlkOwogCi0JCWZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkgewomIzQzOwkJbHJ1X2dlbl9zZXFfbm9kZXMoJmFtcDtub2Rlcyk7CiYjNDM7CQlmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBub2RlcykgewogCQkJaWYgKCFucl90b19za2lwLS0pCiAJCQkJcmV0dXJuIGdldF9scnV2ZWMobWVtY2csIG5pZCk7CiAJCX0KQEAgLTU0NTEsMTYgJiM0Mzs1NDcyLDE4IEBAIHN0YXRpYyB2b2lkICpscnVfZ2VuX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7CiAJaW50IG5pZCA9IGxydXZlY19wZ2RhdCh2KS0mZ3Q7bm9kZV9pZDsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBscnV2ZWNfbWVtY2codik7CiYjNDM7CW5vZGVtYXNrX3Qgbm9kZXM7CiAKIAkmIzQzOyYjNDM7KnBvczsKIAotCW5pZCA9IG5leHRfbWVtb3J5X25vZGUobmlkKTsKJiM0MzsJbHJ1X2dlbl9zZXFfbm9kZXMoJmFtcDtub2Rlcyk7CiYjNDM7CW5pZCA9IG5leHRfbm9kZShuaWQsIG5vZGVzKTsKIAlpZiAobmlkID09IE1BWF9OVU1OT0RFUykgewogCQltZW1jZyA9IG1lbV9jZ3JvdXBfaXRlcihOVUxMLCBtZW1jZywgTlVMTCk7CiAJCWlmICghbWVtY2cpCiAJCQlyZXR1cm4gTlVMTDsKIAotCQluaWQgPSBmaXJzdF9tZW1vcnlfbm9kZTsKJiM0MzsJCW5pZCA9IGZpcnN0X25vZGUobm9kZXMpOwogCX0KIAogCXJldHVybiBnZXRfbHJ1dmVjKG1lbWNnLCBuaWQpOwpAQCAtNTUyOSwxMCAmIzQzOzU1NTIsMTIgQEAgc3RhdGljIGludCBscnVfZ2VuX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIAlzdHJ1Y3QgbHJ1X2dlbl9mb2xpbyAqbHJ1Z2VuID0gJmFtcDtscnV2ZWMtJmd0O2xydWdlbjsKIAlpbnQgbmlkID0gbHJ1dmVjX3BnZGF0KGxydXZlYyktJmd0O25vZGVfaWQ7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbHJ1dmVjX21lbWNnKGxydXZlYyk7CiYjNDM7CW5vZGVtYXNrX3Qgbm9kZXM7CiAJREVGSU5FX01BWF9TRVEobHJ1dmVjKTsKIAlERUZJTkVfTUlOX1NFUShscnV2ZWMpOwogCi0JaWYgKG5pZCA9PSBmaXJzdF9tZW1vcnlfbm9kZSkgewomIzQzOwlscnVfZ2VuX3NlcV9ub2RlcygmYW1wO25vZGVzKTsKJiM0MzsJaWYgKG5pZCA9PSBmaXJzdF9ub2RlKG5vZGVzKSkgewogCQljb25zdCBjaGFyICpwYXRoID0gbWVtY2cgPyBtLSZndDtwcml2YXRlIDogJiMzNDsmIzM0OzsKIAogI2lmZGVmIENPTkZJR19NRU1DRwpAQCAtNTYzMiw3ICYjNDM7NTY1Nyw5IEBAIHN0YXRpYyBpbnQgcnVuX2NtZChjaGFyIGNtZCwgdTY0IG1lbWNnX2lkLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHNlcSwKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBOVUxMOwogCi0JaWYgKG5pZCAmbHQ7IDAgfHwgbmlkICZndDs9IE1BWF9OVU1OT0RFUyB8fCAhbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSkKJiM0MzsJaWYgKG5pZCAmbHQ7IDAgfHwgbmlkICZndDs9IE1BWF9OVU1OT0RFUyB8fAomIzQzOwkgICAgIShub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpIHx8CiYjNDM7CSAgICAgIChub2RlX2lzX3ByaXZhdGUobmlkKSAmYW1wOyZhbXA7IG5vZGVfYWxsb3dzX3JlY2xhaW0obmlkKSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghbWVtX2Nncm91cF9kaXNhYmxlZCgpKSB7CkBAIC02MTYxLDYgJiM0Mzs2MTg4LDEzIEBAIHN0YXRpYyB2b2lkIHNocmlua19ub2RlKHBnX2RhdGFfdCAqcGdkYXQsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQogCXN0cnVjdCBscnV2ZWMgKnRhcmdldF9scnV2ZWM7CiAJYm9vbCByZWNsYWltYWJsZSA9IGZhbHNlOwogCiYjNDM7CS8qCiYjNDM7CSAqIFByaXZhdGUgbm9kZXMgZG8gbm90IHN1cHBvcnQgcmVjbGFpbSBieSBkZWZhdWx0LCBmaWx0ZXJpbmcgaGVyZQomIzQzOwkgKiBjYXB0dXJlcyBhbGwgbm9ybWFsIHJlY2xhaW0gcGF0aHMgdGhhdCBtYXkgYXR0ZW1wdCBldmljdGlvbi4KJiM0MzsJICovCiYjNDM7CWlmICghbm9kZV9hbGxvd3NfcmVjbGFpbShwZ2RhdC0mZ3Q7bm9kZV9pZCkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiAJaWYgKChscnVfZ2VuX2VuYWJsZWQoKSB8fCBscnVfZ2VuX3N3aXRjaGluZygpKSAmYW1wOyZhbXA7IHJvb3RfcmVjbGFpbShzYykpIHsKIAkJbWVtc2V0KCZhbXA7c2MtJmd0O25yLCAwLCBzaXplb2Yoc2MtJmd0O25yKSk7CiAJCWxydV9nZW5fc2hyaW5rX25vZGUocGdkYXQsIHNjKTsKQEAgLTY3NzEsNiAmIzQzOzY4MDUsMTYgQEAgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAlyZXR1cm4gc2MubnJfcmVjbGFpbWVkOwogfQogCiYjNDM7c3RhdGljIHN0cnVjdCB6b25lbGlzdCAqbWVtY2dfcmVjbGFpbV96b25lbGlzdChpbnQgbmlkLCBnZnBfdCBnZnBfbWFzaykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBhZmxhZ3MgPSBBTExPQ19ERUZBVUxUOwomIzQzOwomIzQzOwlpZiAodW5saWtlbHkoIW5vZGVzX2VtcHR5KG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSkpCiYjNDM7CQlhZmxhZ3MgPSBBTExPQ19aT05FTElTVF9QUklWQVRFOwomIzQzOwomIzQzOwlyZXR1cm4gc2VsZWN0X3pvbmVsaXN0KG5pZCwgZ2ZwX21hc2ssIGFmbGFncyk7CiYjNDM7fQomIzQzOwogdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKIAkJCQkJICAgZ2ZwX3QgZ2ZwX21hc2ssCkBAIC02Nzk3LDcgJiM0Mzs2ODQxLDggQEAgdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkgKiBlcXVhbCBwcmVzc3VyZSBvbiBhbGwgdGhlIG5vZGVzLiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKIAkgKiB0aGUgcmVjbGFpbSBkb2VzIG5vdCBiYWlsIG91dCBlYXJseS4KIAkgKi8KLQlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0ID0gbm9kZV96b25lbGlzdChudW1hX25vZGVfaWQoKSwgc2MuZ2ZwX21hc2spOwomIzQzOwlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0ID0gbWVtY2dfcmVjbGFpbV96b25lbGlzdChudW1hX25vZGVfaWQoKSwKJiM0MzsJCQkJCQkJICAgc2MuZ2ZwX21hc2spOwogCiAJc2V0X3Rhc2tfcmVjbGFpbV9zdGF0ZShjdXJyZW50LCAmYW1wO3NjLnJlY2xhaW1fc3RhdGUpOwogCXRyYWNlX21tX3Ztc2Nhbl9tZW1jZ19yZWNsYWltX2JlZ2luKHNjLmdmcF9tYXNrLCAwLCBtZW1jZyk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vTWFrZWZpbGUua3ZtIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bQppbmRleCA2ZmMzNGU5YmY4ZTFiNC4uZTBkZDc3YzY2NGM3ZWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm0KJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bQpAQCAtMTU1LDYgJiM0MzsxNTUsNyBAQCBURVNUX0dFTl9QUk9HU194ODYgJiM0Mzs9IGFjY2Vzc190cmFja2luZ19wZXJmX3Rlc3QKIFRFU1RfR0VOX1BST0dTX3g4NiAmIzQzOz0gY29hbGVzY2VkX2lvX3Rlc3QKIFRFU1RfR0VOX1BST0dTX3g4NiAmIzQzOz0gZGlydHlfbG9nX3BlcmZfdGVzdAogVEVTVF9HRU5fUFJPR1NfeDg2ICYjNDM7PSBndWVzdF9tZW1mZF90ZXN0CiYjNDM7VEVTVF9HRU5fUFJPR1NfeDg2ICYjNDM7PSBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdAogVEVTVF9HRU5fUFJPR1NfeDg2ICYjNDM7PSBoYXJkd2FyZV9kaXNhYmxlX3Rlc3QKIFRFU1RfR0VOX1BST0dTX3g4NiAmIzQzOz0gbW11X3N0cmVzc190ZXN0CiBURVNUX0dFTl9QUk9HU194ODYgJiM0Mzs9IHJzZXFfdGVzdApAQCAtMTk1LDYgJiM0MzsxOTYsNyBAQCBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gY29hbGVzY2VkX2lvX3Rlc3QKIFRFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBkaXJ0eV9sb2dfcGVyZl90ZXN0CiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gZ2V0LXJlZy1saXN0CiBURVNUX0dFTl9QUk9HU19hcm02NCAmIzQzOz0gZ3Vlc3RfbWVtZmRfdGVzdAomIzQzO1RFU1RfR0VOX1BST0dTX2FybTY0ICYjNDM7PSBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdAogVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IG1tdV9zdHJlc3NfdGVzdAogVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IHJzZXFfdGVzdAogVEVTVF9HRU5fUFJPR1NfYXJtNjQgJiM0Mzs9IHN0ZWFsX3RpbWUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX2JpbmRfbm9kZV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjZmMzNiMWFlNmM0MmFjCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX2JpbmRfbm9kZV90ZXN0LmMKQEAgLTAsMCAmIzQzOzEsMjEzIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIFN0YW5kYWxvbmUgdGVzdCBmb3IgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUuCiYjNDM7ICoKJiM0MzsgKiBWZXJpZmllcyB0aGF0IGEgZ3Vlc3RfbWVtZmQgY3JlYXRlZCB3aXRoIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIGFsbG9jYXRlcwomIzQzOyAqIGl0cyBmb2xpb3Mgb24gdGhlIHJlcXVlc3RlZCBOVU1BIG5vZGUsIHdpdGhvdXQgYW55IHVzZXJzcGFjZSBtYmluZCgpLgomIzQzOyAqCiYjNDM7ICogVGhlIGZvbGlvIHBsYWNlbWVudCBpcyBjaGVja2VkIHdpdGggbW92ZV9wYWdlcygyKSAoc3RhdHVzIHF1ZXJ5IG1vZGUpLgomIzQzOyAqCiYjNDM7ICogU2VsZi1jb250YWluZWQ6CiYjNDM7ICogICAtIGlzc3VlcyB0aGUgS1ZNIGlvY3RscyBkaXJlY3RseQomIzQzOyAqCiYjNDM7ICogQnVpbGQgaW5zaWRlIHRoZSBndWVzdDoKJiM0MzsgKiAgIGdjYyAtTzIgLW8gZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3QgZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3QuYwomIzQzOyAqCiYjNDM7ICogVXNhZ2U6IGd1ZXN0X21lbWZkX2JpbmRfbm9kZV90ZXN0ICZsdDt0YXJnZXRfbm9kZSZndDsKJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2Vyci5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtlcnJuby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c2NhbGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva3ZtLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7CiYjNDM7LyogTWlycm9yIHRoZSAocHJvcG9zZWQpIHVhcGkgYWRkaXRpb25zIGluIGNhc2UgdGhlIGhvc3QgaGVhZGVycyBsYWcuICovCiYjNDM7I2lmbmRlZiBHVUVTVF9NRU1GRF9GTEFHX01NQVAKJiM0MzsjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUAkJKDFVTEwgJmx0OyZsdDsgMCkKJiM0MzsjZW5kaWYKJiM0MzsjaWZuZGVmIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQKJiM0MzsjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQJKDFVTEwgJmx0OyZsdDsgMSkKJiM0MzsjZW5kaWYKJiM0MzsjaWZuZGVmIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFCiYjNDM7I2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERQkoMVVMTCAmbHQ7Jmx0OyAyKQomIzQzOyNlbmRpZgomIzQzOyNpZm5kZWYgS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHUwomIzQzOyNkZWZpbmUgS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHUwkyNDQKJiM0MzsjZW5kaWYKJiM0MzsKJiM0MztzdHJ1Y3QgZ21lbWZkX2FyZ3MgewomIzQzOwlfX3U2NCBzaXplOwomIzQzOwlfX3U2NCBmbGFnczsKJiM0MzsJX191MzIgbm9kZTsKJiM0MzsJX191MzIgcGFkOwomIzQzOwlfX3U2NCByZXNlcnZlZFs1XTsKJiM0Mzt9OwomIzQzOwomIzQzOy8qIFRydWUgaWYgdGhlIG5vZGUgaGFzIGFueSBtZW1vcnkgKE1lbVRvdGFsICZndDsgMCkuICovCiYjNDM7c3RhdGljIGludCBub2RlX2hhc19tZW1vcnkoaW50IG5vZGUpCiYjNDM7ewomIzQzOwljaGFyIHBhdGhbMTI4XTsKJiM0MzsJY2hhciBsaW5lWzI1Nl07CiYjNDM7CUZJTEUgKmY7CiYjNDM7CWxvbmcgdG90YWwgPSAtMTsKJiM0MzsKJiM0MzsJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLAomIzQzOwkJICYjMzQ7L3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGUlZC9tZW1pbmZvJiMzNDssIG5vZGUpOwomIzQzOwlmID0gZm9wZW4ocGF0aCwgJiMzNDtyJiMzNDspOwomIzQzOwlpZiAoIWYpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKJiM0MzsJCWlmIChzdHJzdHIobGluZSwgJiMzNDtNZW1Ub3RhbDomIzM0OykpIHsKJiM0MzsJCQlpZiAoc3NjYW5mKGxpbmUsICYjMzQ7Tm9kZSAlKmQgTWVtVG90YWw6ICVsZCBrQiYjMzQ7LCAmYW1wO3RvdGFsKSA9PSAxKQomIzQzOwkJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlmY2xvc2UoZik7CiYjNDM7CXJldHVybiB0b3RhbCAmZ3Q7IDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBsb25nIG1vdmVfcGFnZXNfc3RhdHVzKHZvaWQgKmFkZHIpCiYjNDM7ewomIzQzOwl2b2lkICpwYWdlc1sxXSA9IHsgYWRkciB9OwomIzQzOwlpbnQgc3RhdHVzWzFdID0geyAtMSB9OwomIzQzOwlsb25nIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gc3lzY2FsbChTWVNfbW92ZV9wYWdlcywgMCwgMSwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQllcnIoMSwgJiMzNDttb3ZlX3BhZ2VzJiMzNDspOwomIzQzOwlyZXR1cm4gc3RhdHVzWzBdOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiYjNDM7ewomIzQzOwlpbnQga3ZtLCB2bSwgZ21lbSwgcmV0OwomIzQzOwlsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKJiM0MzsJc2l6ZV90IHNpemUgPSBwYWdlX3NpemUgKiA0OwomIzQzOwlpbnQgdGFyZ2V0X25vZGU7CiYjNDM7CXN0cnVjdCBnbWVtZmRfYXJncyBnYSA9IHt9OwomIzQzOwljaGFyICptZW07CiYjNDM7CXNpemVfdCBpOwomIzQzOwomIzQzOwlpZiAoYXJnYyAhPSAyKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDt1c2FnZTogJXMgJmx0O3RhcmdldF9ub2RlJmd0O1xuJiMzNDssIGFyZ3ZbMF0pOwomIzQzOwl0YXJnZXRfbm9kZSA9IGF0b2koYXJndlsxXSk7CiYjNDM7CiYjNDM7CWt2bSA9IG9wZW4oJiMzNDsvZGV2L2t2bSYjMzQ7LCBPX1JEV1IpOwomIzQzOwlpZiAoa3ZtICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7b3BlbiAvZGV2L2t2bTogJXNcbiYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBVc2UgYSBkZWZhdWx0IChub24tcHJvdGVjdGVkKSBWTTogaXQgaGFzIG5vIHByaXZhdGUgbWVtb3J5LCBzbyBpdAomIzQzOwkgKiBhZHZlcnRpc2VzIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQsIHdoaWNoIGxldHMgdGhlIGhvc3QgbW1hcCBhbmQKJiM0MzsJICogZmF1bHQgdGhlIGdtZW0gKG5lZWRlZCB0byBvYnNlcnZlIHBsYWNlbWVudCB3aXRoIG1vdmVfcGFnZXMoKSkuICBBCiYjNDM7CSAqIFNXLXByb3RlY3RlZCBWTSB3b3VsZCBub3QgYWR2ZXJ0aXNlIElOSVRfU0hBUkVEIGFuZCB0aGUgaG9zdCBmYXVsdAomIzQzOwkgKiB3b3VsZCBTSUdCVVMuCiYjNDM7CSAqLwomIzQzOwl2bSA9IGlvY3RsKGt2bSwgS1ZNX0NSRUFURV9WTSwgMFVMKTsKJiM0MzsJaWYgKHZtICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7S1ZNX0NSRUFURV9WTTogJXNcbiYjMzQ7LCBzdHJlcnJvcihlcnJubykpOwomIzQzOwomIzQzOwl7CiYjNDM7CQlsb25nIGNhcHMgPSBpb2N0bCh2bSwgS1ZNX0NIRUNLX0VYVEVOU0lPTiwKJiM0MzsJCQkJICBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTKTsKJiM0MzsKJiM0MzsJCXByaW50ZigmIzM0O0tWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MgPSAweCVseFxuJiMzNDssIGNhcHMpOwomIzQzOwkJaWYgKCEoY2FwcyAmYW1wOyBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkpCiYjNDM7CQkJa3NmdF9leGl0X3NraXAoJiMzNDtCSU5EX05PREUgZmxhZyBub3QgYWR2ZXJ0aXNlZCAobmVlZCBDT05GSUdfTlVNQSlcbiYjMzQ7KTsKJiM0MzsJCWlmICghKGNhcHMgJmFtcDsgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRCkpCiYjNDM7CQkJa3NmdF9leGl0X3NraXAoJiMzNDtJTklUX1NIQVJFRCBub3QgYWR2ZXJ0aXNlZDsgY2Fubm90IGZhdWx0IGZyb20gaG9zdFxuJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIE5lZ2F0aXZlOiBwYWQgbXVzdCBiZSB6ZXJvLiAqLwomIzQzOwlnYSA9IChzdHJ1Y3QgZ21lbWZkX2FyZ3MpeyAuc2l6ZSA9IHNpemUsCiYjNDM7CQkJCSAgIC5mbGFncyA9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLAomIzQzOwkJCQkgICAubm9kZSA9IHRhcmdldF9ub2RlLCAucGFkID0gMSB9OwomIzQzOwlyZXQgPSBpb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgJmFtcDtnYSk7CiYjNDM7CWlmICghKHJldCAmbHQ7IDAgJmFtcDsmYW1wOyBlcnJubyA9PSBFSU5WQUwpKQomIzQzOwkJZXJyeCgxLCAmIzM0O25vbnplcm8gcGFkIHNob3VsZCBiZSByZWplY3RlZCAocmV0PSVkIGVycm5vPSVkKSYjMzQ7LCByZXQsIGVycm5vKTsKJiM0MzsJcHJpbnRmKCYjMzQ7T0s6IG5vbnplcm8gcGFkIHJlamVjdGVkXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIE5lZ2F0aXZlOiBvdXQtb2YtcmFuZ2Ugbm9kZS4gKi8KJiM0MzsJZ2EgPSAoc3RydWN0IGdtZW1mZF9hcmdzKXsgLnNpemUgPSBzaXplLAomIzQzOwkJCQkgICAuZmxhZ3MgPSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSwKJiM0MzsJCQkJICAgLm5vZGUgPSAxICZsdDsmbHQ7IDIwIH07CiYjNDM7CXJldCA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCAmYW1wO2dhKTsKJiM0MzsJaWYgKCEocmV0ICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vID09IEVJTlZBTCkpCiYjNDM7CQllcnJ4KDEsICYjMzQ7Ym9ndXMgbm9kZSBzaG91bGQgYmUgcmVqZWN0ZWQgKHJldD0lZCBlcnJubz0lZCkmIzM0OywgcmV0LCBlcnJubyk7CiYjNDM7CXByaW50ZigmIzM0O09LOiBvdXQtb2YtcmFuZ2Ugbm9kZSByZWplY3RlZFxuJiMzNDspOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBOZWdhdGl2ZTogbm9kZSBzZXQgd2l0aG91dCB0aGUgZmxhZy4gIE9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBub256ZXJvCiYjNDM7CSAqIG5vZGU6IG5vZGUgMCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tICYjMzQ7bm9kZSBmaWVsZCB1bnNldCYjMzQ7LgomIzQzOwkgKi8KJiM0MzsJaWYgKHRhcmdldF9ub2RlICE9IDApIHsKJiM0MzsJCWdhID0gKHN0cnVjdCBnbWVtZmRfYXJncyl7IC5zaXplID0gc2l6ZSwgLmZsYWdzID0gMCwKJiM0MzsJCQkJCSAgIC5ub2RlID0gdGFyZ2V0X25vZGUgfTsKJiM0MzsJCXJldCA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCAmYW1wO2dhKTsKJiM0MzsJCWlmICghKHJldCAmbHQ7IDAgJmFtcDsmYW1wOyBlcnJubyA9PSBFSU5WQUwpKQomIzQzOwkJCWVycngoMSwgJiMzNDtub2RlIHdpdGhvdXQgZmxhZyBzaG91bGQgYmUgcmVqZWN0ZWQgKHJldD0lZCBlcnJubz0lZCkmIzM0OywKJiM0MzsJCQkgICAgIHJldCwgZXJybm8pOwomIzQzOwkJcHJpbnRmKCYjMzQ7T0s6IG5vZGUtd2l0aG91dC1mbGFnIHJlamVjdGVkXG4mIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUG9zaXRpdmU6IGJpbmQgdG8gdGFyZ2V0X25vZGUsIG1tYXAsIGZhdWx0LCB2ZXJpZnkgcGxhY2VtZW50LiAqLwomIzQzOwlnYSA9IChzdHJ1Y3QgZ21lbWZkX2FyZ3MpewomIzQzOwkJLnNpemUgPSBzaXplLAomIzQzOwkJLmZsYWdzID0gR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgfCBHVUVTVF9NRU1GRF9GTEFHX01NQVAgfAomIzQzOwkJCSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVELAomIzQzOwkJLm5vZGUgPSB0YXJnZXRfbm9kZSwKJiM0MzsJfTsKJiM0MzsJZ21lbSA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCAmYW1wO2dhKTsKJiM0MzsJaWYgKGdtZW0gJmx0OyAwKSB7CiYjNDM7CQkvKgomIzQzOwkJICogQSBub2RlIHRoYXQgY2Fubm90IGJlIGJvdW5kIC0gbWVtb3J5bGVzcy9vZmZsaW5lLCBvciBhIHByaXZhdGUKJiM0MzsJCSAqIG5vZGUgdGhhdCBkaWQgbm90IG9wdCBpbnRvIHVzZXJzcGFjZSBwbGFjZW1lbnQgLSBtdXN0IGJlCiYjNDM7CQkgKiByZWplY3RlZCBhdCBjcmVhdGUgd2l0aCBFSU5WQUwgKG1wb2xfYmluZF9ub2RlKCkgZmFpbHMpLCBub3QKJiM0MzsJCSAqIHByb2R1Y2UgYW4gb3BhcXVlIGZhaWx1cmUgbGF0ZXIuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghbm9kZV9oYXNfbWVtb3J5KHRhcmdldF9ub2RlKSAmYW1wOyZhbXA7IGVycm5vID09IEVJTlZBTCkgewomIzQzOwkJCXByaW50ZigmIzM0O09LOiB1bmJpbmRhYmxlIG5vZGUgJWQgcmVqZWN0ZWQgd2l0aCBFSU5WQUxcbiYjMzQ7LAomIzQzOwkJCSAgICAgICB0YXJnZXRfbm9kZSk7CiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQl9CiYjNDM7CQllcnIoMSwgJiMzNDtLVk1fQ1JFQVRFX0dVRVNUX01FTUZEKGJpbmQgbm9kZSAlZCkmIzM0OywgdGFyZ2V0X25vZGUpOwomIzQzOwl9CiYjNDM7CWlmICghbm9kZV9oYXNfbWVtb3J5KHRhcmdldF9ub2RlKSkKJiM0MzsJCWVycngoMSwgJiMzNDtGQUlMOiB1bmJpbmRhYmxlIG5vZGUgJWQgc2hvdWxkIGhhdmUgYmVlbiByZWplY3RlZCYjMzQ7LAomIzQzOwkJICAgICB0YXJnZXRfbm9kZSk7CiYjNDM7CXByaW50ZigmIzM0O09LOiBjcmVhdGVkIGdtZW0gZmQ9JWQgYm91bmQgdG8gbm9kZSAlZFxuJiMzNDssIGdtZW0sIHRhcmdldF9ub2RlKTsKJiM0MzsKJiM0MzsJbWVtID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBnbWVtLCAwKTsKJiM0MzsJaWYgKG1lbSA9PSBNQVBfRkFJTEVEKQomIzQzOwkJZXJyKDEsICYjMzQ7bW1hcCBnbWVtJiMzNDspOwomIzQzOwomIzQzOwkvKiBGYXVsdCBldmVyeSBwYWdlIGluIChubyBtYmluZCBvbiB0aGlzIG1hcHBpbmcpLiAqLwomIzQzOwltZW1zZXQobWVtLCAweGFhLCBzaXplKTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IHNpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlsb25nIG5vZGUgPSBtb3ZlX3BhZ2VzX3N0YXR1cyhtZW0gJiM0MzsgaSAqIHBhZ2Vfc2l6ZSk7CiYjNDM7CiYjNDM7CQlwcmludGYoJiMzNDtwYWdlICV6dSAtJmd0OyBub2RlICVsZCAod2FudCAlZClcbiYjMzQ7LCBpLCBub2RlLCB0YXJnZXRfbm9kZSk7CiYjNDM7CQlpZiAobm9kZSAhPSB0YXJnZXRfbm9kZSkKJiM0MzsJCQllcnJ4KDEsICYjMzQ7RkFJTDogcGFnZSAlenUgbGFuZGVkIG9uIG5vZGUgJWxkLCB3YW50ZWQgJWQmIzM0OywKJiM0MzsJCQkgICAgIGksIG5vZGUsIHRhcmdldF9ub2RlKTsKJiM0MzsJfQomIzQzOwomIzQzOwlwcmludGYoJiMzNDtQQVNTOiBhbGwgJXp1IHBhZ2VzIG9uIG5vZGUgJWQgdmlhIEZMQUdfQklORF9OT0RFIChubyBtYmluZClcbiYjMzQ7LAomIzQzOwkgICAgICAgc2l6ZSAvIHBhZ2Vfc2l6ZSwgdGFyZ2V0X25vZGUpOwomIzQzOwomIzQzOwltdW5tYXAobWVtLCBzaXplKTsKJiM0MzsJY2xvc2UoZ21lbSk7CiYjNDM7CWNsb3NlKHZtKTsKJiM0MzsJY2xvc2Uoa3ZtKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKaW5kZXggZjBlNWRhNDkwODY2MDQuLmRlMzIwZGYwOGUwZmY0IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCiYjNDM7JiM0MzsmIzQzOyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKQEAgLTQ1Niw2ICYjNDM7NDU2LDI2IEBAIHN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICprdm1fZ21lbV9nZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCSAqLwogCXJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKCZhbXA7R01FTV9JKGlub2RlKS0mZ3Q7cG9saWN5LCBwZ29mZik7CiB9CiYjNDM7CiYjNDM7c3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CXBvbCA9IG1wb2xfYmluZF9ub2RlKG5vZGUpOwomIzQzOwlpZiAoSVNfRVJSKHBvbCkpCiYjNDM7CQlyZXR1cm4gUFRSX0VSUihwb2wpOwomIzQzOwomIzQzOwllcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKCZhbXA7R01FTV9JKGlub2RlKS0mZ3Q7cG9saWN5LCAwLAomIzQzOwkJCQkJICBNQVhfTEZTX0ZJTEVTSVpFICZndDsmZ3Q7IFBBR0VfU0hJRlQsIHBvbCk7CiYjNDM7CW1wb2xfcHV0KHBvbCk7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOyNlbHNlCiYjNDM7c3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVJTlZBTDsKJiM0Mzt9CiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBrdm1fZ21lbV92bV9vcHMgPSB7CkBAIC01NTcsNyAmIzQzOzU3Nyw3IEBAIGJvb2wgX193ZWFrIGt2bV9hcmNoX3N1cHBvcnRzX2dtZW1faW5pdF9zaGFyZWQoc3RydWN0IGt2bSAqa3ZtKQogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncykKJiM0MztzdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncywgaW50IG5vZGUpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSAmIzM0O1trdm0tZ21lbV0mIzM0OzsKIAlzdHJ1Y3QgZ21lbV9maWxlICpmOwpAQCAtNTk4LDYgJiM0Mzs2MTgsMTIgQEAgc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MpCiAKIAlHTUVNX0koaW5vZGUpLSZndDtmbGFncyA9IGZsYWdzOwogCiYjNDM7CWlmIChmbGFncyAmYW1wOyBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkgewomIzQzOwkJZXJyID0ga3ZtX2dtZW1fYmluZF9ub2RlKGlub2RlLCBub2RlKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJZ290byBlcnJfaW5vZGU7CiYjNDM7CX0KJiM0MzsKIAlmaWxlID0gYWxsb2NfZmlsZV9wc2V1ZG8oaW5vZGUsIGt2bV9nbWVtX21udCwgbmFtZSwgT19SRFdSLCAmYW1wO2t2bV9nbWVtX2ZvcHMpOwogCWlmIChJU19FUlIoZmlsZSkpIHsKIAkJZXJyID0gUFRSX0VSUihmaWxlKTsKQEAgLTYzMCw2ICYjNDM7NjU2LDcgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKQogewogCWxvZmZfdCBzaXplID0gYXJncy0mZ3Q7c2l6ZTsKIAl1NjQgZmxhZ3MgPSBhcmdzLSZndDtmbGFnczsKJiM0MzsJaW50IG5vZGUgPSBOVU1BX05PX05PREU7CiAKIAlpZiAoZmxhZ3MgJmFtcDsgfmt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02MzcsNyAmIzQzOzY2NCwxNSBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpCiAJaWYgKHNpemUgJmx0Oz0gMCB8fCAhUEFHRV9BTElHTkVEKHNpemUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzKTsKJiM0MzsJaWYgKGZsYWdzICZhbXA7IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7CiYjNDM7CQlpZiAoYXJncy0mZ3Q7cGFkIHx8IGFyZ3MtJmd0O25vZGUgJmd0Oz0gTUFYX05VTU5PREVTKQomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJbm9kZSA9IGFyZ3MtJmd0O25vZGU7CiYjNDM7CX0gZWxzZSBpZiAoYXJncy0mZ3Q7bm9kZSB8fCBhcmdzLSZndDtwYWQpIHsKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzLCBub2RlKTsKIH0KIAogaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yMyAwMjo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0NzA0MQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDMyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBc3Nlc3NpbmcgdGhlIEZ1enppbmcgSW1wYWN0IG9mIFRoaXMgUGF0Y2ggU2VyaWVzKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIHNlcmllcyBpbiBmcm9udCBvZiBtZSwgYW5kIG15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHdoZXRoZXIgaXQgaW50cm9kdWNlcyBhbnkgbmV3LCBmdXp6ZXItd29ydGh5IGZ1bmN0aW9uYWxpdHkgaW50byB0aGUga2VybmVsLiBUaGlzIGxvb2tzIGxpa2UgYSBzaWduaWZpY2FudCBjaGFuZ2U7IGl0JiMzOTtzIGludHJvZHVjaW5nICYjMzQ7UHJpdmF0ZSBtZW1vcnkgbm9kZXMmIzM0OyDigJMgYE5fTUVNT1JZX1BSSVZBVEVgIOKAkyBhbmQgaXQmIzM5O3MgdG91Y2hpbmcgcXVpdGUgYSBmZXcgY3JpdGljYWwgYXJlYXM6IG1lbW9yeSBtYW5hZ2VtZW50LCBob3RwbHVnLCBtZW1wb2xpY3ksIE5VTUEgYmFsYW5jaW5nLCBldmVuIEtWTSYjMzk7cyBgZ3Vlc3RfbWVtZmRgLiBUaGF0JiMzOTtzIGEgc3Ryb25nIGluZGljYXRvciB3ZSBuZWVkIHRvIGdpdmUgdGhpcyBhIHZlcnkgY2xvc2UgbG9vay4KClRoZSBjb3JlIG9mIHRoZSBjaGFuZ2Ugc2VlbXMgdG8gYmUgY2VudGVyZWQgYXJvdW5kIHRoaXMgbmV3IGBOX01FTU9SWV9QUklWQVRFYCBub2RlIHN0YXRlIGFuZCBhIGNvcnJlc3BvbmRpbmcgYHN0cnVjdCBub2RlX3ByaXZhdGVgLiBBbmQsIGhleSwgaXQgbG9va3MgbGlrZSBhIG5ldyBmbGFnLCBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgLCBpcyBiZWluZyBhZGRlZCB0byBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAuIFRoYXQmIzM5O3MgaW1wb3J0YW50OyBpdCBtZWFucyB1c2Vyc3BhY2UgaW50ZXJhY3Rpb24gaXMgYWxtb3N0IGNlcnRhaW5seSBpbnZvbHZlZC4KCk5vdywgbGV0JiMzOTtzIHNlZSBpZiB0aGlzIGNvZGUgcGF0aCBpcyBhY3R1YWxseSByZWFjaGFibGUuICBUaGUgS1ZNIGNoYW5nZXMgYXJlIGVhc3k7IHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcHJvdmlkZXMgYSBjbGVhciBlbnRyeSBwb2ludCBmcm9tIHVzZXJzcGFjZS4gIEFuZCB0aGlzIG5ldyBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UuIEdvb2QuICBJIG5lZWQgdG8gY2hlY2sgaG93IHRoZSBkcml2ZXJzIHdvcmsuIEkgc2VlIHRoZSBgYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkYCBmdW5jdGlvbiwgYW5kIGl0JiMzOTtzIGV4cG9ydGVkLiBJcyBpdCBiZWluZyB1c2VkIGJ5IGFueXRoaW5nICppbiB0aGlzIHBhdGNoIHNlcmllcyo/IExldCBtZSBkb3VibGUtY2hlY2suIE9rYXksIEkmIzM5O20gbG9va2luZyBhdCBgZHJpdmVycy9kYXgva21lbS5jYCwgYW5kIGl0JiMzOTtzIG1vZGlmeWluZyBpdCB0byBwYXNzIGBOVUxMYCB0byBgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkYCwgc28gaXQgbG9va3MgbGlrZSBpdCBpcywgYnV0IGp1c3QgaW4gdGhhdCBwYXJ0aWN1bGFyIGNhc2UuCgpBbHJpZ2h0LCBsZXQmIzM5O3Mgem9vbSBvdXQuIERvZXMgKmFueXRoaW5nKiBpbiB0aGUgb3ZlcmFsbCBjb2RlYmFzZSBjdXJyZW50bHkgdXNlIGBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWRgIG9yIGBub2RlX3ByaXZhdGVfcmVnaXN0ZXJgPyBUaW1lIHRvIGRvIGEgcXVpY2sgc2VhcmNoLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHkgaXMgYWN0dWFsbHkgcGFydCBvZiBhIGNvZGVwYXRoIHRoYXQgZ2V0cyBleGVjdXRlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yMyAwMjo1MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7RG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0PTkxPUEgZHJpdmVyIGJyaW5ncyBtZW1vcnkgdXAgYXMgcHJpdmF0ZSB3aXRoOjpcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC05Mi1cbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdDo5MzogIGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZChuaWQsIHN0YXJ0LCBzaXplLCByZXNvdXJjZV9uYW1lLFxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0LTk0LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ocF9mbGFncywgb25saW5lX3R5cGUsIG5wKVxuLS1cbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaD0zMDY9aW50IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxuLS1cbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaC0zMDgtXHRcdFx0XHRlbnVtIG1tb3Agb25saW5lX3R5cGUsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKTtcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaDozMDk6aW50IGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTMxMC1cdFx0XHRcdCAgICAgIGNvbnN0IGNoYXIgKnJlc291cmNlX25hbWUsIG1ocF90IG1ocF9mbGFncyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE3MzU9RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQsIFwmIzM0O2ttZW1cJiMzNDspO1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTczNy0vKipcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTczODogKiBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQgLSBhZGQgcHJpdmF0ZSBkcml2ZXItbWFuYWdlZCBtZW1vcnlcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTczOS0gKiBAbmlkOiBOVU1BIG5vZGUgSUQgd2hlcmUgdGhlIG1lbW9yeSB3aWxsIGJlIGFkZGVkXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNzUzLSAqL1xubW0vbWVtb3J5X2hvdHBsdWcuYzoxNzU0OmludCBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTc1NS1cdFx0XHRcdCAgICAgIGNvbnN0IGNoYXIgKnJlc291cmNlX25hbWUsIG1ocF90IG1ocF9mbGFncyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE3NjMtfVxubW0vbWVtb3J5X2hvdHBsdWcuYzoxNzY0OkVYUE9SVF9TWU1CT0xfR1BMKGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZCk7XG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE3NjUtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjMgMDI6NTM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDgzODcKCQkJCQkJCW91dHB1dDogMjMKCQkJCQkJCXRob3VnaHRzOiAxNzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyB0aGUgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCBGbGFnIGluIEtWTSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZGAsIGFuZCBpdCBzZWVtcyBsaWtlICpub2JvZHkqIGluIHRoZSBrZXJuZWwgdHJlZSBpcyBhY3R1YWxseSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gcmlnaHQgbm93LiBJbnRlcmVzdGluZy4gQnV0LCBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIOKAkyB0aGF0JiMzOTtzIGFub3RoZXIgc3RvcnkuIEtWTSBhY3R1YWxseSBleHBvc2VzIHRoaXMgZmxhZyB0byB1c2Vyc3BhY2UgdGhyb3VnaCBhIEtWTSBpb2N0bC4gSSYjMzk7bSB3b25kZXJpbmcgaWYgdGhpcyBjb3VsZCBiZSBhIHBvdGVudGlhbCBmdXp6IHRhcmdldC4KCkxldCBtZSBjaGVjay4gWWVwLCBnb29kLCBga3ZtX2dtZW1fY3JlYXRlYCBkb2VzIGluZGVlZCBoYW5kbGUgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYC4gQW5kIHRoZSB0cmFjZSBsb29rcyBnb29kIC0gYGt2bV9nbWVtX2NyZWF0ZWAgaXMgdGhlbiBjYWxsaW5nIGBrdm1fZ21lbV9iaW5kX25vZGVgLCB3aGljaCB0aGVuIGlzIGNhbGxpbmcgYG1wb2xfYmluZF9ub2RlKG5vZGUpYC4gR3JlYXQsIGBtcG9sX2JpbmRfbm9kZWAgaXMgc3RhbmRhcmQsIGxvY2F0ZWQgaW4gYG1tL21lbXBvbGljeS5jYC4gVGltZSB0byBkaXZlIGEgYml0IGRlZXBlciBpbnRvIGBrdm1fZ21lbV9jcmVhdGVgIGFuZCBga3ZtX2dtZW1fYmluZF9ub2RlYCB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjMgMDI6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a3ZtX2dtZW1fYmluZF9ub2RlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NDQwPXN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICprdm1fZ21lbV9nZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNDU5LVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYzo0NjA6c3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTQ2MS17XG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy00NzQtI2Vsc2VcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NDc1OnN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy00NzYte1xuLS1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NTgwPXN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzLCBpbnQgbm9kZSlcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTYyMS1cdGlmIChmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjIyOlx0XHRlcnIgPSBrdm1fZ21lbV9iaW5kX25vZGUoaW5vZGUsIG5vZGUpO1xudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy02MjMtXHRcdGlmIChlcnIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjMgMDI6NTM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDkxNzkKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAxNDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBHdWVzdCBNZW1vcnkgTm9kZSBCaW5kaW5nIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBzb21ldGhpbmcgaW50ZXJlc3Rpbmc6IGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAsIGEgbmV3IEtWTSBmZWF0dXJlLiBFc3NlbnRpYWxseSwgaXQgYWxsb3dzIGJpbmRpbmcgYSBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIChndWVzdF9tZW1mZCkgdG8gYSBzcGVjaWZpYyBOVU1BIG5vZGUuIEZ1bmN0aW9uYWxseSwgdGhpcyBpcyBhIGRlZmluaXRlIGNoYW5nZSwgd2hpY2ggbWVhbnMgZnV6emluZyBpcyBjcnVjaWFsLgoKR2l2ZW4gdGhlIG5hdHVyZSBvZiB0aGUgY2hhbmdlLCBJJiMzOTttIGdvaW5nIHRvIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbnMgYXJlIGVuYWJsZWQuIExvb2tzIGxpa2UgYENPTkZJR19LVk1gIGFuZCBgQ09ORklHX05VTUFgIGFyZSB0aGUga2V5IG9uZXMgaGVyZS4KCk5vdywgbGV0JiMzOTtzIGRyaWxsIGRvd24gaW50byB0aGUgY29yZSBzeW1ib2xzLiBJJiMzOTttIHRoaW5raW5nIEkgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIGBrdm1fZ21lbV9jcmVhdGVgLCBga3ZtX2dtZW1fYmluZF9ub2RlYCwgYW5kIHRoZW4gZGl2ZSBpbnRvIHRoZSBOVU1BLXNwZWNpZmljIGNhbGxzOiBgbXBvbF9iaW5kX25vZGVgLCBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAsIGFuZCB1bHRpbWF0ZWx5LCB0aGUgbG93LWxldmVsIGBfX21wb2xfYmluZF9ub2RlYC4gSSYjMzk7bGwgc3RhcnQgYnkgdGFraW5nIGEgZ29vZCBsb29rIGF0IGBtcG9sX2JpbmRfbm9kZWAgYW5kIGl0cyB1bmRlcmx5aW5nIGZ1bmN0aW9uLCBgX19tcG9sX2JpbmRfbm9kZWAsIG1ha2luZyBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aG9zZSBhbmQgdGhlIG5ldyBLVk0gZnVuY3Rpb25hbGl0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yMyAwMjo1MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtfX21wb2xfYmluZF9ub2RlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbXBvbGljeS5jPTExMDQ9c3RhdGljIGxvbmcgZG9fc2V0X21lbXBvbGljeSh1bnNpZ25lZCBzaG9ydCBtb2RlLCB1bnNpZ25lZCBzaG9ydCBmbGFncyxcbi0tXG5tbS9tZW1wb2xpY3kuYy0xMTUyLSAqL1xubW0vbWVtcG9saWN5LmM6MTE1MzpzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqX19tcG9sX2JpbmRfbm9kZShpbnQgbmlkLCB1bnNpZ25lZCBzaG9ydCBmbGFncylcbm1tL21lbXBvbGljeS5jLTExNTQte1xuLS1cbm1tL21lbXBvbGljeS5jPTEyMDA9c3RydWN0IG1lbXBvbGljeSAqbXBvbF9wcml2YXRlX2JpbmQoaW50IG5pZClcbi0tXG5tbS9tZW1wb2xpY3kuYy0xMjAzLVx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbm1tL21lbXBvbGljeS5jOjEyMDQ6XHRyZXR1cm4gX19tcG9sX2JpbmRfbm9kZShuaWQsIE1QT0xfRl9QUklWQVRFKTtcbm1tL21lbXBvbGljeS5jLTEyMDUtfVxuLS1cbm1tL21lbXBvbGljeS5jPTEyMjM9c3RydWN0IG1lbXBvbGljeSAqbXBvbF9iaW5kX25vZGUoaW50IG5pZClcbm1tL21lbXBvbGljeS5jLTEyMjQte1xubW0vbWVtcG9saWN5LmM6MTIyNTpcdHJldHVybiBfX21wb2xfYmluZF9ub2RlKG5pZCwgMCk7XG5tbS9tZW1wb2xpY3kuYy0xMjI2LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yMyAwMjo1MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0OTg5MwoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzIG9uIGNoZWNraW5nIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYDoKCioqRXhhbWluaW5nIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCoqCgpSaWdodCwgc28gSSBzZWUgdGhhdCBmdW5jdGlvbiBuYW1lIOKAkyBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBmaWd1cmUgb3V0IGl0cyBwdXJwb3NlIHdpdGhpbiB0aGlzIGNvbnRleHQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgaXQgKmRvZXMqIGluIHJlbGF0aW9uIHRvIHRoZSBicm9hZGVyIHN5c3RlbSwgd2hhdGV2ZXIgdGhhdCBtYXkgYmUuICYjMzQ7U2hhcmVkIHBvbGljeSYjMzQ7IHN1Z2dlc3RzIHNvbWV0aGluZyByZWxhdGVkIHRvIHJlc291cmNlIG1hbmFnZW1lbnQsIHBlcmhhcHMgbWVtb3J5IG9yIHByb2Nlc3NvcnMsIGJlaW5nIGFwcGxpZWQgYWNyb3NzIGEgc3BlY2lmaWVkIHJhbmdlLiAgSSYjMzk7bSBhbHJlYWR5IG1lbnRhbGx5IGZvcm1pbmcgcXVlc3Rpb25zOiB3aGF0IGNvbnN0aXR1dGVzIHRoZSAmIzM0O3NoYXJlZCBwb2xpY3kmIzM0Oz8gV2hhdCBraW5kIG9mICYjMzQ7cmFuZ2UmIzM0OyBhcmUgd2UgdGFsa2luZyBhYm91dD8gRG9lcyB0aGlzIHBvbGljeSAqb3ZlcnJpZGUqIGV4aXN0aW5nIHNldHRpbmdzLCBvciAqY29tcGxlbWVudCogdGhlbT8gV2hhdCBhcmUgdGhlIGltcGxpY2F0aW9ucyBmb3IgY29uY3VycmVuY3ksIGlmIGFueT8gQWxzbywgaXMgdGhlcmUgYSBwYXJ0aWN1bGFyIG1lbW9yeSBtb2RlbCB0byBiZSBjb25jZXJuZWQgYWJvdXQ/IEkgc2hvdWxkIHByb2JhYmx5IHN0YXJ0IGJ5IHJlZnJlc2hpbmcgbXkgbWVtb3J5IG9uIHJlbGV2YW50IGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIGJyb2FkZXIgc3lzdGVtIGFuZCBob3cgaXRzIHJlc291cmNlcyB3b3JrLiBJIG5lZWQgdG8gYXNzZXNzIGhvdyBpdCBmaXRzIHdpdGhpbiB0aGUgbGFyZ2VyIGFyY2hpdGVjdHVyZS4gSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBnb2luZyBvdmVyIHJlbGV2YW50IGRvY3VtZW50cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjMgMDI6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oPTEyNj1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG5pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oLTEyNy1cdFx0XHQgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XG5pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oOjEyODppbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG5pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oLTEyOS1cdFx0XHRcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XG4tLVxubW0vbWVtcG9saWN5LmM9MzQyNT1FWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2hhcmVkX3BvbGljeV9pbml0LCBcJiMzNDtrdm1cJiMzNDspO1xuLS1cbm1tL21lbXBvbGljeS5jLTM0MjctLyoqXG5tbS9tZW1wb2xpY3kuYzozNDI4OiAqIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgLSBpbnN0YWxsIEBwb2wgb3ZlciBbQHN0YXJ0LCBAZW5kKSBvZiBAc3Bcbm1tL21lbXBvbGljeS5jLTM0MjktICogQHNwOiAgICB0aGUgc2hhcmVkIHBvbGljeSB0cmVlXG4tLVxubW0vbWVtcG9saWN5LmMtMzQ0My0gKi9cbm1tL21lbXBvbGljeS5jOjM0NDQ6aW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LFxubW0vbWVtcG9saWN5LmMtMzQ0NS1cdFx0XHRcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuLS1cbm1tL21lbXBvbGljeS5jLTM0NTktfVxubW0vbWVtcG9saWN5LmM6MzQ2MDpFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UsIFwmIzM0O2t2bVwmIzM0Oyk7XG5tbS9tZW1wb2xpY3kuYy0zNDYxLVxubW0vbWVtcG9saWN5LmM9MzQ2Mj1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4tLVxubW0vbWVtcG9saWN5LmMtMzQ2NC17XG5tbS9tZW1wb2xpY3kuYzozNDY1Olx0cmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3AsIHZtYS1cdTAwM2V2bV9wZ29mZixcbm1tL21lbXBvbGljeS5jLTM0NjYtXHRcdFx0XHRcdCAgIHZtYS1cdTAwM2V2bV9wZ29mZiAmIzQzOyB2bWFfcGFnZXModm1hKSwgcG9sKTtcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jPTQ2MD1zdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTQ2OC1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NDY5Olx0ZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZXBvbGljeSwgMCxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNDcwLVx0XHRcdFx0XHQgIE1BWF9MRlNfRklMRVNJWkUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQsIHBvbCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzIzIDAyOjUzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUwODI0CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQcml2YXRlIE5vZGUgSW1wbGVtZW50YXRpb24qKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyB0b3VjaGluZyBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgYW5kIGBkcml2ZXJzL2Jhc2Uvbm9kZS5jYCwgd2hpY2ggaW1tZWRpYXRlbHkgZmxhZ3MgbXkgaW50ZXJlc3QgYmVjYXVzZSB3ZSYjMzk7cmUgZGl2aW5nIGludG8gcHJpdmF0ZSBub2RlIHN1cHBvcnQuIFRoZSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGF0IGBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWRgIGlzbiYjMzk7dCBhY3R1YWxseSAqdXNlZCogYnkgYW55IGV4aXN0aW5nIGRyaXZlciBjb2RlLiBUaGF0IHN1Z2dlc3RzIHRoZSBwcml2YXRlIG5vZGUgZnVuY3Rpb25hbGl0eSwgYXMgYSB3aG9sZSwgbWlnaHQgYmUgZWZmZWN0aXZlbHkgaW5hY2Nlc3NpYmxlIHVubGVzcyB5b3UgY2FuIGFjdHVhbGx5IGhvdHBsdWcgYSBwcml2YXRlIG5vZGUuIFdoaWNoIGZlZWxzLi4ubGltaXRpbmcuIFRoaXMgcmFpc2VzIGEgcmVkIGZsYWcgaW4gbXkgbWluZDsgdGhhdCYjMzk7cyBub3QgaWRlYWwgZGVzaWduIGZyb20gYSByb2J1c3RuZXNzIHBlcnNwZWN0aXZlLgoKSG93ZXZlciwgaG9sZCBvbiBhIHNlY29uZC4uLiBgbm9kZV9wcml2YXRlX3JlZ2lzdGVyYCBpcyAqZXhwb3J0ZWQqLiBUaGF0IGltcGxpZXMgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGxldmVyYWdlIHRoaXMgZnVuY3Rpb24uIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSBpZiB0aGlzIGlzIGFjdHVhbGx5IHVzZWQgYW55d2hlcmUuIFRoYXQmIzM5O3MgYSBjcnVjaWFsIHBvaW50LCBhbmQgSSBuZWVkIHRvIGNoZWNrIHRoZSBjYWxsIHNpdGVzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBwYXRoIGlzIHRydWx5IHJlYWNoYWJsZS4gSSBuZWVkIHRvIGZvbGxvdyB0aGUgYnJlYWRjcnVtYnMgaGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjMgMDI6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bm9kZV9wcml2YXRlX3JlZ2lzdGVyJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdD0xMDI9VGhlIG5vZGUgbGVhdmVzIGBgTl9NRU1PUllfUFJJVkFURWBgIG9ubHkgd2hlbiB0aGUgbGFzdCByYW5nZSBpcyBvZmZsaW5lZC5cbi0tXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QtMTA3LS4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2Uvbm9kZS5jXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3Q6MTA4OiAgIDppZGVudGlmaWVyczogbm9kZV9wcml2YXRlX3JlZ2lzdGVyIG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QtMTA5LVxuLS1cbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdD0xNDQ9RGVwZW5kZW5jaWVzIGJldHdlZW4gY2FwYWJpbGl0aWVzIGFyZSBlbmZvcmNlZCAqKm9uY2UqKiwgYnlcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdDoxNDU6YGBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoKWBgIGF0IGhvdHBsdWcsIHJhdGhlciB0aGFuIGJ5IHdoYXRldmVyIHNldHMgdGhlIGJpdHM6XG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QtMTQ2LVxuLS1cbmRyaXZlcnMvYmFzZS9ub2RlLmM9ODczPXN0YXRpYyBERUZJTkVfTVVURVgobm9kZV9wcml2YXRlX2xvY2spO1xuLS1cbmRyaXZlcnMvYmFzZS9ub2RlLmMtODc1LS8qKlxuZHJpdmVycy9iYXNlL25vZGUuYzo4NzY6ICogbm9kZV9wcml2YXRlX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgYSBwcml2YXRlIG5vZGVcbmRyaXZlcnMvYmFzZS9ub2RlLmMtODc3LSAqIEBuaWQ6IE5vZGUgaWRlbnRpZmllclxuLS1cbmRyaXZlcnMvYmFzZS9ub2RlLmMtODg5LSAqL1xuZHJpdmVycy9iYXNlL25vZGUuYzo4OTA6aW50IG5vZGVfcHJpdmF0ZV9yZWdpc3RlcihpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucClcbmRyaXZlcnMvYmFzZS9ub2RlLmMtODkxLXtcbi0tXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTkyOS19XG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjkzMDpFWFBPUlRfU1lNQk9MX0dQTChub2RlX3ByaXZhdGVfcmVnaXN0ZXIpO1xuZHJpdmVycy9iYXNlL25vZGUuYy05MzEtXG4tLVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaD04PXN0cnVjdCBwYWdlO1xuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMjQtICpcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6MjU6ICogQWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIgYW5kIHBhc3NlZCB0byBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoKS5cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMjYtICogVGhlIGRyaXZlciBvd25zIHRoZSBtZW1vcnkgYW5kIG11c3QgZW5zdXJlIGl0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXJcbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oPTIzNj1zdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfbHRwaW4oaW50IG5pZClcbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTI0NC1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6MjQ1OmludCBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoaW50IG5pZCwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApO1xuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0yNDYtaW50IG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKGludCBuaWQpO1xuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMjQ5LVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaDoyNTA6c3RhdGljIGlubGluZSBpbnQgbm9kZV9wcml2YXRlX3JlZ2lzdGVyKGludCBuaWQsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0yNTEte1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTY4Nz1pbnQgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNzExLVx0XHR9XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE3MTI6XHRcdHJjID0gbm9kZV9wcml2YXRlX3JlZ2lzdGVyKHJlYWxfbmlkLCBucCk7XG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE3MTMtXHRcdGlmIChyYylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjMgMDI6NTM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTE5MTcKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiAyNjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIGBub2RlX3ByaXZhdGVfcmVnaXN0ZXJgIEZ1bmN0aW9uIGFuZCBLVk0gR3Vlc3QgTWVtb3J5KioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJIHNlZSwgYG5vZGVfcHJpdmF0ZV9yZWdpc3RlcmAgc2VlbXMgdG8gYmUgY2FsbGVkICpvbmx5KiBmcm9tIGBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWRgLiBBbmQgbG9va2luZyBhdCB0aGUgY2FsbCBncmFwaCwgYF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZGAgaXMgZXhjbHVzaXZlbHkgcmVhY2hlZCB2aWEgYGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZGAgYW5kIGBhZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkYC4gQnV0IGhvbGQgb24sIHdoZW4gYGFkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWRgIGlzIGNhbGxlZCwgaXQgcGFzc2VzIGBOVUxMYCBmb3IgYG5wYC4gTWVhbmluZyBgbm9kZV9wcml2YXRlX3JlZ2lzdGVyYCBpc24mIzM5O3QgcmVnaXN0ZXJpbmcgYW55IHByaXZhdGUgbm9kZXMgaW4gdGhhdCBwYXJ0aWN1bGFyIHBhdGguIEluIGZhY3QsIGlmIG15IHJlYWRpbmcgaXMgY29ycmVjdCwgYG5vZGVfcHJpdmF0ZV9yZWdpc3RlcmAgaXMgKnVucmVhY2hhYmxlKiBmcm9tIGFueSBleGlzdGluZyBkcml2ZXIgd2l0aGluIHRoZSB0cmVlLCBhdCBsZWFzdCBpbiBpdHMgY3VycmVudCBzdGF0ZS4KCkhvd2V2ZXIsIGhlcmUmIzM5O3Mgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZzogdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZy4uLiB0aGF0JiMzOTtzICpleHRlcm5hbGx5KiBhY2Nlc3NpYmxlLiBMZXQgbWUgY29uZmlybSB0aGF0IHRoZXJlIGFyZW4mIzM5O3QgYW55IHNuZWFreSBiYWNrZG9vcnMgSSBhbSBtaXNzaW5nLiBPa2F5LCB0aGUgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCBmbGFnICppcyogYWRkZWQgdG8gdGhlIHN1cHBvcnRlZCBmbGFncyBieSBga3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFnc2AuIEFoLCBhbmQgKnRoYXQqIGlzIHJlYWNoZWQgYnkgdGhlIGBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEYCBpb2N0bC4gUmlnaHQsIHNvIHRoZXNlIHJlY2VudCBLVk0gZ3Vlc3RfbWVtZmQgbW9kaWZpY2F0aW9ucyAqYXJlKiByZWFjaGFibGUuIFRoZXkmIzM5O3JlIGRlZmluaXRlbHkgaW4gdGhlIGNyb3NzaGFpcnMgZm9yIHBvdGVudGlhbCBmdXp6aW5nLgoKQmVmb3JlIEkgZ28gZnVydGhlciwgSSBzaG91bGQgY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb25zLiBgQ09ORklHX0tWTWAgaXMgb2J2aW91c2x5IGEgcHJlcmVxdWlzaXRlLiBBbmQsIHllcCwgYENPTkZJR19OVU1BYCAqaXMqIHJlcXVpcmVkIGZvciBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIHRvIGJlIHN1cHBvcnRlZCwgYXMgSSBzdXNwZWN0ZWQuIE5vdyBJIHNob3VsZCByZXZpZXcgYGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3NgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yMyAwMjo1MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaD03MzM9Ym9vbCBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKHN0cnVjdCBrdm0gKmt2bSk7XG5pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgtNzM0LVxuaW5jbHVkZS9saW51eC9rdm1faG9zdC5oOjczNTpzdGF0aWMgaW5saW5lIHU2NCBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSlcbmluY2x1ZGUvbGludXgva3ZtX2hvc3QuaC03MzYte1xuLS1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NjU1PWludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY2MC1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjYxOlx0aWYgKGZsYWdzIFx1MDAyNiB+a3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhrdm0pKVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy02NjItXHRcdHJldHVybiAtRUlOVkFMO1xuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmM9NDg2ND1zdGF0aWMgaW50IGt2bV92bV9pb2N0bF9jaGVja19leHRlbnNpb25fZ2VuZXJpYyhzdHJ1Y3Qga3ZtICprdm0sIGxvbmcgYXJnKVxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtNDkzMi1cdGNhc2UgS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHUzpcbnZpcnQva3ZtL2t2bV9tYWluLmM6NDkzMzpcdFx0cmV0dXJuIGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3Moa3ZtKTtcbnZpcnQva3ZtL2t2bV9tYWluLmMtNDkzNC0jZW5kaWZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjMgMDI6NTM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTMwMDEKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiA1MTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEtWTSBHdWVzdCBNZW1vcnkgYW5kIE5VTUEgTm9kZSBCaW5kaW5nKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZyb20gbG9va2luZyBhdCBga3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFnc2AgaW4gYGluY2x1ZGUvbGludXgva3ZtX2hvc3QuaGAsIGl0JiMzOTtzIGNsZWFyIHRoYXQgTlVNQSBzdXBwb3J0IGlzIGEgcHJlcmVxdWlzaXRlLCBpbmRpY2F0ZWQgYnkgdGhlIHVzZSBvZiBgQ09ORklHX05VTUFgLiBUaGF0JiMzOTtzIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2guCgpOb3csIHRoZSBjb25uZWN0aW9uIGlzIHRocm91Z2ggYG1wb2xfYmluZF9ub2RlYCwgd2hpY2ggZXNzZW50aWFsbHkgY2FsbHMgYF9fbXBvbF9iaW5kX25vZGVgIHRvIGNyZWF0ZSBhIG1lbW9yeSBwb2xpY3kuIFRoaXMgcGF0aCBpcyBvYnZpb3VzbHkgYWNjZXNzaWJsZSBmcm9tIGBrdm1fZ21lbV9iaW5kX25vZGVgLCBhbmQgbXkgY29uY2VybiBpcyBhYm91dCBvdGhlciBwb3RlbnRpYWwgcGF0aHMuCgpJJiMzOTt2ZSBiZWVuIHNjYW5uaW5nIGZvciB0aGUgdmFyaW91cyBjYWxscyBhZmZlY3RlZCwgc3BlY2lmaWNhbGx5IGluIHRoZSBwYXRjaCwgYW5kIEkgc2VlIG1vZGlmaWNhdGlvbnMgYWNyb3NzIHRoZSBib2FyZC4gVGhlIGNhbGxzIHJlYWNoIGBjcHVzZXRfaGFuZGxlX2hvdHBsdWdgLCBgY29tcGFjdGlvbl96b25lbGlzdF9zdWl0YWJsZWAsIGB0cnlfdG9fY29tcGFjdF9wYWdlc2AsIGV0Yy4KClRoZSBjcml0aWNhbCB0aGluZyBJJiMzOTttIHNlZWluZyBpcyB0aGF0IGFsbW9zdCBhbGwgb2YgdGhlc2UgbW9kaWZpY2F0aW9ucyBhcmUgZ2F0ZWQgYnkgY2hlY2tzIGxpa2UgYG5vZGVfaXNfcHJpdmF0ZShuaWQpYCBvciBgZm9saW9faXNfcHJpdmF0ZV9ub2RlKGZvbGlvKWAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHNpbmNlIHRoZXJlIGlzbiYjMzk7dCBhIGRyaXZlciB0byByZWdpc3RlciBhICYjMzQ7cHJpdmF0ZSYjMzQ7IG5vZGUsIHRoZXNlIGNvbmRpdGlvbnMgd2lsbCAqYWx3YXlzKiBiZSBmYWxzZS4gVGhhdCB3b3VsZCBzZWVtIHRvIGxpbWl0IHRoZSBpbXBhY3QgaGVyZS4KCkJ1dCBob2xkIG9uLCBsZXQgbWUgZG91YmxlLWNoZWNrIGhvdyBgbm9kZV9pc19wcml2YXRlYCBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZC4gSSBzZWUgdGhhdCBpdCB1c2VzIGBub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSlgLiBUaGUgcXVlc3Rpb24gaXMsIGNhbiBgTl9NRU1PUllfUFJJVkFURWAgYmUgc2V0ICp3aXRob3V0KiBhIGRlZGljYXRlZCBkcml2ZXI/IEkgbmVlZCB0byBjaGVjayBob3cgdGhlIHN5c3RlbSBzZXRzIHRoaXMgc3RhdGUsIHNwZWNpZmljYWxseSB0aGUgYG9ubGluZV9wYWdlc2AgZnVuY3Rpb24gaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBvdGhlciBwb3RlbnRpYWwgbWVjaGFuaXNtcy4gSSYjMzk7bGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIG1lbW9yeSBob3RwbHVnIGNvZGUgYW5kIHNlZSBpZiB0aGVyZSYjMzk7cyBhbnkgc2NlbmFyaW8gd2hlcmUgdGhhdCBzdGF0ZSAqY291bGQqIGJlIHNldCBpbiBhIHdheSB0aGF0IGlzIHJlbGV2YW50IHRvIEtWTSBndWVzdCBtZW1vcnkgbWFuYWdlbWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjMgMDI6NTM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtub2RlX3NldF9zdGF0ZS4qTl9NRU1PUllfUFJJVkFURSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzIzIDAyOjU0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUzOTY2CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBob3cgSSYjMzk7ZCBhcHByb2FjaCB0aGlzLCBhcyBhbiBleHBlcnQgaW4gdGhlIGZpZWxkOgoKKipBbmFseXppbmcgdGhlIE1lbW9yeSBIb3RwbHVnIFBhdGNoOiBGb2N1cyBvbiBgb25saW5lX3BhZ2VzYCoqCgpSaWdodCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaCBpbiB0aGUgY29udGV4dCBvZiBtZW1vcnkgaG90cGx1Z2dpbmcsIGFuZCB0aGUgZmlyc3QgdGhpbmcgdGhhdCBqdW1wcyBvdXQgaXMgdGhlIG1lbnRpb24gb2YgYG9ubGluZV9wYWdlc2Agd2l0aGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4gVGhhdCYjMzk7cyB0aGUgY29yZSBvZiB0aGUgbWF0dGVyLCBsaWtlbHkgdGhlIGNlbnRyYWwgdmFyaWFibGUgb3IgZnVuY3Rpb24gYmVpbmcgbW9kaWZpZWQuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O09rYXksIHdoYXQmIzM5O3MgY2hhbmdlZCBhYm91dCBob3cgd2UmIzM5O3JlIGJyaW5naW5nIHBhZ2VzIG9ubGluZT8mIzM0OyBJcyB0aGUgbG9naWMgZm9yIGRldGVjdGluZywgYWxsb2NhdGluZywgb3IgbWFwcGluZyB0aGVtIGJlaW5nIGFsdGVyZWQ/IEFyZSB0aGVyZSBuZXcgZXJyb3IgcGF0aHMsIG9yIHBlcmhhcHMgb3B0aW1pemF0aW9ucz8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgYSBuZXcgYWxnb3JpdGhtIHRvIGRldGVybWluZSB3aGljaCBwYWdlcyB0byBicmluZyBvbmxpbmU/IEkgbmVlZCB0byBsb29rIGNsb3NlbHkgYXQgaG93IHRoaXMgdmFyaWFibGUgb3IgZnVuY3Rpb24gaXMgKnVzZWQqIHdpdGhpbiB0aGUgbGFyZ2VyIG1lbW9yeSBob3RwbHVnIHByb2Nlc3MuIEkgbmVlZCB0byB0cmFjZSB0aGUgaW1wbGljYXRpb25zIG9mIGNoYW5nZXMgdG8gYG9ubGluZV9wYWdlc2AgdGhyb3VnaG91dCB0aGUgY29kZSB0byB1bmRlcnN0YW5kIHRoZSBmdW5jdGlvbmFsIGltcGFjdCBhbmQgYW55IGFzc29jaWF0ZWQgcGVyZm9ybWFuY2Ugb3Igc3RhYmlsaXR5IGltcGxpY2F0aW9ucy4gSXMgdGhlcmUgYSByYWNlIGNvbmRpdGlvbiBiZWluZyBhZGRyZXNzZWQ/IE9yIGEgbmV3IGZlYXR1cmUgYmVpbmcgaW1wbGVtZW50ZWQgdG8gaW1wcm92ZSBvbmxpbmUgcGFnZSBoYW5kbGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjMgMDI6NTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Tl9NRU1PUllfUFJJVkFURSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtEb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZGV2aWNlcy1ub2RlPTM0PURlc2NyaXB0aW9uOlxuRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMtbm9kZTozNTpcdFx0Tm9kZXMgdGhhdCBoYXZlIHByaXZhdGUgKE5fTUVNT1JZX1BSSVZBVEUpIG1lbW9yeTogbWVtb3J5XG5Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZGV2aWNlcy1ub2RlLTM2LVx0XHRob3RwbHVnZ2VkIGJ5IGEgZHJpdmVyIG9udG8gYSBDUFUtbGVzcyBub2RlIGFuZCBpc29sYXRlZCBmcm9tXG4tLVxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0PTg9YW5kIGRlbGliZXJhdGVseSBoaWRkZW4gZnJvbSB0aGUga2VybmVsJiMzOTtzIG5vcm1hbCBtZW1vcnkgbWFuYWdlbWVudC4gIFN1Y2ggYVxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0Ojk6bm9kZSBpcyBtYXJrZWQgYGBOX01FTU9SWV9QUklWQVRFYGAgaW5zdGVhZCBvZiBgYE5fTUVNT1JZYGA7IHRoZSB0d28gc3RhdGVzXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QtMTAtYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgc28gYSBwcml2YXRlIG5vZGUgaXMgbmV2ZXIgY29uc2lkZXJlZCBieSB0aGUgcGFnZVxuLS1cbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdD0xOD1QcmVjb25kaXRpb25zXG4tLVxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0LTIwLVxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0OjIxOmBgTl9NRU1PUllfUFJJVkFURWBgIGFuZCBgYE5fTUVNT1JZYGAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgc28gdGhlIGJhY2tpbmdcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC0yMi1tZW1vcnkgbXVzdCBjb21lIHVwIG9uIGEgbm9kZSB0aGF0IGhhcyBubyBEUkFNIG9mIGl0cyBvd24gKG90aGVyd2lzZSB0aGUgbm9kZVxuLS1cbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdD0zNT1ab25lbGlzdCBleGNsdXNpb25cbi0tXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QtNDQtXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3Q6NDU6ICAgIGBgTl9NRU1PUllfUFJJVkFURWBgIG5vZGVzIGFyZSAqKmV4Y2x1ZGVkKiogZnJvbSBib3RoIGBgRkFMTEJBQ0tgYCBhbmRcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC00Ni0gICAgYGBOT0ZBTExCQUNLYGAgem9uZWxpc3RzLiAgSW5zdGVhZCB0aGV5IGFyZSBhZGRlZCB0byBgYFpPTkVMSVNUX1BSSVZBVEVgYCxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdDo0NzogICAgd2hpY2ggaW5jbHVkZXMgYm90aCBgYE5fTUVNT1JZYGAgYW5kIGBgTl9NRU1PUllfUFJJVkFURWBgIG5vZGVzLiAgVGhpcyBpc1xuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0LTQ4LSAgICB0aGUgb25seSB6b25lbGlzdCB0aGF0IGNvbnRhaW5zIHByaXZhdGUtbm9kZSB6b25lcywgYW5kIHNvIHRoZSBvbmx5IHdheVxuLS1cbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdD0xMDA9aGVhdmlseSBpbXBsaWVzIGEgXCYjMzQ7b25lLW5vZGUtcGVyLWRldmljZVwmIzM0OyBkZXNpZ24gb2YgdGhlIHN5c3RlbS5cbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC0xMDEtXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3Q6MTAyOlRoZSBub2RlIGxlYXZlcyBgYE5fTUVNT1JZX1BSSVZBVEVgYCBvbmx5IHdoZW4gdGhlIGxhc3QgcmFuZ2UgaXMgb2ZmbGluZWQuXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QtMTAzLVxuLS1cbmRyaXZlcnMvYmFzZS9ub2RlLmM9ODkwPWludCBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoaW50IG5pZCwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApXG4tLVxuZHJpdmVycy9iYXNlL25vZGUuYy05MDYtXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjkwNzpcdC8qIE5fTUVNT1JZX1BSSVZBVEUgYW5kIE5fTUVNT1JZIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKi9cbmRyaXZlcnMvYmFzZS9ub2RlLmMtOTA4LVx0aWYgKG5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpIHtcbi0tXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jPTkzMD1FWFBPUlRfU1lNQk9MX0dQTChub2RlX3ByaXZhdGVfcmVnaXN0ZXIpO1xuLS1cbmRyaXZlcnMvYmFzZS9ub2RlLmMtOTM3LSAqXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjkzODogKiBPbmx5IHN1Y2NlZWRzIGlmIGFsbCBtZW1vcnkgaGFzIGJlZW4gb2ZmbGluZWQgKE5fTUVNT1JZX1BSSVZBVEUgY2xlYXJlZCkuXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTkzOS0gKlxuZHJpdmVycy9iYXNlL25vZGUuYzo5NDA6ICogTl9NRU1PUllfUFJJVkFURSBzdGF0ZSBpcyBjbGVhcmVkIGJ5IG9mZmxpbmVfcGFnZXMoKSB3aGVuIHRoZSBsYXN0XG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTk0MS0gKiBtZW1vcnkgaXMgb2ZmbGluZWQsIG5vdCBieSB0aGlzIGZ1bmN0aW9uLlxuLS1cbmRyaXZlcnMvYmFzZS9ub2RlLmMtOTQ1LSAqXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjk0NjogKiBSZXR1cm46IDAgaWYgdW5yZWdpc3RlcmVkLCAtRUJVU1kgaWYgTl9NRU1PUllfUFJJVkFURSBpcyBzdGlsbCBzZXQuXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTk0Ny0gKi9cbmRyaXZlcnMvYmFzZS9ub2RlLmM9OTQ4PWludCBub2RlX3ByaXZhdGVfdW5yZWdpc3RlcihpbnQgbmlkKVxuLS1cbmRyaXZlcnMvYmFzZS9ub2RlLmMtOTY4LVx0LypcbmRyaXZlcnMvYmFzZS9ub2RlLmM6OTY5Olx0ICogT25seSB1bnJlZ2lzdGVyIGlmIE5fTUVNT1JZX1BSSVZBVEUgaXMgY2xlYXJlZCAob25seSBvY2N1cnMgd2hlblxuZHJpdmVycy9iYXNlL25vZGUuYy05NzAtXHQgKiB0aGUgbGFzdCBtZW1vcnkgYmxvY2sgaXMgb2ZmbGluZWQgaW4gb2ZmbGluZV9wYWdlcygpKVxuLS1cbmRyaXZlcnMvYmFzZS9ub2RlLmM9MTA3Nz1zdGF0aWMgc3RydWN0IG5vZGVfYXR0ciBub2RlX3N0YXRlX2F0dHJbXSA9IHtcbi0tXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTEwODQtXHRbTl9NRU1PUlldID0gX05PREVfQVRUUihoYXNfbWVtb3J5LCBOX01FTU9SWSksXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjEwODU6XHRbTl9NRU1PUllfUFJJVkFURV0gPSBfTk9ERV9BVFRSKGhhc19wcml2YXRlX21lbW9yeSwgTl9NRU1PUllfUFJJVkFURSksXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTEwODYtXHRbTl9DUFVdID0gX05PREVfQVRUUihoYXNfY3B1LCBOX0NQVSksXG4tLVxuZHJpdmVycy9iYXNlL25vZGUuYz0xMDkxPXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpub2RlX3N0YXRlX2F0dHJzW10gPSB7XG4tLVxuZHJpdmVycy9iYXNlL25vZGUuYy0xMDk4LVx0XHUwMDI2bm9kZV9zdGF0ZV9hdHRyW05fTUVNT1JZXS5hdHRyLmF0dHIsXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjEwOTk6XHRcdTAwMjZub2RlX3N0YXRlX2F0dHJbTl9NRU1PUllfUFJJVkFURV0uYXR0ci5hdHRyLFxuZHJpdmVycy9iYXNlL25vZGUuYy0xMTAwLVx0XHUwMDI2bm9kZV9zdGF0ZV9hdHRyW05fQ1BVXS5hdHRyLmF0dHIsXG4tLVxuZnMvcHJvYy9rY29yZS5jPTI1MD1zdGF0aWMgaW50IGtjb3JlX3JhbV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpXG4tLVxuZnMvcHJvYy9rY29yZS5jLTI1OS1cdC8qIEluY2x1ZGUgcHJpdmF0ZSBub2RlIG1lbW9yeSBpbiB0aGUgc2NhbiAqL1xuZnMvcHJvYy9rY29yZS5jOjI2MDpcdG5vZGVzX29yKG1lbSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XG5mcy9wcm9jL2tjb3JlLmMtMjYxLVx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgbWVtKSB7XG4tLVxuZnMvcHJvYy90YXNrX21tdS5jPTMzNzU9c3RhdGljIHN0cnVjdCBwYWdlICpjYW5fZ2F0aGVyX251bWFfc3RhdHMocHRlX3QgcHRlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5mcy9wcm9jL3Rhc2tfbW11LmMtMzM5Mi1cdGlmICghbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSkgXHUwMDI2XHUwMDI2XG5mcy9wcm9jL3Rhc2tfbW11LmM6MzM5MzpcdCAgICAhbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSlcbmZzL3Byb2MvdGFza19tbXUuYy0zMzk0LVx0XHRyZXR1cm4gTlVMTDtcbi0tXG5mcy9wcm9jL3Rhc2tfbW11LmM9MzQwMD1zdGF0aWMgc3RydWN0IHBhZ2UgKmNhbl9nYXRoZXJfbnVtYV9zdGF0c19wbWQocG1kX3QgcG1kLFxuLS1cbmZzL3Byb2MvdGFza19tbXUuYy0zNDE4LVx0aWYgKCFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKSBcdTAwMjZcdTAwMjZcbmZzL3Byb2MvdGFza19tbXUuYzozNDE5Olx0ICAgICFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pKVxuZnMvcHJvYy90YXNrX21tdS5jLTM0MjAtXHRcdHJldHVybiBOVUxMO1xuLS1cbmZzL3Byb2MvdGFza19tbXUuYz0zNTMwPXN0YXRpYyBpbnQgc2hvd19udW1hX21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4tLVxuZnMvcHJvYy90YXNrX21tdS5jLTM2MDYtXG5mcy9wcm9jL3Rhc2tfbW11LmM6MzYwNzpcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKVxuZnMvcHJvYy90YXNrX21tdS5jLTM2MDgtXHRcdGlmIChtZC1cdTAwM2Vub2RlW25pZF0pXG4tLVxuaW5jbHVkZS9saW51eC9nZnAuaD0yMDQ9c3RhdGljIGlubGluZSB2b2lkIGFyY2hfYWxsb2NfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKSB7IH1cbi0tXG5pbmNsdWRlL2xpbnV4L2dmcC5oLTIwNi1cbmluY2x1ZGUvbGludXgvZ2ZwLmg6MjA3Oi8qIEFsbG9jYXRlIGZyb20gYW4gTl9NRU1PUllfUFJJVkFURSBub2RlIChzZWxlY3RzIHRoZSBwcml2YXRlIHpvbmVsaXN0KS4gKi9cbmluY2x1ZGUvbGludXgvZ2ZwLmgtMjA4LXN0cnVjdCBwYWdlICphbGxvY19wYWdlc19ub2RlX3ByaXZhdGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuLS1cbmluY2x1ZGUvbGludXgvbW16b25lLmg9MTM5MT1lbnVtIHtcbi0tXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEzOTYtXHQgKiByZXN0cmljdCB0aGUgYWxsb2NhdGlvbnMgdG8gYSBzaW5nbGUgbm9kZSBmb3IgX19HRlBfVEhJU05PREVcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTM5NzpcdCAqIGFuZCBOX01FTU9SWV9QUklWQVRFIG5vZGVzIChpc29sYXRlZCBmcm9tIGRlZmF1bHQgbGlzdHMpLlxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMzk4LVx0ICovXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTEzOTktXHRaT05FTElTVF9OT0ZBTExCQUNLLFx0Lyogem9uZWxpc3Qgd2l0aG91dCBmYWxsYmFjayAoX19HRlBfVEhJU05PREUpICovXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjE0MDA6XHRaT05FTElTVF9QUklWQVRFLFx0LyogTl9NRU1PUllfUFJJVkFURSBhY2Nlc3MsIGZhbGxzIGJhY2sgdG8gRFJBTSAqL1xuaW5jbHVkZS9saW51eC9tbXpvbmUuaDoxNDAxOlx0Wk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLLCAvKiBOX01FTU9SWV9QUklWQVRFIGFjY2VzcywgX19HRlBfVEhJU05PREUgKi9cbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTQwMi0jZW5kaWZcbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oPTg9c3RydWN0IHBhZ2U7XG4tLVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0yMi0vKipcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6MjM6ICogc3RydWN0IG5vZGVfcHJpdmF0ZSAtIFBlci1ub2RlIGNvbnRhaW5lciBmb3IgTl9NRU1PUllfUFJJVkFURSBub2Rlc1xuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0yNC0gKlxuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9NDE9c3RhdGljIGlubGluZSBib29sIGZvbGlvX2lzX3ByaXZhdGVfbm9kZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC00Mi17XG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oOjQzOlx0cmV0dXJuIG5vZGVfc3RhdGUoZm9saW9fbmlkKGZvbGlvKSwgTl9NRU1PUllfUFJJVkFURSk7XG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTQ0LX1cbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oPTQ2PXN0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2lzX3ByaXZhdGVfbm9kZShzdHJ1Y3QgcGFnZSAqcGFnZSlcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtNDcte1xuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaDo0ODpcdHJldHVybiBub2RlX3N0YXRlKHBhZ2VfdG9fbmlkKHBhZ2UpLCBOX01FTU9SWV9QUklWQVRFKTtcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtNDktfVxuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9NTE9c3RhdGljIGlubGluZSBib29sIG5vZGVfaXNfcHJpdmF0ZShpbnQgbmlkKVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC01Mi17XG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oOjUzOlx0cmV0dXJuIG5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKTtcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtNTQtfVxuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9NjM9c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX3JlY2xhaW0oaW50IG5pZClcbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTY3LVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaDo2ODpcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC02OS1cdFx0cmV0dXJuIHRydWU7XG4tLVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC04NC0gKlxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaDo4NTogKiByZXR1cm46IHRydWUgZm9yIE5fTUVNT1JZIGFuZCBOX01FTU9SWV9QUklWQVRFIHdpdGggQ0FQX1VTRVJfTlVNQS5cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtODYtICogICAgICAgICBmYWxzZSBmb3IgbWVtb3J5bGVzcyBvciBvcHRlZC1vdXQgcHJpdmF0ZSBub2RlLlxuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9ODg9c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX3VzZXJfbnVtYShpbnQgbmlkKVxuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtOTQtXHRcdHJldHVybiB0cnVlO1xuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaDo5NTpcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC05Ni1cdFx0cmV0dXJuIGZhbHNlO1xuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9MTEwPXN0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19ob3R1bnBsdWcoaW50IG5pZClcbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTExNC1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6MTE1Olx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTExNi1cdFx0cmV0dXJuIHRydWU7XG4tLVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaD0xMzQ9c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2RlbW90aW9uKGludCBuaWQpXG4tLVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0xMzgtXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oOjEzOTpcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0xNDAtXHRcdHJldHVybiB0cnVlO1xuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9MTU3PXN0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19udW1hX2JhbGFuY2luZyhpbnQgbmlkKVxuLS1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMTYxLVxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaDoxNjI6XHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMTYzLVx0XHRyZXR1cm4gdHJ1ZTtcbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oPTE4MD1zdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfbHRwaW4oaW50IG5pZClcbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTE4NC1cbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6MTg1Olx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTE4Ni1cdFx0cmV0dXJuIHRydWU7XG4tLVxuaW5jbHVkZS9saW51eC9ub2RlbWFzay5oPTM4ND1lbnVtIG5vZGVfc3RhdGVzIHtcbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmgtMzkzLVx0Tl9NRU1PUlksXHRcdC8qIFRoZSBub2RlIGhhcyBtZW1vcnkocmVndWxhciwgaGlnaCwgbW92YWJsZSkgKi9cbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaDozOTQ6XHROX01FTU9SWV9QUklWQVRFLFx0LyogVGhlIG5vZGUmIzM5O3MgbWVtb3J5IGlzIHByaXZhdGUgKi9cbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaC0zOTUtXHROX0NQVSxcdFx0LyogVGhlIG5vZGUgaGFzIG9uZSBvciBtb3JlIGNwdXMgKi9cbi0tXG5pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmg9NDU5PXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IG5vZGVfc3RhdGUoaW50IG5vZGUsIGVudW0gbm9kZV9zdGF0ZXMgc3RhdGUpXG5pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmgtNDYwLXtcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaDo0NjE6XHRyZXR1cm4gbm9kZSA9PSAwIFx1MDAyNlx1MDAyNiBzdGF0ZSAhPSBOX01FTU9SWV9QUklWQVRFO1xuaW5jbHVkZS9saW51eC9ub2RlbWFzay5oLTQ2Mi19XG4tLVxuaW5jbHVkZS9saW51eC9ub2RlbWFzay5oPTQ3Mj1zdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBudW1fbm9kZV9zdGF0ZShlbnVtIG5vZGVfc3RhdGVzIHN0YXRlKVxuaW5jbHVkZS9saW51eC9ub2RlbWFzay5oLTQ3My17XG5pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmg6NDc0Olx0cmV0dXJuIHN0YXRlID09IE5fTUVNT1JZX1BSSVZBVEUgPyAwIDogMTtcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaC00NzUtfVxuLS1cbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaC00NzctI2RlZmluZSBmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIF9fc3RhdGUpIFxcXG5pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmg6NDc4Olx0Zm9yICgobm9kZSkgPSAwOyAobm9kZSkgPT0gMCBcdTAwMjZcdTAwMjYgKF9fc3RhdGUpICE9IE5fTUVNT1JZX1BSSVZBVEU7IChub2RlKSA9IDEpXG5pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmgtNDc5LVxuLS1cbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmM9Mzg3MT1zdGF0aWMgdm9pZCBjcHVzZXRfaGFuZGxlX2hvdHBsdWcodm9pZClcbi0tXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jLTM5MDEtXHQgKiBQcml2YXRlIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0LCBidXQgaWYgb25lIGxlYXZlc1xua2VybmVsL2Nncm91cC9jcHVzZXQuYzozOTAyOlx0ICogTl9NRU1PUllfUFJJVkFURSB3ZSBzdGlsbCBuZWVkIHRvIHJ1biBtcG9sX3JlYmluZF8qIHRvIGNsZWFuIHVwXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jLTM5MDMtXHQgKiBtZW1wb2xpY2llcyB0aGF0IGFyZSBiaW5kaW5nIHRoZW0uXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jLTM5MDQtXHQgKi9cbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmM6MzkwNTpcdHByaXZfc2hyYW5rID0gIW5vZGVzX3N1YnNldChwcmV2X3ByaXZfbWVtcywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xua2VybmVsL2Nncm91cC9jcHVzZXQuYzozOTA2Olx0cHJldl9wcml2X21lbXMgPSBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXTtcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmMtMzkwNy1cbi0tXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jPTQxNjA9bm9kZW1hc2tfdCBjcHVzZXRfbWVtc19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxuLS1cbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmMtNDE3Ni0gKiBBcmUgYW55IG9mIHRoZSBub2RlcyBpbiB0aGUgbm9kZW1hc2sgdXNhYmxlPyAgTl9NRU1PUlkgbm9kZXMgbXVzdCBiZSBpblxua2VybmVsL2Nncm91cC9jcHVzZXQuYzo0MTc3OiAqIGN1cnJlbnQtXHUwMDNlbWVtc19hbGxvd2VkLCB3aGlsZSBOX01FTU9SWV9QUklWQVRFIG5vZGVzIGFyZSBhbHdheXMgdmFsaWQuXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jLTQxNzgtICovXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jPTQxNzk9aW50IGNwdXNldF9ub2RlbWFza192YWxpZF9tZW1zX2FsbG93ZWQoY29uc3Qgbm9kZW1hc2tfdCAqbm9kZW1hc2spXG4tLVxua2VybmVsL2Nncm91cC9jcHVzZXQuYy00MTgxLVx0cmV0dXJuIG5vZGVzX2ludGVyc2VjdHMoKm5vZGVtYXNrLCBjdXJyZW50LVx1MDAzZW1lbXNfYWxsb3dlZCkgfHxcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmM6NDE4MjpcdCAgICAgICBub2Rlc19pbnRlcnNlY3RzKCpub2RlbWFzaywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xua2VybmVsL2Nncm91cC9jcHVzZXQuYy00MTgzLX1cbi0tXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jPTQyMzg9Ym9vbCBjcHVzZXRfY3VycmVudF9ub2RlX2FsbG93ZWQoaW50IG5vZGUsIGdmcF90IGdmcF9tYXNrKVxuLS1cbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmMtNDI0NS1cdFx0cmV0dXJuIHRydWU7XG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jOjQyNDY6XHQvKiBOX01FTU9SWV9QUklWQVRFIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0cy5tZW1zICovXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jLTQyNDctXHRpZiAobm9kZV9pc19wcml2YXRlKG5vZGUpKVxuLS1cbm1tL2ludGVybmFsLmg9MTA4PXN0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2lzX3ByaXZhdGVfbWFuYWdlZChzdHJ1Y3QgcGFnZSAqcGFnZSlcbi0tXG5tbS9pbnRlcm5hbC5oLTExNi0gKiBtYWR2aXNlIHJlY2xhaW0gaGludHMgKENPTEQvUEFHRU9VVC9GUkVFKSBhcmUgdXNlcmxhbmQtZHJpdmVuIHJlY2xhaW0sIHNvXG5tbS9pbnRlcm5hbC5oOjExNzogKiB0aGV5IGZvbGxvdyByZWNsYWltIG9wdC1pbjogZmFsc2UgZm9yIFpPTkVfREVWSUNFIGFuZCBmb3IgTl9NRU1PUllfUFJJVkFURVxubW0vaW50ZXJuYWwuaC0xMTgtICogbm9kZXMgd2l0aG91dCBDQVBfUkVDTEFJTSwgdHJ1ZSBmb3IgYWxsIG90aGVyIG5vcm1hbCBmb2xpb3MuXG4tLVxubW0vaW50ZXJuYWwuaD0xMjA9c3RhdGljIGlubGluZSBib29sIGZvbGlvX2FsbG93c19tYWR2aXNlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0vaW50ZXJuYWwuaC0xMjktICogTlVNQSBiYWxhbmNpbmcgaXMgYWNjZXNzLWF3YXJlIHRpZXJpbmcgbWlncmF0aW9uLCBzbyBpdCBmb2xsb3dzIHRoZSB0aWVyaW5nXG5tbS9pbnRlcm5hbC5oOjEzMDogKiBvcHQtaW46IGZhbHNlIGZvciBaT05FX0RFVklDRSBhbmQgZm9yIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgd2l0aG91dFxubW0vaW50ZXJuYWwuaC0xMzEtICogQ0FQX05VTUFfQkFMQU5DSU5HLCB0cnVlIGZvciBhbGwgb3RoZXIgZm9saW9zLlxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYz0yMTE5PXN0YXRpYyBpbnQgbWVtY2dfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYy0yMTM5LVx0LyogUHJpdmF0ZSBub2RlcyBob2xkIGNncm91cCBtZW1vcnkgdG9vLCByZXBvcnQgdGhlbS4gKi9cbm1tL21lbWNvbnRyb2wtdjEuYzoyMTQwOlx0bm9kZXNfb3IocmVwb3J0YWJsZSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XG5tbS9tZW1jb250cm9sLXYxLmMtMjE0MS1cbi0tXG5tbS9tZW1jb250cm9sLmM9NDQ5Mz1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2Nzc19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KVxuLS1cbm1tL21lbWNvbnRyb2wuYy00NTI4LVx0LyogUHJpdmF0ZSBub2RlcyBtdXN0IGFsc28gYmUgYWNjb3VudGVkIG9yIG51bWFfc3RhdCBpcyBtaXNsZWFkaW5nICovXG5tbS9tZW1jb250cm9sLmM6NDUyOTpcdG5vZGVzX29yKHJlcG9ydGFibGUsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xubW0vbWVtY29udHJvbC5jLTQ1MzAtXHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCByZXBvcnRhYmxlKSB7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ5NDk9c3RhdGljIGludCBtZW1vcnlfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxuLS1cbm1tL21lbWNvbnRyb2wuYy00OTU3LVx0LyogUHJpdmF0ZSBub2RlcyBob2xkIGNncm91cCBtZW1vcnkgdG9vLCByZXBvcnQgdGhlbS4gKi9cbm1tL21lbWNvbnRyb2wuYzo0OTU4Olx0bm9kZXNfb3IocmVwb3J0YWJsZSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XG5tbS9tZW1jb250cm9sLmMtNDk1OS1cbi0tXG5tbS9tZW1jb250cm9sLmM9NjA2NT12b2lkIG1lbV9jZ3JvdXBfbm9kZV9maWx0ZXJfYWxsb3dlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIG5vZGVtYXNrX3QgKm1hc2spXG4tLVxubW0vbWVtY29udHJvbC5jLTYwNzgtXHRjcHVzZXRfbm9kZXNfYWxsb3dlZChtZW1jZy1cdTAwM2Vjc3MuY2dyb3VwLCBcdTAwMjZhbGxvd2VkKTtcbm1tL21lbWNvbnRyb2wuYzo2MDc5Olx0LyogTl9NRU1PUllfUFJJVkFURSBub2RlcyBhcmUgbm90IHBhcnRpdGlvbmVkIGJ5IGNwdXNldCwgaW5jbHVkZSB0aGVtICovXG5tbS9tZW1jb250cm9sLmM6NjA4MDpcdG5vZGVzX29yKGFsbG93ZWQsIGFsbG93ZWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcbm1tL21lbWNvbnRyb2wuYy02MDgxLVx0bm9kZXNfYW5kKCptYXNrLCAqbWFzaywgYWxsb3dlZCk7XG4tLVxubW0vbWVtb3J5LXRpZXJzLmM9MzAzPXZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtMzIwLVxubW0vbWVtb3J5LXRpZXJzLmM6MzIxOi8qIFRpZXJpbmcgc2V0OiBOX01FTU9SWSB8IChOX01FTU9SWV9QUklWQVRFIHcvIENBUF9ERU1PVElPTikgKi9cbm1tL21lbW9yeS10aWVycy5jLTMyMi1zdGF0aWMgbm9kZW1hc2tfdCB0aWVyYWJsZV9ub2Rlcztcbi0tXG5tbS9tZW1vcnktdGllcnMuYz0zMjQ9c3RhdGljIHZvaWQgdXBkYXRlX3RpZXJhYmxlX25vZGVzKHZvaWQpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtMzMwLVx0dGllcmFibGVfbm9kZXMgPSBub2RlX3N0YXRlc1tOX01FTU9SWV07XG5tbS9tZW1vcnktdGllcnMuYzozMzE6XHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZX1BSSVZBVEUpXG5tbS9tZW1vcnktdGllcnMuYy0zMzItXHRcdGlmIChub2RlX2FsbG93c19kZW1vdGlvbihub2RlKSlcbi0tXG5tbS9tZW1vcnktdGllcnMuYz01NjE9c3RhdGljIHN0cnVjdCBtZW1vcnlfdGllciAqc2V0X25vZGVfbWVtb3J5X3RpZXIoaW50IG5vZGUpXG4tLVxubW0vbWVtb3J5LXRpZXJzLmMtNTcwLVxubW0vbWVtb3J5LXRpZXJzLmM6NTcxOlx0LyogSW5jbHVkZSBOX01FTU9SWSBhbmQgTl9NRU1PUllfUFJJVkFURSB3aXRoIENBUF9ERU1PVElPTiAqL1xubW0vbWVtb3J5LXRpZXJzLmMtNTcyLVx0aWYgKCFub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSBcdTAwMjZcdTAwMjYgIW5vZGVfYWxsb3dzX2RlbW90aW9uKG5vZGUpKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTE0MT1pbnQgb25saW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTIwNy1cdC8qXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEyMDg6XHQgKiBOX01FTU9SWSBhbmQgTl9NRU1PUllfUFJJVkFURSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCBkZXRlcm1pbmVcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTIwOS1cdCAqIHdoaWNoIGlzIGNvcnJlY3QgYmFzZWQgb24gd2hldGhlciB0aGUgcGdkYXQtXHUwMDNlcHJpdmF0ZSBpcyBzZXQuXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjEyLVx0XHRub2RlX3NldF9zdGF0ZShuaWQsIHBnZGF0X2lzX3ByaXZhdGUoTk9ERV9EQVRBKG5pZCkpID9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTIxMzpcdFx0XHRcdCAgICBOX01FTU9SWV9QUklWQVRFIDogTl9NRU1PUlkpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjE0LVx0Lypcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE2NTE9RVhQT1JUX1NZTUJPTF9HUEwoYWRkX21lbW9yeSk7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNjYwLSAqIEBvbmxpbmVfdHlwZTogQXV0by1PbmxpbmUgYmVoYXZpb3IgKG9mZmxpbmUsIG9ubGluZSwga2VybmVsLCBtb3ZhYmxlKVxubW0vbWVtb3J5X2hvdHBsdWcuYzoxNjYxOiAqIEBucDogZHJpdmVyLW93bmVkIG5vZGVfcHJpdmF0ZSB0byBvbmxpbmUgdGhlIG5vZGUgYXMgTl9NRU1PUllfUFJJVkFURSwgb3Jcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTY2Mi0gKlx0TlVMTCBmb3Igb3JkaW5hcnkgc3lzdGVtIFJBTVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MjAyND1pbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyMDctXHRcdG5vZGVfY2xlYXJfc3RhdGUobm9kZSwgTl9NRU1PUlkpO1xubW0vbWVtb3J5X2hvdHBsdWcuYzoyMjA4Olx0XHRub2RlX2NsZWFyX3N0YXRlKG5vZGUsIE5fTUVNT1JZX1BSSVZBVEUpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjA5LVx0fVxuLS1cbm1tL21lbXBvbGljeS5jPTQwNj1zdGF0aWMgaW50IG1wb2xfc2V0X25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcbi0tXG5tbS9tZW1wb2xpY3kuYy00NDgtXHQvKiBJZiBhbnkgcHJpdmF0ZSBub2RlcyBsZWZ0IGluIHRoZSBub2RlbWFzayAtIGFkZCB0aGUgcHJpdmF0ZSBmbGFnICovXG5tbS9tZW1wb2xpY3kuYzo0NDk6XHRpZiAobm9kZXNfaW50ZXJzZWN0cyhuc2MtXHUwMDNlbWFzazIsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSlcbm1tL21lbXBvbGljeS5jLTQ1MC1cdFx0cG9sLVx1MDAzZWZsYWdzIHw9IE1QT0xfRl9QUklWQVRFO1xuLS1cbm1tL21lbXBvbGljeS5jPTUyMz1zdGF0aWMgdm9pZCBtcG9sX3JlYmluZF9ub2RlbWFzayhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxuLS1cbm1tL21lbXBvbGljeS5jLTUyNy1cdC8qIHByZXNlcnZlIG9ubGluZSBwcml2YXRlIG5vZGVzIHRvIHJlLWFkZCBsYXRlciAqL1xubW0vbWVtcG9saWN5LmM6NTI4Olx0bm9kZXNfYW5kKHByaXYsIHBvbC1cdTAwM2Vub2Rlcywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xubW0vbWVtcG9saWN5LmMtNTI5LVxuLS1cbm1tL21lbXBvbGljeS5jPTExNTM9c3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKl9fbXBvbF9iaW5kX25vZGUoaW50IG5pZCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MpXG4tLVxubW0vbWVtcG9saWN5LmMtMTE4My0gKiBtcG9sX3ByaXZhdGVfYmluZCAtIGJ1aWxkIGFuIE1QT0xfQklORCBwb2xpY3kgcGlubmVkIHRvIGEgcHJpdmF0ZSBub2RlXG5tbS9tZW1wb2xpY3kuYzoxMTg0OiAqIEBuaWQ6IGFuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZVxubW0vbWVtcG9saWN5LmMtMTE4NS0gKlxuLS1cbm1tL21lbXBvbGljeS5jLTExOTMtICpcbm1tL21lbXBvbGljeS5jOjExOTQ6ICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgQG5pZCBpcyBOX01FTU9SWV9QUklWQVRFLlxubW0vbWVtcG9saWN5LmMtMTE5NS0gKlxuLS1cbm1tL21lbXBvbGljeS5jPTEyMDY9RVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3ByaXZhdGVfYmluZCwgXCYjMzQ7a21lbVwmIzM0Oyk7XG4tLVxubW0vbWVtcG9saWN5LmMtMTIxNS0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgdXNlZCBieSBzZXJ2aWNlcyBpbXBsZW50aW5nIG1lbXBvbGljeSBzdXBwb3J0IHdpdGhcbm1tL21lbXBvbGljeS5jOjEyMTY6ICogdXNlci1wcm92aWRlZCBub2RlIGJpbmRpbmdzLiBOX01FTU9SWV9QUklWQVRFIG5vZGUgYmluZGluZ3MgYXJlIGhvbm9yZWQgaWZcbm1tL21lbXBvbGljeS5jLTEyMTctICogdGhlIG5vZGUgaGFzIENBUF9VU0VSX05VTUEsIG90aGVyd2lzZSByZXR1cm4gLUVJTlZBTC5cbi0tXG5tbS9wYWdlX2FsbG9jLmM9NTk4OT1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcbi0tXG5tbS9wYWdlX2FsbG9jLmMtNjAwOC1cdCAqXG5tbS9wYWdlX2FsbG9jLmM6NjAwOTpcdCAqIFBSSVZBVEU6ICAgIChOX01FTU9SWSB8IE5fTUVNT1JZX1BSSVZBVEUpIC0gYWxsb3dzIGFjY2VzcyB0b1xubW0vcGFnZV9hbGxvYy5jLTYwMTAtXHQgKiAgICAgICAgICAgICBwcml2YXRlIG5vZGVzLCBhbmQgZmFsbHMgYmFjayB0byBub3JtYWwgbWVtb3J5IHVubGVzc1xuLS1cbm1tL3BhZ2VfYWxsb2MuYy02MDIyLVxubW0vcGFnZV9hbGxvYy5jOjYwMjM6XHRub2Rlc19vcih0aWVyX25vZGVzLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcbm1tL3BhZ2VfYWxsb2MuYy02MDI0LVx0YnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgXHUwMDI2dGllcl9ub2RlcywgWk9ORUxJU1RfUFJJVkFURSwgZmFsc2UsXG4tLVxubW0vcGFnZV9hbGxvYy5oLTU5LVxubW0vcGFnZV9hbGxvYy5oOjYwOi8qIFNlbGVjdCB0aGUgTl9NRU1PUllfUFJJVkFURSB6b25lbGlzdCBmYW1pbHkgKHNlZSBzZWxlY3Rfem9uZWxpc3QoKSkuICovXG5tbS9wYWdlX2FsbG9jLmgtNjEtI2RlZmluZSBBTExPQ19aT05FTElTVF9QUklWQVRFIDB4MjAwMFxuLS1cbm1tL3BhZ2VfYWxsb2MuaD0xMDI9c3RhdGljX2Fzc2VydChaT05FTElTVF9QUklWQVRFICYjNDM7IDEgPT0gWk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLKTtcbi0tXG5tbS9wYWdlX2FsbG9jLmgtMTA4LSAqIFRoZSBkZWZhdWx0IG1hdGNoZXMgbm9kZV96b25lbGlzdCgpOyBBTExPQ19aT05FTElTVF9QUklWQVRFIHNlbGVjdHMgdGhlXG5tbS9wYWdlX2FsbG9jLmg6MTA5OiAqIHByaXZhdGUtbm9kZSBmYW1pbHkgc28gYW4gYWxsb2NhdGlvbiBtYXkgcmVhY2ggYW4gTl9NRU1PUllfUFJJVkFURSBub2RlLlxubW0vcGFnZV9hbGxvYy5oLTExMC0gKi9cbi0tXG5tbS92bXNjYW4uYz05NzA9c3RhdGljIHN0cnVjdCBmb2xpbyAqYWxsb2NfZGVtb3RlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqc3JjLFxuLS1cbm1tL3Ztc2Nhbi5jLTk3OC1cdGlmIChtdGMtXHUwMDNlbm1hc2sgXHUwMDI2XHUwMDI2XG5tbS92bXNjYW4uYzo5Nzk6XHQgICAgbm9kZXNfaW50ZXJzZWN0cygqbXRjLVx1MDAzZW5tYXNrLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSkpXG5tbS92bXNjYW4uYy05ODAtXHRcdG10Yy1cdTAwM2VhbGxvY19mbGFncyA9IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEU7XG4tLVxubW0vdm1zY2FuLmM9NTQxND1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBscnVfZ2VuX2F0dHJfZ3JvdXAgPSB7XG4tLVxubW0vdm1zY2FuLmMtNTQyNC0gKiBOb2RlcyB0aGUgbHJ1X2dlbiBkZWJ1Z2ZzIGludGVyZmFjZSBsaXN0czogb3JkaW5hcnkgbWVtb3J5IG5vZGVzIHBsdXMgYW55XG5tbS92bXNjYW4uYzo1NDI1OiAqIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgb3B0ZWQgaW50byByZWNsYWltLiAgcnVuX2NtZCgpIGFscmVhZHkgYWNjZXB0cyB0aGVcbm1tL3Ztc2Nhbi5jLTU0MjYtICogbGF0dGVyLCBzbyBrZWVwIHRoZSBsaXN0aW5nIGluIHN5bmMgd2l0aCB3aGF0IGl0IGFjY2VwdHMuXG4tLVxubW0vdm1zY2FuLmM9NTQyOD1zdGF0aWMgdm9pZCBscnVfZ2VuX3NlcV9ub2Rlcyhub2RlbWFza190ICpub2Rlcylcbi0tXG5tbS92bXNjYW4uYy01NDMyLVx0Km5vZGVzID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldO1xubW0vdm1zY2FuLmM6NTQzMzpcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKVxubW0vdm1zY2FuLmMtNTQzNC1cdFx0aWYgKG5vZGVfYWxsb3dzX3JlY2xhaW0obmlkKSlcbi0tXG5tbS92bXNjYW4uYz02ODA4PXN0YXRpYyBzdHJ1Y3Qgem9uZWxpc3QgKm1lbWNnX3JlY2xhaW1fem9uZWxpc3QoaW50IG5pZCwgZ2ZwX3QgZ2ZwX21hc2spXG4tLVxubW0vdm1zY2FuLmMtNjgxMS1cbm1tL3Ztc2Nhbi5jOjY4MTI6XHRpZiAodW5saWtlbHkoIW5vZGVzX2VtcHR5KG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSkpXG5tbS92bXNjYW4uYy02ODEzLVx0XHRhZmxhZ3MgPSBBTExPQ19aT05FTElTVF9QUklWQVRFO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yMyAwMjo1NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MTM5OQoJCQkJCQkJb3V0cHV0OiAyMzkKCQkJCQkJCXRob3VnaHRzOiAzMDU5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIEtWTSBHdWVzdCBNZW1mZCBOVU1BIE5vZGUgQmluZGluZyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzIHBhdGNoLiBUaGUga2V5IHRoaW5nIEkmIzM5O20gc2VlaW5nIGlzIGEgbmV3IEtWTSBmZWF0dXJlOiB0aGUgYWJpbGl0eSB0byBiaW5kIGEgZ3Vlc3QgbWVtZmQgdG8gYSBzcGVjaWZpYyBOVU1BIG5vZGUuIEluaXRpYWxseSwgdGhlIHBhdGNoIHRvdWNoZXMgYGt2bV9nbWVtX2NyZWF0ZWAgdG8gYWNjZXB0IGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgYW5kIHRoZW4gY2FsbHMgYGt2bV9nbWVtX2JpbmRfbm9kZWAuIFRoaXMsIGluIHR1cm4sIGNhbGxzIGBtcG9sX2JpbmRfbm9kZWAsIGFuZCB0aGF0IGNhc2NhZGVzIGRvd24gdGhyb3VnaCBgX19tcG9sX2JpbmRfbm9kZWAuIEkmIzM5O20gdmVyaWZ5aW5nIHRoZSBleGVjdXRpb24gcGF0aHMgdG8gYmUgc3VyZS4gSXQgbG9va3MgbGlrZSBgX19tcG9sX2JpbmRfbm9kZWAgY3JlYXRlcyBhIG1lbXBvbGljeSB3aXRoIGBNUE9MX0JJTkRgIGFuZCBgTVBPTF9GX1BSSVZBVEVgLiBIb3dldmVyLCB0aGVyZSYjMzk7cyBzb21lIGludGVyZXN0aW5nIGxvZ2ljIGFyb3VuZCBwcml2YXRlIG5vZGVzIGFuZCBgQ0FQX1VTRVJfTlVNQWAgdGhhdCBJIG5lZWQgdG8ga2VlcCBzdHJhaWdodC4gSSYjMzk7dmUgdHJhY2tlZCB0aGF0IGRvd24gdG9vLgoKVGhlIGZsb3cgaW4gYG1wb2xfc2V0X25vZGVtYXNrYCBpcyB0aGUgY3J1Y2lhbCBwYXJ0OyBpdCBmaXJzdCBjaGVja3MgdGhlIGBjcHVzZXRfbWVtc19hbGxvd2VkYCwgYW5kICp0aGVuKiBhZGRzIGJhY2sgcHJpdmF0ZSBub2RlcyBpZiBhbGxvd2VkIGJ5IGBub2RlX2FsbG93c191c2VyX251bWFgIGFuZCB0aGUgYE1QT0xfRl9QUklWQVRFYCBmbGFnLiBJJiMzOTttIGNvbmZpcm1pbmcgdGhhdCB0aGUgYG5zYy0mZ3Q7bWFzazJgIGlzIGJlaW5nIHBvcHVsYXRlZCBjb3JyZWN0bHksIHNwZWNpZmljYWxseSBpdCBzZWVtcyBsaWtlIHRoZSBpbnRlcnNlY3Rpb24gb2YgYCpub2Rlc2AgYW5kIGBjcHVzZXRfbWVtc19hbGxvd2VkYCwgd2l0aCB0aGUgcG90ZW50aWFsIGFkZGl0aW9uIG9mIHByaXZhdGUgbm9kZXMuIFRoZSBmaW5hbCBzdGVwIGlzIHdoZXJlIHRoaXMgbWVtcG9saWN5IGlzIHNldCB2aWEgYG1wb2xfb3BzW3BvbC0mZ3Q7bW9kZV0uY3JlYXRlYC4KCkZyb20gd2hhdCBJIGNhbiB0ZWxsLCBga3ZtX2dtZW1fYmluZF9ub2RlYCBpcyBmdWxseSByZWFjaGFibGUgYW5kIGZ1bmN0aW9uYWwsIGFsbG93aW5nIGJpbmRpbmcgYSBndWVzdCBtZW1mZCB0byBhIHNwZWNpZmljIE5VTUEgbm9kZS4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhIHVzZWZ1bCBuZXcgZmVhdHVyZSBmb3IgS1ZNLCBhbmQgaXQmIzM5O3MgY2VydGFpbmx5IHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGZ1enplZC4gSXQmIzM5O3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgYGd1ZXN0X21lbWZkYCBkb2VzbiYjMzk7dCBoYXZlIGEgVk1BLCBzbyB0cmFkaXRpb25hbCBgbWJpbmQoKWAgZG9lc24mIzM5O3QgYXBwbHk7IHRoaXMgaXMgYSBicmFuZC1uZXcgYXBwcm9hY2guCgpOb3csIGxldCYjMzk7cyBpZGVudGlmeSB3aGF0IGNvbmZpZ3VyYXRpb25zIGFyZSBuZWNlc3NhcnkgdG8gbWFrZSBpdCB3b3JrLiBJJiMzOTttIHNlZWluZyB0aGF0IHdlIHdpbGwgcmVxdWlyZSBgQ09ORklHX0tWTWAgYW5kIGBDT05GSUdfTlVNQWAsIG9mIGNvdXJzZS4gTGV0JiMzOTtzIG1ha2Ugc3VyZSB0aGF0IGlzIHNldC4KClRoZSBjcml0aWNhbCBzeW1ib2xzIGZvciB0ZXN0aW5nIGFyZSBga3ZtX2dtZW1fY3JlYXRlYCwgYF9fa3ZtX2dtZW1fY3JlYXRlYCwgYGt2bV9nbWVtX2JpbmRfbm9kZWAsIGBtcG9sX2JpbmRfbm9kZWAsIGBfX21wb2xfYmluZF9ub2RlYCwgYW5kIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYC4gTGV0JiMzOTtzIGNvbmZpcm0gdGhlc2UgYXJlIHRoZSByaWdodCBlbnRyeSBwb2ludHMuIE9rYXksIGBrdm1fZ21lbV9jcmVhdGVgIGlzIHRoZSBlbnRyeSBwb2ludCwgYW5kIHRoYXQgY2FsbHMgYF9fa3ZtX2dtZW1fY3JlYXRlYCB3aGljaCB0aGVuIGNhbGxzIGBrdm1fZ21lbV9iaW5kX25vZGVgLiBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWAgc2VlbXMgaW1wb3J0YW50IGZvciBtYWtpbmcgdGhlIHBvbGljeSBlZmZlY3RpdmUuCgpJJiMzOTttIHNlZWluZyBhIGxvdCBvZiBjaGFuZ2VzIHJlbGF0ZWQgdG8gcHJpdmF0ZSBtZW1vcnkgbm9kZXMuIFRoZSBwYXRjaCBpcyBzZXR0aW5nIHVwIHRoZSBpbmZyYXN0cnVjdHVyZSBmb3IgcHJpdmF0ZSBub2RlcyB3aXRoIGBOX01FTU9SWV9QUklWQVRFYCBidXQgaXQmIzM5O3Mgbm90IGJlaW5nICp1c2VkKiBieSBhbnkgZHJpdmVycyByaWdodCBub3cuIGBkcml2ZXJzL2RheC9rbWVtLmNgIGhhcyBiZWVuIHRvdWNoZWQgdG9vLiBJdCYjMzk7cyBwYXNzaW5nIGEgYE5VTExgIGZvciB0aGUgbm9kZSBwb2ludGVyLiBTbyByZWFsbHksIHRoZSBvbmx5IHVzZXItcmVhY2hhYmxlIG5ldyBmdW5jdGlvbmFsaXR5IGZyb20gdGhpcyBwYXRjaCBpcyB0aGUgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCBmbGFnLiBXZSAqZG8qIG5lZWQgYENPTkZJR19NRU1PUllfSE9UUExVR2AsIGBDT05GSUdfTUVNQ0dgLCBgQ09ORklHX05VTUFfQkFMQU5DSU5HYCwgYENPTkZJR19NSUdSQVRJT05gLCBgQ09ORklHX0NPTVBBQ1RJT05gLCBgQ09ORklHX0tTTWAsIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBhbmQgYENPTkZJR19EQU1PTl9QQUREUmAsIGZvciBhbGwgdGhlIGNoYW5nZXMgaW4gdGhvc2UgYXJlYXMuCgpMZXQmIzM5O3MgYWxzbyBtYWtlIHN1cmUgYGt2bV9nbWVtX2JpbmRfbm9kZWAgYW5kIGBtcG9sX2JpbmRfbm9kZWAgYW5kIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBhcmUgY29tcGlsZWQgb25seSB3aGVuIGBDT05GSUdfTlVNQWAgaXMgZW5hYmxlZC4gT2theSwgeWVzLCBldmVyeXRoaW5nIGNoZWNrcyBvdXQgdGhlcmUgdG9vLgoKSW4gc2hvcnQsIHRoaXMgcGF0Y2ggaXMgYSBzaWduaWZpY2FudCBhbmQgKmZ1bmN0aW9uYWwqIGFkZGl0aW9uIGZvciBLVk0uIFRoZSBwcml2YXRlIG5vZGUgYXNwZWN0cyBhcmUgYSBmdXR1cmUgZXhwYW5zaW9uLCBidXQgdGhlIGd1ZXN0X21lbWZkIG5vZGUgYmluZGluZyBpcyByZWFkeSB0byBnbyBub3cuIFRoaXMgZGVmaW5pdGVseSB3YXJyYW50cyBmb2N1c2VkIGZ1enppbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzIzIDAyOjU0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLVk0mIzM0OywKICAgICYjMzQ7TlVNQSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDtfX2t2bV9nbWVtX2NyZWF0ZSYjMzQ7LAogICAgJiMzNDtrdm1fZ21lbV9iaW5kX25vZGUmIzM0OywKICAgICYjMzQ7bXBvbF9iaW5kX25vZGUmIzM0OywKICAgICYjMzQ7X19tcG9sX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDttcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHByaXZhdGUgbWVtb3J5IG5vZGVzIGFuZCBhZGRzIHN1cHBvcnQgZm9yIHRoZW0gYWNyb3NzIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIFdoaWxlIHRoZSBkcml2ZXItZmFjaW5nIEFQSSBpcyBub3QgeWV0IHVzZWQgYnkgYW55IGluLXRyZWUgZHJpdmVyLCB0aGUgcGF0Y2ggYWxzbyBpbnRyb2R1Y2VzIGEgbmV3IEtWTSBmZWF0dXJlIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIHdoaWNoIGFsbG93cyBiaW5kaW5nIGEgZ3Vlc3RfbWVtZmQgdG8gYSBzcGVjaWZpYyBOVU1BIG5vZGUuIFRoaXMgZmVhdHVyZSBpcyBmdWxseSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIGlvY3RsIGFuZCByZWxpZXMgb24gdGhlIG5ld2x5IGFkZGVkIG1wb2xfYmluZF9ub2RlIGFuZCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlIGZ1bmN0aW9ucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIEtWTSBhbmQgY29yZSBtbSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtOVU1BJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7a3ZtX2dtZW1fY3JlYXRlJiMzNDssCiAgICAmIzM0O19fa3ZtX2dtZW1fY3JlYXRlJiMzNDssCiAgICAmIzM0O2t2bV9nbWVtX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDttcG9sX2JpbmRfbm9kZSYjMzQ7LAogICAgJiMzNDtfX21wb2xfYmluZF9ub2RlJiMzNDssCiAgICAmIzM0O21wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgcHJpdmF0ZSBtZW1vcnkgbm9kZXMgYW5kIGFkZHMgc3VwcG9ydCBmb3IgdGhlbSBhY3Jvc3MgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gV2hpbGUgdGhlIGRyaXZlci1mYWNpbmcgQVBJIGlzIG5vdCB5ZXQgdXNlZCBieSBhbnkgaW4tdHJlZSBkcml2ZXIsIHRoZSBwYXRjaCBhbHNvIGludHJvZHVjZXMgYSBuZXcgS1ZNIGZlYXR1cmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgd2hpY2ggYWxsb3dzIGJpbmRpbmcgYSBndWVzdF9tZW1mZCB0byBhIHNwZWNpZmljIE5VTUEgbm9kZS4gVGhpcyBmZWF0dXJlIGlzIGZ1bGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgaW9jdGwgYW5kIHJlbGllcyBvbiB0aGUgbmV3bHkgYWRkZWQgbXBvbF9iaW5kX25vZGUgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgZnVuY3Rpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gS1ZNIGFuZCBjb3JlIG1tIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTIzVDAyOjUyOjU2LjQyODU5OTY1NFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk4MTA3ODc5NzE3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiTlVNQVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwiX19rdm1fZ21lbV9jcmVhdGVcIixcbiAgICBcImt2bV9nbWVtX2JpbmRfbm9kZVwiLFxuICAgIFwibXBvbF9iaW5kX25vZGVcIixcbiAgICBcIl9fbXBvbF9iaW5kX25vZGVcIixcbiAgICBcIm1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2VcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBwcml2YXRlIG1lbW9yeSBub2RlcyBhbmQgYWRkcyBzdXBwb3J0IGZvciB0aGVtIGFjcm9zcyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBXaGlsZSB0aGUgZHJpdmVyLWZhY2luZyBBUEkgaXMgbm90IHlldCB1c2VkIGJ5IGFueSBpbi10cmVlIGRyaXZlciwgdGhlIHBhdGNoIGFsc28gaW50cm9kdWNlcyBhIG5ldyBLVk0gZmVhdHVyZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSB3aGljaCBhbGxvd3MgYmluZGluZyBhIGd1ZXN0X21lbWZkIHRvIGEgc3BlY2lmaWMgTlVNQSBub2RlLiBUaGlzIGZlYXR1cmUgaXMgZnVsbHkgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCBpb2N0bCBhbmQgcmVsaWVzIG9uIHRoZSBuZXdseSBhZGRlZCBtcG9sX2JpbmRfbm9kZSBhbmQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSBmdW5jdGlvbnMuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0byBLVk0gYW5kIGNvcmUgbW0gdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yM1QwMjo1Mjo1Ni40Mjg2MDU1MTRaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcwMzgzMDY4OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGM4YTk3NTk4MzJlZWY3ZDUyNmU3M2U1MjU5MmVjMzBjNjY4MGZlYTZcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBKdWwgMjMgMDI6NTI6NTUgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMtbm9kZSBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzLW5vZGVcXG5pbmRleCAyZDBlMDIzZjIyYTcxYS4uOGEzNmZiYzNkNDAyODcgMTAwNjQ0XFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMtbm9kZVxcbisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzLW5vZGVcXG5AQCAtMjksNiArMjksMTYgQEAgRGVzY3JpcHRpb246XFxuIFxcdFxcdE5vZGVzIHRoYXQgaGF2ZSByZWd1bGFyIG9yIGhpZ2ggbWVtb3J5LlxcbiBcXHRcXHREZXBlbmRzIG9uIENPTkZJR19ISUdITUVNLlxcbiBcXG4rV2hhdDpcXHRcXHQvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvaGFzX3ByaXZhdGVfbWVtb3J5XFxuK0NvbnRhY3Q6XFx0TGludXggTWVtb3J5IE1hbmFnZW1lbnQgbGlzdCBcXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXFx1MDAzZVxcbitEZXNjcmlwdGlvbjpcXG4rXFx0XFx0Tm9kZXMgdGhhdCBoYXZlIHByaXZhdGUgKE5fTUVNT1JZX1BSSVZBVEUpIG1lbW9yeTogbWVtb3J5XFxuK1xcdFxcdGhvdHBsdWdnZWQgYnkgYSBkcml2ZXIgb250byBhIENQVS1sZXNzIG5vZGUgYW5kIGlzb2xhdGVkIGZyb21cXG4rXFx0XFx0dGhlIHBhZ2UgYWxsb2NhdG9yJ3Mgbm9ybWFsIGFuZCBmYWxsYmFjayB6b25lbGlzdHMuICBBIG5vZGUgaXNcXG4rXFx0XFx0bGlzdGVkIGhlcmUgZm9yIGFzIGxvbmcgYXMgaXQgaG9sZHMgcHJpdmF0ZSBtZW1vcnk7IGl0IGlzIG5ldmVyXFxuK1xcdFxcdGxpc3RlZCBpbiBoYXNfbWVtb3J5IGF0IHRoZSBzYW1lIHRpbWUgKHRoZSB0d28gc3RhdGVzIGFyZVxcbitcXHRcXHRtdXR1YWxseSBleGNsdXNpdmUpLiAgU2VlIERvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC5cXG4rXFxuIFdoYXQ6XFx0XFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGVYXFxuIERhdGU6XFx0XFx0T2N0b2JlciAyMDAyXFxuIENvbnRhY3Q6XFx0TGludXggTWVtb3J5IE1hbmFnZW1lbnQgbGlzdCBcXHUwMDNjbGludXgtbW1Aa3ZhY2sub3JnXFx1MDAzZVxcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21tL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vbW0vaW5kZXgucnN0XFxuaW5kZXggMTNhNzlmNWQwOTJjMGUuLmY2MDcwNGRmNjEwNGMxIDEwMDY0NFxcbi0tLSBhL0RvY3VtZW50YXRpb24vbW0vaW5kZXgucnN0XFxuKysrIGIvRG9jdW1lbnRhdGlvbi9tbS9pbmRleC5yc3RcXG5AQCAtNjUsNiArNjUsNyBAQCBkb2N1bWVudGF0aW9uLCBvciBkZWxldGVkIGlmIGl0IGhhcyBzZXJ2ZWQgaXRzIHB1cnBvc2UuXFxuICAgIG1tdV9ub3RpZmllclxcbiAgICBtdWx0aWdlbl9scnVcXG4gICAgbnVtYVxcbisgICBudW1hX3ByaXZhdGVfbm9kZXNcXG4gICAgb3ZlcmNvbW1pdC1hY2NvdW50aW5nXFxuICAgIHBhZ2VfbWlncmF0aW9uXFxuICAgIHBhZ2VfZnJhZ3NcXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0XFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uM2IyN2EyZTI0YjA4NjdcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0XFxuQEAgLTAsMCArMSwxNjAgQEBcXG4rLi4gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKz09PT09PT09PT09PT09PT09PT09XFxuK1ByaXZhdGUgbWVtb3J5IG5vZGVzXFxuKz09PT09PT09PT09PT09PT09PT09XFxuK1xcbitBICpwcml2YXRlIG1lbW9yeSBub2RlKiBpcyBhIE5VTUEgbm9kZSB3aG9zZSBtZW1vcnkgaXMgaG90cGx1Z2dlZCBieSBhIGRyaXZlclxcbithbmQgZGVsaWJlcmF0ZWx5IGhpZGRlbiBmcm9tIHRoZSBrZXJuZWwncyBub3JtYWwgbWVtb3J5IG1hbmFnZW1lbnQuICBTdWNoIGFcXG4rbm9kZSBpcyBtYXJrZWQgYGBOX01FTU9SWV9QUklWQVRFYGAgaW5zdGVhZCBvZiBgYE5fTUVNT1JZYGA7IHRoZSB0d28gc3RhdGVzXFxuK2FyZSBtdXR1YWxseSBleGNsdXNpdmUsIHNvIGEgcHJpdmF0ZSBub2RlIGlzIG5ldmVyIGNvbnNpZGVyZWQgYnkgdGhlIHBhZ2VcXG4rYWxsb2NhdG9yJ3Mgbm9ybWFsIG9yIGZhbGxiYWNrIHBhdGhzLlxcbitcXG4rVGhlIGludGVudCBpcyB0byBnaXZlIGEgZHJpdmVyIGEgYmxvY2sgb2YgTlVNQS1hZGRyZXNzYWJsZSBtZW1vcnkgdGhhdCB0aGUgcmVzdFxcbitvZiB0aGUga2VybmVsIHdpbGwgbm90IGFsbG9jYXRlIGZyb20gb24gaXRzIG93biwgd2hpbGUgc3RpbGwgbGV0dGluZyB0aGF0IG1lbW9yeVxcbitiZSBtYXBwZWQgaW50byBwcm9jZXNzZXMgYXMgb3JkaW5hcnksIHN0cnVjdC1wYWdlLCBMUlUtbWFuYWdlZCBmb2xpb3MgLS0gYW5kIHRvXFxuK2xldCB0aGUgZHJpdmVyIHJlLWVuYWJsZSBpbmRpdmlkdWFsIG1tIHNlcnZpY2VzIGl0IGlzIGNhcGFibGUgb2YgYWxsb3dpbmcuXFxuK1xcbitQcmVjb25kaXRpb25zXFxuKz09PT09PT09PT09PT1cXG4rXFxuK2BgTl9NRU1PUllfUFJJVkFURWBgIGFuZCBgYE5fTUVNT1JZYGAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgc28gdGhlIGJhY2tpbmdcXG4rbWVtb3J5IG11c3QgY29tZSB1cCBvbiBhIG5vZGUgdGhhdCBoYXMgbm8gRFJBTSBvZiBpdHMgb3duIChvdGhlcndpc2UgdGhlIG5vZGVcXG4rd291bGQgYWxyZWFkeSBiZSBgYE5fTUVNT1JZYGApLlxcbitcXG4rSW4gcHJhY3RpY2UgdGhlIG1lbW9yeSBpcyBwcm92aWRlZCBieSBhIGRldmljZSBkcml2ZXIgb3IgYSBEQVggZGV2aWNlIHdob3NlXFxuK3RhcmdldCBub2RlIGhhcyBubyBvdGhlciBtZW1vcnksIGFuZCB1c3VhbGx5IG5vIENQVXMuXFxuK1xcbitJc29sYXRpb24gbW9kZWxcXG4rPT09PT09PT09PT09PT09XFxuK1xcbitJc29sYXRpb24gaXMgKm9wdC1pbiBieSBleGNsdXNpb24qIGFuZCBpcyAqKnN0cnVjdHVyYWwqKjogYnkgZGVmYXVsdCBub3RoaW5nIGluXFxuK3RoZSBrZXJuZWwgY2FuIHBsYWNlIG1lbW9yeSBvbiBhIHByaXZhdGUgbm9kZSBiZWNhdXNlIHRoZSBub2RlIGlzIGFic2VudCBmcm9tIHRoZVxcbit6b25lbGlzdHMgYW4gb3JkaW5hcnkgYWxsb2NhdGlvbiB3YWxrcy5cXG4rXFxuK1pvbmVsaXN0IGV4Y2x1c2lvblxcbisgICAgVGhlIGtlcm5lbCBwYWdlIGFsbG9jYXRvciBkZXBlbmRzIG9uIHRoZSBgYEZBTExCQUNLYGAgYW5kIGBgTk9GQUxMQkFDS2BgXFxuKyAgICB6b25lbGlzdHMgdG8gYWxsb2NhdGUgbWVtb3J5LiAgQSBub3JtYWwgYGBOX01FTU9SWWBgIG5vZGUncyB6b25lcyAoZXhjZXB0XFxuKyAgICBgYFpPTkVfREVWSUNFYGApIGFwcGVhciBpbiB0aGVzZSBsaXN0cyBhbmQgYWxsb3cgYWxsb2NhdGlvbnMgdG8gZmFsbC1iYWNrXFxuKyAgICB0byBsZXNzIHByZWZlcmFibGUgbG9jYXRpb25zIGlmIHRoZSBwcmVmZXJyZWQgbG9jYXRpb24gaXMgcHJlc3N1cmVkLlxcbitcXG4rICAgIGBgX19HRlBfVEhJU05PREVgYCBpcyB1c2VkIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uIHRvIHN3aXRjaCBiZXR3ZWVuXFxuKyAgICBgYEZBTExCQUNLYGAgYW5kIGBgTk9GQUxMQkFDS2BgLCB3aGVyZSBgYE5PRkFMTEJBQ0tgYCBvbmx5IGNvbnRhaW5zIHRoZVxcbisgICAgem9uZWxpc3RzIG9mIHRoZSBwcmVmZXJyZWQgbm9kZS5cXG4rXFxuKyAgICBgYE5fTUVNT1JZX1BSSVZBVEVgYCBub2RlcyBhcmUgKipleGNsdWRlZCoqIGZyb20gYm90aCBgYEZBTExCQUNLYGAgYW5kXFxuKyAgICBgYE5PRkFMTEJBQ0tgYCB6b25lbGlzdHMuICBJbnN0ZWFkIHRoZXkgYXJlIGFkZGVkIHRvIGBgWk9ORUxJU1RfUFJJVkFURWBgLFxcbisgICAgd2hpY2ggaW5jbHVkZXMgYm90aCBgYE5fTUVNT1JZYGAgYW5kIGBgTl9NRU1PUllfUFJJVkFURWBgIG5vZGVzLiAgVGhpcyBpc1xcbisgICAgdGhlIG9ubHkgem9uZWxpc3QgdGhhdCBjb250YWlucyBwcml2YXRlLW5vZGUgem9uZXMsIGFuZCBzbyB0aGUgb25seSB3YXlcXG4rICAgIHRvIGFjcXVpcmUgcHJpdmF0ZSBub2RlIGFsbG9jYXRpb25zIGlzIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCB0aGF0IHpvbmVsaXN0LlxcbitcXG4rICAgIEV2ZW4gYW4gYWxsb2NhdGlvbiBjYXJyeWluZyBgYF9fR0ZQX1RISVNOT0RFYGAgY2Fubm90IGFjY2VzcyB0aGUgbm9kZSdzXFxuKyAgICBtZW1vcnkgd2l0aG91dCBhbHNvIGV4cGxpY2l0bHkgcGFzc2luZyB0aGUgcHJpdmF0ZSB6b25lbGlzdC4gIFRoaXMgcHJldmVudHNcXG4rICAgIGluY2lkZW50YWwgYWxsb2NhdGlvbiBvZiBwcml2YXRlIG1lbW9yeSBieSB1c2VycyBvZiBwb3NzaWJsZS9vbmxpbmVcXG4rICAgIG5vZGVsaXN0cy5cXG4rXFxuKyAgICBXaGVuIGBgQ09ORklHX05VTUFgYCBpcyBkaXNhYmxlZCBgYFpPTkVMSVNUX1BSSVZBVEVgYCBhbGlhc2VzXFxuKyAgICBgYFpPTkVMSVNUX0ZBTExCQUNLYGAgYW5kIGlzIG5ldmVyIHNlbGVjdGVkLlxcbitcXG4rVGhlIHVzZXJfbnVtYSBwYXRoXFxuK1xcbisgICAgYGBNUE9MX0ZfUFJJVkFURWBgIGlzIGFuIGludGVybmFsIHVzZXJfbnVtYSBmbGFnIChuZXZlciBhY2NlcHRlZCBmcm9tXFxuKyAgICB1c2Vyc3BhY2UpIG1hcmtpbmcgdGhhdCBhIG1lbXBvbGljeSBoYXMgYSBwcml2YXRlIG5vZGUgaW4gaXRzIG5vZGVtYXNrLlxcbitcXG4rICAgIFdoZW4gYGBDQVBfVVNFUl9OVU1BYGAgZm9yIGEgcHJpdmF0ZSBub2RlIGlzIHNldCwgdXNlci1zb3VyY2VkIG1lbXBvbGljeVxcbisgICAgKGBgc2V0X21lbXBvbGljeSgyKWBgKSBhbmQgbWlncmF0aW9uIChgYG1vdmVfcGFnZXMoMilgYCkgb3BlcmF0aW9ucyBhcmVcXG4rICAgIGFsbG93ZWQgdG8gaW5jbHVkZSB0aGF0IG5vZGUgaW4gbm9kZW1hc2tzIGFuZCB0YXJnZXRzIHJlc3BlY3RpdmVseS5cXG4rXFxuKyAgICBgYG1iaW5kKE1QT0xfTUZfTU9WRSlgYCBpcyBib3RoIGEgbWVtcG9saWN5IGFuZCBhIG1pZ3JhdGlvbiBvcGVyYXRpb24sXFxuKyAgICBzbyBwbGFjZW1lbnQgYW5kIG1pZ3JhdGlvbiBzaGFyZSB0aGUgc2FtZSBjYXBhYmlsaXR5LlxcbitcXG4rICAgIFRoZSBtZW1wb2xpY3kgY29tcG9uZW50IHVzZXMgYGBNUE9MX0ZfUFJJVkFURWBgIGF0IGZhdWx0LXRpbWUgdG8gc2VsZWN0XFxuKyAgICBgYFpPTkVMSVNUX1BSSVZBVEVgYCBhbmQgbWFrZXMgdGhlIG5vZGUncyBtZW1vcnkgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLlxcbisgICAgSXQgaXMgb3RoZXJ3aXNlIGFuIG9yZGluYXJ5LCByZWxheGFibGUgbWVtcG9saWN5OiBhbiB1bnNhdGlzZmlhYmxlIHJlcXVlc3RcXG4rICAgIChhbiB1bm1vdmFibGUgYWxsb2NhdGlvbiBvbiBhIG1vdmFibGUtb25seSBwcml2YXRlIG5vZGUpIHNpbXBseSBmYWxscyBiYWNrLlxcbitcXG4rXFxuK2NwdXNldCBpbnRlcmFjdGlvblxcbis9PT09PT09PT09PT09PT09PT1cXG4rXFxuK2NwdXNldC5tZW1zIGRvZXMgKipub3QqKiBwYXJ0aXRpb24gcHJpdmF0ZSBub2Rlcy4gIGNwdXNldCBuZWl0aGVyIGdyYW50cyBub3JcXG4rZGVuaWVzIGFjY2VzcywgYW5kIHJlYmluZGluZyBjcHVzZXQubWVtcyBub2RlbWFza3MgZG8gbm90IGFmZmVjdCBhIHByaXZhdGUgbm9kZSdzXFxuK3Jlc2lkZW5jeSBpbiBhbnkgbm9kZW1hc2suXFxuK1xcbitMaWtld2lzZSwgYSBwcml2YXRlIG5vZGUncyBpbmNsdXNpb24gaW4gYSBub2RlbWFzayBkb2VzIG5vdCBhZmZlY3QgY3B1c2V0Lm1lbXMnXFxuK2ZpbHRlcmluZyBvZiBhbnkgYGBOX01FTU9SWWBgIC0gdGhleSByZW1haW4gcGFydGl0aW9uZWQgYWNjb3JkaW5nIHRvIGNwdXNldC5cXG4rXFxuK1xcbitQcm92aXNpb25pbmdcXG4rPT09PT09PT09PT09XFxuK1xcbitBIGRyaXZlciBicmluZ3MgbWVtb3J5IHVwIGFzIHByaXZhdGUgd2l0aDo6XFxuK1xcbisgIGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZChuaWQsIHN0YXJ0LCBzaXplLCByZXNvdXJjZV9uYW1lLFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaHBfZmxhZ3MsIG9ubGluZV90eXBlLCBucClcXG4rXFxuK3doaWNoIG9ubGluZXMgdGhlIHJhbmdlIGFuZCByZWdpc3RlcnMgdGhlIGRyaXZlci1vd25lZCBgYHN0cnVjdCBub2RlX3ByaXZhdGVgYFxcbisoYGBucGBgKSBkZXNjcmliaW5nIHRoZSBub2RlLCBpbmNsdWRpbmcgaXRzIGNhcGFiaWxpdHkgYml0bWFwIChzZWUgYmVsb3cpLlxcbitcXG4rT25seSBvbmUgZHJpdmVyL3NlcnZpY2UgbWF5IHJlZ2lzdGVyIGEgYGBzdHJ1Y3Qgbm9kZV9wcml2YXRlYGAsIHdoaWNoXFxuK2hlYXZpbHkgaW1wbGllcyBhIFxcXCJvbmUtbm9kZS1wZXItZGV2aWNlXFxcIiBkZXNpZ24gb2YgdGhlIHN5c3RlbS5cXG4rXFxuK1RoZSBub2RlIGxlYXZlcyBgYE5fTUVNT1JZX1BSSVZBVEVgYCBvbmx5IHdoZW4gdGhlIGxhc3QgcmFuZ2UgaXMgb2ZmbGluZWQuXFxuK1xcbisuLiBrZXJuZWwtZG9jOjogbW0vbWVtb3J5X2hvdHBsdWcuY1xcbisgICA6aWRlbnRpZmllcnM6IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZFxcbitcXG4rLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9ub2RlLmNcXG4rICAgOmlkZW50aWZpZXJzOiBub2RlX3ByaXZhdGVfcmVnaXN0ZXIgbm9kZV9wcml2YXRlX3VucmVnaXN0ZXJcXG4rXFxuK0NhcGFiaWxpdGllcyAocGVyLXNlcnZpY2Ugb3B0LWlucylcXG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbitcXG4rQmVjYXVzZSB0aGUgZGVmYXVsdCBpcyBcXFwibm8gbW0gc2VydmljZSB0b3VjaGVzIHRoZSBub2RlXFxcIiwgZWFjaCBzZXJ2aWNlIGEgZHJpdmVyXFxuK3dhbnRzIGJhY2sgaXMgcmVxdWVzdGVkIGV4cGxpY2l0bHkgdGhyb3VnaCBhIGNhcGFiaWxpdHkgYml0IGluXFxuK2BgbnAtXFx1MDAzZWNhcHNgYC4gIFRoZSBtbSBzaWRlIGNoZWNrcyB0aGUgbWF0Y2hpbmcgYGBub2RlX2FsbG93c18qKClgYCAvXFxuK2BgZm9saW9fYWxsb3dzXyooKWBgIHByZWRpY2F0ZSBiZWZvcmUgYWN0aW5nOlxcbitcXG4rLi4gbGlzdC10YWJsZTo6XFxuKyAgIDpoZWFkZXItcm93czogMVxcbisgICA6d2lkdGhzOiAzNSA2NVxcbitcXG4rICAgKiAtIENhcGFiaWxpdHlcXG4rICAgICAtIFJlLWVuYWJsZXNcXG4rICAgKiAtIGBgTk9ERV9QUklWQVRFX0NBUF9SRUNMQUlNYGBcXG4rICAgICAtIHJlY2xhaW0gb2YgdGhlIG5vZGUncyBmb2xpb3MsIGJ5IHRoZSBtbSBhbmQgYnkgdXNlcnNwYWNlXFxuKyAgICAgICBgYE1BRFZfQ09MRGBgIC8gYGBQQUdFT1VUYGAgLyBgYEZSRUVgYCAodXNlcmxhbmQtZHJpdmVuIHJlY2xhaW0pXFxuKyAgICogLSBgYE5PREVfUFJJVkFURV9DQVBfVVNFUl9OVU1BYGBcXG4rICAgICAtIGFsbCB1c2Vyc3BhY2UtZGlyZWN0ZWQgcGxhY2VtZW50IGFuZCBtaWdyYXRpb246IGBgbWJpbmQoKWBgIC9cXG4rICAgICAgIGBgc2V0X21lbXBvbGljeSgpYGAgLyBob21lIG5vZGUsIGFuZCBgYG1vdmVfcGFnZXMoKWBgIC9cXG4rICAgICAgIGBgbWlncmF0ZV9wYWdlcygpYGAgdG8vZnJvbSB0aGUgbm9kZVxcbisgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX0hPVFVOUExVR2BgXFxuKyAgICAgLSBob3QtdW5wbHVnIHZpYSBtaWdyYXRpb25cXG4rICAgKiAtIGBgTk9ERV9QUklWQVRFX0NBUF9ERU1PVElPTmBgXFxuKyAgICAgLSByZWNsYWltLWRyaXZlbiB0aWVyaW5nIGRlbW90aW9uIG9udG8gdGhlIG5vZGUgKHRoZSBub2RlIGpvaW5zIHRoZVxcbisgICAgICAgZGVtb3Rpb24gaGllcmFyY2h5KVxcbisgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX05VTUFfQkFMQU5DSU5HYGBcXG4rICAgICAtIGFjY2Vzcy1iYXNlZCBOVU1BIGJhbGFuY2luZyBzY2FuL21pZ3JhdGlvbiBvZiB0aGUgbm9kZSdzIGZvbGlvc1xcbisgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX0xUUElOYGBcXG4rICAgICAtIGBgRk9MTF9MT05HVEVSTWBgIEdVUCBwaW5zXFxuK1xcbitraHVnZXBhZ2VkIG5ldmVyIG9wZXJhdGVzIG9uIHByaXZhdGUtbm9kZSBmb2xpb3MgKGxpa2UgWk9ORV9ERVZJQ0UpLCBhbmQgREFNT05cXG4rZG9lcyBub3QgYWN0IG9uIHRoZW07IGBgTUFEVl9DT0xMQVBTRWBgIGlzIGNvdmVyZWQgYnkgYGBDQVBfVVNFUl9OVU1BYGAuXFxuK1xcbitEZXBlbmRlbmNpZXMgYmV0d2VlbiBjYXBhYmlsaXRpZXMgYXJlIGVuZm9yY2VkICoqb25jZSoqLCBieVxcbitgYG5vZGVfcHJpdmF0ZV9yZWdpc3RlcigpYGAgYXQgaG90cGx1ZywgcmF0aGVyIHRoYW4gYnkgd2hhdGV2ZXIgc2V0cyB0aGUgYml0czpcXG4rXFxuKyogYGBERU1PVElPTmBgIHJlcXVpcmVzIGBgUkVDTEFJTWBgIChhIGRlbW90aW9uIHRhcmdldCBhY2N1bXVsYXRlcyBkZW1vdGVkXFxuKyAgcGFnZXMsIHNvIHdpdGhvdXQgcmVjbGFpbSBhcyBhIHNhZmV0eSB2YWx2ZSBpdCB3b3VsZCBqdXN0IGZpbGwgdXApLlxcbitcXG4rQ2FwYWJpbGl0eSBmbGFncyBhcmUgZXhwZWN0ZWQgdG8gYmUgc3RhYmxlIGF0IHJ1bnRpbWUuXFxuK1xcbitPYnNlcnZhYmlsaXR5XFxuKz09PT09PT09PT09PT1cXG4rXFxuK0EgcHJpdmF0ZSBub2RlIGlzIHJlcG9ydGVkIHRocm91Z2g6XFxuK1xcbisqIGBgL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL2hhc19wcml2YXRlX21lbW9yeWBgXFxuKyogYGAvcHJvYy9cXHUwMDNjcGlkXFx1MDAzZS9udW1hX21hcHNgYCAtLSBwZXItbm9kZSByZXNpZGVuY3kgaW5jbHVkZXMgcHJpdmF0ZSBub2Rlc1xcbisqIGBgL3Byb2Mva2NvcmVgYCAtLSBwcml2YXRlLW5vZGUgUkFNIGFwcGVhcnMgaW4gdGhlIGtjb3JlIFJBTSBtYXBcXG4rKiBtZW1jZyBwZXItbm9kZSBzdGF0aXN0aWNzIGFjY291bnQgcHJpdmF0ZS1ub2RlIG1lbW9yeS5cXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL25vZGUuYyBiL2RyaXZlcnMvYmFzZS9ub2RlLmNcXG5pbmRleCAzZGE5MTkyOWFkNGUzNy4uM2Q2MWNhMWI4MDVkYzAgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9iYXNlL25vZGUuY1xcbisrKyBiL2RyaXZlcnMvYmFzZS9ub2RlLmNcXG5AQCAtMjIsNiArMjIsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc3dhcC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtYmxvY2suaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25vZGVfcHJpdmF0ZS5oXFx1MDAzZVxcbiBcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidXNfdHlwZSBub2RlX3N1YnN5cyA9IHtcXG4gXFx0Lm5hbWUgPSBcXFwibm9kZVxcXCIsXFxuQEAgLTg2OCw2ICs4NjksMTIxIEBAIHZvaWQgcmVnaXN0ZXJfbWVtb3J5X2Jsb2Nrc191bmRlcl9ub2RlX2hvdHBsdWcoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sXFxuIFxcdFxcdFxcdCAgICh2b2lkICopXFx1MDAyNm5pZCwgcmVnaXN0ZXJfbWVtX2Jsb2NrX3VuZGVyX25vZGVfaG90cGx1Zyk7XFxuIFxcdHJldHVybjtcXG4gfVxcbitcXG4rc3RhdGljIERFRklORV9NVVRFWChub2RlX3ByaXZhdGVfbG9jayk7XFxuK1xcbisvKipcXG4rICogbm9kZV9wcml2YXRlX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgYSBwcml2YXRlIG5vZGVcXG4rICogQG5pZDogTm9kZSBpZGVudGlmaWVyXFxuKyAqIEBucDogVGhlIG5vZGVfcHJpdmF0ZSBzdHJ1Y3R1cmUgKGRyaXZlci1hbGxvY2F0ZWQsIGRyaXZlci1vd25lZClcXG4rICpcXG4rICogUmVnaXN0ZXIgYW4gb3duZXIgZm9yIGEgcHJpdmF0ZSBub2RlLiBJZiBhbiBvd25lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcXG4rICogKGRpZmZlcmVudCBucCksIHJldHVybiAtRUJVU1kuXFxuKyAqXFxuKyAqIFJlLXJlZ2lzdHJhdGlvbiB3aXRoIHRoZSBzYW1lIG5wIGlzIGFsbG93ZWQuXFxuKyAqXFxuKyAqIFRoZSBjYWxsZXIgb3ducyB0aGUgbm9kZV9wcml2YXRlIG1lbW9yeSBhbmQgbXVzdCBlbnN1cmUgaXQgcmVtYWlucyB2YWxpZFxcbisgKiB1bnRpbCBhZnRlciBub2RlX3ByaXZhdGVfdW5yZWdpc3RlcigpIHJldHVybnMuXFxuKyAqXFxuKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLlxcbisgKi9cXG4raW50IG5vZGVfcHJpdmF0ZV9yZWdpc3RlcihpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucClcXG4re1xcbitcXHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpleGlzdGluZztcXG4rXFx0cGdfZGF0YV90ICpwZ2RhdDtcXG4rXFx0aW50IHJldCA9IDA7XFxuK1xcbitcXHRpZiAoIW5wIHx8ICFub2RlX3Bvc3NpYmxlKG5pZCkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0LyogRGVtb3Rpb24gaXMgZHJpdmVuIGJ5IHJlY2xhaW0sIHNvIGl0IHJlcXVpcmVzIHJlY2xhaW0uICovXFxuK1xcdGlmICgobnAtXFx1MDAzZWNhcHMgXFx1MDAyNiBOT0RFX1BSSVZBVEVfQ0FQX0RFTU9USU9OKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIShucC1cXHUwMDNlY2FwcyBcXHUwMDI2IE5PREVfUFJJVkFURV9DQVBfUkVDTEFJTSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0bXV0ZXhfbG9jayhcXHUwMDI2bm9kZV9wcml2YXRlX2xvY2spO1xcbitcXHRtZW1faG90cGx1Z19iZWdpbigpO1xcbitcXG4rXFx0LyogTl9NRU1PUllfUFJJVkFURSBhbmQgTl9NRU1PUlkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqL1xcbitcXHRpZiAobm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSkge1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRwZ2RhdCA9IE5PREVfREFUQShuaWQpO1xcbitcXHRleGlzdGluZyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocGdkYXQtXFx1MDAzZW5vZGVfcHJpdmF0ZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBsb2NrZGVwX2lzX2hlbGQoXFx1MDAyNm5vZGVfcHJpdmF0ZV9sb2NrKSk7XFxuK1xcbitcXHQvKiBJZiBpdCBleGlzdHMsIHJlc3RyaWN0IHRvIHNpbmdsZSBvd25lciAqL1xcbitcXHRpZiAoZXhpc3RpbmcpIHtcXG4rXFx0XFx0aWYgKGV4aXN0aW5nICE9IG5wKVxcbitcXHRcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRyY3VfYXNzaWduX3BvaW50ZXIocGdkYXQtXFx1MDAzZW5vZGVfcHJpdmF0ZSwgbnApO1xcbitvdXQ6XFxuK1xcdG1lbV9ob3RwbHVnX2RvbmUoKTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZub2RlX3ByaXZhdGVfbG9jayk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobm9kZV9wcml2YXRlX3JlZ2lzdGVyKTtcXG4rXFxuKy8qKlxcbisgKiBub2RlX3ByaXZhdGVfdW5yZWdpc3RlciAtIFVucmVnaXN0ZXIgYSBwcml2YXRlIG5vZGVcXG4rICogQG5pZDogTm9kZSBpZGVudGlmaWVyXFxuKyAqXFxuKyAqIFVucmVnaXN0ZXIgdGhlIGRyaXZlciBmcm9tIGEgcHJpdmF0ZSBub2RlLlxcbisgKlxcbisgKiBPbmx5IHN1Y2NlZWRzIGlmIGFsbCBtZW1vcnkgaGFzIGJlZW4gb2ZmbGluZWQgKE5fTUVNT1JZX1BSSVZBVEUgY2xlYXJlZCkuXFxuKyAqXFxuKyAqIE5fTUVNT1JZX1BSSVZBVEUgc3RhdGUgaXMgY2xlYXJlZCBieSBvZmZsaW5lX3BhZ2VzKCkgd2hlbiB0aGUgbGFzdFxcbisgKiBtZW1vcnkgaXMgb2ZmbGluZWQsIG5vdCBieSB0aGlzIGZ1bmN0aW9uLlxcbisgKlxcbisgKiBBZnRlciB0aGlzIHJldHVybnMsIHRoZSBub2RlX3ByaXZhdGUgcG9pbnRlciBpcyBubyBsb25nZXIgdmlzaWJsZSBhbmRcXG4rICogYW4gUkNVIGdyYWNlIHBlcmlvZCBoYXMgZWxhcHNlZCwgc28gdGhlIGRyaXZlciBtYXkgZnJlZSBpdHMgY29udGV4dC5cXG4rICpcXG4rICogUmV0dXJuOiAwIGlmIHVucmVnaXN0ZXJlZCwgLUVCVVNZIGlmIE5fTUVNT1JZX1BSSVZBVEUgaXMgc3RpbGwgc2V0LlxcbisgKi9cXG4raW50IG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKGludCBuaWQpXFxuK3tcXG4rXFx0c3RydWN0IG5vZGVfcHJpdmF0ZSAqbnA7XFxuK1xcdHBnX2RhdGFfdCAqcGdkYXQ7XFxuK1xcbitcXHRpZiAoIW5vZGVfcG9zc2libGUobmlkKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZub2RlX3ByaXZhdGVfbG9jayk7XFxuK1xcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XFxuK1xcbitcXHRwZ2RhdCA9IE5PREVfREFUQShuaWQpO1xcbitcXHRucCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocGdkYXQtXFx1MDAzZW5vZGVfcHJpdmF0ZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGxvY2tkZXBfaXNfaGVsZChcXHUwMDI2bm9kZV9wcml2YXRlX2xvY2spKTtcXG4rXFx0aWYgKCFucCkge1xcbitcXHRcXHRtZW1faG90cGx1Z19kb25lKCk7XFxuK1xcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2bm9kZV9wcml2YXRlX2xvY2spO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogT25seSB1bnJlZ2lzdGVyIGlmIE5fTUVNT1JZX1BSSVZBVEUgaXMgY2xlYXJlZCAob25seSBvY2N1cnMgd2hlblxcbitcXHQgKiB0aGUgbGFzdCBtZW1vcnkgYmxvY2sgaXMgb2ZmbGluZWQgaW4gb2ZmbGluZV9wYWdlcygpKVxcbitcXHQgKi9cXG4rXFx0aWYgKG5vZGVfaXNfcHJpdmF0ZShuaWQpKSB7XFxuK1xcdFxcdG1lbV9ob3RwbHVnX2RvbmUoKTtcXG4rXFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZub2RlX3ByaXZhdGVfbG9jayk7XFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdHJjdV9hc3NpZ25fcG9pbnRlcihwZ2RhdC1cXHUwMDNlbm9kZV9wcml2YXRlLCBOVUxMKTtcXG4rXFxuK1xcdG1lbV9ob3RwbHVnX2RvbmUoKTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZub2RlX3ByaXZhdGVfbG9jayk7XFxuK1xcbitcXHRzeW5jaHJvbml6ZV9yY3UoKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwobm9kZV9wcml2YXRlX3VucmVnaXN0ZXIpO1xcbiAjZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RQTFVHICovXFxuIFxcbiAvKipcXG5AQCAtOTY2LDYgKzEwODIsNyBAQCBzdGF0aWMgc3RydWN0IG5vZGVfYXR0ciBub2RlX3N0YXRlX2F0dHJbXSA9IHtcXG4gXFx0W05fSElHSF9NRU1PUlldID0gX05PREVfQVRUUihoYXNfaGlnaF9tZW1vcnksIE5fSElHSF9NRU1PUlkpLFxcbiAjZW5kaWZcXG4gXFx0W05fTUVNT1JZXSA9IF9OT0RFX0FUVFIoaGFzX21lbW9yeSwgTl9NRU1PUlkpLFxcbitcXHRbTl9NRU1PUllfUFJJVkFURV0gPSBfTk9ERV9BVFRSKGhhc19wcml2YXRlX21lbW9yeSwgTl9NRU1PUllfUFJJVkFURSksXFxuIFxcdFtOX0NQVV0gPSBfTk9ERV9BVFRSKGhhc19jcHUsIE5fQ1BVKSxcXG4gXFx0W05fR0VORVJJQ19JTklUSUFUT1JdID0gX05PREVfQVRUUihoYXNfZ2VuZXJpY19pbml0aWF0b3IsXFxuIFxcdFxcdFxcdFxcdFxcdCAgIE5fR0VORVJJQ19JTklUSUFUT1IpLFxcbkBAIC05NzksNiArMTA5Niw3IEBAIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpub2RlX3N0YXRlX2F0dHJzW10gPSB7XFxuIFxcdFxcdTAwMjZub2RlX3N0YXRlX2F0dHJbTl9ISUdIX01FTU9SWV0uYXR0ci5hdHRyLFxcbiAjZW5kaWZcXG4gXFx0XFx1MDAyNm5vZGVfc3RhdGVfYXR0cltOX01FTU9SWV0uYXR0ci5hdHRyLFxcbitcXHRcXHUwMDI2bm9kZV9zdGF0ZV9hdHRyW05fTUVNT1JZX1BSSVZBVEVdLmF0dHIuYXR0cixcXG4gXFx0XFx1MDAyNm5vZGVfc3RhdGVfYXR0cltOX0NQVV0uYXR0ci5hdHRyLFxcbiBcXHRcXHUwMDI2bm9kZV9zdGF0ZV9hdHRyW05fR0VORVJJQ19JTklUSUFUT1JdLmF0dHIuYXR0cixcXG4gXFx0TlVMTFxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2RheC9rbWVtLmMgYi9kcml2ZXJzL2RheC9rbWVtLmNcXG5pbmRleCBhNDhkNjk5Y2YzNDRjOS4uYzNmYWYxOGU3Zjg1ZGUgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9kYXgva21lbS5jXFxuKysrIGIvZHJpdmVycy9kYXgva21lbS5jXFxuQEAgLTEyNiw3ICsxMjYsNyBAQCBzdGF0aWMgaW50IGRheF9rbWVtX2RvX2hvdHBsdWcoc3RydWN0IGRldl9kYXggKmRldl9kYXgsXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRyYyA9IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChkYXRhLVxcdTAwM2VtZ2lkLCByYW5nZS5zdGFydCxcXG4gXFx0XFx0XFx0XFx0cmFuZ2VfbGVuKFxcdTAwMjZyYW5nZSksIGttZW1fbmFtZSwgbWhwX2ZsYWdzLFxcbi1cXHRcXHRcXHRcXHRvbmxpbmVfdHlwZSk7XFxuK1xcdFxcdFxcdFxcdG9ubGluZV90eXBlLCBOVUxMKTtcXG4gXFxuIFxcdFxcdGlmIChyYykge1xcbiBcXHRcXHRcXHRkZXZfd2FybihkZXYsIFxcXCJtYXBwaW5nJWQ6ICUjbGx4LSUjbGx4IG1lbW9yeSBhZGQgZmFpbGVkXFxcXG5cXFwiLFxcbmRpZmYgLS1naXQgYS9mcy9wcm9jL2tjb3JlLmMgYi9mcy9wcm9jL2tjb3JlLmNcXG5pbmRleCAzOTA1NDdiOTkyYWNkOS4uZjY3MTk0ZGMyYTliODUgMTAwNjQ0XFxuLS0tIGEvZnMvcHJvYy9rY29yZS5jXFxuKysrIGIvZnMvcHJvYy9rY29yZS5jXFxuQEAgLTI1MSwxMSArMjUxLDE0IEBAIHN0YXRpYyBpbnQga2NvcmVfcmFtX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcXG4ge1xcbiBcXHRpbnQgbmlkLCByZXQ7XFxuIFxcdHVuc2lnbmVkIGxvbmcgZW5kX3BmbjtcXG4rXFx0bm9kZW1hc2tfdCBtZW07XFxuIFxcbiBcXHQvKiBOb3QgaW5pdGlhbGl6ZWQuLi4udXBkYXRlIG5vdyAqL1xcbiBcXHQvKiBmaW5kIG91dCBcXFwibWF4IHBmblxcXCIgKi9cXG4gXFx0ZW5kX3BmbiA9IDA7XFxuLVxcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkge1xcbitcXHQvKiBJbmNsdWRlIHByaXZhdGUgbm9kZSBtZW1vcnkgaW4gdGhlIHNjYW4gKi9cXG4rXFx0bm9kZXNfb3IobWVtLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcXG4rXFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgbWVtKSB7XFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgbm9kZV9lbmQ7XFxuIFxcdFxcdG5vZGVfZW5kID0gbm9kZV9lbmRfcGZuKG5pZCk7XFxuIFxcdFxcdGlmIChlbmRfcGZuIFxcdTAwM2Mgbm9kZV9lbmQpXFxuZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19tbXUuYyBiL2ZzL3Byb2MvdGFza19tbXUuY1xcbmluZGV4IDgxN2UzZTBmOTE5NDMwLi5lMTE2Y2Q1ZjE1N2I5YSAxMDA2NDRcXG4tLS0gYS9mcy9wcm9jL3Rhc2tfbW11LmNcXG4rKysgYi9mcy9wcm9jL3Rhc2tfbW11LmNcXG5AQCAtMzM4OSw3ICszMzg5LDggQEAgc3RhdGljIHN0cnVjdCBwYWdlICpjYW5fZ2F0aGVyX251bWFfc3RhdHMocHRlX3QgcHRlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0cmV0dXJuIE5VTEw7XFxuIFxcbiBcXHRuaWQgPSBwYWdlX3RvX25pZChwYWdlKTtcXG4tXFx0aWYgKCFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKSlcXG4rXFx0aWYgKCFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIW5vZGVfaXNzZXQobmlkLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSkpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4gXFx0cmV0dXJuIHBhZ2U7XFxuQEAgLTM0MTQsNyArMzQxNSw4IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqY2FuX2dhdGhlcl9udW1hX3N0YXRzX3BtZChwbWRfdCBwbWQsXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4gXFx0bmlkID0gcGFnZV90b19uaWQocGFnZSk7XFxuLVxcdGlmICghbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSkpXFxuK1xcdGlmICghbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pKVxcbiBcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFxuIFxcdHJldHVybiBwYWdlO1xcbkBAIC0zNjAyLDYgKzM2MDQsMTAgQEAgc3RhdGljIGludCBzaG93X251bWFfbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcXG4gXFx0XFx0aWYgKG1kLVxcdTAwM2Vub2RlW25pZF0pXFxuIFxcdFxcdFxcdHNlcV9wcmludGYobSwgXFxcIiBOJWQ9JWx1XFxcIiwgbmlkLCBtZC1cXHUwMDNlbm9kZVtuaWRdKTtcXG4gXFxuK1xcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKVxcbitcXHRcXHRpZiAobWQtXFx1MDAzZW5vZGVbbmlkXSlcXG4rXFx0XFx0XFx0c2VxX3ByaW50ZihtLCBcXFwiIE4lZD0lbHVcXFwiLCBuaWQsIG1kLVxcdTAwM2Vub2RlW25pZF0pO1xcbitcXG4gXFx0c2VxX3ByaW50ZihtLCBcXFwiIGtlcm5lbHBhZ2VzaXplX2tCPSVsdVxcXCIsIHZtYV9rZXJuZWxfcGFnZXNpemUodm1hKSBcXHUwMDNlXFx1MDAzZSAxMCk7XFxuIG91dDpcXG4gXFx0c2VxX3B1dGMobSwgJ1xcXFxuJyk7XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2ZwLmggYi9pbmNsdWRlL2xpbnV4L2dmcC5oXFxuaW5kZXggODcyYmM1M2YzMmVjODcuLmYzZTg2N2RlNzQ0ZjZkIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2dmcC5oXFxuQEAgLTIwNCw5ICsyMDQsMTYgQEAgc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZnJlZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3JkZXIpIHsgfVxcbiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9hbGxvY19wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3JkZXIpIHsgfVxcbiAjZW5kaWZcXG4gXFxuLXN0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBwcmVmZXJyZWRfbmlkLFxcbi1cXHRcXHRub2RlbWFza190ICpub2RlbWFzayk7XFxuLSNkZWZpbmUgX19mb2xpb19hbGxvYyguLi4pXFx0XFx0XFx0YWxsb2NfaG9va3MoX19mb2xpb19hbGxvY19ub3Byb2YoX19WQV9BUkdTX18pKVxcbisvKiBBbGxvY2F0ZSBmcm9tIGFuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZSAoc2VsZWN0cyB0aGUgcHJpdmF0ZSB6b25lbGlzdCkuICovXFxuK3N0cnVjdCBwYWdlICphbGxvY19wYWdlc19ub2RlX3ByaXZhdGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxcbitcXHRcXHRpbnQgbmlkKTtcXG4rI2RlZmluZSBhbGxvY19wYWdlc19ub2RlX3ByaXZhdGUoLi4uKVxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0YWxsb2NfaG9va3MoYWxsb2NfcGFnZXNfbm9kZV9wcml2YXRlX25vcHJvZihfX1ZBX0FSR1NfXykpXFxuK1xcbitzdHJ1Y3QgZm9saW8gKmZvbGlvX2FsbG9jX25vZGVfcHJpdmF0ZV9ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuK1xcdFxcdGludCBuaWQpO1xcbisjZGVmaW5lIGZvbGlvX2FsbG9jX25vZGVfcHJpdmF0ZSguLi4pXFx0XFx0XFx0XFx0XFxcXFxcbitcXHRhbGxvY19ob29rcyhmb2xpb19hbGxvY19ub2RlX3ByaXZhdGVfbm9wcm9mKF9fVkFfQVJHU19fKSlcXG4gXFxuIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCxcXG4gXFx0XFx0XFx0XFx0bm9kZW1hc2tfdCAqbm9kZW1hc2ssIGludCBucl9wYWdlcyxcXG5AQCAtMjUyLDE0ICsyNTksNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgd2Fybl9pZl9ub2RlX29mZmxpbmUoaW50IHRoaXNfbm9kZSwgZ2ZwX3QgZ2ZwX21hc2spXFxuIFxcdGR1bXBfc3RhY2soKTtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZVxcbi1zdHJ1Y3QgZm9saW8gKl9fZm9saW9fYWxsb2Nfbm9kZV9ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBuaWQpXFxuLXtcXG4tXFx0d2Fybl9pZl9ub2RlX29mZmxpbmUobmlkLCBnZnApO1xcbi1cXG4tXFx0cmV0dXJuIF9fZm9saW9fYWxsb2Nfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgTlVMTCk7XFxuLX1cXG4tXFxuK3N0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub2RlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IG5pZCk7XFxuICNkZWZpbmUgIF9fZm9saW9fYWxsb2Nfbm9kZSguLi4pXFx0XFx0YWxsb2NfaG9va3MoX19mb2xpb19hbGxvY19ub2RlX25vcHJvZihfX1ZBX0FSR1NfXykpXFxuIFxcbiAvKlxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhcXG5pbmRleCBhYjhjZmFlYzgyZDMxZS4uZjY0NDhhNzNkNDY0YzggMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXFxuQEAgLTczOSw2ICs3MzksOSBAQCBzdGF0aWMgaW5saW5lIHU2NCBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSlcXG4gXFx0aWYgKCFrdm0gfHwga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChrdm0pKVxcbiBcXHRcXHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEO1xcbiBcXG4rXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX05VTUEpKVxcbitcXHRcXHRmbGFncyB8PSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERTtcXG4rXFxuIFxcdHJldHVybiBmbGFncztcXG4gfVxcbiAjZW5kaWZcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oXFxuaW5kZXggYjM5NjA1ZDMwODk2MzIuLmZjY2ViMGE0MjM1NzliIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaFxcbkBAIC0zMDUsNyArMzA1LDEwIEBAIGV4dGVybiBpbnQgYWRkX21lbW9yeV9yZXNvdXJjZShpbnQgbmlkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlc291cmNlLFxcbiBcXHRcXHRcXHQgICAgICAgbWhwX3QgbWhwX2ZsYWdzKTtcXG4gaW50IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxcbiBcXHRcXHRcXHRcXHRjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lLCBtaHBfdCBtaHBfZmxhZ3MsXFxuLVxcdFxcdFxcdFxcdGVudW0gbW1vcCBvbmxpbmVfdHlwZSk7XFxuK1xcdFxcdFxcdFxcdGVudW0gbW1vcCBvbmxpbmVfdHlwZSwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApO1xcbitpbnQgYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXFxuK1xcdFxcdFxcdFxcdCAgICAgIGNvbnN0IGNoYXIgKnJlc291cmNlX25hbWUsIG1ocF90IG1ocF9mbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgZW51bSBtbW9wIG9ubGluZV90eXBlLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucCk7XFxuIGV4dGVybiBpbnQgYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxcbiBcXHRcXHRcXHRcXHQgICAgIGNvbnN0IGNoYXIgKnJlc291cmNlX25hbWUsXFxuIFxcdFxcdFxcdFxcdCAgICAgbWhwX3QgbWhwX2ZsYWdzKTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcXG5pbmRleCA2NWM3MzJkNDQwZDJmNC4uMTM0OGU5ZjVmMmNmOTIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcXG5AQCAtNyw2ICs3LDcgQEBcXG4gI2RlZmluZSBfTElOVVhfTUVNUE9MSUNZX0ggMVxcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NjaGVkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tem9uZS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcmJ0cmVlLmhcXHUwMDNlXFxuQEAgLTEyNCwxMCArMTI1LDE1IEBAIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpO1xcbiB2b2lkIG1wb2xfc2hhcmVkX3BvbGljeV9pbml0KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XFxuIGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcXG4gXFx0XFx0XFx0ICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xcbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXFxuK1xcdFxcdFxcdFxcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XFxuIHZvaWQgbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwKTtcXG4gc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICBwZ29mZl90IGlkeCk7XFxuIFxcbitzdHJ1Y3QgbWVtcG9saWN5ICptcG9sX3ByaXZhdGVfYmluZChpbnQgbmlkKTtcXG4rc3RydWN0IG1lbXBvbGljeSAqbXBvbF9iaW5kX25vZGUoaW50IG5pZCk7XFxuK1xcbiBzdHJ1Y3QgbWVtcG9saWN5ICpnZXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTtcXG4gc3RydWN0IG1lbXBvbGljeSAqX19nZXRfdm1hX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyLCBwZ29mZl90ICppbHgpO1xcbkBAIC0yMjYsNiArMjMyLDE2IEBAIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IGlkeClcXG4gXFx0cmV0dXJuIE5VTEw7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1lbXBvbGljeSAqbXBvbF9wcml2YXRlX2JpbmQoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1lbXBvbGljeSAqbXBvbF9iaW5kX25vZGUoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7XFxuK31cXG4rXFxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1lbXBvbGljeSAqZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG9yZGVyLCBwZ29mZl90ICppbHgpXFxuIHtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmhcXG5pbmRleCA0YzBkZTc4ODJiYmI2NC4uZjM5MzU3MmQ3NDAxZGEgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmhcXG5AQCAtMjYsNiArMjYsOCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2l6ZXMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9wYWdlLmhcXHUwMDNlXFxuIFxcbitzdHJ1Y3Qgbm9kZV9wcml2YXRlO1xcbitcXG4gLyogRnJlZSBtZW1vcnkgbWFuYWdlbWVudCAtIHpvbmVkIGJ1ZGR5IGFsbG9jYXRvci4gICovXFxuICNpZm5kZWYgQ09ORklHX0FSQ0hfRk9SQ0VfTUFYX09SREVSXFxuICNkZWZpbmUgTUFYX1BBR0VfT1JERVIgMTBcXG5AQCAtMTM5MSwxMyArMTM5MywyMiBAQCBlbnVtIHtcXG4gI2lmZGVmIENPTkZJR19OVU1BXFxuIFxcdC8qXFxuIFxcdCAqIFRoZSBOVU1BIHpvbmVsaXN0cyBhcmUgZG91YmxlZCBiZWNhdXNlIHdlIG5lZWQgem9uZWxpc3RzIHRoYXRcXG4tXFx0ICogcmVzdHJpY3QgdGhlIGFsbG9jYXRpb25zIHRvIGEgc2luZ2xlIG5vZGUgZm9yIF9fR0ZQX1RISVNOT0RFLlxcbitcXHQgKiByZXN0cmljdCB0aGUgYWxsb2NhdGlvbnMgdG8gYSBzaW5nbGUgbm9kZSBmb3IgX19HRlBfVEhJU05PREVcXG4rXFx0ICogYW5kIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgKGlzb2xhdGVkIGZyb20gZGVmYXVsdCBsaXN0cykuXFxuIFxcdCAqL1xcbiBcXHRaT05FTElTVF9OT0ZBTExCQUNLLFxcdC8qIHpvbmVsaXN0IHdpdGhvdXQgZmFsbGJhY2sgKF9fR0ZQX1RISVNOT0RFKSAqL1xcbitcXHRaT05FTElTVF9QUklWQVRFLFxcdC8qIE5fTUVNT1JZX1BSSVZBVEUgYWNjZXNzLCBmYWxscyBiYWNrIHRvIERSQU0gKi9cXG4rXFx0Wk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLLCAvKiBOX01FTU9SWV9QUklWQVRFIGFjY2VzcywgX19HRlBfVEhJU05PREUgKi9cXG4gI2VuZGlmXFxuIFxcdE1BWF9aT05FTElTVFNcXG4gfTtcXG4gXFxuKyNpZm5kZWYgQ09ORklHX05VTUFcXG4rLyogV2l0aG91dCBOVU1BIG9ubHkgWk9ORUxJU1RfRkFMTEJBQ0sgZXhpc3RzIHNvIGV2ZXJ5dGhpbmcgY29sbGFwc2VzIHRoZXJlICovXFxuKyNkZWZpbmUgWk9ORUxJU1RfUFJJVkFURVxcdFxcdFpPTkVMSVNUX0ZBTExCQUNLXFxuKyNkZWZpbmUgWk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLXFx0Wk9ORUxJU1RfRkFMTEJBQ0tcXG4rI2VuZGlmXFxuK1xcbiAvKlxcbiAgKiBUaGlzIHN0cnVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHpvbmUgaW4gYSB6b25lbGlzdC4gSXQgaXMgc3RvcmVkXFxuICAqIGhlcmUgdG8gYXZvaWQgZGVyZWZlcmVuY2VzIGludG8gbGFyZ2Ugc3RydWN0dXJlcyBhbmQgbG9va3VwcyBvZiB0YWJsZXNcXG5AQCAtMTU5NywxMiArMTYwOCwyNSBAQCB0eXBlZGVmIHN0cnVjdCBwZ2xpc3RfZGF0YSB7XFxuIFxcdGF0b21pY19sb25nX3RcXHRcXHR2bV9zdGF0W05SX1ZNX05PREVfU1RBVF9JVEVNU107XFxuICNpZmRlZiBDT05GSUdfTlVNQVxcbiBcXHRzdHJ1Y3QgbWVtb3J5X3RpZXIgX19yY3UgKm1lbXRpZXI7XFxuK1xcdHN0cnVjdCBub2RlX3ByaXZhdGUgX19yY3UgKm5vZGVfcHJpdmF0ZTtcXG4gI2VuZGlmXFxuICNpZmRlZiBDT05GSUdfTUVNT1JZX0ZBSUxVUkVcXG4gXFx0c3RydWN0IG1lbW9yeV9mYWlsdXJlX3N0YXRzIG1mX3N0YXRzO1xcbiAjZW5kaWZcXG4gfSBwZ19kYXRhX3Q7XFxuIFxcbisjaWZkZWYgQ09ORklHX05VTUFcXG4rc3RhdGljIGlubGluZSBib29sIHBnZGF0X2lzX3ByaXZhdGUocGdfZGF0YV90ICpwZ2RhdClcXG4re1xcbitcXHRyZXR1cm4gISFwZ2RhdC1cXHUwMDNlbm9kZV9wcml2YXRlO1xcbit9XFxuKyNlbHNlXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBwZ2RhdF9pc19wcml2YXRlKHBnX2RhdGFfdCAqcGdkYXQpXFxuK3tcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuKyNlbmRpZlxcbitcXG4gI2RlZmluZSBub2RlX3ByZXNlbnRfcGFnZXMobmlkKVxcdChOT0RFX0RBVEEobmlkKS1cXHUwMDNlbm9kZV9wcmVzZW50X3BhZ2VzKVxcbiAjZGVmaW5lIG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpXFx0KE5PREVfREFUQShuaWQpLVxcdTAwM2Vub2RlX3NwYW5uZWRfcGFnZXMpXFxuIFxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oIGIvaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaFxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjZmNTY4YmMwZDQ2Yzc5XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2luY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmhcXG5AQCAtMCwwICsxLDI2MiBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisjaWZuZGVmIF9MSU5VWF9OT0RFX1BSSVZBVEVfSFxcbisjZGVmaW5lIF9MSU5VWF9OT0RFX1BSSVZBVEVfSFxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ub2RlbWFzay5oXFx1MDAzZVxcbitcXG4rc3RydWN0IHBhZ2U7XFxuK1xcbisvKlxcbisgKiBQZXItbm9kZSBzZXJ2aWNlIG9wdC1pbnMgKG5vZGVfcHJpdmF0ZS5jYXBzKS4gIEEgcHJpdmF0ZSBub2RlIGlzIGlzb2xhdGVkXFxuKyAqIGZyb20gYWxsIGdlbmVyYWwgbW0gc2VydmljZXMgYnkgZGVmYXVsdDsgdGhlIHJlZ2lzdGVyaW5nIGRyaXZlciBzZXRzIHRoZXNlXFxuKyAqIHRvIGxldCBzcGVjaWZpYyBzZXJ2aWNlcyBvcGVyYXRlIG9uIGl0cyBub2RlLlxcbisgKi9cXG4rI2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX1JFQ0xBSU1cXHQoMVVMIFxcdTAwM2NcXHUwMDNjIDApXFx0LyogYWxsb3cgbW0gcmVjbGFpbSAqL1xcbisjZGVmaW5lIE5PREVfUFJJVkFURV9DQVBfVVNFUl9OVU1BXFx0KDFVTCBcXHUwMDNjXFx1MDAzYyAxKVxcdC8qIGFsbG93IG1lbXBvbGljeSAqL1xcbisjZGVmaW5lIE5PREVfUFJJVkFURV9DQVBfSE9UVU5QTFVHXFx0KDFVTCBcXHUwMDNjXFx1MDAzYyAyKVxcdC8qIGFsbG93IGhvdC11bnBsdWcgKi9cXG4rI2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX0RFTU9USU9OXFx0KDFVTCBcXHUwMDNjXFx1MDAzYyAzKVxcdC8qIGFsbG93IHRpZXJpbmcgZGVtb3Rpb24gKi9cXG4rI2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX05VTUFfQkFMQU5DSU5HXFx0KDFVTCBcXHUwMDNjXFx1MDAzYyA0KVxcdC8qIGFsbG93IE5VTUEgYmFsYW5jaW5nICovXFxuKyNkZWZpbmUgTk9ERV9QUklWQVRFX0NBUF9MVFBJTlxcdFxcdCgxVUwgXFx1MDAzY1xcdTAwM2MgNSlcXHQvKiBhbGxvdyBHVVAgcGlucyAqL1xcbitcXG4rLyoqXFxuKyAqIHN0cnVjdCBub2RlX3ByaXZhdGUgLSBQZXItbm9kZSBjb250YWluZXIgZm9yIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXNcXG4rICpcXG4rICogQWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIgYW5kIHBhc3NlZCB0byBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoKS5cXG4rICogVGhlIGRyaXZlciBvd25zIHRoZSBtZW1vcnkgYW5kIG11c3QgZW5zdXJlIGl0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXJcXG4rICogbm9kZV9wcml2YXRlX3VucmVnaXN0ZXIoKSByZXR1cm5zLlxcbisgKlxcbisgKiBAb3duZXI6IE9wYXF1ZSBkcml2ZXIgaWRlbnRpZmllclxcbisgKiBAY2FwczogTk9ERV9QUklWQVRFX0NBUF8qIHNlcnZpY2Ugb3B0LWlucyBmb3IgdGhlIG5vZGUgKHplcm8gYnkgZGVmYXVsdDtcXG4rICpcXHQgIGluZGl2aWR1YWwgY2FwYWJpbGl0aWVzIGFyZSBkZWZpbmVkIGFuZCBjb25zdW1lZCBieSBsYXRlciBjaGFuZ2VzKVxcbisgKi9cXG4rc3RydWN0IG5vZGVfcHJpdmF0ZSB7XFxuK1xcdHZvaWQgKm93bmVyO1xcbitcXHR1bnNpZ25lZCBsb25nIGNhcHM7XFxuK307XFxuK1xcbisjaWZkZWYgQ09ORklHX05VTUFcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tem9uZS5oXFx1MDAzZVxcbitcXG4rc3RhdGljIGlubGluZSBib29sIGZvbGlvX2lzX3ByaXZhdGVfbm9kZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbit7XFxuK1xcdHJldHVybiBub2RlX3N0YXRlKGZvbGlvX25pZChmb2xpbyksIE5fTUVNT1JZX1BSSVZBVEUpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9pc19wcml2YXRlX25vZGUoc3RydWN0IHBhZ2UgKnBhZ2UpXFxuK3tcXG4rXFx0cmV0dXJuIG5vZGVfc3RhdGUocGFnZV90b19uaWQocGFnZSksIE5fTUVNT1JZX1BSSVZBVEUpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9pc19wcml2YXRlKGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIG5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIG5vZGVfYWxsb3dzX3JlY2xhaW0gLSBtYXkgdGhlIG1tIHJlY2xhaW0gZnJvbSB0aGlzIG5vZGU/XFxuKyAqIEBuaWQ6IHRoZSBub2RlIHRvIHRlc3RcXG4rICpcXG4rICogT25seSBhIHByaXZhdGUgbm9kZSBpcyBldmVyIGV4Y2x1ZGVkLiAgRXZlcnkgb3RoZXIgbm9kZSBjYW4gc2FmZWx5XFxuKyAqIGJlIG9wZXJhdGVkIG9uIGJ5IHJlY2xhaW0uXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfcmVjbGFpbShpbnQgbmlkKVxcbit7XFxuK1xcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xcbitcXHRib29sIHJldDtcXG4rXFxuK1xcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS1cXHUwMDNlbm9kZV9wcml2YXRlKTtcXG4rXFx0cmV0ID0gbnAgXFx1MDAyNlxcdTAwMjYgKG5wLVxcdTAwM2VjYXBzIFxcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9SRUNMQUlNKTtcXG4rXFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBub2RlX2FsbG93c191c2VyX251bWEgLSBtYXkgdXNlcnNwYWNlIHBsYWNlIG9yIG1pZ3JhdGUgbWVtb3J5IGhlcmU/XFxuKyAqIEBuaWQ6IHRoZSBub2RlIHRvIHRlc3RcXG4rICpcXG4rICogR2F0ZSBhbGwgdXNlcnNwYWNlLWRpcmVjdGVkIG1lbW9yeSBvcGVyYXRpb25zIG9uIGEgcHJpdmF0ZSBub2RlLlxcbisgKiAgIC0gbWJpbmQoKS9zZXRfbWVtcG9saWN5KClcXG4rICogICAtIG1vdmVfcGFnZXMoKS9taWdyYXRlX3BhZ2VzKClcXG4rICpcXG4rICogcmV0dXJuOiB0cnVlIGZvciBOX01FTU9SWSBhbmQgTl9NRU1PUllfUFJJVkFURSB3aXRoIENBUF9VU0VSX05VTUEuXFxuKyAqICAgICAgICAgZmFsc2UgZm9yIG1lbW9yeWxlc3Mgb3Igb3B0ZWQtb3V0IHByaXZhdGUgbm9kZS5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c191c2VyX251bWEoaW50IG5pZClcXG4re1xcbitcXHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDtcXG4rXFx0Ym9vbCByZXQ7XFxuK1xcbitcXHRpZiAobm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSlcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0bnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktXFx1MDAzZW5vZGVfcHJpdmF0ZSk7XFxuK1xcdHJldCA9IG5wIFxcdTAwMjZcXHUwMDI2IChucC1cXHUwMDNlY2FwcyBcXHUwMDI2IE5PREVfUFJJVkFURV9DQVBfVVNFUl9OVU1BKTtcXG4rXFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBub2RlX2FsbG93c19ob3R1bnBsdWcgLSBtYXkgaG90LXVucGx1ZyBtaWdyYXRlIHRoaXMgbm9kZSdzIGZvbGlvcz9cXG4rICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdFxcbisgKlxcbisgKiBUcnVlIGZvciBub3JtYWwgbm9kZXMgYW5kIHByaXZhdGUgbm9kZXMgb3B0ZWQgaW50byBDQVBfSE9UVU5QTFVHLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2hvdHVucGx1ZyhpbnQgbmlkKVxcbit7XFxuK1xcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xcbitcXHRib29sIHJldDtcXG4rXFxuK1xcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS1cXHUwMDNlbm9kZV9wcml2YXRlKTtcXG4rXFx0cmV0ID0gbnAgXFx1MDAyNlxcdTAwMjYgKG5wLVxcdTAwM2VjYXBzIFxcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9IT1RVTlBMVUcpO1xcbitcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIG5vZGVfYWxsb3dzX2RlbW90aW9uIC0gbWF5IGtlcm5lbCB0aWVyaW5nIGRlbW90ZSB0byB0aGlzIG5vZGU/XFxuKyAqIEBuaWQ6IHRoZSBub2RlIHRvIHRlc3RcXG4rICpcXG4rICogR292ZXJucyB3aGV0aGVyIGEgcHJpdmF0ZSBub2RlIHBhcnRpY2lwYXRlcyBpbiB0aGUgZGVtb3Rpb24gaGllcmFyY2h5LlxcbisgKiBEZW1vdGlvbiBhY2N1bXVsYXRlcyBwYWdlcyBvbiB0aGUgbm9kZSwgc28gQ0FQX0RFTU9USU9OIHJlcXVpcmVzIENBUF9SRUNMQUlNXFxuKyAqIChlbmZvcmNlZCBhdCByZWdpc3RyYXRpb24pIGFzIGEgc2FmZXR5IHZhbHZlLlxcbisgKlxcbisgKiByZXR1cm46IHRydWUgZm9yIG5vcm1hbCBub2RlcyBhbmQgcHJpdmF0ZSBub2RlcyBvcHRlZCBpbnRvIENBUF9ERU1PVElPTi5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19kZW1vdGlvbihpbnQgbmlkKVxcbit7XFxuK1xcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xcbitcXHRib29sIHJldDtcXG4rXFxuK1xcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS1cXHUwMDNlbm9kZV9wcml2YXRlKTtcXG4rXFx0cmV0ID0gbnAgXFx1MDAyNlxcdTAwMjYgKG5wLVxcdTAwM2VjYXBzIFxcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9ERU1PVElPTik7XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogbm9kZV9hbGxvd3NfbnVtYV9iYWxhbmNpbmcgLSBtYXkgTlVNQSBiYWxhbmNpbmcgc2Nhbi9taWdyYXRlIHRoaXMgbm9kZT9cXG4rICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdFxcbisgKlxcbisgKiBBY2Nlc3MtYmFzZWQgcHJvbW90aW9uL21pZ3JhdGlvbi4gIFVubGlrZSBkZW1vdGlvbiB0aGlzIGlzIG5vdCByZWNsYWltLWRyaXZlbixcXG4rICogc28gQ0FQX05VTUFfQkFMQU5DSU5HIHN0YW5kcyBhbG9uZSAobm8gQ0FQX1JFQ0xBSU0gZGVwZW5kZW5jeSkuXFxuKyAqXFxuKyAqIHJldHVybjogdHJ1ZSBmb3Igbm9ybWFsIG5vZGVzIGFuZCBwcml2YXRlIG5vZGVzIG9wdGVkIGludG8gQ0FQX05VTUFfQkFMQU5DSU5HLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX251bWFfYmFsYW5jaW5nKGludCBuaWQpXFxuK3tcXG4rXFx0c3RydWN0IG5vZGVfcHJpdmF0ZSAqbnA7XFxuK1xcdGJvb2wgcmV0O1xcbitcXG4rXFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXHRyY3VfcmVhZF9sb2NrKCk7XFxuK1xcdG5wID0gcmN1X2RlcmVmZXJlbmNlKE5PREVfREFUQShuaWQpLVxcdTAwM2Vub2RlX3ByaXZhdGUpO1xcbitcXHRyZXQgPSBucCBcXHUwMDI2XFx1MDAyNiAobnAtXFx1MDAzZWNhcHMgXFx1MDAyNiBOT0RFX1BSSVZBVEVfQ0FQX05VTUFfQkFMQU5DSU5HKTtcXG4rXFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBub2RlX2FsbG93c19sdHBpbiAtIG1heSBhIGZvbGlvIG9uIHRoaXMgbm9kZSBiZSBsb25nLXRlcm0gR1VQLXBpbm5lZD9cXG4rICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdFxcbisgKlxcbisgKiBPcHRlZC1vdXQgcHJpdmF0ZSBub2RlcyBjYXVzZSBsb25ndGVybSBwaW5zIHRvIG91dHJpZ2h0IGZhaWwgcmVnYXJkbGVzc1xcbisgKiBvZiBaT05FIHBsYWNlbWVudCAoTk9STUFMIHdvdWxkIGFsbG93LCBNT1ZBQkxFIHdvdWxkIG1pZ3JhdGUgZmlyc3QpLlxcbisgKlxcbisgKiBPcHRlZC1pbiBwcml2YXRlIG5vZGVzIGFsbG93IGxvbmd0ZXJtIHBpbnMgdG8gb3BlcmF0ZSBub3JtYWxseS5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19sdHBpbihpbnQgbmlkKVxcbit7XFxuK1xcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xcbitcXHRib29sIHJldDtcXG4rXFxuK1xcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS1cXHUwMDNlbm9kZV9wcml2YXRlKTtcXG4rXFx0cmV0ID0gbnAgXFx1MDAyNlxcdTAwMjYgKG5wLVxcdTAwM2VjYXBzIFxcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9MVFBJTik7XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisjZWxzZSAvKiAhQ09ORklHX05VTUEgKi9cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19pc19wcml2YXRlX25vZGUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4re1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2lzX3ByaXZhdGVfbm9kZShzdHJ1Y3QgcGFnZSAqcGFnZSlcXG4re1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2lzX3ByaXZhdGUoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19yZWNsYWltKGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c191c2VyX251bWEoaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2hvdHVucGx1ZyhpbnQgbmlkKVxcbit7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfZGVtb3Rpb24oaW50IG5pZClcXG4re1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX251bWFfYmFsYW5jaW5nKGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19sdHBpbihpbnQgbmlkKVxcbit7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG4rXFxuKyNpZiBkZWZpbmVkKENPTkZJR19OVU1BKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRylcXG4rXFxuK2ludCBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoaW50IG5pZCwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApO1xcbitpbnQgbm9kZV9wcml2YXRlX3VucmVnaXN0ZXIoaW50IG5pZCk7XFxuK1xcbisjZWxzZSAvKiAhQ09ORklHX05VTUEgfHwgIUNPTkZJR19NRU1PUllfSE9UUExVRyAqL1xcbitcXG4rc3RhdGljIGlubGluZSBpbnQgbm9kZV9wcml2YXRlX3JlZ2lzdGVyKGludCBuaWQsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKVxcbit7XFxuK1xcdHJldHVybiAtRU5PREVWO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBub2RlX3ByaXZhdGVfdW5yZWdpc3RlcihpbnQgbmlkKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisjZW5kaWYgLyogQ09ORklHX05VTUEgXFx1MDAyNlxcdTAwMjYgQ09ORklHX01FTU9SWV9IT1RQTFVHICovXFxuK1xcbisjZW5kaWYgLyogX0xJTlVYX05PREVfUFJJVkFURV9IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbm9kZW1hc2suaCBiL2luY2x1ZGUvbGludXgvbm9kZW1hc2suaFxcbmluZGV4IGI4NDJhYTUyNTU0NjQ0Li5iYTNlNmM1NzBhMTEyZCAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmhcXG5AQCAtMzkxLDYgKzM5MSw3IEBAIGVudW0gbm9kZV9zdGF0ZXMge1xcbiBcXHROX0hJR0hfTUVNT1JZID0gTl9OT1JNQUxfTUVNT1JZLFxcbiAjZW5kaWZcXG4gXFx0Tl9NRU1PUlksXFx0XFx0LyogVGhlIG5vZGUgaGFzIG1lbW9yeShyZWd1bGFyLCBoaWdoLCBtb3ZhYmxlKSAqL1xcbitcXHROX01FTU9SWV9QUklWQVRFLFxcdC8qIFRoZSBub2RlJ3MgbWVtb3J5IGlzIHByaXZhdGUgKi9cXG4gXFx0Tl9DUFUsXFx0XFx0LyogVGhlIG5vZGUgaGFzIG9uZSBvciBtb3JlIGNwdXMgKi9cXG4gXFx0Tl9HRU5FUklDX0lOSVRJQVRPUixcXHQvKiBUaGUgbm9kZSBoYXMgb25lIG9yIG1vcmUgR2VuZXJpYyBJbml0aWF0b3JzICovXFxuIFxcdE5SX05PREVfU1RBVEVTXFxuQEAgLTQ1Nyw3ICs0NTgsNyBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgbm9kZV9zZXRfb2ZmbGluZShpbnQgbmlkKVxcbiBcXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgbm9kZV9zdGF0ZShpbnQgbm9kZSwgZW51bSBub2RlX3N0YXRlcyBzdGF0ZSlcXG4ge1xcbi1cXHRyZXR1cm4gbm9kZSA9PSAwO1xcbitcXHRyZXR1cm4gbm9kZSA9PSAwIFxcdTAwMjZcXHUwMDI2IHN0YXRlICE9IE5fTUVNT1JZX1BSSVZBVEU7XFxuIH1cXG4gXFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBub2RlX3NldF9zdGF0ZShpbnQgbm9kZSwgZW51bSBub2RlX3N0YXRlcyBzdGF0ZSlcXG5AQCAtNDcwLDExICs0NzEsMTEgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIG5vZGVfY2xlYXJfc3RhdGUoaW50IG5vZGUsIGVudW0gbm9kZV9zdGF0ZXMgc3RhdGUpXFxuIFxcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBudW1fbm9kZV9zdGF0ZShlbnVtIG5vZGVfc3RhdGVzIHN0YXRlKVxcbiB7XFxuLVxcdHJldHVybiAxO1xcbitcXHRyZXR1cm4gc3RhdGUgPT0gTl9NRU1PUllfUFJJVkFURSA/IDAgOiAxO1xcbiB9XFxuIFxcbiAjZGVmaW5lIGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgX19zdGF0ZSkgXFxcXFxcbi1cXHRmb3IgKCAobm9kZSkgPSAwOyAobm9kZSkgPT0gMDsgKG5vZGUpID0gMSlcXG4rXFx0Zm9yICgobm9kZSkgPSAwOyAobm9kZSkgPT0gMCBcXHUwMDI2XFx1MDAyNiAoX19zdGF0ZSkgIT0gTl9NRU1PUllfUFJJVkFURTsgKG5vZGUpID0gMSlcXG4gXFxuICNkZWZpbmUgZmlyc3Rfb25saW5lX25vZGVcXHQwXFxuICNkZWZpbmUgZmlyc3RfbWVtb3J5X25vZGVcXHQwXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaCBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaFxcbmluZGV4IDQxOTAxMTA5N2ZhOGUyLi5hOGZmMTUwZTJjYmI3NyAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcXG5AQCAtMTY1NCwxMSArMTY1NCwxNCBAQCBzdHJ1Y3Qga3ZtX21lbW9yeV9hdHRyaWJ1dGVzIHtcXG4gI2RlZmluZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEXFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcXG4gI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX01NQVBcXHRcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKVxcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRURcXHQoMVVMTCBcXHUwMDNjXFx1MDAzYyAxKVxcbisjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFXFx0KDFVTEwgXFx1MDAzY1xcdTAwM2MgMilcXG4gXFxuIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIHtcXG4gXFx0X191NjQgc2l6ZTtcXG4gXFx0X191NjQgZmxhZ3M7XFxuLVxcdF9fdTY0IHJlc2VydmVkWzZdO1xcbitcXHRfX3UzMiBub2RlO1xcbitcXHRfX3UzMiBwYWQ7XFxuK1xcdF9fdTY0IHJlc2VydmVkWzVdO1xcbiB9O1xcbiBcXG4gI2RlZmluZSBLVk1fUFJFX0ZBVUxUX01FTU9SWVxcdF9JT1dSKEtWTUlPLCAweGQ1LCBzdHJ1Y3Qga3ZtX3ByZV9mYXVsdF9tZW1vcnkpXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tZW1wb2xpY3kuaFxcbmluZGV4IDdmNmZjOTU5OTY5M2I2Li44N2FmMThjODRiOTQ3NSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbWVtcG9saWN5LmhcXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbWVtcG9saWN5LmhcXG5AQCAtNjcsNiArNjcsNyBAQCBlbnVtIG1lbXBvbGljeV9tb2RlIHtcXG4gI2RlZmluZSBNUE9MX0ZfU0hBUkVEICAoMSBcXHUwMDNjXFx1MDAzYyAwKVxcdC8qIGlkZW50aWZ5IHNoYXJlZCBwb2xpY2llcyAqL1xcbiAjZGVmaW5lIE1QT0xfRl9NT0ZcXHQoMSBcXHUwMDNjXFx1MDAzYyAzKSAvKiB0aGlzIHBvbGljeSB3YW50cyBtaWdyYXRlIG9uIGZhdWx0ICovXFxuICNkZWZpbmUgTVBPTF9GX01PUk9OXFx0KDEgXFx1MDAzY1xcdTAwM2MgNCkgLyogTWlncmF0ZSBPbiBwcm90bm9uZSBSZWZlcmVuY2UgT24gTm9kZSAqL1xcbisjZGVmaW5lIE1QT0xfRl9QUklWQVRFXFx0KDEgXFx1MDAzY1xcdTAwM2MgNSkgLyogbm9kZW1hc2sgY29udGFpbnMgcHJpdmF0ZSBub2RlcyAqL1xcbiBcXG4gLypcXG4gICogRW5hYmxpbmcgem9uZSByZWNsYWltIG1lYW5zIHRoZSBwYWdlIGFsbG9jYXRvciB3aWxsIGF0dGVtcHQgdG8gZnVsZmlsbFxcbmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwL2NwdXNldC5jIGIva2VybmVsL2Nncm91cC9jcHVzZXQuY1xcbmluZGV4IGVlNDAyNWI5NzA3YTIyLi43OGE0Zjk0ODU2NTYwZCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvY2dyb3VwL2NwdXNldC5jXFxuKysrIGIva2VybmVsL2Nncm91cC9jcHVzZXQuY1xcbkBAIC0yNiw2ICsyNiw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1wb2xpY3kuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1vcnkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25vZGVfcHJpdmF0ZS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcmN1cGRhdGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NjaGVkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9kZWFkbGluZS5oXFx1MDAzZVxcbkBAIC0zODcyLDcgKzM4NzMsOCBAQCBzdGF0aWMgdm9pZCBjcHVzZXRfaGFuZGxlX2hvdHBsdWcodm9pZClcXG4gXFx0c3RhdGljIERFQ0xBUkVfV09SSyhoa19zZF93b3JrLCBoa19zZF93b3JrZm4pO1xcbiBcXHRzdGF0aWMgY3B1bWFza190IG5ld19jcHVzO1xcbiBcXHRzdGF0aWMgbm9kZW1hc2tfdCBuZXdfbWVtcztcXG4tXFx0Ym9vbCBjcHVzX3VwZGF0ZWQsIG1lbXNfdXBkYXRlZDtcXG4rXFx0c3RhdGljIG5vZGVtYXNrX3QgcHJldl9wcml2X21lbXM7XFxuK1xcdGJvb2wgY3B1c191cGRhdGVkLCBtZW1zX3VwZGF0ZWQsIHByaXZfc2hyYW5rO1xcbiBcXHRib29sIG9uX2RmbCA9IGlzX2luX3YyX21vZGUoKTtcXG4gXFx0c3RydWN0IHRtcG1hc2tzIHRtcCwgKnB0bXAgPSBOVUxMO1xcbiBcXG5AQCAtMzg5NSw2ICszODk3LDE0IEBAIHN0YXRpYyB2b2lkIGNwdXNldF9oYW5kbGVfaG90cGx1Zyh2b2lkKVxcbiBcXHRcXHQgICAgICAgIWNwdW1hc2tfZW1wdHkoc3VicGFydGl0aW9uc19jcHVzKTtcXG4gXFx0bWVtc191cGRhdGVkID0gIW5vZGVzX2VxdWFsKHRvcF9jcHVzZXQuZWZmZWN0aXZlX21lbXMsIG5ld19tZW1zKTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFByaXZhdGUgbm9kZXMgYXJlIG5vdCBwYXJ0aXRpb25lZCBieSBjcHVzZXQsIGJ1dCBpZiBvbmUgbGVhdmVzXFxuK1xcdCAqIE5fTUVNT1JZX1BSSVZBVEUgd2Ugc3RpbGwgbmVlZCB0byBydW4gbXBvbF9yZWJpbmRfKiB0byBjbGVhbiB1cFxcbitcXHQgKiBtZW1wb2xpY2llcyB0aGF0IGFyZSBiaW5kaW5nIHRoZW0uXFxuK1xcdCAqL1xcbitcXHRwcml2X3NocmFuayA9ICFub2Rlc19zdWJzZXQocHJldl9wcml2X21lbXMsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcXG4rXFx0cHJldl9wcml2X21lbXMgPSBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXTtcXG4rXFxuIFxcdC8qIEZvciB2MSwgc3luY2hyb25pemUgY3B1c19hbGxvd2VkIHRvIGNwdV9hY3RpdmVfbWFzayAqL1xcbiBcXHRpZiAoY3B1c191cGRhdGVkKSB7XFxuIFxcdFxcdGNwdXNldF9mb3JjZV9yZWJ1aWxkKCk7XFxuQEAgLTM5MjcsOSArMzkzNywxMiBAQCBzdGF0aWMgdm9pZCBjcHVzZXRfaGFuZGxlX2hvdHBsdWcodm9pZClcXG4gXFx0XFx0XFx0dG9wX2NwdXNldC5tZW1zX2FsbG93ZWQgPSBuZXdfbWVtcztcXG4gXFx0XFx0dG9wX2NwdXNldC5lZmZlY3RpdmVfbWVtcyA9IG5ld19tZW1zO1xcbiBcXHRcXHRzcGluX3VubG9ja19pcnEoXFx1MDAyNmNhbGxiYWNrX2xvY2spO1xcbi1cXHRcXHRjcHVzZXRfdXBkYXRlX3Rhc2tzX25vZGVtYXNrKFxcdTAwMjZ0b3BfY3B1c2V0KTtcXG4gXFx0fVxcbiBcXG4rXFx0LyogUmViaW5kIHRhc2sgbWVtcG9saWNpZXMgaWYgYW55IG1lbW9yeSBub2RlIGNoYW5nZWQgc3RhdGUgKi9cXG4rXFx0aWYgKG1lbXNfdXBkYXRlZCB8fCBwcml2X3NocmFuaylcXG4rXFx0XFx0Y3B1c2V0X3VwZGF0ZV90YXNrc19ub2RlbWFzayhcXHUwMDI2dG9wX2NwdXNldCk7XFxuK1xcbiBcXHRtdXRleF91bmxvY2soXFx1MDAyNmNwdXNldF9tdXRleCk7XFxuIFxcbiBcXHQvKiBpZiBjcHVzIG9yIG1lbXMgY2hhbmdlZCwgd2UgbmVlZCB0byBwcm9wYWdhdGUgdG8gZGVzY2VuZGFudHMgKi9cXG5AQCAtNDE2MCwxMSArNDE3MywxMyBAQCBub2RlbWFza190IGNwdXNldF9tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXFxuICAqIGNwdXNldF9ub2RlbWFza192YWxpZF9tZW1zX2FsbG93ZWQgLSBjaGVjayBub2RlbWFzayB2cy4gY3VycmVudCBtZW1zX2FsbG93ZWRcXG4gICogQG5vZGVtYXNrOiB0aGUgbm9kZW1hc2sgdG8gYmUgY2hlY2tlZFxcbiAgKlxcbi0gKiBBcmUgYW55IG9mIHRoZSBub2RlcyBpbiB0aGUgbm9kZW1hc2sgYWxsb3dlZCBpbiBjdXJyZW50LVxcdTAwM2VtZW1zX2FsbG93ZWQ/XFxuKyAqIEFyZSBhbnkgb2YgdGhlIG5vZGVzIGluIHRoZSBub2RlbWFzayB1c2FibGU/ICBOX01FTU9SWSBub2RlcyBtdXN0IGJlIGluXFxuKyAqIGN1cnJlbnQtXFx1MDAzZW1lbXNfYWxsb3dlZCwgd2hpbGUgTl9NRU1PUllfUFJJVkFURSBub2RlcyBhcmUgYWx3YXlzIHZhbGlkLlxcbiAgKi9cXG4gaW50IGNwdXNldF9ub2RlbWFza192YWxpZF9tZW1zX2FsbG93ZWQoY29uc3Qgbm9kZW1hc2tfdCAqbm9kZW1hc2spXFxuIHtcXG4tXFx0cmV0dXJuIG5vZGVzX2ludGVyc2VjdHMoKm5vZGVtYXNrLCBjdXJyZW50LVxcdTAwM2VtZW1zX2FsbG93ZWQpO1xcbitcXHRyZXR1cm4gbm9kZXNfaW50ZXJzZWN0cygqbm9kZW1hc2ssIGN1cnJlbnQtXFx1MDAzZW1lbXNfYWxsb3dlZCkgfHxcXG4rXFx0ICAgICAgIG5vZGVzX2ludGVyc2VjdHMoKm5vZGVtYXNrLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XFxuIH1cXG4gXFxuIC8qXFxuQEAgLTQyMjgsNiArNDI0Myw5IEBAIGJvb2wgY3B1c2V0X2N1cnJlbnRfbm9kZV9hbGxvd2VkKGludCBub2RlLCBnZnBfdCBnZnBfbWFzaylcXG4gXFxuIFxcdGlmIChpbl9pbnRlcnJ1cHQoKSlcXG4gXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdC8qIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgYXJlIG5vdCBwYXJ0aXRpb25lZCBieSBjcHVzZXRzLm1lbXMgKi9cXG4rXFx0aWYgKG5vZGVfaXNfcHJpdmF0ZShub2RlKSlcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuIFxcdGlmIChub2RlX2lzc2V0KG5vZGUsIGN1cnJlbnQtXFx1MDAzZW1lbXNfYWxsb3dlZCkpXFxuIFxcdFxcdHJldHVybiB0cnVlO1xcbiBcXHQvKlxcbmRpZmYgLS1naXQgYS9tbS9jb21wYWN0aW9uLmMgYi9tbS9jb21wYWN0aW9uLmNcXG5pbmRleCA5ZjgxMDU1YTM1OGVkMS4uYjljMjVjNTk5NzMyZmQgMTAwNjQ0XFxuLS0tIGEvbW0vY29tcGFjdGlvbi5jXFxuKysrIGIvbW0vY29tcGFjdGlvbi5jXFxuQEAgLTI1LDYgKzI1LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BzaS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY3B1c2V0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcXCJwYWdlX2FsbG9jLmhcXFwiXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ub2RlX3ByaXZhdGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFxcImludGVybmFsLmhcXFwiXFxuIFxcbiAjaWZkZWYgQ09ORklHX0NPTVBBQ1RJT05cXG5AQCAtMjQ2Miw2ICsyNDYzLDkgQEAgYm9vbCBjb21wYWN0aW9uX3pvbmVsaXN0X3N1aXRhYmxlKHN0cnVjdCBhbGxvY19jb250ZXh0ICphYywgaW50IG9yZGVyLFxcbiBcXHRcXHQgICAgIV9fY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lLCBnZnBfbWFzaykpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4rXFx0XFx0aWYgKCFub2RlX2FsbG93c19yZWNsYWltKHpvbmVfdG9fbmlkKHpvbmUpKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcbiBcXHRcXHQvKlxcbiBcXHRcXHQgKiBEbyBub3QgY29uc2lkZXIgYWxsIHRoZSByZWNsYWltYWJsZSBtZW1vcnkgYmVjYXVzZSB3ZSBkbyBub3RcXG4gXFx0XFx0ICogd2FudCB0byB0cmFzaCBqdXN0IGZvciBhIHNpbmdsZSBoaWdoIG9yZGVyIGFsbG9jYXRpb24gd2hpY2hcXG5AQCAtMjg1Myw2ICsyODU3LDkgQEAgZW51bSBjb21wYWN0X3Jlc3VsdCB0cnlfdG9fY29tcGFjdF9wYWdlcyhnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyLFxcbiBcXHRcXHRcXHQhX19jcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIGdmcF9tYXNrKSlcXG4gXFx0XFx0XFx0XFx0Y29udGludWU7XFxuIFxcbitcXHRcXHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0oem9uZV90b19uaWQoem9uZSkpKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFxuIFxcdFxcdGlmIChwcmlvIFxcdTAwM2UgTUlOX0NPTVBBQ1RfUFJJT1JJVFlcXG4gXFx0XFx0XFx0XFx0XFx0XFx1MDAyNlxcdTAwMjYgY29tcGFjdGlvbl9kZWZlcnJlZCh6b25lLCBvcmRlcikpIHtcXG4gXFx0XFx0XFx0cmMgPSBtYXhfdChlbnVtIGNvbXBhY3RfcmVzdWx0LCBDT01QQUNUX0RFRkVSUkVELCByYyk7XFxuQEAgLTI5MjIsNiArMjkyOSw5IEBAIHN0YXRpYyBpbnQgY29tcGFjdF9ub2RlKHBnX2RhdGFfdCAqcGdkYXQsIGJvb2wgcHJvYWN0aXZlKVxcbiBcXHRcXHQucHJvYWN0aXZlX2NvbXBhY3Rpb24gPSBwcm9hY3RpdmUsXFxuIFxcdH07XFxuIFxcbitcXHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0ocGdkYXQtXFx1MDAzZW5vZGVfaWQpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuIFxcdGZvciAoem9uZWlkID0gMDsgem9uZWlkIFxcdTAwM2MgTUFYX05SX1pPTkVTOyB6b25laWQrKykge1xcbiBcXHRcXHR6b25lID0gXFx1MDAyNnBnZGF0LVxcdTAwM2Vub2RlX3pvbmVzW3pvbmVpZF07XFxuIFxcdFxcdGlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpXFxuQEAgLTMwMTcsNiArMzAyNyw5IEBAIHN0YXRpYyBzc2l6ZV90IGNvbXBhY3Rfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LFxcbiB7XFxuIFxcdGludCBuaWQgPSBkZXYtXFx1MDAzZWlkO1xcbiBcXG4rXFx0aWYgKCFub2RlX2FsbG93c19yZWNsYWltKG5pZCkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4gXFx0aWYgKG5pZCBcXHUwMDNlPSAwIFxcdTAwMjZcXHUwMDI2IG5pZCBcXHUwMDNjIG5yX25vZGVfaWRzIFxcdTAwMjZcXHUwMDI2IG5vZGVfb25saW5lKG5pZCkpIHtcXG4gXFx0XFx0LyogRmx1c2ggcGVuZGluZyB1cGRhdGVzIHRvIHRoZSBMUlUgbGlzdHMgKi9cXG4gXFx0XFx0bHJ1X2FkZF9kcmFpbl9hbGwoKTtcXG5kaWZmIC0tZ2l0IGEvbW0vZGFtb24vcGFkZHIuYyBiL21tL2RhbW9uL3BhZGRyLmNcXG5pbmRleCBlNGY5OGQ2NzQ2MWY1MC4uYjY2OGNmNTVkMWI2NzMgMTAwNjQ0XFxuLS0tIGEvbW0vZGFtb24vcGFkZHIuY1xcbisrKyBiL21tL2RhbW9uL3BhZGRyLmNcXG5AQCAtMTIsNiArMTIsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc3dhcC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbV9pbmxpbmUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25vZGVfcHJpdmF0ZS5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcIi4uL2ludGVybmFsLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJvcHMtY29tbW9uLmhcXFwiXFxuQEAgLTI1MCw2ICsyNTEsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZGFtb25fcGFfcGFnZW91dChzdHJ1Y3QgZGFtb25fcmVnaW9uICpyLFxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0fVxcbiBcXG4rXFx0XFx0LyogREFNT1MgcGFnZW91dCBpcyByZWNsYWltOyBnYXRlIGEgcHJpdmF0ZSBub2RlIG9uIENBUF9SRUNMQUlNICovXFxuK1xcdFxcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbShmb2xpb19uaWQoZm9saW8pKSlcXG4rXFx0XFx0XFx0Z290byBwdXRfZm9saW87XFxuK1xcbiBcXHRcXHRpZiAoZGFtb3NfcGFfZmlsdGVyX291dChzLCBmb2xpbykpXFxuIFxcdFxcdFxcdGdvdG8gcHV0X2ZvbGlvO1xcbiBcXHRcXHRlbHNlXFxuQEAgLTM0NCw2ICszNDksMTAgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZGFtb25fcGFfbWlncmF0ZShzdHJ1Y3QgZGFtb25fcmVnaW9uICpyLFxcbiBcXHRcXHRlbHNlXFxuIFxcdFxcdFxcdCpzel9maWx0ZXJfcGFzc2VkICs9IGZvbGlvX3NpemUoZm9saW8pIC8gYWRkcl91bml0O1xcbiBcXG4rXFx0XFx0LyogcHJpdmF0ZSBub2RlcyBkbyBub3Qgc3VwcG9ydCBtaWdyYXRpb24gYnkgZGVmYXVsdCAqL1xcbitcXHRcXHRpZiAoZm9saW9faXNfcHJpdmF0ZV9ub2RlKGZvbGlvKSlcXG4rXFx0XFx0XFx0Z290byBwdXRfZm9saW87XFxuK1xcbiBcXHRcXHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSlcXG4gXFx0XFx0XFx0Z290byBwdXRfZm9saW87XFxuIFxcdFxcdGxpc3RfYWRkKFxcdTAwMjZmb2xpby1cXHUwMDNlbHJ1LCBcXHUwMDI2Zm9saW9fbGlzdCk7XFxuZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmNcXG5pbmRleCA5OTkwMmMxNTcwM2IwMS4uODIxODM5YjcxM2JiNDUgMTAwNjQ0XFxuLS0tIGEvbW0vZ3VwLmNcXG4rKysgYi9tbS9ndXAuY1xcbkBAIC01NDcsMTAgKzU0NywxMSBAQCBzdGF0aWMgc3RydWN0IGZvbGlvICp0cnlfZ3JhYl9mb2xpb19mYXN0KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcmVmcyxcXG4gXFx0LypcXG4gXFx0ICogQ2FuJ3QgZG8gRk9MTF9MT05HVEVSTSArIEZPTExfUElOIGd1cCBmYXN0IHBhdGggaWYgbm90IGluIGFcXG4gXFx0ICogcmlnaHQgem9uZSwgc28gZmFpbCBhbmQgbGV0IHRoZSBjYWxsZXIgZmFsbCBiYWNrIHRvIHRoZSBzbG93XFxuLVxcdCAqIHBhdGguXFxuK1xcdCAqIHBhdGguICBGYWlsIGZvciBub24tb3B0ZWQtaW4gcHJpdmF0ZSBub2RlIGZvbGlvcyBoZXJlIHNvIHRoZVxcbitcXHQgKiBzbG93IHBhdGggY2FuIHJlamVjdCB0aGUgcGluIGVudGlyZWx5LlxcbiBcXHQgKi9cXG4gXFx0aWYgKHVubGlrZWx5KChmbGFncyBcXHUwMDI2IEZPTExfTE9OR1RFUk0pIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICAgIWZvbGlvX2lzX2xvbmd0ZXJtX3Bpbm5hYmxlKGZvbGlvKSkpIHtcXG4rXFx0XFx0ICAgICAhZm9saW9fYWxsb3dzX2xvbmd0ZXJtX3Bpbihmb2xpbykpKSB7XFxuIFxcdFxcdGZvbGlvX3B1dF9yZWZzKGZvbGlvLCByZWZzKTtcXG4gXFx0XFx0cmV0dXJuIE5VTEw7XFxuIFxcdH1cXG5AQCAtMjM4MiwxMiArMjM4MywzNSBAQCBtaWdyYXRlX2xvbmd0ZXJtX3VucGlubmFibGVfZm9saW9zKHN0cnVjdCBsaXN0X2hlYWQgKm1vdmFibGVfZm9saW9fbGlzdCxcXG4gXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4rLypcXG4rICogVHJ1ZSBpZiBhbnkgZm9saW8gc2l0cyBvbiBhIHByaXZhdGUgbm9kZSB3aG9zZSBmb2xpb3MgbWF5IG5vdCBiZSBsb25ndGVybVxcbisgKiBwaW5uZWQuICBTdWNoIGZvbGlvcyBjYW4gbmVpdGhlciBiZSBwaW5uZWQgbm9yIG1pZ3JhdGVkLCBzbyB0aGUgd2hvbGUgcGluXFxuKyAqIG11c3QgZmFpbCBiZWZvcmUgbWlncmF0aW9uLiAgQ2hlY2tlZCBiZWZvcmUgYW55IGlzb2xhdGlvbiBvY2N1cnMuXFxuKyAqL1xcbitzdGF0aWMgYm9vbCBwb2ZzX2hhc19sdHBpbl9mb3JiaWRkZW4oc3RydWN0IHBhZ2VzX29yX2ZvbGlvcyAqcG9mcylcXG4re1xcbitcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbitcXHRsb25nIGkgPSAwO1xcbitcXG4rXFx0Zm9yIChmb2xpbyA9IHBvZnNfZ2V0X2ZvbGlvKHBvZnMsIGkpOyBmb2xpbztcXG4rXFx0ICAgICBmb2xpbyA9IHBvZnNfbmV4dF9mb2xpbyhmb2xpbywgcG9mcywgXFx1MDAyNmkpKSB7XFxuK1xcdFxcdGlmIChmb2xpb19sb25ndGVybV9waW5fZm9yYmlkZGVuKGZvbGlvKSlcXG4rXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbiBzdGF0aWMgbG9uZ1xcbiBjaGVja19hbmRfbWlncmF0ZV9tb3ZhYmxlX3BhZ2VzX29yX2ZvbGlvcyhzdHJ1Y3QgcGFnZXNfb3JfZm9saW9zICpwb2ZzKVxcbiB7XFxuIFxcdExJU1RfSEVBRChtb3ZhYmxlX2ZvbGlvX2xpc3QpO1xcbiBcXHR1bnNpZ25lZCBsb25nIGNvbGxlY3RlZDtcXG4gXFxuK1xcdGlmIChwb2ZzX2hhc19sdHBpbl9mb3JiaWRkZW4ocG9mcykpIHtcXG4rXFx0XFx0cG9mc191bnBpbihwb2ZzKTtcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcdH1cXG4rXFxuIFxcdGNvbGxlY3RlZCA9IGNvbGxlY3RfbG9uZ3Rlcm1fdW5waW5uYWJsZV9mb2xpb3MoXFx1MDAyNm1vdmFibGVfZm9saW9fbGlzdCxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIHBvZnMpO1xcbiBcXHRpZiAoIWNvbGxlY3RlZClcXG5kaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5pbmRleCAwNGU4YTZiNTUzNDM1Zi4uM2FkNzM1MGZjNDI3ZTUgMTAwNjQ0XFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xcbisrKyBiL21tL2h1Z2VfbWVtb3J5LmNcXG5AQCAtMzcsNiArMzcsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcGFnZV9vd25lci5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQvc3lzY3RsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25vZGVfcHJpdmF0ZS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGF0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wZ2FsbG9jLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wZ2FsbG9jX3RhZy5oXFx1MDAzZVxcbkBAIC0yMzM4LDYgKzIzMzksMTAgQEAgYm9vbCBtYWR2aXNlX2ZyZWVfaHVnZV9wbWQoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdH1cXG4gXFxuIFxcdGZvbGlvID0gcG1kX2ZvbGlvKG9yaWdfcG1kKTtcXG4rXFxuK1xcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbShmb2xpb19uaWQoZm9saW8pKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbiBcXHQvKlxcbiBcXHQgKiBJZiBvdGhlciBwcm9jZXNzZXMgYXJlIG1hcHBpbmcgdGhpcyBmb2xpbywgd2UgY291bGRuJ3QgZGlzY2FyZFxcbiBcXHQgKiB0aGUgZm9saW8gdW5sZXNzIHRoZXkgYWxsIGRvIE1BRFZfRlJFRSBzbyBsZXQncyBza2lwIHRoZSBmb2xpby5cXG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcXG5pbmRleCA1MWVlNGMxMzEwOTA4ZC4uMTdhN2FlZjhhNzg5ZGYgMTAwNjQ0XFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxcbisrKyBiL21tL2ludGVybmFsLmhcXG5AQCAtMTIsNiArMTIsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbW0uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tX2lubGluZS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbW11X25vdGlmaWVyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ub2RlX3ByaXZhdGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2V3YWxrLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9ybWFwLmhcXHUwMDNlXFxuQEAgLTk4LDYgKzk5LDk1IEBAIGV4dGVybiBpbnQgc3lzY3RsX21pbl91bm1hcHBlZF9yYXRpbztcXG4gZXh0ZXJuIGludCBzeXNjdGxfbWluX3NsYWJfcmF0aW87XFxuICNlbmRpZlxcbiBcXG4rLyogZm9saW9faXNfcHJpdmF0ZV9tYW5hZ2VkKCkgLSBmb2xpbyBoYXMgc3BlY2lhbCBtbSBtYW5hZ2VtZW50IHJ1bGVzICovXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19pc19wcml2YXRlX21hbmFnZWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG4re1xcbitcXHRyZXR1cm4gZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8IGZvbGlvX2lzX3ByaXZhdGVfbm9kZShmb2xpbyk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2lzX3ByaXZhdGVfbWFuYWdlZChzdHJ1Y3QgcGFnZSAqcGFnZSlcXG4re1xcbitcXHRyZXR1cm4gZm9saW9faXNfcHJpdmF0ZV9tYW5hZ2VkKHBhZ2VfZm9saW8ocGFnZSkpO1xcbit9XFxuK1xcbisvKlxcbisgKiBmb2xpb19hbGxvd3NfbWFkdmlzZSgpIC0gbWF5IG1hZHZpc2UgcmVjbGFpbSBoaW50cyBhY3Qgb24gdGhpcyBmb2xpbz9cXG4rICpcXG4rICogbWFkdmlzZSByZWNsYWltIGhpbnRzIChDT0xEL1BBR0VPVVQvRlJFRSkgYXJlIHVzZXJsYW5kLWRyaXZlbiByZWNsYWltLCBzb1xcbisgKiB0aGV5IGZvbGxvdyByZWNsYWltIG9wdC1pbjogZmFsc2UgZm9yIFpPTkVfREVWSUNFIGFuZCBmb3IgTl9NRU1PUllfUFJJVkFURVxcbisgKiBub2RlcyB3aXRob3V0IENBUF9SRUNMQUlNLCB0cnVlIGZvciBhbGwgb3RoZXIgbm9ybWFsIGZvbGlvcy5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19hbGxvd3NfbWFkdmlzZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbit7XFxuK1xcdHJldHVybiAhZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICBub2RlX2FsbG93c19yZWNsYWltKGZvbGlvX25pZChmb2xpbykpO1xcbit9XFxuK1xcbisvKlxcbisgKiBmb2xpb19hbGxvd3NfbnVtYV9iYWxhbmNlKCkgLSBtYXkgTlVNQSBiYWxhbmNpbmcgc2Nhbi9taWdyYXRlIHRoaXMgZm9saW8/XFxuKyAqXFxuKyAqIE5VTUEgYmFsYW5jaW5nIGlzIGFjY2Vzcy1hd2FyZSB0aWVyaW5nIG1pZ3JhdGlvbiwgc28gaXQgZm9sbG93cyB0aGUgdGllcmluZ1xcbisgKiBvcHQtaW46IGZhbHNlIGZvciBaT05FX0RFVklDRSBhbmQgZm9yIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgd2l0aG91dFxcbisgKiBDQVBfTlVNQV9CQUxBTkNJTkcsIHRydWUgZm9yIGFsbCBvdGhlciBmb2xpb3MuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fYWxsb3dzX251bWFfYmFsYW5jZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbit7XFxuK1xcdHJldHVybiAhZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICBub2RlX2FsbG93c19udW1hX2JhbGFuY2luZyhmb2xpb19uaWQoZm9saW8pKTtcXG4rfVxcbitcXG4rLypcXG4rICogZm9saW9fYWxsb3dzX2NvbGxhcHNlKCkgLSBtYXkgY29sbGFwc2UgZm9sZCB0aGlzIGZvbGlvIGludG8gYSBUSFA/XFxuKyAqIEBpc19raHVnZXBhZ2VkOiB0cnVlIGZvciB0aGUga2h1Z2VwYWdlZCwgZmFsc2UgZm9yIE1BRFZfQ09MTEFQU0UuXFxuKyAqXFxuKyAqIENvbGxhcHNlIGlzIGEgcmVzaWRlbmN5IG9wZXJhdGlvbiBnYXRlZCBieSB0aGUgYWN0b3IgY2FsbGluZyBpdDpcXG4rICogICAtIGtodWdlcGFnZWQgbmV2ZXIgb3BlcmF0ZXMgb24gcHJpdmF0ZS1ub2RlIGZvbGlvcyAobGlrZSBaT05FX0RFVklDRSlcXG4rICogICAtIE1BRFZfQ09MTEFQU0UgaXMgZ2F0ZWQgYnkgQ0FQX1VTRVJfTlVNQVxcbisgKlxcbisgKiBOZXZlciB0cnVlIGZvciBaT05FX0RFVklDRS5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19hbGxvd3NfY29sbGFwc2Uoc3RydWN0IGZvbGlvICpmb2xpbywgYm9vbCBpc19raHVnZXBhZ2VkKVxcbit7XFxuK1xcdGludCBuaWQgPSBmb2xpb19uaWQoZm9saW8pO1xcbitcXG4rXFx0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRpZiAoaXNfa2h1Z2VwYWdlZClcXG4rXFx0XFx0cmV0dXJuICFub2RlX2lzX3ByaXZhdGUobmlkKTtcXG4rXFx0cmV0dXJuIG5vZGVfYWxsb3dzX3VzZXJfbnVtYShuaWQpO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9hbGxvd3NfY29sbGFwc2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGJvb2wgaXNfa2h1Z2VwYWdlZClcXG4re1xcbitcXHRyZXR1cm4gZm9saW9fYWxsb3dzX2NvbGxhcHNlKHBhZ2VfZm9saW8ocGFnZSksIGlzX2todWdlcGFnZWQpO1xcbit9XFxuK1xcbisvKlxcbisgKiBmb2xpb19hbGxvd3NfbG9uZ3Rlcm1fcGluKCkgLSBtYXkgdGhpcyBmb2xpbyBiZSBsb25nLXRlcm0gR1VQLXBpbm5lZD9cXG4rICpcXG4rICogY2hlY2tzIGZvbGlvX2lzX2xvbmd0ZXJtX3Bpbm5hYmxlKCkgcnVsZXMgcGx1cyBwcml2YXRlIG5vZGUgcGVybWlzc2lvbnMuXFxuKyAqIHByaXZhdGUgbm9kZSBwZXJtaXNzaW9uIGlzIGNoZWNrZWQgaGVyZSB0byByZXNvbHZlIGNpcmN1bGFyIGhlYWRlclxcbisgKiBkZXBlbmRlbmNpZXMgaW4gZm9saW9faXNfbG9uZ3Rlcm1fcGlubmFibGUuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fYWxsb3dzX2xvbmd0ZXJtX3BpbihzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbit7XFxuK1xcdHJldHVybiBmb2xpb19pc19sb25ndGVybV9waW5uYWJsZShmb2xpbykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICAgIG5vZGVfYWxsb3dzX2x0cGluKGZvbGlvX25pZChmb2xpbykpO1xcbit9XFxuK1xcbisvKlxcbisgKiBmb2xpb19sb25ndGVybV9waW5fZm9yYmlkZGVuKCkgLSBtdXN0IGEgbG9uZ3Rlcm0gcGluIG9mIHRoaXMgZm9saW8gZmFpbFxcbisgKiBvdXRyaWdodCAobmVpdGhlciBwaW5uZWQgaW4gcGxhY2Ugbm9yIG1pZ3JhdGVkIG9mZiB0aGUgbm9kZSk/XFxuKyAqXFxuKyAqIFRydWUgb25seSBmb3IgYSBmb2xpbyBvbiBhIHByaXZhdGUgbm9kZSB0aGF0IGRpZCBub3Qgb3B0IGludG8gbG9uZ3Rlcm1cXG4rICogcGlubmluZyAoTk9ERV9QUklWQVRFX0NBUF9MVFBJTik7IG5vZGVfYWxsb3dzX2x0cGluKCkgaXMgdHJ1ZSBmb3Igb3JkaW5hcnlcXG4rICogbm9kZXMgYW5kIGZvciBvcHRlZC1pbiBwcml2YXRlIG5vZGVzLCBzbyB0aGlzIG5ldmVyIHRyaXBzIHRoZW0uXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fbG9uZ3Rlcm1fcGluX2ZvcmJpZGRlbihzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbit7XFxuK1xcdHJldHVybiAhbm9kZV9hbGxvd3NfbHRwaW4oZm9saW9fbmlkKGZvbGlvKSk7XFxuK31cXG4rXFxuIC8qXFxuICAqIE1haW50YWlucyBzdGF0ZSBhY3Jvc3MgYSBwYWdlIHRhYmxlIG1vdmUuIFRoZSBvcGVyYXRpb24gYXNzdW1lcyBib3RoIHNvdXJjZVxcbiAgKiBhbmQgZGVzdGluYXRpb24gVk1BcyBhbHJlYWR5IGV4aXN0IGFuZCBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxcbkBAIC0xMTQ3LDcgKzEyMzcsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xcbiBcXG4gZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbm9kZV9yZWNsYWltKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsXFxuIFxcdFxcdFxcdFxcdCAgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcik7XFxuLWV4dGVybiBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spO1xcbitleHRlcm4gaW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxcbitcXHRcXHRcXHRcXHQgIGNvbnN0IG5vZGVtYXNrX3QgKmNhbmRpZGF0ZXMpO1xcbiAjZWxzZVxcbiAjZGVmaW5lIG5vZGVfcmVjbGFpbV9tb2RlIDBcXG4gXFxuQEAgLTExNTYsNyArMTI0Nyw4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcXG4ge1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbi1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaylcXG4rc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXFxuK1xcdFxcdFxcdFxcdFxcdCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxcbiB7XFxuIFxcdHJldHVybiBOVU1BX05PX05PREU7XFxuIH1cXG5AQCAtMTI0Miw2ICsxMzM0LDcgQEAgc3RydWN0IG1pZ3JhdGlvbl90YXJnZXRfY29udHJvbCB7XFxuIFxcdG5vZGVtYXNrX3QgKm5tYXNrO1xcbiBcXHRnZnBfdCBnZnBfbWFzaztcXG4gXFx0ZW51bSBtaWdyYXRlX3JlYXNvbiByZWFzb247XFxuK1xcdHVuc2lnbmVkIGludCBhbGxvY19mbGFncztcXG4gfTtcXG4gXFxuIC8qXFxuZGlmZiAtLWdpdCBhL21tL2todWdlcGFnZWQuYyBiL21tL2todWdlcGFnZWQuY1xcbmluZGV4IDI3ZThmMzA3N2U4MGZlLi41ZjIwODM5ODU3NzM4MiAxMDA2NDRcXG4tLS0gYS9tbS9raHVnZXBhZ2VkLmNcXG4rKysgYi9tbS9raHVnZXBhZ2VkLmNcXG5AQCAtNzAwLDcgKzcwMCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHR9XFxuIFxcdFxcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZXZhbCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHwgdW5saWtlbHkoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkpIHtcXG4rXFx0XFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fFxcbitcXHRcXHQgICAgdW5saWtlbHkoIXBhZ2VfYWxsb3dzX2NvbGxhcHNlKHBhZ2UsIGNjLVxcdTAwM2Vpc19raHVnZXBhZ2VkKSkpIHtcXG4gXFx0XFx0XFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XFxuIFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHR9XFxuQEAgLTEyNDEsOSArMTI0MiwxNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCBhbGxvY19jaGFyZ2VfZm9saW8oc3RydWN0IGZvbGlvICoqZm9saW9wLCBzdHJ1Y3QgbW1fc3RydVxcbiBcXHRnZnBfdCBnZnAgPSAoY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgPyBhbGxvY19odWdlcGFnZV9raHVnZXBhZ2VkX2dmcG1hc2soKSA6XFxuIFxcdFxcdCAgICAgR0ZQX1RSQU5TSFVHRSk7XFxuIFxcdGludCBub2RlID0gY29sbGFwc2VfZmluZF90YXJnZXRfbm9kZShjYyk7XFxuK1xcdHVuc2lnbmVkIGludCBhZmxhZ3M7XFxuIFxcdHN0cnVjdCBmb2xpbyAqZm9saW87XFxuK1xcdGJvb2wgYWxsb3c7XFxuIFxcbi1cXHRmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgXFx1MDAyNmNjLVxcdTAwM2VhbGxvY19ubWFzayk7XFxuK1xcdC8qIFByaXZhdGUgbm9kZSBhY2Nlc3M6IGtodWdlcGFnZWQgbmV2ZXIsIG1hZHZpc2Ugd2l0aCBDQVBfVVNFUl9OVU1BICovXFxuK1xcdGFsbG93ID0gY2MtXFx1MDAzZWlzX2todWdlcGFnZWQgPyAhbm9kZV9pc19wcml2YXRlKG5vZGUpXFxuK1xcdFxcdFxcdFxcdCAgOiBub2RlX2FsbG93c191c2VyX251bWEobm9kZSk7XFxuK1xcdGFmbGFncyA9IChhbGxvdyBcXHUwMDI2XFx1MDAyNiBub2RlX2lzX3ByaXZhdGUobm9kZSkpID9cXG4rXFx0XFx0QUxMT0NfWk9ORUxJU1RfUFJJVkFURSA6IEFMTE9DX0RFRkFVTFQ7XFxuK1xcbitcXHRmb2xpbyA9IF9fZm9saW9fYWxsb2MoZ2ZwLCBvcmRlciwgbm9kZSwgXFx1MDAyNmNjLVxcdTAwM2VhbGxvY19ubWFzaywgYWZsYWdzKTtcXG4gXFx0aWYgKCFmb2xpbykge1xcbiBcXHRcXHQqZm9saW9wID0gTlVMTDtcXG4gXFx0XFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXFxuQEAgLTE2ODcsNyArMTY5Niw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IGNvbGxhcHNlX3NjYW5fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLFxcbiBcXHRcXHR9XFxuIFxcbiBcXHRcXHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGV2YWwpO1xcbi1cXHRcXHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8IHVubGlrZWx5KGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpKSB7XFxuK1xcdFxcdGlmICh1bmxpa2VseSghcGFnZSkgfHxcXG4rXFx0XFx0ICAgIHVubGlrZWx5KCFwYWdlX2FsbG93c19jb2xsYXBzZShwYWdlLCBjYy1cXHUwMDNlaXNfa2h1Z2VwYWdlZCkpKSB7XFxuIFxcdFxcdFxcdHJlc3VsdCA9IFNDQU5fUEFHRV9OVUxMO1xcbiBcXHRcXHRcXHRnb3RvIG91dF91bm1hcDtcXG4gXFx0XFx0fVxcbkBAIC0xOTQ0LDcgKzE5NTQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCB0cnlfY29sbGFwc2VfcHRlX21hcHBlZF90aHAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnblxcbiBcXHRcXHR9XFxuIFxcbiBcXHRcXHRwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyLCBwdGVudCk7XFxuLVxcdFxcdGlmIChXQVJOX09OX09OQ0UocGFnZSBcXHUwMDI2XFx1MDAyNiBpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSlcXG4rXFx0XFx0aWYgKFdBUk5fT05fT05DRShwYWdlIFxcdTAwMjZcXHUwMDI2IHBhZ2VfaXNfcHJpdmF0ZV9tYW5hZ2VkKHBhZ2UpKSlcXG4gXFx0XFx0XFx0cGFnZSA9IE5VTEw7XFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIE5vdGUgdGhhdCB1cHJvYmUsIGRlYnVnZ2VyLCBvciBNQVBfUFJJVkFURSBtYXkgY2hhbmdlIHRoZVxcbmRpZmYgLS1naXQgYS9tbS9rc20uYyBiL21tL2tzbS5jXFxuaW5kZXggYjliMzJmN2JmYjY5MWUuLmZmMjMxM2ZjNDVkNTNhIDEwMDY0NFxcbi0tLSBhL21tL2tzbS5jXFxuKysrIGIvbW0va3NtLmNcXG5AQCAtODI3LDcgKzgyNyw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZ2V0X21lcmdlYWJsZV9wYWdlKHN0cnVjdCBrc21fcm1hcF9pdGVtICpybWFwX2l0ZW0pXFxuIFxcbiBcXHRmb2xpbyA9IGZvbGlvX3dhbGtfc3RhcnQoXFx1MDAyNmZ3LCB2bWEsIGFkZHIsIDApO1xcbiBcXHRpZiAoZm9saW8pIHtcXG4tXFx0XFx0aWYgKCFmb2xpb19pc196b25lX2RldmljZShmb2xpbykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0aWYgKCFmb2xpb19pc19wcml2YXRlX21hbmFnZWQoZm9saW8pIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdCAgICBmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XFxuIFxcdFxcdFxcdGZvbGlvX2dldChmb2xpbyk7XFxuIFxcdFxcdFxcdHBhZ2UgPSBmdy5wYWdlO1xcbkBAIC0yNTU5LDcgKzI1NTksOCBAQCBzdGF0aWMgaW50IGtzbV9uZXh0X3BhZ2VfcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvblxcbiBcXHRcXHRcXHRcXHRnb3RvIG5vdF9mb3VuZF91bmxvY2s7XFxuIFxcdFxcdFxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcXG4gXFxuLVxcdFxcdFxcdGlmIChmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXFxuK1xcdFxcdFxcdGlmICh1bmxpa2VseShmb2xpb19pc19wcml2YXRlX21hbmFnZWQoZm9saW8pKSB8fFxcbitcXHRcXHRcXHQgICAgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXFxuIFxcdFxcdFxcdFxcdGdvdG8gbm90X2ZvdW5kX3VubG9jaztcXG4gXFxuIFxcdFxcdFxcdHBhZ2UgKz0gKChhZGRyIFxcdTAwMjYgKFBNRF9TSVpFIC0gMSkpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpO1xcbkBAIC0yNTgzLDcgKzI1ODQsOCBAQCBzdGF0aWMgaW50IGtzbV9uZXh0X3BhZ2VfcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvblxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbiBcXG4tXFx0XFx0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4rXFx0XFx0aWYgKHVubGlrZWx5KGZvbGlvX2lzX3ByaXZhdGVfbWFuYWdlZChmb2xpbykpIHx8XFxuK1xcdFxcdCAgICAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcdFxcdGdvdG8gZm91bmRfdW5sb2NrO1xcbiBcXHR9XFxuZGlmZiAtLWdpdCBhL21tL21hZHZpc2UuYyBiL21tL21hZHZpc2UuY1xcbmluZGV4IDA3YTIxY2EzMWJhZDRkLi41NmNhOTc0NTQyNzA3OCAxMDA2NDRcXG4tLS0gYS9tbS9tYWR2aXNlLmNcXG4rKysgYi9tbS9tYWR2aXNlLmNcXG5AQCAtMzIsNiArMzIsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbGVhZm9wcy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2htZW1fZnMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tdV9ub3RpZmllci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL3RsYi5oXFx1MDAzZVxcbiBcXG5AQCAtMzk1LDYgKzM5Niw5IEBAIHN0YXRpYyBpbnQgbWFkdmlzZV9jb2xkX29yX3BhZ2VvdXRfcHRlX3JhbmdlKHBtZF90ICpwbWQsXFxuIFxcbiBcXHRcXHRmb2xpbyA9IHBtZF9mb2xpbyhvcmlnX3BtZCk7XFxuIFxcbitcXHRcXHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0oZm9saW9fbmlkKGZvbGlvKSkpXFxuK1xcdFxcdFxcdGdvdG8gaHVnZV91bmxvY2s7XFxuK1xcbiBcXHRcXHQvKiBEbyBub3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgbWFwcGluZ3Mgb2YgdGhpcyBmb2xpbyAqL1xcbiBcXHRcXHRpZiAoZm9saW9fbWF5YmVfbWFwcGVkX3NoYXJlZChmb2xpbykpXFxuIFxcdFxcdFxcdGdvdG8gaHVnZV91bmxvY2s7XFxuQEAgLTQ3NCw3ICs0NzgsNyBAQCBzdGF0aWMgaW50IG1hZHZpc2VfY29sZF9vcl9wYWdlb3V0X3B0ZV9yYW5nZShwbWRfdCAqcG1kLFxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbi1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4rXFx0XFx0aWYgKCFmb2xpbyB8fCAhZm9saW9fYWxsb3dzX21hZHZpc2UoZm9saW8pKVxcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFxuIFxcdFxcdC8qXFxuQEAgLTcwMyw3ICs3MDcsNyBAQCBzdGF0aWMgaW50IG1hZHZpc2VfZnJlZV9wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbiBcXHRcXHR9XFxuIFxcbiBcXHRcXHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcXG4tXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuK1xcdFxcdGlmICghZm9saW8gfHwgIWZvbGlvX2FsbG93c19tYWR2aXNlKGZvbGlvKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbiBcXHRcXHQvKlxcbmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLXYxLmMgYi9tbS9tZW1jb250cm9sLXYxLmNcXG5pbmRleCAyZGM1OTk0ODRkMDA2Zi4uNWU0NjRlNTJkZmI5YTggMTAwNjQ0XFxuLS0tIGEvbW0vbWVtY29udHJvbC12MS5jXFxuKysrIGIvbW0vbWVtY29udHJvbC12MS5jXFxuQEAgLTIxMzIsMTQgKzIxMzIsMTggQEAgc3RhdGljIGludCBtZW1jZ19udW1hX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXFxuIFxcdGNvbnN0IHN0cnVjdCBudW1hX3N0YXQgKnN0YXQ7XFxuIFxcdGludCBuaWQ7XFxuIFxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9zZXEobSk7XFxuK1xcdG5vZGVtYXNrX3QgcmVwb3J0YWJsZTtcXG4gXFxuIFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiBcXG4rXFx0LyogUHJpdmF0ZSBub2RlcyBob2xkIGNncm91cCBtZW1vcnkgdG9vLCByZXBvcnQgdGhlbS4gKi9cXG4rXFx0bm9kZXNfb3IocmVwb3J0YWJsZSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XFxuK1xcbiBcXHRmb3IgKHN0YXQgPSBzdGF0czsgc3RhdCBcXHUwMDNjIEFSUkFZX0VORChzdGF0cyk7IHN0YXQrKykge1xcbiBcXHRcXHRzZXFfcHJpbnRmKG0sIFxcXCIlcz0lbHVcXFwiLCBzdGF0LVxcdTAwM2VuYW1lLFxcbiBcXHRcXHRcXHQgICBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW1jZywgc3RhdC1cXHUwMDNlbHJ1X21hc2ssXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgIGZhbHNlKSk7XFxuLVxcdFxcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSlcXG4rXFx0XFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcmVwb3J0YWJsZSlcXG4gXFx0XFx0XFx0c2VxX3ByaW50ZihtLCBcXFwiIE4lZD0lbHVcXFwiLCBuaWQsXFxuIFxcdFxcdFxcdFxcdCAgIG1lbV9jZ3JvdXBfbm9kZV9ucl9scnVfcGFnZXMobWVtY2csIG5pZCxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0c3RhdC1cXHUwMDNlbHJ1X21hc2ssIGZhbHNlKSk7XFxuQEAgLTIxNTEsNyArMjE1NSw3IEBAIHN0YXRpYyBpbnQgbWVtY2dfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxcbiBcXHRcXHRzZXFfcHJpbnRmKG0sIFxcXCJoaWVyYXJjaGljYWxfJXM9JWx1XFxcIiwgc3RhdC1cXHUwMDNlbmFtZSxcXG4gXFx0XFx0XFx0ICAgbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIHN0YXQtXFx1MDAzZWxydV9tYXNrLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgICB0cnVlKSk7XFxuLVxcdFxcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSlcXG4rXFx0XFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcmVwb3J0YWJsZSlcXG4gXFx0XFx0XFx0c2VxX3ByaW50ZihtLCBcXFwiIE4lZD0lbHVcXFwiLCBuaWQsXFxuIFxcdFxcdFxcdFxcdCAgIG1lbV9jZ3JvdXBfbm9kZV9ucl9scnVfcGFnZXMobWVtY2csIG5pZCxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0c3RhdC1cXHUwMDNlbHJ1X21hc2ssIHRydWUpKTtcXG5kaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC5jIGIvbW0vbWVtY29udHJvbC5jXFxuaW5kZXggODMxOWFkOGM1YzIzYWMuLjRkNzllMjM4YmM1N2Q4IDEwMDY0NFxcbi0tLSBhL21tL21lbWNvbnRyb2wuY1xcbisrKyBiL21tL21lbWNvbnRyb2wuY1xcbkBAIC00NDk2LDYgKzQ0OTYsNyBAQCBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2Nzc19yc3RhdF9mbHVzaChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzLCBpbnQgY3B1KVxcbiBcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50ID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpO1xcbiBcXHRzdHJ1Y3QgbWVtY2dfdm1zdGF0c19wZXJjcHUgKnN0YXRjO1xcbiBcXHRzdHJ1Y3QgYWdncmVnYXRlX2NvbnRyb2wgYWM7XFxuK1xcdG5vZGVtYXNrX3QgcmVwb3J0YWJsZTtcXG4gXFx0aW50IG5pZDtcXG4gXFxuIFxcdGZsdXNoX25taV9zdGF0cyhtZW1jZywgcGFyZW50KTtcXG5AQCAtNDUyNCw3ICs0NTI1LDkgQEAgc3RhdGljIHZvaWQgbWVtX2Nncm91cF9jc3NfcnN0YXRfZmx1c2goc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcywgaW50IGNwdSlcXG4gXFx0fTtcXG4gXFx0bWVtX2Nncm91cF9zdGF0X2FnZ3JlZ2F0ZShcXHUwMDI2YWMpO1xcbiBcXG4tXFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSB7XFxuK1xcdC8qIFByaXZhdGUgbm9kZXMgbXVzdCBhbHNvIGJlIGFjY291bnRlZCBvciBudW1hX3N0YXQgaXMgbWlzbGVhZGluZyAqL1xcbitcXHRub2Rlc19vcihyZXBvcnRhYmxlLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcXG4rXFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcmVwb3J0YWJsZSkge1xcbiBcXHRcXHRzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfbm9kZSAqcG4gPSBtZW1jZy1cXHUwMDNlbm9kZWluZm9bbmlkXTtcXG4gXFx0XFx0c3RydWN0IGxydXZlY19zdGF0cyAqbHN0YXRzID0gcG4tXFx1MDAzZWxydXZlY19zdGF0cztcXG4gXFx0XFx0c3RydWN0IGxydXZlY19zdGF0cyAqcGxzdGF0cyA9IE5VTEw7XFxuQEAgLTQ5NDcsOSArNDk1MCwxMyBAQCBzdGF0aWMgaW50IG1lbW9yeV9udW1hX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXFxuIHtcXG4gXFx0aW50IGk7XFxuIFxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9zZXEobSk7XFxuK1xcdG5vZGVtYXNrX3QgcmVwb3J0YWJsZTtcXG4gXFxuIFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiBcXG4rXFx0LyogUHJpdmF0ZSBub2RlcyBob2xkIGNncm91cCBtZW1vcnkgdG9vLCByZXBvcnQgdGhlbS4gKi9cXG4rXFx0bm9kZXNfb3IocmVwb3J0YWJsZSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XFxuK1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShtZW1vcnlfc3RhdHMpOyBpKyspIHtcXG4gXFx0XFx0aW50IG5pZDtcXG4gXFxuQEAgLTQ5NTcsNyArNDk2NCw3IEBAIHN0YXRpYyBpbnQgbWVtb3J5X251bWFfc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbiBcXHRcXHRzZXFfcHJpbnRmKG0sIFxcXCIlc1xcXCIsIG1lbW9yeV9zdGF0c1tpXS5uYW1lKTtcXG4tXFx0XFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSB7XFxuK1xcdFxcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsIHJlcG9ydGFibGUpIHtcXG4gXFx0XFx0XFx0dTY0IHNpemU7XFxuIFxcdFxcdFxcdHN0cnVjdCBscnV2ZWMgKmxydXZlYztcXG4gXFxuQEAgLTYwNjksNiArNjA3Niw4IEBAIHZvaWQgbWVtX2Nncm91cF9ub2RlX2ZpbHRlcl9hbGxvd2VkKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgbm9kZW1hc2tfdCAqbWFzaylcXG4gXFx0ICogbWFzayBpcyBhY2NlcHRhYmxlLlxcbiBcXHQgKi9cXG4gXFx0Y3B1c2V0X25vZGVzX2FsbG93ZWQobWVtY2ctXFx1MDAzZWNzcy5jZ3JvdXAsIFxcdTAwMjZhbGxvd2VkKTtcXG4rXFx0LyogTl9NRU1PUllfUFJJVkFURSBub2RlcyBhcmUgbm90IHBhcnRpdGlvbmVkIGJ5IGNwdXNldCwgaW5jbHVkZSB0aGVtICovXFxuK1xcdG5vZGVzX29yKGFsbG93ZWQsIGFsbG93ZWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcXG4gXFx0bm9kZXNfYW5kKCptYXNrLCAqbWFzaywgYWxsb3dlZCk7XFxuIH1cXG4gXFxuZGlmZiAtLWdpdCBhL21tL21lbW9yeS10aWVycy5jIGIvbW0vbWVtb3J5LXRpZXJzLmNcXG5pbmRleCA1NDg1MWQ4YTE5NWIwMy4uYzY3MzA4MGQxNTNlNDEgMTAwNjQ0XFxuLS0tIGEvbW0vbWVtb3J5LXRpZXJzLmNcXG4rKysgYi9tbS9tZW1vcnktdGllcnMuY1xcbkBAIC03LDYgKzcsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LXRpZXJzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9ub3RpZmllci5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2NoZWQvc3lzY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ub2RlX3ByaXZhdGUuaFxcdTAwM2VcXG4gXFxuICNpbmNsdWRlIFxcXCJpbnRlcm5hbC5oXFxcIlxcbiBcXG5AQCAtMzE3LDYgKzMxOCwyMSBAQCB2b2lkIG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ19kYXRhX3QgKnBnZGF0LCBub2RlbWFza190ICp0YXJnZXRzKVxcbiBcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gfVxcbiBcXG4rLyogVGllcmluZyBzZXQ6IE5fTUVNT1JZIHwgKE5fTUVNT1JZX1BSSVZBVEUgdy8gQ0FQX0RFTU9USU9OKSAqL1xcbitzdGF0aWMgbm9kZW1hc2tfdCB0aWVyYWJsZV9ub2RlcztcXG4rXFxuK3N0YXRpYyB2b2lkIHVwZGF0ZV90aWVyYWJsZV9ub2Rlcyh2b2lkKVxcbit7XFxuK1xcdGludCBub2RlO1xcbitcXG4rXFx0bG9ja2RlcF9hc3NlcnRfaGVsZF9vbmNlKFxcdTAwMjZtZW1vcnlfdGllcl9sb2NrKTtcXG4rXFxuK1xcdHRpZXJhYmxlX25vZGVzID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldO1xcbitcXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZX1BSSVZBVEUpXFxuK1xcdFxcdGlmIChub2RlX2FsbG93c19kZW1vdGlvbihub2RlKSlcXG4rXFx0XFx0XFx0bm9kZV9zZXQobm9kZSwgdGllcmFibGVfbm9kZXMpO1xcbit9XFxuK1xcbiAvKipcXG4gICogbmV4dF9kZW1vdGlvbl9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGUgZGVtb3Rpb24gcGF0aFxcbiAgKiBAbm9kZTogVGhlIHN0YXJ0aW5nIG5vZGUgdG8gbG9va3VwIHRoZSBuZXh0IG5vZGVcXG5AQCAtMzMwLDcgKzM0Niw3IEBAIHZvaWQgbm9kZV9nZXRfYWxsb3dlZF90YXJnZXRzKHBnX2RhdGFfdCAqcGdkYXQsIG5vZGVtYXNrX3QgKnRhcmdldHMpXFxuIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcXG4ge1xcbiBcXHRzdHJ1Y3QgZGVtb3Rpb25fbm9kZXMgKm5kO1xcbi1cXHRub2RlbWFza190IG1hc2s7XFxuK1xcdG5vZGVtYXNrX3QgbWFzaywgdGllcmFibGU7XFxuIFxcbiBcXHRpZiAoIW5vZGVfZGVtb3Rpb24pXFxuIFxcdFxcdHJldHVybiBOVU1BX05PX05PREU7XFxuQEAgLTM3MCw3ICszODYsOCBAQCBpbnQgbmV4dF9kZW1vdGlvbl9ub2RlKGludCBub2RlLCBjb25zdCBub2RlbWFza190ICphbGxvd2VkX21hc2spXFxuIFxcdCAqIGNsb3Nlc3QgZGVtb3Rpb24gdGFyZ2V0LlxcbiBcXHQgKi9cXG4gXFx0bm9kZXNfY29tcGxlbWVudChtYXNrLCAqYWxsb3dlZF9tYXNrKTtcXG4tXFx0cmV0dXJuIGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgXFx1MDAyNm1hc2spO1xcbitcXHR0aWVyYWJsZSA9IHRpZXJhYmxlX25vZGVzO1xcbitcXHRyZXR1cm4gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcXHUwMDI2bWFzaywgXFx1MDAyNnRpZXJhYmxlKTtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbkBAIC0zNzgsNyArMzk1LDcgQEAgc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbiBcXHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXI7XFxuIFxcdGludCBub2RlO1xcbiBcXG4tXFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX01FTU9SWSkge1xcbitcXHRmb3JfZWFjaF9ub2RlX21hc2sobm9kZSwgdGllcmFibGVfbm9kZXMpIHtcXG4gXFx0XFx0bm9kZV9kZW1vdGlvbltub2RlXS5wcmVmZXJyZWQgPSBOT0RFX01BU0tfTk9ORTtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2UgYXJlIGhvbGRpbmcgbWVtb3J5X3RpZXJfbG9jaywgaXQgaXMgc2FmZVxcbkBAIC00MDEsNyArNDE4LDcgQEAgc3RhdGljIHZvaWQgZHVtcF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXFxuIHtcXG4gXFx0aW50IG5vZGU7XFxuIFxcbi1cXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSB7XFxuK1xcdGZvcl9lYWNoX25vZGVfbWFzayhub2RlLCB0aWVyYWJsZV9ub2Rlcykge1xcbiBcXHRcXHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXIgPSBfX25vZGVfZ2V0X21lbW9yeV90aWVyKG5vZGUpO1xcbiBcXHRcXHRub2RlbWFza190IHByZWZlcnJlZCA9IG5vZGVfZGVtb3Rpb25bbm9kZV0ucHJlZmVycmVkO1xcbiBcXG5AQCAtNDM1LDkgKzQ1MiwxMCBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbiBcXHRpZiAoIW5vZGVfZGVtb3Rpb24pXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuK1xcdHVwZGF0ZV90aWVyYWJsZV9ub2RlcygpO1xcbiBcXHRkaXNhYmxlX2FsbF9kZW1vdGlvbl90YXJnZXRzKCk7XFxuIFxcbi1cXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSB7XFxuK1xcdGZvcl9lYWNoX25vZGVfbWFzayhub2RlLCB0aWVyYWJsZV9ub2Rlcykge1xcbiBcXHRcXHRiZXN0X2Rpc3RhbmNlID0gLTE7XFxuIFxcdFxcdG5kID0gXFx1MDAyNm5vZGVfZGVtb3Rpb25bbm9kZV07XFxuIFxcbkBAIC00NTAsMTIgKzQ2OCwxMiBAQCBzdGF0aWMgdm9pZCBlc3RhYmxpc2hfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxcbiBcXHRcXHRtZW10aWVyID0gbGlzdF9uZXh0X2VudHJ5KG1lbXRpZXIsIGxpc3QpO1xcbiBcXHRcXHR0aWVyX25vZGVzID0gZ2V0X21lbXRpZXJfbm9kZW1hc2sobWVtdGllcik7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIGZpbmRfbmV4dF9iZXN0X25vZGUsIHVzZSAndXNlZCcgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXFxuK1xcdFxcdCAqIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4sIHVzZSAndXNlZCcgbm9kZW1hc2sgYXMgYSBza2lwIGxpc3QuXFxuIFxcdFxcdCAqIEFkZCBhbGwgbWVtb3J5IG5vZGVzIGV4Y2VwdCB0aGUgc2VsZWN0ZWQgbWVtb3J5IHRpZXJcXG4gXFx0XFx0ICogbm9kZWxpc3QgdG8gc2tpcCBsaXN0IHNvIHRoYXQgd2UgZmluZCB0aGUgYmVzdCBub2RlIGZyb20gdGhlXFxuIFxcdFxcdCAqIG1lbXRpZXIgbm9kZWxpc3QuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRub2Rlc19hbmRub3QodGllcl9ub2Rlcywgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCB0aWVyX25vZGVzKTtcXG4rXFx0XFx0bm9kZXNfYW5kbm90KHRpZXJfbm9kZXMsIHRpZXJhYmxlX25vZGVzLCB0aWVyX25vZGVzKTtcXG4gXFxuIFxcdFxcdC8qXFxuIFxcdFxcdCAqIEZpbmQgYWxsIHRoZSBub2RlcyBpbiB0aGUgbWVtb3J5IHRpZXIgbm9kZSBsaXN0IG9mIHNhbWUgYmVzdCBkaXN0YW5jZS5cXG5AQCAtNDYzLDcgKzQ4MSw4IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXFxuIFxcdFxcdCAqIGluIHRoZSBwcmVmZXJyZWQgbWFzayB3aGVuIGFsbG9jYXRpbmcgcGFnZXMgZHVyaW5nIGRlbW90aW9uLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0ZG8ge1xcbi1cXHRcXHRcXHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlKG5vZGUsIFxcdTAwMjZ0aWVyX25vZGVzKTtcXG4rXFx0XFx0XFx0dGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcXHUwMDI2dGllcl9ub2RlcyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx1MDAyNnRpZXJhYmxlX25vZGVzKTtcXG4gXFx0XFx0XFx0aWYgKHRhcmdldCA9PSBOVU1BX05PX05PREUpXFxuIFxcdFxcdFxcdFxcdGJyZWFrO1xcbiBcXG5AQCAtNTAyLDcgKzUyMSw3IEBAIHN0YXRpYyB2b2lkIGVzdGFibGlzaF9kZW1vdGlvbl90YXJnZXRzKHZvaWQpXFxuIFxcdCAqIGFsbG9jYXRpb24gdG8gYSBzZXQgb2Ygbm9kZXMgdGhhdCBpcyBjbG9zZXIgdGhlIGFib3ZlIHNlbGVjdGVkXFxuIFxcdCAqIHByZWZlcnJlZCBub2RlLlxcbiBcXHQgKi9cXG4tXFx0bG93ZXJfdGllciA9IG5vZGVfc3RhdGVzW05fTUVNT1JZXTtcXG4rXFx0bG93ZXJfdGllciA9IHRpZXJhYmxlX25vZGVzO1xcbiBcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KG1lbXRpZXIsIFxcdTAwMjZtZW1vcnlfdGllcnMsIGxpc3QpIHtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogS2VlcCByZW1vdmluZyBjdXJyZW50IHRpZXIgZnJvbSBsb3dlcl90aWVyIG5vZGVzLFxcbkBAIC01NDksNyArNTY4LDggQEAgc3RhdGljIHN0cnVjdCBtZW1vcnlfdGllciAqc2V0X25vZGVfbWVtb3J5X3RpZXIoaW50IG5vZGUpXFxuIFxcbiBcXHRsb2NrZGVwX2Fzc2VydF9oZWxkX29uY2UoXFx1MDAyNm1lbW9yeV90aWVyX2xvY2spO1xcbiBcXG4tXFx0aWYgKCFub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSlcXG4rXFx0LyogSW5jbHVkZSBOX01FTU9SWSBhbmQgTl9NRU1PUllfUFJJVkFURSB3aXRoIENBUF9ERU1PVElPTiAqL1xcbitcXHRpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIFxcdTAwMjZcXHUwMDI2ICFub2RlX2FsbG93c19kZW1vdGlvbihub2RlKSlcXG4gXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcbiBcXHRtdF9jYWxjX2FkaXN0YW5jZShub2RlLCBcXHUwMDI2YWRpc3QpO1xcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xcbmluZGV4IDIyNmFiOWNiMDc4YWQxLi5lOTU3M2Y5MGUwZGNkMyAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jXFxuKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xcbkBAIC0zNCw2ICszNCw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1ibG9jay5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGFjdGlvbi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcm1hcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25vZGUuaFxcdTAwM2VcXG4gXFxuQEAgLTExNjgsNyArMTE2OSw3IEBAIGludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuIFxcdG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoem9uZSwgcGZuLCBucl9wYWdlcywgTlVMTCwgTUlHUkFURV9NT1ZBQkxFLFxcbiBcXHRcXHRcXHQgICAgICAgdHJ1ZSk7XFxuIFxcbi1cXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpIHtcXG4rXFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpIFxcdTAwMjZcXHUwMDI2ICFub2RlX2lzX3ByaXZhdGUobmlkKSkge1xcbiBcXHRcXHQvKiBBZGRpbmcgbWVtb3J5IHRvIHRoZSBub2RlIGZvciB0aGUgZmlyc3QgdGltZSAqL1xcbiBcXHRcXHRub2RlX2FyZy5uaWQgPSBuaWQ7XFxuIFxcdFxcdHJldCA9IG5vZGVfbm90aWZ5KE5PREVfQURESU5HX0ZJUlNUX01FTU9SWSwgXFx1MDAyNm5vZGVfYXJnKTtcXG5AQCAtMTIwMywxMyArMTIwNCwyMCBAQCBpbnQgb25saW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbiBcXHRvbmxpbmVfcGFnZXNfcmFuZ2UocGZuLCBucl9wYWdlcyk7XFxuIFxcdGFkanVzdF9wcmVzZW50X3BhZ2VfY291bnQocGZuX3RvX3BhZ2UocGZuKSwgZ3JvdXAsIG5yX3BhZ2VzKTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIE5fTUVNT1JZIGFuZCBOX01FTU9SWV9QUklWQVRFIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIGRldGVybWluZVxcbitcXHQgKiB3aGljaCBpcyBjb3JyZWN0IGJhc2VkIG9uIHdoZXRoZXIgdGhlIHBnZGF0LVxcdTAwM2Vwcml2YXRlIGlzIHNldC5cXG4rXFx0ICovXFxuIFxcdGlmIChub2RlX2FyZy5uaWQgXFx1MDAzZT0gMClcXG4tXFx0XFx0bm9kZV9zZXRfc3RhdGUobmlkLCBOX01FTU9SWSk7XFxuK1xcdFxcdG5vZGVfc2V0X3N0YXRlKG5pZCwgcGdkYXRfaXNfcHJpdmF0ZShOT0RFX0RBVEEobmlkKSkgP1xcbitcXHRcXHRcXHRcXHQgICAgTl9NRU1PUllfUFJJVkFURSA6IE5fTUVNT1JZKTtcXG4gXFx0LypcXG4gXFx0ICogQ2hlY2sgd2hldGhlciB3ZSBhcmUgYWRkaW5nIG5vcm1hbCBtZW1vcnkgdG8gdGhlIG5vZGUgZm9yIHRoZSBmaXJzdFxcbiBcXHQgKiB0aW1lLlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9OT1JNQUxfTUVNT1JZKSBcXHUwMDI2XFx1MDAyNiB6b25lX2lkeCh6b25lKSBcXHUwMDNjPSBaT05FX05PUk1BTClcXG4rXFx0aWYgKCFub2RlX2lzX3ByaXZhdGUobmlkKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIW5vZGVfc3RhdGUobmlkLCBOX05PUk1BTF9NRU1PUlkpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICB6b25lX2lkeCh6b25lKSBcXHUwMDNjPSBaT05FX05PUk1BTClcXG4gXFx0XFx0bm9kZV9zZXRfc3RhdGUobmlkLCBOX05PUk1BTF9NRU1PUlkpO1xcbiBcXG4gXFx0aWYgKG5lZWRfem9uZWxpc3RzX3JlYnVpbGQpXFxuQEAgLTEyMjksOCArMTIzNywxMCBAQCBpbnQgb25saW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbiBcXHQvKiByZWluaXRpYWxpc2Ugd2F0ZXJtYXJrcyBhbmQgdXBkYXRlIHBjcCBsaW1pdHMgKi9cXG4gXFx0aW5pdF9wZXJfem9uZV93bWFya19taW4oKTtcXG4gXFxuLVxcdGtzd2FwZF9ydW4obmlkKTtcXG4tXFx0a2NvbXBhY3RkX3J1bihuaWQpO1xcbitcXHRpZiAobm9kZV9hbGxvd3NfcmVjbGFpbShuaWQpKSB7XFxuK1xcdFxcdGtzd2FwZF9ydW4obmlkKTtcXG4rXFx0XFx0a2NvbXBhY3RkX3J1bihuaWQpO1xcbitcXHR9XFxuIFxcbiBcXHRpZiAobm9kZV9hcmcubmlkIFxcdTAwM2U9IDApXFxuIFxcdFxcdC8qIEZpcnN0IG1lbW9yeSBhZGRlZCBzdWNjZXNzZnVsbHkuIE5vdGlmeSBjb25zdW1lcnMuICovXFxuQEAgLTE2NDgsNiArMTY1OCw4IEBAIEVYUE9SVF9TWU1CT0xfR1BMKGFkZF9tZW1vcnkpO1xcbiAgKiBAcmVzb3VyY2VfbmFtZTogUmVzb3VyY2UgbmFtZSBpbiBmb3JtYXQgXFxcIlN5c3RlbSBSQU0gKCREUklWRVIpXFxcIlxcbiAgKiBAbWhwX2ZsYWdzOiBNZW1vcnkgaG90cGx1ZyBmbGFnc1xcbiAgKiBAb25saW5lX3R5cGU6IEF1dG8tT25saW5lIGJlaGF2aW9yIChvZmZsaW5lLCBvbmxpbmUsIGtlcm5lbCwgbW92YWJsZSlcXG4rICogQG5wOiBkcml2ZXItb3duZWQgbm9kZV9wcml2YXRlIHRvIG9ubGluZSB0aGUgbm9kZSBhcyBOX01FTU9SWV9QUklWQVRFLCBvclxcbisgKlxcdE5VTEwgZm9yIG9yZGluYXJ5IHN5c3RlbSBSQU1cXG4gICpcXG4gICogQWRkIHNwZWNpYWwsIGRyaXZlci1tYW5hZ2VkIG1lbW9yeSB0byB0aGUgc3lzdGVtIGFzIHN5c3RlbSBSQU0uIFN1Y2hcXG4gICogbWVtb3J5IGlzIG5vdCBleHBvc2VkIHZpYSB0aGUgcmF3IGZpcm13YXJlLXByb3ZpZGVkIG1lbW1hcCBhcyBzeXN0ZW1cXG5AQCAtMTY3NCw5ICsxNjg2LDExIEBAIEVYUE9SVF9TWU1CT0xfR1BMKGFkZF9tZW1vcnkpO1xcbiAgKi9cXG4gaW50IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxcbiBcXHRcXHRjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lLCBtaHBfdCBtaHBfZmxhZ3MsXFxuLVxcdFxcdGVudW0gbW1vcCBvbmxpbmVfdHlwZSlcXG4rXFx0XFx0ZW51bSBtbW9wIG9ubGluZV90eXBlLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucClcXG4ge1xcbitcXHRpbnQgcmVhbF9uaWQgPSBuaWQ7XFxuIFxcdHN0cnVjdCByZXNvdXJjZSAqcmVzO1xcbitcXHRzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cDtcXG4gXFx0aW50IHJjO1xcbiBcXG4gXFx0aWYgKCFyZXNvdXJjZV9uYW1lIHx8XFxuQEAgLTE2ODcsNiArMTcwMSwxOSBAQCBpbnQgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXFxuIFxcdGlmIChvbmxpbmVfdHlwZSBcXHUwMDNjIE1NT1BfT0ZGTElORSB8fCBvbmxpbmVfdHlwZSBcXHUwMDNlIE1NT1BfT05MSU5FX01PVkFCTEUpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4rXFx0LyogUmVnaXN0ZXIgYSBwcml2YXRlLW5vZGUgb3duZXIgYmVmb3JlIGFkZGluZyBtZW1vcnkuICovXFxuK1xcdGlmIChucCkge1xcbitcXHRcXHRpZiAobWhwX2ZsYWdzIFxcdTAwMjYgTUhQX05JRF9JU19NR0lEKSB7XFxuK1xcdFxcdFxcdGdyb3VwID0gbWVtb3J5X2dyb3VwX2ZpbmRfYnlfaWQobmlkKTtcXG4rXFx0XFx0XFx0aWYgKCFncm91cClcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdFxcdFxcdHJlYWxfbmlkID0gZ3JvdXAtXFx1MDAzZW5pZDtcXG4rXFx0XFx0fVxcbitcXHRcXHRyYyA9IG5vZGVfcHJpdmF0ZV9yZWdpc3RlcihyZWFsX25pZCwgbnApO1xcbitcXHRcXHRpZiAocmMpXFxuK1xcdFxcdFxcdHJldHVybiByYztcXG4rXFx0fVxcbitcXG4gXFx0bG9ja19kZXZpY2VfaG90cGx1ZygpO1xcbiBcXG4gXFx0cmVzID0gcmVnaXN0ZXJfbWVtb3J5X3Jlc291cmNlKHN0YXJ0LCBzaXplLCByZXNvdXJjZV9uYW1lKTtcXG5AQCAtMTcwMSwxMCArMTcyOCw0MSBAQCBpbnQgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXFxuIFxcbiBvdXRfdW5sb2NrOlxcbiBcXHR1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcXG4rXFx0aWYgKHJjIFxcdTAwM2MgMCBcXHUwMDI2XFx1MDAyNiBucClcXG4rXFx0XFx0bm9kZV9wcml2YXRlX3VucmVnaXN0ZXIocmVhbF9uaWQpO1xcbiBcXHRyZXR1cm4gcmM7XFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQsIFxcXCJrbWVtXFxcIik7XFxuIFxcbisvKipcXG4rICogYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkIC0gYWRkIHByaXZhdGUgZHJpdmVyLW1hbmFnZWQgbWVtb3J5XFxuKyAqIEBuaWQ6IE5VTUEgbm9kZSBJRCB3aGVyZSB0aGUgbWVtb3J5IHdpbGwgYmUgYWRkZWRcXG4rICogQHN0YXJ0OiBTdGFydCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgcmFuZ2VcXG4rICogQHNpemU6IFNpemUgb2YgdGhlIG1lbW9yeSByYW5nZSBpbiBieXRlc1xcbisgKiBAcmVzb3VyY2VfbmFtZTogUmVzb3VyY2UgbmFtZSBpbiBmb3JtYXQgXFxcIlN5c3RlbSBSQU0gKCREUklWRVIpXFxcIlxcbisgKiBAbWhwX2ZsYWdzOiBNZW1vcnkgaG90cGx1ZyBmbGFnc1xcbisgKiBAb25saW5lX3R5cGU6IEF1dG8tT25saW5lIGJlaGF2aW9yIChvZmZsaW5lLCBvbmxpbmUsIGtlcm5lbCwgbW92YWJsZSlcXG4rICogQG5wOiBwcml2YXRlIG5vZGUgY29udGV4dCBmb3IgdGhlIG93bmVyIC0gbWFuZGF0b3J5LlxcbisgKlxcbisgKiBBZGQgcHJpdmF0ZSBkcml2ZXItbWFuYWdlZCBtZW1vcnkuICBQcml2YXRlIG5vZGUgY29udGV4dCBpcyByZXF1aXJlZCB0b1xcbisgKiBhdm9pZCB0aGUgbWVtb3J5IGJlaW5nIGFkZGVkIGFzIGEgbm9ybWFsIE5fTUVNT1JZIG5vZGUuXFxuKyAqXFxuKyAqIFNlZSBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQgZm9yIG1vcmUgZGV0YWlscy5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cXG4rICovXFxuK2ludCBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgY29uc3QgY2hhciAqcmVzb3VyY2VfbmFtZSwgbWhwX3QgbWhwX2ZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgICBlbnVtIG1tb3Agb25saW5lX3R5cGUsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKVxcbit7XFxuK1xcdGlmICghbnApXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0cmV0dXJuIF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChuaWQsIHN0YXJ0LCBzaXplLCByZXNvdXJjZV9uYW1lLFxcbitcXHRcXHRcXHRcXHRcXHQgICBtaHBfZmxhZ3MsIG9ubGluZV90eXBlLCBucCk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKTtcXG4rXFxuIC8qKlxcbiAgKiBhZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkIC0gYWRkIGRyaXZlci1tYW5hZ2VkIG1lbW9yeVxcbiAgKiBAbmlkOiBOVU1BIG5vZGUgSUQgd2hlcmUgdGhlIG1lbW9yeSB3aWxsIGJlIGFkZGVkXFxuQEAgLTE3MjUsNyArMTc4Myw3IEBAIGludCBhZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXFxuIHtcXG4gXFx0cmV0dXJuIF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChuaWQsIHN0YXJ0LCBzaXplLCByZXNvdXJjZV9uYW1lLFxcbiBcXHRcXHRcXHRtaHBfZmxhZ3MsXFxuLVxcdFxcdFxcdG1ocF9nZXRfZGVmYXVsdF9vbmxpbmVfdHlwZSgpKTtcXG4rXFx0XFx0XFx0bWhwX2dldF9kZWZhdWx0X29ubGluZV90eXBlKCksIE5VTEwpO1xcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGFkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQpO1xcbiBcXG5AQCAtMTg0MywxMSArMTkwMSwxMiBAQCBzdGF0aWMgaW50IHNjYW5fbW92YWJsZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCxcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4rc3RhdGljIGludCBkb19taWdyYXRlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXFxuIHtcXG4gXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4gXFx0dW5zaWduZWQgbG9uZyBwZm47XFxuIFxcdExJU1RfSEVBRChzb3VyY2UpO1xcbitcXHRpbnQgZXJyID0gMDtcXG4gXFx0c3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUobWlncmF0ZV9ycywgREVGQVVMVF9SQVRFTElNSVRfSU5URVJWQUwsXFxuIFxcdFxcdFxcdFxcdCAgICAgIERFRkFVTFRfUkFURUxJTUlUX0JVUlNUKTtcXG4gXFxuQEAgLTE4ODQsNiArMTk0MywxNSBAQCBzdGF0aWMgdm9pZCBkb19taWdyYXRlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXFxuIFxcdFxcdFxcdGdvdG8gcHV0X2ZvbGlvO1xcbiBcXHRcXHR9XFxuIFxcbitcXHRcXHQvKiBGYWlsIG91dHJpZ2h0IG9uIHByaXZhdGUgbm9kZXMgdy9vIGhvdHVucGx1ZyBzdXBwb3J0ICovXFxuK1xcdFxcdGlmICghbm9kZV9hbGxvd3NfaG90dW5wbHVnKGZvbGlvX25pZChmb2xpbykpKSB7XFxuK1xcdFxcdFxcdHByX2luZm9fcmF0ZWxpbWl0ZWQoXFxcIm1lbW9yeSBvZmZsaW5lIHJlZnVzZWQ6IG5vZGUgJWQgcGZuICVseFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIGZvbGlvX25pZChmb2xpbyksIHBmbik7XFxuK1xcdFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuK1xcdFxcdFxcdGVyciA9IC1FQlVTWTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFxuIFxcdFxcdGlmICghaXNvbGF0ZV9mb2xpb190b19saXN0KGZvbGlvLCBcXHUwMDI2c291cmNlKSkge1xcbiBcXHRcXHRcXHRpZiAoX19yYXRlbGltaXQoXFx1MDAyNm1pZ3JhdGVfcnMpKSB7XFxuIFxcdFxcdFxcdFxcdHByX3dhcm4oXFxcImZhaWxlZCB0byBpc29sYXRlIHBmbiAlbHhcXFxcblxcXCIsXFxuQEAgLTE5MzEsNiArMTk5OSw3IEBAIHN0YXRpYyB2b2lkIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcXG4gXFx0XFx0XFx0cHV0YmFja19tb3ZhYmxlX3BhZ2VzKFxcdTAwMjZzb3VyY2UpO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4rXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG4gc3RhdGljIGludCBfX2luaXQgY21kbGluZV9wYXJzZV9tb3ZhYmxlX25vZGUoY2hhciAqcClcXG5AQCAtMjAyOSw3ICsyMDk4LDcgQEAgaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuIFxcdC8qXFxuIFxcdCAqIENoZWNrIHdoZXRoZXIgdGhlIG5vZGUgd2lsbCBoYXZlIG5vIHByZXNlbnQgcGFnZXMgYWZ0ZXIgd2Ugb2ZmbGluZVxcbiBcXHQgKiAnbnJfcGFnZXMnIG1vcmUuIElmIHNvLCB3ZSBrbm93IHRoYXQgdGhlIG5vZGUgd2lsbCBiZWNvbWUgZW1wdHksIGFuZFxcbi1cXHQgKiBzbyB3ZSB3aWxsIGNsZWFyIE5fTUVNT1JZIGZvciBpdC5cXG4rXFx0ICogc28gd2Ugd2lsbCBjbGVhciBOX01FTU9SWShfUFJJVkFURSkgZm9yIGl0LlxcbiBcXHQgKi9cXG4gXFx0aWYgKG5yX3BhZ2VzIFxcdTAwM2U9IHBnZGF0LVxcdTAwM2Vub2RlX3ByZXNlbnRfcGFnZXMpIHtcXG4gXFx0XFx0bm9kZV9hcmcubmlkID0gbm9kZTtcXG5AQCAtMjA2NywxMCArMjEzNiwxMSBAQCBpbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4gXFx0XFx0XFx0cmV0ID0gc2Nhbl9tb3ZhYmxlX3BhZ2VzKHBmbiwgZW5kX3BmbiwgXFx1MDAyNnBmbik7XFxuIFxcdFxcdFxcdGlmICghcmV0KSB7XFxuIFxcdFxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdFxcdCAqIFRPRE86IGZhdGFsIG1pZ3JhdGlvbiBmYWlsdXJlcyBzaG91bGQgYmFpbFxcbi1cXHRcXHRcXHRcXHQgKiBvdXRcXG4rXFx0XFx0XFx0XFx0ICogQSBmYXRhbCBtaWdyYXRpb24gZmFpbHVyZSAoZS5nLiBhIGZvbGlvIG9uIGFcXG4rXFx0XFx0XFx0XFx0ICogbm9uLW1pZ3JhdGFibGUgcHJpdmF0ZSBub2RlKSBiYWlscyBvdXQ7IHRyYW5zaWVudFxcbitcXHRcXHRcXHRcXHQgKiBmYWlsdXJlcyBsZWF2ZSByZXQgemVybyBhbmQgYXJlIHJldHJpZWQgYmVsb3cuXFxuIFxcdFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRcXHRkb19taWdyYXRlX3JhbmdlKHBmbiwgZW5kX3Bmbik7XFxuK1xcdFxcdFxcdFxcdHJldCA9IGRvX21pZ3JhdGVfcmFuZ2UocGZuLCBlbmRfcGZuKTtcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHR9IHdoaWxlICghcmV0KTtcXG4gXFxuQEAgLTIxMzMsOCArMjIwMywxMCBAQCBpbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4gXFx0ICogTWFrZSBzdXJlIHRvIG1hcmsgdGhlIG5vZGUgYXMgbWVtb3J5LWxlc3MgYmVmb3JlIHJlYnVpbGRpbmcgdGhlIHpvbmVcXG4gXFx0ICogbGlzdC4gT3RoZXJ3aXNlIHRoaXMgbm9kZSB3b3VsZCBzdGlsbCBhcHBlYXIgaW4gdGhlIGZhbGxiYWNrIGxpc3RzLlxcbiBcXHQgKi9cXG4tXFx0aWYgKG5vZGVfYXJnLm5pZCBcXHUwMDNlPSAwKVxcbitcXHRpZiAobm9kZV9hcmcubmlkIFxcdTAwM2U9IDApIHtcXG4gXFx0XFx0bm9kZV9jbGVhcl9zdGF0ZShub2RlLCBOX01FTU9SWSk7XFxuK1xcdFxcdG5vZGVfY2xlYXJfc3RhdGUobm9kZSwgTl9NRU1PUllfUFJJVkFURSk7XFxuK1xcdH1cXG4gXFx0aWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkge1xcbiBcXHRcXHR6b25lX3BjcF9yZXNldCh6b25lKTtcXG4gXFx0XFx0YnVpbGRfYWxsX3pvbmVsaXN0cyhOVUxMKTtcXG5AQCAtMjE5OCw2ICsyMjcwLDE1IEBAIHN0YXRpYyBpbnQgY291bnRfbWVtb3J5X3JhbmdlX2FsdG1hcHNfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbitzdGF0aWMgaW50IGNvbGxlY3RfbWVtYmxvY2tfbm9kZXNfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXFxuK3tcXG4rXFx0bm9kZW1hc2tfdCAqbm9kZXMgPSBhcmc7XFxuK1xcbitcXHRpZiAobWVtLVxcdTAwM2VuaWQgIT0gTlVNQV9OT19OT0RFKVxcbitcXHRcXHRub2RlX3NldChtZW0tXFx1MDAzZW5pZCwgKm5vZGVzKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnQgY2hlY2tfY3B1X29uX25vZGUoaW50IG5pZClcXG4ge1xcbiBcXHRpbnQgY3B1O1xcbkBAIC0yNDYxLDEwICsyNTQyLDExIEBAIEVYUE9SVF9TWU1CT0xfR1BMKG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnkpO1xcbiBpbnQgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMoY29uc3Qgc3RydWN0IHJhbmdlICpyYW5nZXMsXFxuIFxcdFxcdHVuc2lnbmVkIGludCBucl9yYW5nZXMpXFxuIHtcXG4rXFx0bm9kZW1hc2tfdCBub2RlcyA9IE5PREVfTUFTS19OT05FO1xcbiBcXHR1bnNpZ25lZCBsb25nIG1iX2NvdW50ID0gMDtcXG4gXFx0dWludDhfdCAqb25saW5lX3R5cGVzLCAqdG1wO1xcbiBcXHR1bnNpZ25lZCBpbnQgaTtcXG4tXFx0aW50IHJjID0gMDtcXG4rXFx0aW50IG5pZCwgcmMgPSAwO1xcbiBcXG4gXFx0aWYgKCFyYW5nZXMgfHwgIW5yX3JhbmdlcylcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuQEAgLTI0OTIsNiArMjU3NCwxMSBAQCBpbnQgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMoY29uc3Qgc3RydWN0IHJhbmdlICpyYW5nZXMsXFxuIFxcbiBcXHRsb2NrX2RldmljZV9ob3RwbHVnKCk7XFxuIFxcbitcXHQvKiBSZWNvcmQgdGhlIG5vZGVzIGZvciB0aGUgYmxvY2tzIHRvIGRyb3AgcHJpdmF0ZS1ub2RlIGRhdGEgYWZ0ZXIgKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3JhbmdlczsgaSsrKVxcbitcXHRcXHR3YWxrX21lbW9yeV9ibG9ja3MocmFuZ2VzW2ldLnN0YXJ0LCByYW5nZV9sZW4oXFx1MDAyNnJhbmdlc1tpXSksXFxuK1xcdFxcdFxcdFxcdCAgIFxcdTAwMjZub2RlcywgY29sbGVjdF9tZW1ibG9ja19ub2Rlc19jYik7XFxuK1xcbiBcXHQvKlxcbiBcXHQgKiBQaGFzZSAxOiBvZmZsaW5lIGV2ZXJ5IGJsb2NrIGluIGV2ZXJ5IHJhbmdlLiAgQW4gYWxyZWFkeS1vZmZsaW5lXFxuIFxcdCAqIGJsb2NrIGZvbGRzIHRvIHN1Y2Nlc3MsIHNvIG91dC1vZi1iYW5kIG9mZmxpbmluZyBuZXZlciBibG9ja3MgdW5wbHVnLlxcbkBAIC0yNTIyLDYgKzI2MDksMTAgQEAgaW50IG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzKGNvbnN0IHN0cnVjdCByYW5nZSAqcmFuZ2VzLFxcbiBvdXRfdW5sb2NrOlxcbiBcXHR1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcXG4gXFxuK1xcdC8qIERyb3AgcHJpdmF0ZSBub2RlIHJlZ2lzdHJhdGlvbiBpZiB0aGV5IGFyZSBub3cgbWVtb3J5bGVzcyAqL1xcbitcXHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBub2RlcylcXG4rXFx0XFx0bm9kZV9wcml2YXRlX3VucmVnaXN0ZXIobmlkKTtcXG4rXFxuIFxcdGtmcmVlKG9ubGluZV90eXBlcyk7XFxuIFxcdHJldHVybiByYztcXG4gfVxcbmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jXFxuaW5kZXggNTcyMGY3ZjU0ZDk0MmYuLjIzYzRjMjUwOTc0NTA0IDEwMDY0NFxcbi0tLSBhL21tL21lbXBvbGljeS5jXFxuKysrIGIvbW0vbWVtcG9saWN5LmNcXG5AQCAtMTExLDYgKzExMSw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tbXVfbm90aWZpZXIuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3ByaW50ay5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbGVhZm9wcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9nY2QuaFxcdTAwM2VcXG4gXFxuICNpbmNsdWRlIFxcdTAwM2Nhc20vdGxiZmx1c2guaFxcdTAwM2VcXG5AQCAtNDA1LDcgKzQwNiw3IEBAIHN0YXRpYyBpbnQgbXBvbF9uZXdfcHJlZmVycmVkKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMpXFxuIHN0YXRpYyBpbnQgbXBvbF9zZXRfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxcbiBcXHRcXHQgICAgIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzLCBzdHJ1Y3Qgbm9kZW1hc2tfc2NyYXRjaCAqbnNjKVxcbiB7XFxuLVxcdGludCByZXQ7XFxuK1xcdGludCByZXQsIG5pZDtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIERlZmF1bHQgKHBvbD09TlVMTCkgcmVzcC4gbG9jYWwgbWVtb3J5IHBvbGljaWVzIGFyZSBub3QgYVxcbkBAIC00MzEsNiArNDMyLDIzIEBAIHN0YXRpYyBpbnQgbXBvbF9zZXRfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxcbiBcXHRlbHNlXFxuIFxcdFxcdHBvbC1cXHUwMDNldy5jcHVzZXRfbWVtc19hbGxvd2VkID0gY3B1c2V0X2N1cnJlbnRfbWVtc19hbGxvd2VkO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogUHJpdmF0ZSBub2RlcyBhcmUgbm90IGluIGNwdXNldC5tZW1zLCBzbyB0aGV5J3JlIGFsd2F5cyBzdHJpcHBlZC5cXG4rXFx0ICogRHJpdmVyLWFsbG9jYXRlZCBwb2xpY2llcyAoTVBPTF9GX1BSSVZBVEUpIGFuZCBDQVBfVVNFUl9OVU1BIHByaXZhdGVcXG4rXFx0ICogbm9kZXMgc2hvdWxkIGJlIGFkZGVkIGJhY2sgaW50byB0aGUgbm9kZW1hc2suXFxuK1xcdCAqL1xcbitcXHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCAqbm9kZXMpIHtcXG4rXFx0XFx0aWYgKCFub2RlX2lzX3ByaXZhdGUobmlkKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGlmICgocG9sLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1QT0xfRl9QUklWQVRFKSB8fFxcbitcXHRcXHQgICAgbm9kZV9hbGxvd3NfdXNlcl9udW1hKG5pZCkpXFxuK1xcdFxcdFxcdG5vZGVfc2V0KG5pZCwgbnNjLVxcdTAwM2VtYXNrMik7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIElmIGFueSBwcml2YXRlIG5vZGVzIGxlZnQgaW4gdGhlIG5vZGVtYXNrIC0gYWRkIHRoZSBwcml2YXRlIGZsYWcgKi9cXG4rXFx0aWYgKG5vZGVzX2ludGVyc2VjdHMobnNjLVxcdTAwM2VtYXNrMiwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pKVxcbitcXHRcXHRwb2wtXFx1MDAzZWZsYWdzIHw9IE1QT0xfRl9QUklWQVRFO1xcbitcXG4gXFx0cmV0ID0gbXBvbF9vcHNbcG9sLVxcdTAwM2Vtb2RlXS5jcmVhdGUocG9sLCBcXHUwMDI2bnNjLVxcdTAwM2VtYXNrMik7XFxuIFxcdHJldHVybiByZXQ7XFxuIH1cXG5AQCAtNDk2LDcgKzUxNCw3IEBAIHZvaWQgX19tcG9sX3B1dChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuIFxcdCAqL1xcbiBcXHRrZnJlZV9yY3UocG9sLCByY3UpO1xcbiB9XFxuLUVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMoX19tcG9sX3B1dCwgXFxcImt2bVxcXCIpO1xcbitFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKF9fbXBvbF9wdXQsIFxcXCJrdm0sa21lbVxcXCIpO1xcbiBcXG4gc3RhdGljIHZvaWQgbXBvbF9yZWJpbmRfZGVmYXVsdChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxcbiB7XFxuQEAgLTUwNCwyMiArNTIyLDMzIEBAIHN0YXRpYyB2b2lkIG1wb2xfcmViaW5kX2RlZmF1bHQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBjb25zdCBub2RlbWFza190ICpub2RlcylcXG4gXFxuIHN0YXRpYyB2b2lkIG1wb2xfcmViaW5kX25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMpXFxuIHtcXG4tXFx0bm9kZW1hc2tfdCB0bXA7XFxuK1xcdG5vZGVtYXNrX3QgdG1wLCBwcml2O1xcbitcXG4rXFx0LyogcHJlc2VydmUgb25saW5lIHByaXZhdGUgbm9kZXMgdG8gcmUtYWRkIGxhdGVyICovXFxuK1xcdG5vZGVzX2FuZChwcml2LCBwb2wtXFx1MDAzZW5vZGVzLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XFxuIFxcbiBcXHRpZiAocG9sLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1QT0xfRl9TVEFUSUNfTk9ERVMpXFxuIFxcdFxcdG5vZGVzX2FuZCh0bXAsIHBvbC1cXHUwMDNldy51c2VyX25vZGVtYXNrLCAqbm9kZXMpO1xcbi1cXHRlbHNlIGlmIChwb2wtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTVBPTF9GX1JFTEFUSVZFX05PREVTKVxcbi1cXHRcXHRtcG9sX3JlbGF0aXZlX25vZGVtYXNrKFxcdTAwMjZ0bXAsIFxcdTAwMjZwb2wtXFx1MDAzZXcudXNlcl9ub2RlbWFzaywgbm9kZXMpO1xcbi1cXHRlbHNlIHtcXG4rXFx0ZWxzZSBpZiAocG9sLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1QT0xfRl9SRUxBVElWRV9OT0RFUykge1xcbitcXHRcXHQvKiBmb2xkIG9ubHkgdGhlIHB1YmxpYyBwYXJ0OiBhIHByaXZhdGUgbm9kZSBtdXN0IG5vdCB0YWtlIGEgc2xvdCAqL1xcbitcXHRcXHRub2Rlc19hbmQodG1wLCBwb2wtXFx1MDAzZXcudXNlcl9ub2RlbWFzaywgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcXG4rXFx0XFx0bXBvbF9yZWxhdGl2ZV9ub2RlbWFzayhcXHUwMDI2dG1wLCBcXHUwMDI2dG1wLCBub2Rlcyk7XFxuK1xcdH0gZWxzZSB7XFxuIFxcdFxcdG5vZGVzX3JlbWFwKHRtcCwgcG9sLVxcdTAwM2Vub2RlcywgcG9sLVxcdTAwM2V3LmNwdXNldF9tZW1zX2FsbG93ZWQsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCpub2Rlcyk7XFxuIFxcdFxcdHBvbC1cXHUwMDNldy5jcHVzZXRfbWVtc19hbGxvd2VkID0gKm5vZGVzO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAobm9kZXNfZW1wdHkodG1wKSlcXG4rXFx0LyogcHJpdmF0ZSBub2RlcyBhcmUgaWRlbnRpdHktbWFwcGVkIGR1cmluZyByZW1hcCwgZHJvcCB0aGVtIGhlcmUgKi9cXG4rXFx0bm9kZXNfYW5kKHRtcCwgdG1wLCBub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xcbitcXHRpZiAobm9kZXNfZW1wdHkodG1wKSBcXHUwMDI2XFx1MDAyNiBub2Rlc19lbXB0eShwcml2KSlcXG4gXFx0XFx0dG1wID0gKm5vZGVzO1xcbiBcXG4tXFx0cG9sLVxcdTAwM2Vub2RlcyA9IHRtcDtcXG4rXFx0LyogSWYgYW55IG9ubGluZSBwcml2YXRlIG5vZGVzIHJlbWFpbiwgYWRkIHRoZW0gYmFjayAqL1xcbitcXHRub2Rlc19vcihwb2wtXFx1MDAzZW5vZGVzLCB0bXAsIHByaXYpO1xcbitcXHQvKiBJZiBubyBvbmxpbmUgcHJpdmF0ZSBub2RlcyByZW1haW4sIHN0cmlwIHRoZSBwcml2YXRlIGZsYWcgKi9cXG4rXFx0aWYgKG5vZGVzX2VtcHR5KHByaXYpKVxcbitcXHRcXHRwb2wtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5NUE9MX0ZfUFJJVkFURTtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgbXBvbF9yZWJpbmRfcHJlZmVycmVkKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcXG5AQCAtNjY4LDYgKzY5Nyw4IEBAIHN0YXRpYyB2b2lkIHF1ZXVlX2ZvbGlvc19wbWQocG1kX3QgKnBtZCwgc3RydWN0IG1tX3dhbGsgKndhbGspXFxuIFxcdH1cXG4gXFx0aWYgKCFxdWV1ZV9mb2xpb19yZXF1aXJlZChmb2xpbywgcXApKVxcbiBcXHRcXHRyZXR1cm47XFxuK1xcdGlmICghbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKVxcbitcXHRcXHRyZXR1cm47XFxuIFxcdGlmICghKHFwLVxcdTAwM2VmbGFncyBcXHUwMDI2IChNUE9MX01GX01PVkUgfCBNUE9MX01GX01PVkVfQUxMKSkgfHxcXG4gXFx0ICAgICF2bWFfbWlncmF0YWJsZSh3YWxrLVxcdTAwM2V2bWEpIHx8XFxuIFxcdCAgICAhbWlncmF0ZV9mb2xpb19hZGQoZm9saW8sIHFwLVxcdTAwM2VwYWdlbGlzdCwgcXAtXFx1MDAzZWZsYWdzKSlcXG5AQCAtNzIyLDcgKzc1Myw4IEBAIHN0YXRpYyBpbnQgcXVldWVfZm9saW9zX3B0ZV9yYW5nZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHR9XFxuIFxcdFxcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xcbi1cXHRcXHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4rXFx0XFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHxcXG4rXFx0XFx0ICAgICFub2RlX2FsbG93c191c2VyX251bWEoZm9saW9fbmlkKGZvbGlvKSkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykgXFx1MDAyNlxcdTAwMjYgbWF4X25yICE9IDEpXFxuIFxcdFxcdFxcdG5yID0gZm9saW9fcHRlX2JhdGNoKGZvbGlvLCBwdGUsIHB0ZW50LCBtYXhfbnIpO1xcbkBAIC03OTcsNiArODI5LDggQEAgc3RhdGljIGludCBxdWV1ZV9mb2xpb3NfaHVnZXRsYihwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGhtYXNrLFxcbiBcXHRmb2xpbyA9IHBmbl9mb2xpbyhwdGVfcGZuKHB0ZXApKTtcXG4gXFx0aWYgKCFxdWV1ZV9mb2xpb19yZXF1aXJlZChmb2xpbywgcXApKVxcbiBcXHRcXHRnb3RvIHVubG9jaztcXG4rXFx0aWYgKCFub2RlX2FsbG93c191c2VyX251bWEoZm9saW9fbmlkKGZvbGlvKSkpXFxuK1xcdFxcdGdvdG8gdW5sb2NrO1xcbiBcXHRpZiAoIShmbGFncyBcXHUwMDI2IChNUE9MX01GX01PVkUgfCBNUE9MX01GX01PVkVfQUxMKSkgfHxcXG4gXFx0ICAgICF2bWFfbWlncmF0YWJsZSh3YWxrLVxcdTAwM2V2bWEpKSB7XFxuIFxcdFxcdHFwLVxcdTAwM2Vucl9mYWlsZWQrKztcXG5AQCAtODQwLDcgKzg3NCw3IEBAIGJvb2wgZm9saW9fY2FuX21hcF9wcm90X251bWEoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIHtcXG4gXFx0aW50IG5pZDtcXG4gXFxuLVxcdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8IGZvbGlvX3Rlc3Rfa3NtKGZvbGlvKSlcXG4rXFx0aWYgKCFmb2xpbyB8fCAhZm9saW9fYWxsb3dzX251bWFfYmFsYW5jZShmb2xpbykgfHwgZm9saW9fdGVzdF9rc20oZm9saW8pKVxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcbiBcXHQvKiBBbHNvIHNraXAgc2hhcmVkIGNvcHktb24td3JpdGUgZm9saW9zICovXFxuQEAgLTExMDYsNiArMTE0MCw5MiBAQCBzdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbisvKlxcbisgKiBCdWlsZCBhIHJlZmNvdW50ZWQgTVBPTF9CSU5EIHBvbGljeSB0YXJnZXRpbmcgdGhlIHNpbmdsZSBub2RlIEBuaWQsXFxuKyAqIGNvbnRleHR1YWxpc2VkIHRvIHRoZSBjYWxsZXIncyBjcHVzZXQgbGlrZSBhIHVzZXJzcGFjZSBtYmluZCgpLlxcbisgKlxcbisgKiBAZmxhZ3MgaXMgTVBPTF9GX1BSSVZBVEUgZm9yIHRoZSBhbiBleHBsaWNpdCBpbi1rZXJuZWwgdXNlciwgbGV0dGluZ1xcbisgKiBhIHByaXZhdGUgbm9kZSBiZSBib3VuZCB3aXRob3V0IGNoZWNraW5nIENBUF9VU0VSX05VTUEuICBPdGhlcndpc2UsXFxuKyAqIENBUF9VU0VSX05VTUEgaXMgZW5mb3JjZWQuXFxuKyAqXFxuKyAqIFRoZSBjYWxsZXIgb3ducyB0aGUgcmVmZXJlbmNlIGFuZCBmcmVlcyBpdCB3aXRoIG1wb2xfcHV0KCkuXFxuKyAqL1xcbitzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqX19tcG9sX2JpbmRfbm9kZShpbnQgbmlkLCB1bnNpZ25lZCBzaG9ydCBmbGFncylcXG4re1xcbitcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XFxuK1xcdG5vZGVtYXNrX3Qgbm9kZXM7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xcbitcXG4rXFx0aWYgKCFzY3JhdGNoKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcXG4rXFxuK1xcdG5vZGVzX2NsZWFyKG5vZGVzKTtcXG4rXFx0bm9kZV9zZXQobmlkLCBub2Rlcyk7XFxuK1xcbitcXHRwb2wgPSBtcG9sX25ldyhNUE9MX0JJTkQsIGZsYWdzLCBcXHUwMDI2bm9kZXMpO1xcbitcXHRpZiAoSVNfRVJSKHBvbCkpIHtcXG4rXFx0XFx0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xcbitcXHRcXHRyZXR1cm4gcG9sO1xcbitcXHR9XFxuK1xcbitcXHRlcnIgPSBtcG9sX3NldF9ub2RlbWFzayhwb2wsIFxcdTAwMjZub2Rlcywgc2NyYXRjaCk7XFxuK1xcdE5PREVNQVNLX1NDUkFUQ0hfRlJFRShzY3JhdGNoKTtcXG4rXFx0aWYgKGVycikge1xcbitcXHRcXHRtcG9sX3B1dChwb2wpO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xcbitcXHR9XFxuK1xcdHJldHVybiBwb2w7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBtcG9sX3ByaXZhdGVfYmluZCAtIGJ1aWxkIGFuIE1QT0xfQklORCBwb2xpY3kgcGlubmVkIHRvIGEgcHJpdmF0ZSBub2RlXFxuKyAqIEBuaWQ6IGFuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZVxcbisgKlxcbisgKiBSZXR1cm5zIGEgcmVmY291bnRlZCBtZW1wb2xpY3kgdGhhdCBiaW5kcyBhbGxvY2F0aW9ucyB0byBAbmlkIHdpdGggdGhlXFxuKyAqIHByaXZhdGUtcGxhY2VtZW50IGludGVudCAoTVBPTF9GX1BSSVZBVEUpLiAgVGhpcyBiaW5kcyB0byBAbmlkIHJlZ2FyZGxlc3NcXG4rICogb2YgdGhlIG5vZGUncyBDQVBfVVNFUl9OVU1BLCBwcm92aWRpbmcgYSBwcml2aWxlZ2VkIHdheSBmb3Igbm9kZS1vd25lcnNcXG4rICogdG8gYmluZCBkcml2ZXIvc2VydmljZSBvd25lZCBWTUFzIHRvIHRoZSBub2RlLlxcbisgKlxcbisgKiBMaWtlIGFueSBNUE9MX0JJTkQgaXQgaXMgcmVsYXhhYmxlOiBhbiB1bnNhdGlzZmlhYmxlIHJlcXVlc3QgZmFsbHMgYmFja1xcbisgKiByYXRoZXIgdGhhbiBmYWlsaW5nLlxcbisgKlxcbisgKiBNdXN0IGJlIGNhbGxlZCB3aGlsZSBAbmlkIGlzIE5fTUVNT1JZX1BSSVZBVEUuXFxuKyAqXFxuKyAqIFRoZSBjYWxsZXIgb3ducyB0aGUgcmVmZXJlbmNlIGFuZCBmcmVlcyBpdCB3aXRoIG1wb2xfcHV0KCkuXFxuKyAqXFxuKyAqIFJldHVybjogdGhlIHBvbGljeSwgb3IgYW4gRVJSX1BUUiBvbiBmYWlsdXJlLlxcbisgKi9cXG4rc3RydWN0IG1lbXBvbGljeSAqbXBvbF9wcml2YXRlX2JpbmQoaW50IG5pZClcXG4re1xcbitcXHRpZiAoIW5vZGVfaXNfcHJpdmF0ZShuaWQpKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4rXFx0cmV0dXJuIF9fbXBvbF9iaW5kX25vZGUobmlkLCBNUE9MX0ZfUFJJVkFURSk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3ByaXZhdGVfYmluZCwgXFxcImttZW1cXFwiKTtcXG4rXFxuKy8qKlxcbisgKiBtcG9sX2JpbmRfbm9kZSAtIGJ1aWxkIGFuIE1QT0xfQklORCBwb2xpY3kgdGFyZ2V0aW5nIEBuaWQgZm9yIGluLWtlcm5lbCB1c2VcXG4rICogQG5pZDogdGhlIG5vZGUgdG8gYmluZCB0b1xcbisgKlxcbisgKiBSZXR1cm5zIGEgcmVmY291bnRlZCBNUE9MX0JJTkQgcG9saWN5IHRoYXQgcGxhY2VzIGFsbG9jYXRpb25zIG9uIEBuaWQsXFxuKyAqIGNvbnRleHR1YWxpc2VkIHRvIHRoZSBjYWxsZXIncyBjcHVzZXQgZXhhY3RseSBsaWtlIGEgdXNlcnNwYWNlIG1iaW5kKCkuXFxuKyAqXFxuKyAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSB1c2VkIGJ5IHNlcnZpY2VzIGltcGxlbnRpbmcgbWVtcG9saWN5IHN1cHBvcnQgd2l0aFxcbisgKiB1c2VyLXByb3ZpZGVkIG5vZGUgYmluZGluZ3MuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZSBiaW5kaW5ncyBhcmUgaG9ub3JlZCBpZlxcbisgKiB0aGUgbm9kZSBoYXMgQ0FQX1VTRVJfTlVNQSwgb3RoZXJ3aXNlIHJldHVybiAtRUlOVkFMLlxcbisgKlxcbisgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHJlZmVyZW5jZSBhbmQgZnJlZXMgaXQgd2l0aCBtcG9sX3B1dCgpLlxcbisgKlxcbisgKiBSZXR1cm46IHRoZSBwb2xpY3ksIG9yIGFuIEVSUl9QVFIgb24gZmFpbHVyZS5cXG4rICovXFxuK3N0cnVjdCBtZW1wb2xpY3kgKm1wb2xfYmluZF9ub2RlKGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIF9fbXBvbF9iaW5kX25vZGUobmlkLCAwKTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfYmluZF9ub2RlLCBcXFwia3ZtXFxcIik7XFxuK1xcbiAvKlxcbiAgKiBSZXR1cm4gbm9kZW1hc2sgZm9yIHBvbGljeSBmb3IgZ2V0X21lbXBvbGljeSgpIHF1ZXJ5XFxuICAqXFxuQEAgLTEyOTQsNiArMTQxNCw4IEBAIHN0YXRpYyBsb25nIG1pZ3JhdGVfdG9fbm9kZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaW50IHNvdXJjZSwgaW50IGRlc3QsXFxuIFxcdFxcdC5uaWQgPSBkZXN0LFxcbiBcXHRcXHQuZ2ZwX21hc2sgPSBHRlBfSElHSFVTRVJfTU9WQUJMRSB8IF9fR0ZQX1RISVNOT0RFLFxcbiBcXHRcXHQucmVhc29uID0gTVJfU1lTQ0FMTCxcXG4rXFx0XFx0LmFsbG9jX2ZsYWdzID0gbm9kZV9pc19wcml2YXRlKGRlc3QpID9cXG4rXFx0XFx0XFx0IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOiBBTExPQ19ERUZBVUxULFxcbiBcXHR9O1xcbiBcXG4gXFx0bm9kZXNfY2xlYXIobm1hc2spO1xcbkBAIC0xODY3LDkgKzE5ODksMTAgQEAgc3RhdGljIGludCBrZXJuZWxfbWlncmF0ZV9wYWdlcyhwaWRfdCBwaWQsIHVuc2lnbmVkIGxvbmcgbWF4bm9kZSxcXG4gXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7XFxuIFxcdG5vZGVtYXNrX3QgdGFza19ub2RlcztcXG4tXFx0aW50IGVycjtcXG4rXFx0bm9kZW1hc2tfdCBwcml2X29rO1xcbiBcXHRub2RlbWFza190ICpvbGQ7XFxuIFxcdG5vZGVtYXNrX3QgKm5ldztcXG4rXFx0aW50IGVyciwgbmlkO1xcbiBcXHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xcbiBcXG4gXFx0aWYgKCFzY3JhdGNoKVxcbkBAIC0xOTA5LDcgKzIwMzIsMTQgQEAgc3RhdGljIGludCBrZXJuZWxfbWlncmF0ZV9wYWdlcyhwaWRfdCBwaWQsIHVuc2lnbmVkIGxvbmcgbWF4bm9kZSxcXG4gXFx0fVxcbiBcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFxuK1xcdC8qIFByaXZhdGUgbm9kZXMgYXJlIHN0cmlwcGVkIGJ5IGNwdXNldCBjaGVja3MuIEFsbG93IGVsaWdpYmxlIG9uZXMuICovXFxuK1xcdG5vZGVzX2NsZWFyKHByaXZfb2spO1xcbitcXHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCAqbmV3KVxcbitcXHRcXHRpZiAobm9kZV9pc19wcml2YXRlKG5pZCkgXFx1MDAyNlxcdTAwMjYgbm9kZV9hbGxvd3NfdXNlcl9udW1hKG5pZCkpXFxuK1xcdFxcdFxcdG5vZGVfc2V0KG5pZCwgcHJpdl9vayk7XFxuK1xcbiBcXHR0YXNrX25vZGVzID0gY3B1c2V0X21lbXNfYWxsb3dlZCh0YXNrKTtcXG4rXFx0bm9kZXNfb3IodGFza19ub2RlcywgdGFza19ub2RlcywgcHJpdl9vayk7XFxuIFxcdC8qIElzIHRoZSB1c2VyIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSB0YXJnZXQgbm9kZXM/ICovXFxuIFxcdGlmICghbm9kZXNfc3Vic2V0KCpuZXcsIHRhc2tfbm9kZXMpIFxcdTAwMjZcXHUwMDI2ICFjYXBhYmxlKENBUF9TWVNfTklDRSkpIHtcXG4gXFx0XFx0ZXJyID0gLUVQRVJNO1xcbkBAIC0xOTE3LDYgKzIwNDcsNyBAQCBzdGF0aWMgaW50IGtlcm5lbF9taWdyYXRlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBtYXhub2RlLFxcbiBcXHR9XFxuIFxcbiBcXHR0YXNrX25vZGVzID0gY3B1c2V0X21lbXNfYWxsb3dlZChjdXJyZW50KTtcXG4rXFx0bm9kZXNfb3IodGFza19ub2RlcywgdGFza19ub2RlcywgcHJpdl9vayk7XFxuIFxcdGlmICghbm9kZXNfYW5kKCpuZXcsICpuZXcsIHRhc2tfbm9kZXMpKVxcbiBcXHRcXHRnb3RvIG91dF9wdXQ7XFxuIFxcbkBAIC0yMDcxLDYgKzIyMDIsMzQgQEAgYm9vbCB2bWFfcG9saWN5X21vZihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSlcXG4gXFx0cmV0dXJuIG1vZjtcXG4gfVxcbiBcXG4rLypcXG4rICogdHJ1ZSBpZiBhbnkgcG9saWN5ICpwcml2YXRlKiBub2RlIGNhbiBzYXRpc2Z5IGEgIV9fR0ZQX01PVkFCTEUgYWxsb2NhdGlvbi5cXG4rICogUG9saWNpZXMgd2l0aG91dCBwcml2YXRlIG5vZGVzICh+TVBPTF9GX1BSSVZBVEUpIGFsd2F5cyByZXR1cm4gZmFsc2UuXFxuKyAqXFxuKyAqIFRoaXMgcHJvdmlkZXMgYSB3YXkgZm9yIG90aGVyd2lzZS1ib3VuZCBrZXJuZWwgYWxsb2NhdGlvbnMgdG8gbWFrZSB0aGVpclxcbisgKiB3YXkgb250byBwcml2YXRlIG5vZGVzIHdpdGggWk9ORV9OT1JNQUwgbWVtb3J5IHdpdGhvdXQgaGF2aW5nIHRvIGF1ZGl0XFxuKyAqIGV2ZXJ5IGNhbGxlci4gIFRoZSBjb3N0IGlzIGEgem9uZSBzY2FuIGZvciBwcml2YXRlIG5vZGVzIGluIHRoZSBtYXNrLlxcbisgKi9cXG4rc3RhdGljIGJvb2wgcG9saWN5X3ByaXZhdGVfaGFzX2tlcm5lbF96b25lKGNvbnN0IHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcXG4re1xcbitcXHRpbnQgbmlkO1xcbitcXG4rXFx0aWYgKCEocG9sLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1QT0xfRl9QUklWQVRFKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcG9sLVxcdTAwM2Vub2Rlcykge1xcbitcXHRcXHRwZ19kYXRhX3QgKnBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7XFxuK1xcdFxcdGVudW0gem9uZV90eXBlIHp0O1xcbitcXG4rXFx0XFx0aWYgKCFub2RlX2lzX3ByaXZhdGUobmlkKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGZvciAoenQgPSBaT05FX05PUk1BTDsgenQgXFx1MDAzYyBaT05FX01PVkFCTEU7IHp0KyspXFxuK1xcdFxcdFxcdGlmIChtYW5hZ2VkX3pvbmUoXFx1MDAyNnBnZGF0LVxcdTAwM2Vub2RlX3pvbmVzW3p0XSkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiB0cnVlO1xcbitcXHR9XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4gYm9vbCBhcHBseV9wb2xpY3lfem9uZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3ksIGVudW0gem9uZV90eXBlIHpvbmUpXFxuIHtcXG4gXFx0ZW51bSB6b25lX3R5cGUgZHluYW1pY19wb2xpY3lfem9uZSA9IHBvbGljeV96b25lO1xcbkBAIC0yMDc4LDE0ICsyMjM3LDIyIEBAIGJvb2wgYXBwbHlfcG9saWN5X3pvbmUoc3RydWN0IG1lbXBvbGljeSAqcG9saWN5LCBlbnVtIHpvbmVfdHlwZSB6b25lKVxcbiBcXHRCVUdfT04oZHluYW1pY19wb2xpY3lfem9uZSA9PSBaT05FX01PVkFCTEUpO1xcbiBcXG4gXFx0LypcXG4tXFx0ICogaWYgcG9saWN5LVxcdTAwM2Vub2RlcyBoYXMgbW92YWJsZSBtZW1vcnkgb25seSxcXG4tXFx0ICogd2UgYXBwbHkgcG9saWN5IHdoZW4gZ2ZwX3pvbmUoZ2ZwKSA9IFpPTkVfTU9WQUJMRSBvbmx5LlxcbitcXHQgKiBkeW5hbWljX3BvbGljeV96b25lIGlzIHRoZSBsb3dlc3Qgem9uZSB0aGlzIHBvbGljeSBpcyBlbmZvcmNlZCBmb3IsXFxuK1xcdCAqIGFsbG9jYXRpb25zIGJlbG93IGl0IGlnbm9yZSB0aGUgbm9kZW1hc2sgYW5kIGZhbGwgYmFjayBmcmVlbHkuXFxuK1xcdCAqXFxuK1xcdCAqIElmIGFsbCBwb2xpY3ktbm9kZXMgYXJlIG1vdmFibGUtb25seSAoYWxsIFpPTkVfTU9WQUJMRSksIHJhaXNlIHRoZVxcbitcXHQgKiBkeW5hbWljX3BvbGljeV96b25lIHRvIFpPTkVfTU9WQUJMRSBzbyB0aGF0IG9ubHkgbW92YWJsZSBhbGxvY2F0aW9uc1xcbitcXHQgKiBzdGF5IGJvdW5kIC0gb3RoZXJ3aXNlIHRoaXMgd291bGQgZm9yY2Uga2VybmVsLXpvbmUgYWxsb2NhdGlvbnNcXG4rXFx0ICogKGUuZy4gcGFnZSB0YWJsZXMpIG9udG8gYSB6b25lIHRoYXQgY2Fubm90IHNhdGlzZnkgdGhlbS4gIFRoaXNcXG4rXFx0ICogcmVzdWx0cyBpbiBhbGxvY2F0aW9uIGZhaWx1cmUgYW5kIHJldHJ5IGxvb3AgKGxpdmVsb2NrKS5cXG4gXFx0ICpcXG4tXFx0ICogcG9saWN5LVxcdTAwM2Vub2RlcyBpcyBpbnRlcnNlY3Qgd2l0aCBub2RlX3N0YXRlc1tOX01FTU9SWV0uXFxuLVxcdCAqIHNvIGlmIHRoZSBmb2xsb3dpbmcgdGVzdCBmYWlscywgaXQgaW1wbGllc1xcbi1cXHQgKiBwb2xpY3ktXFx1MDAzZW5vZGVzIGhhcyBtb3ZhYmxlIG1lbW9yeSBvbmx5LlxcbitcXHQgKiBOX0hJR0hfTUVNT1JZIHRlbGxzIHVzIFxcXCJoYXMgYSBub24tbW92YWJsZSB6b25lXFxcIiBmb3Igb3JkaW5hcnkgbm9kZXMuXFxuK1xcdCAqIFByaXZhdGUgbm9kZXMgYXJlIGRlbGliZXJhdGVseSBleGNsdWRlZCBmcm9tIE5fSElHSF9NRU1PUlksIHNvIHdlXFxuK1xcdCAqIG5lZWQgdG8gY2hlY2sgdGhlaXIgYWN0dWFsIHpvbmVzIC0gYSBrZXJuZWwtem9uZWQgcHJpdmF0ZSBub2RlIGNhblxcbitcXHQgKiBob2xkIHRoZSBhbGxvY2F0aW9uIGFuZCBtdXN0IGtlZXAgdGhlIHBvbGljeSBhcHBsaWVkLlxcbiBcXHQgKi9cXG4tXFx0aWYgKCFub2Rlc19pbnRlcnNlY3RzKHBvbGljeS1cXHUwMDNlbm9kZXMsIG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKSlcXG4rXFx0aWYgKCFub2Rlc19pbnRlcnNlY3RzKHBvbGljeS1cXHUwMDNlbm9kZXMsIG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIXBvbGljeV9wcml2YXRlX2hhc19rZXJuZWxfem9uZShwb2xpY3kpKVxcbiBcXHRcXHRkeW5hbWljX3BvbGljeV96b25lID0gWk9ORV9NT1ZBQkxFO1xcbiBcXG4gXFx0cmV0dXJuIHpvbmUgXFx1MDAzZT0gZHluYW1pY19wb2xpY3lfem9uZTtcXG5AQCAtMjQwNiw3ICsyNTczLDggQEAgYm9vbCBtZW1wb2xpY3lfaW5fb29tX2RvbWFpbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19wcmVmZXJyZWRfbWFueShnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0aW50IG5pZCwgbm9kZW1hc2tfdCAqbm9kZW1hc2spXFxuK1xcdFxcdFxcdFxcdFxcdFxcdGludCBuaWQsIG5vZGVtYXNrX3QgKm5vZGVtYXNrLFxcbitcXHRcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgYWZsYWdzKVxcbiB7XFxuIFxcdHN0cnVjdCBwYWdlICpwYWdlO1xcbiBcXHRnZnBfdCBwcmVmZXJyZWRfZ2ZwO1xcbkBAIC0yNDIwLDE0ICsyNTg4LDIxIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfcHJlZmVycmVkX21hbnkoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuIFxcdHByZWZlcnJlZF9nZnAgPSBnZnAgfCBfX0dGUF9OT1dBUk47XFxuIFxcdHByZWZlcnJlZF9nZnAgXFx1MDAyNj0gfihfX0dGUF9ESVJFQ1RfUkVDTEFJTSB8IF9fR0ZQX05PRkFJTCk7XFxuIFxcdHBhZ2UgPSBfX2FsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YocHJlZmVycmVkX2dmcCwgb3JkZXIsIG5pZCwgbm9kZW1hc2ssXFxuLVxcdFxcdFxcdFxcdFxcdCAgIEFMTE9DX0RFRkFVTFQpO1xcbitcXHRcXHRcXHRcXHRcXHQgICAgIGFmbGFncyk7XFxuIFxcdGlmICghcGFnZSlcXG4gXFx0XFx0cGFnZSA9IF9fYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihnZnAsIG9yZGVyLCBuaWQsIE5VTEwsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgIEFMTE9DX0RFRkFVTFQpO1xcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGFmbGFncyk7XFxuIFxcbiBcXHRyZXR1cm4gcGFnZTtcXG4gfVxcbiBcXG4rLyogQSBwcml2YXRlIHBvbGljeSBhbGxvY2F0ZXMgZnJvbSB0aGUgcHJpdmF0ZSB6b25lbGlzdC4gKi9cXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbXBvbF9hbGxvY19mbGFncyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuK3tcXG4rXFx0cmV0dXJuIChwb2wtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTVBPTF9GX1BSSVZBVEUpID8gQUxMT0NfWk9ORUxJU1RfUFJJVkFURSA6XFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBBTExPQ19ERUZBVUxUO1xcbit9XFxuK1xcbiAvKipcXG4gICogYWxsb2NfcGFnZXNfbXBvbCAtIEFsbG9jYXRlIHBhZ2VzIGFjY29yZGluZyB0byBOVU1BIG1lbXBvbGljeS5cXG4gICogQGdmcDogR0ZQIGZsYWdzLlxcbkBAIC0yNDQzLDExICsyNjE4LDEzIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfbXBvbChnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcXG4ge1xcbiBcXHRub2RlbWFza190ICpub2RlbWFzaztcXG4gXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdHVuc2lnbmVkIGludCBhZmxhZ3MgPSBtcG9sX2FsbG9jX2ZsYWdzKHBvbCk7XFxuIFxcbiBcXHRub2RlbWFzayA9IHBvbGljeV9ub2RlbWFzayhnZnAsIHBvbCwgaWx4LCBcXHUwMDI2bmlkKTtcXG4gXFxuIFxcdGlmIChwb2wtXFx1MDAzZW1vZGUgPT0gTVBPTF9QUkVGRVJSRURfTUFOWSlcXG4tXFx0XFx0cmV0dXJuIGFsbG9jX3BhZ2VzX3ByZWZlcnJlZF9tYW55KGdmcCwgb3JkZXIsIG5pZCwgbm9kZW1hc2spO1xcbitcXHRcXHRyZXR1cm4gYWxsb2NfcGFnZXNfcHJlZmVycmVkX21hbnkoZ2ZwLCBvcmRlciwgbmlkLCBub2RlbWFzayxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICBhZmxhZ3MpO1xcbiBcXG4gXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHQgICAgLyogZmlsdGVyIFxcXCJodWdlcGFnZVxcXCIgYWxsb2NhdGlvbiwgdW5sZXNzIGZyb20gYWxsb2NfcGFnZXMoKSAqL1xcbkBAIC0yNDcxLDcgKzI2NDgsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmFsbG9jX3BhZ2VzX21wb2woZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuIFxcdFxcdFxcdCAqL1xcbiBcXHRcXHRcXHRwYWdlID0gX19hbGxvY19mcm96ZW5fcGFnZXNfbm9wcm9mKFxcbiBcXHRcXHRcXHRcXHRnZnAgfCBfX0dGUF9USElTTk9ERSB8IF9fR0ZQX05PUkVUUlksIG9yZGVyLFxcbi1cXHRcXHRcXHRcXHRuaWQsIE5VTEwsIEFMTE9DX0RFRkFVTFQpO1xcbitcXHRcXHRcXHRcXHRuaWQsIE5VTEwsIGFmbGFncyk7XFxuIFxcdFxcdFxcdGlmIChwYWdlIHx8ICEoZ2ZwIFxcdTAwMjYgX19HRlBfRElSRUNUX1JFQ0xBSU0pKVxcbiBcXHRcXHRcXHRcXHRyZXR1cm4gcGFnZTtcXG4gXFx0XFx0XFx0LypcXG5AQCAtMjQ4Myw3ICsyNjYwLDcgQEAgc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19tcG9sKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuLVxcdHBhZ2UgPSBfX2FsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBub2RlbWFzaywgQUxMT0NfREVGQVVMVCk7XFxuK1xcdHBhZ2UgPSBfX2FsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBub2RlbWFzaywgYWZsYWdzKTtcXG4gXFxuIFxcdGlmICh1bmxpa2VseShwb2wtXFx1MDAzZW1vZGUgPT0gTVBPTF9JTlRFUkxFQVZFIHx8XFxuIFxcdFxcdCAgICAgcG9sLVxcdTAwM2Vtb2RlID09IE1QT0xfV0VJR0hURURfSU5URVJMRUFWRSkgXFx1MDAyNlxcdTAwMjYgcGFnZSkge1xcbkBAIC0yNTkyLDYgKzI3NjksNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxcbiBcXHRcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuIFxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZV9hcnJheSlcXG4ge1xcbitcXHR1bnNpZ25lZCBpbnQgYWZsYWdzID0gbXBvbF9hbGxvY19mbGFncyhwb2wpO1xcbiBcXHRpbnQgbm9kZXM7XFxuIFxcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXNfcGVyX25vZGU7XFxuIFxcdGludCBkZWx0YTtcXG5AQCAtMjYwNSwxNCArMjc4MywxNCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxcbiBcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5vZGVzOyBpKyspIHtcXG4gXFx0XFx0aWYgKGRlbHRhKSB7XFxuLVxcdFxcdFxcdG5yX2FsbG9jYXRlZCA9IGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCxcXG4tXFx0XFx0XFx0XFx0XFx0aW50ZXJsZWF2ZV9ub2Rlcyhwb2wpLCBOVUxMLFxcbitcXHRcXHRcXHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCxcXG4rXFx0XFx0XFx0XFx0XFx0YWZsYWdzLCBpbnRlcmxlYXZlX25vZGVzKHBvbCksIE5VTEwsXFxuIFxcdFxcdFxcdFxcdFxcdG5yX3BhZ2VzX3Blcl9ub2RlICsgMSxcXG4gXFx0XFx0XFx0XFx0XFx0cGFnZV9hcnJheSk7XFxuIFxcdFxcdFxcdGRlbHRhLS07XFxuIFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdG5yX2FsbG9jYXRlZCA9IGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCxcXG4tXFx0XFx0XFx0XFx0XFx0aW50ZXJsZWF2ZV9ub2Rlcyhwb2wpLCBOVUxMLFxcbitcXHRcXHRcXHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCxcXG4rXFx0XFx0XFx0XFx0XFx0YWZsYWdzLCBpbnRlcmxlYXZlX25vZGVzKHBvbCksIE5VTEwsXFxuIFxcdFxcdFxcdFxcdFxcdG5yX3BhZ2VzX3Blcl9ub2RlLCBwYWdlX2FycmF5KTtcXG4gXFx0XFx0fVxcbiBcXG5AQCAtMjYyNyw2ICsyODA1LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa193ZWlnaHRlZF9pbnRlcmxlYXZlKGdmcF90IGdmcCxcXG4gXFx0XFx0c3RydWN0IG1lbXBvbGljeSAqcG9sLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VfYXJyYXkpXFxuIHtcXG4rXFx0dW5zaWduZWQgaW50IGFmbGFncyA9IG1wb2xfYWxsb2NfZmxhZ3MocG9sKTtcXG4gXFx0c3RydWN0IHdlaWdodGVkX2ludGVybGVhdmVfc3RhdGUgKnN0YXRlO1xcbiBcXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDtcXG4gXFx0dW5zaWduZWQgaW50IGNwdXNldF9tZW1zX2Nvb2tpZTtcXG5AQCAtMjY2Miw4ICsyODQxLDggQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa193ZWlnaHRlZF9pbnRlcmxlYXZlKGdmcF90IGdmcCxcXG4gXFx0d2VpZ2h0ID0gbWUtXFx1MDAzZWlsX3dlaWdodDtcXG4gXFx0aWYgKHdlaWdodCBcXHUwMDI2XFx1MDAyNiBub2RlX2lzc2V0KG5vZGUsIG5vZGVzKSkge1xcbiBcXHRcXHRub2RlX3BhZ2VzID0gbWluKHJlbV9wYWdlcywgd2VpZ2h0KTtcXG4tXFx0XFx0bnJfYWxsb2NhdGVkID0gX19hbGxvY19wYWdlc19idWxrKGdmcCwgbm9kZSwgTlVMTCwgbm9kZV9wYWdlcyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICBwYWdlX2FycmF5KTtcXG4rXFx0XFx0bnJfYWxsb2NhdGVkID0gX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsIGFmbGFncywgbm9kZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICBOVUxMLCBub2RlX3BhZ2VzLCBwYWdlX2FycmF5KTtcXG4gXFx0XFx0cGFnZV9hcnJheSArPSBucl9hbGxvY2F0ZWQ7XFxuIFxcdFxcdHRvdGFsX2FsbG9jYXRlZCArPSBucl9hbGxvY2F0ZWQ7XFxuIFxcdFxcdC8qIGlmIHRoYXQncyBhbGwgdGhlIHBhZ2VzLCBubyBuZWVkIHRvIGludGVybGVhdmUgKi9cXG5AQCAtMjcyNyw4ICsyOTA2LDggQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa193ZWlnaHRlZF9pbnRlcmxlYXZlKGdmcF90IGdmcCxcXG4gXFx0XFx0Lyogbm9kZV9wYWdlcyBjYW4gYmUgMCBpZiBhbiBhbGxvY2F0aW9uIGZhaWxzIGFuZCByb3VuZHMgPT0gMCAqL1xcbiBcXHRcXHRpZiAoIW5vZGVfcGFnZXMpXFxuIFxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGsoZ2ZwLCBub2RlLCBOVUxMLCBub2RlX3BhZ2VzLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgIHBhZ2VfYXJyYXkpO1xcbitcXHRcXHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCwgYWZsYWdzLCBub2RlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgIE5VTEwsIG5vZGVfcGFnZXMsIHBhZ2VfYXJyYXkpO1xcbiBcXHRcXHRwYWdlX2FycmF5ICs9IG5yX2FsbG9jYXRlZDtcXG4gXFx0XFx0dG90YWxfYWxsb2NhdGVkICs9IG5yX2FsbG9jYXRlZDtcXG4gXFx0XFx0aWYgKHRvdGFsX2FsbG9jYXRlZCA9PSBucl9wYWdlcylcXG5AQCAtMjc0NSwxNyArMjkyNCwxOSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3ByZWZlcnJlZF9tYW55KGdmcF90IGdmcCwgaW50IG5pZCxcXG4gXFx0XFx0c3RydWN0IG1lbXBvbGljeSAqcG9sLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbiBcXHRcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VfYXJyYXkpXFxuIHtcXG4rXFx0dW5zaWduZWQgaW50IGFmbGFncyA9IG1wb2xfYWxsb2NfZmxhZ3MocG9sKTtcXG4gXFx0Z2ZwX3QgcHJlZmVycmVkX2dmcDtcXG4gXFx0dW5zaWduZWQgbG9uZyBucl9hbGxvY2F0ZWQgPSAwO1xcbiBcXG4gXFx0cHJlZmVycmVkX2dmcCA9IGdmcCB8IF9fR0ZQX05PV0FSTjtcXG4gXFx0cHJlZmVycmVkX2dmcCBcXHUwMDI2PSB+KF9fR0ZQX0RJUkVDVF9SRUNMQUlNIHwgX19HRlBfTk9GQUlMKTtcXG4gXFxuLVxcdG5yX2FsbG9jYXRlZCAgPSBhbGxvY19wYWdlc19idWxrX25vcHJvZihwcmVmZXJyZWRfZ2ZwLCBuaWQsIFxcdTAwMjZwb2wtXFx1MDAzZW5vZGVzLFxcbi1cXHRcXHRcXHRcXHRcXHQgICBucl9wYWdlcywgcGFnZV9hcnJheSk7XFxuK1xcdG5yX2FsbG9jYXRlZCAgPSBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKHByZWZlcnJlZF9nZnAsIGFmbGFncyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgbmlkLCBcXHUwMDI2cG9sLVxcdTAwM2Vub2RlcywgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpO1xcbiBcXG4gXFx0aWYgKG5yX2FsbG9jYXRlZCBcXHUwMDNjIG5yX3BhZ2VzKVxcbi1cXHRcXHRucl9hbGxvY2F0ZWQgKz0gYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBudW1hX25vZGVfaWQoKSwgTlVMTCxcXG4rXFx0XFx0bnJfYWxsb2NhdGVkICs9IF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBhZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdG51bWFfbm9kZV9pZCgpLCBOVUxMLFxcbiBcXHRcXHRcXHRcXHRucl9wYWdlcyAtIG5yX2FsbG9jYXRlZCxcXG4gXFx0XFx0XFx0XFx0cGFnZV9hcnJheSArIG5yX2FsbG9jYXRlZCk7XFxuIFxcdHJldHVybiBucl9hbGxvY2F0ZWQ7XFxuQEAgLTI3OTEsOCArMjk3Miw4IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19tZW1wb2xpY3lfbm9wcm9mKGdmcF90IGdmcCxcXG4gXFxuIFxcdG5pZCA9IG51bWFfbm9kZV9pZCgpO1xcbiBcXHRub2RlbWFzayA9IHBvbGljeV9ub2RlbWFzayhnZnAsIHBvbCwgTk9fSU5URVJMRUFWRV9JTkRFWCwgXFx1MDAyNm5pZCk7XFxuLVxcdHJldHVybiBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsIG5pZCwgbm9kZW1hc2ssXFxuLVxcdFxcdFxcdFxcdCAgICAgICBucl9wYWdlcywgcGFnZV9hcnJheSk7XFxuK1xcdHJldHVybiBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCwgbXBvbF9hbGxvY19mbGFncyhwb2wpLCBuaWQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdG5vZGVtYXNrLCBucl9wYWdlcywgcGFnZV9hcnJheSk7XFxuIH1cXG4gXFxuIGludCB2bWFfZHVwX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNyYywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QpXFxuQEAgLTMyNDMsMjQgKzM0MjQsNDcgQEAgdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpXFxuIH1cXG4gRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCwgXFxcImt2bVxcXCIpO1xcbiBcXG4taW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLFxcbi1cXHRcXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxcbisvKipcXG4rICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcFxcbisgKiBAc3A6ICAgIHRoZSBzaGFyZWQgcG9saWN5IHRyZWVcXG4rICogQHN0YXJ0OiBmaXJzdCBwYWdlIG9mZnNldCAoaW5jbHVzaXZlKVxcbisgKiBAZW5kOiAgIGxhc3QgcGFnZSBvZmZzZXQgKGV4Y2x1c2l2ZSlcXG4rICogQHBvbDogICBhIGZ1bGx5LWJ1aWx0LCB2YWxpZGF0ZWQgcG9saWN5LCBvciBOVUxMIHRvIGNsZWFyIHRoZSByYW5nZVxcbisgKlxcbisgKiBJbnN0YWxscyBAcG9sIG92ZXIgdGhlIGdpdmVuIHJhbmdlLCByZXBsYWNpbmcgYW55IG92ZXJsYXBwaW5nIHBvbGljeS5cXG4rICogQHNwIHRha2VzIGl0cyBvd24gcmVmZXJlbmNlLCB0aGUgY2FsbGVyIHJldGFpbnMgaXRzIHJlZmVyZW5jZSBvbiBAcG9sLlxcbisgKlxcbisgKiBUaGUgcG9saWN5IGlzIG5vdCByZWNvbnN0cnVjdGVkLCBzbyB0aGUgcG9saWN5IGlzIHByZXNlcnZlZCBleGFjdGx5LlxcbisgKlxcbisgKiBVbmxpa2UgbXBvbF9zZXRfc2hhcmVkX3BvbGljeSgpLCBubyBWTUEgaXMgcmVxdWlyZWQsIHNvIGEgcmFuZ2UgdGhhdFxcbisgKiBpcyBuZXZlciBtYXBwZWQgaW50byBhIFZNQSBjYW4gYmUgY292ZXJlZCwgaW5jbHVkaW5nIHRoZSB3aG9sZSBmaWxlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXFxuKyAqL1xcbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXFxuK1xcdFxcdFxcdFxcdCBwZ29mZl90IGVuZCwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxcbiB7XFxuLVxcdGNvbnN0IHBnb2ZmX3QgcGdvZmYgPSB2bWFfc3RhcnRfcGdvZmYodm1hKTtcXG4tXFx0Y29uc3QgcGdvZmZfdCBwZ29mZl9lbmQgPSB2bWFfZW5kX3Bnb2ZmKHZtYSk7XFxuIFxcdHN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4gXFx0aWYgKHBvbCkge1xcbi1cXHRcXHRuZXcgPSBzcF9hbGxvYyhwZ29mZiwgcGdvZmZfZW5kLCBwb2wpO1xcbitcXHRcXHRuZXcgPSBzcF9hbGxvYyhzdGFydCwgZW5kLCBwb2wpO1xcbiBcXHRcXHRpZiAoIW5ldylcXG4gXFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIFxcdH1cXG4tXFx0ZXJyID0gc2hhcmVkX3BvbGljeV9yZXBsYWNlKHNwLCBwZ29mZiwgcGdvZmZfZW5kLCBuZXcpO1xcbitcXHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7XFxuIFxcdGlmIChlcnIgXFx1MDAyNlxcdTAwMjYgbmV3KVxcbiBcXHRcXHRzcF9mcmVlKG5ldyk7XFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG4rRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlLCBcXFwia3ZtXFxcIik7XFxuK1xcbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuK1xcdFxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuK3tcXG4rXFx0cmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3AsIHZtYS1cXHUwMDNldm1fcGdvZmYsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHZtYS1cXHUwMDNldm1fcGdvZmYgKyB2bWFfcGFnZXModm1hKSwgcG9sKTtcXG4rfVxcbiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2V0X3NoYXJlZF9wb2xpY3ksIFxcXCJrdm1cXFwiKTtcXG4gXFxuIC8qIEZyZWUgYSBiYWNraW5nIHBvbGljeSBzdG9yZSBvbiBpbm9kZSBkZWxldGUuICovXFxuZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuY1xcbmluZGV4IGFiMTVhNGRkZGQwNDcxLi45YzJmNDc0YzY5MjViMyAxMDA2NDRcXG4tLS0gYS9tbS9taWdyYXRlLmNcXG4rKysgYi9tbS9taWdyYXRlLmNcXG5AQCAtMjIzMyw3ICsyMjMzLDggQEAgc3RydWN0IGZvbGlvICphbGxvY19taWdyYXRpb25fdGFyZ2V0KHN0cnVjdCBmb2xpbyAqc3JjLCB1bnNpZ25lZCBsb25nIHByaXZhdGUpXFxuIFxcdGlmIChpc19oaWdobWVtX2lkeCh6aWR4KSB8fCB6aWR4ID09IFpPTkVfTU9WQUJMRSlcXG4gXFx0XFx0Z2ZwX21hc2sgfD0gX19HRlBfSElHSE1FTTtcXG4gXFxuLVxcdHJldHVybiBfX2ZvbGlvX2FsbG9jKGdmcF9tYXNrLCBvcmRlciwgbmlkLCBtdGMtXFx1MDAzZW5tYXNrKTtcXG4rXFx0cmV0dXJuIF9fZm9saW9fYWxsb2MoZ2ZwX21hc2ssIG9yZGVyLCBuaWQsIG10Yy1cXHUwMDNlbm1hc2ssXFxuK1xcdFxcdFxcdCAgICAgbXRjLVxcdTAwM2VhbGxvY19mbGFncyk7XFxuIH1cXG4gXFxuICNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRJT05cXG5AQCAtMjI1NSw2ICsyMjU2LDggQEAgc3RhdGljIGludCBkb19tb3ZlX3BhZ2VzX3RvX25vZGUoc3RydWN0IGxpc3RfaGVhZCAqcGFnZWxpc3QsIGludCBub2RlKVxcbiBcXHRcXHQubmlkID0gbm9kZSxcXG4gXFx0XFx0LmdmcF9tYXNrID0gR0ZQX0hJR0hVU0VSX01PVkFCTEUgfCBfX0dGUF9USElTTk9ERSxcXG4gXFx0XFx0LnJlYXNvbiA9IE1SX1NZU0NBTEwsXFxuK1xcdFxcdC5hbGxvY19mbGFncyA9IG5vZGVfaXNfcHJpdmF0ZShub2RlKSA/XFxuK1xcdFxcdFxcdCBBTExPQ19aT05FTElTVF9QUklWQVRFIDogQUxMT0NfREVGQVVMVCxcXG4gXFx0fTtcXG4gXFxuIFxcdGVyciA9IG1pZ3JhdGVfcGFnZXMocGFnZWxpc3QsIGFsbG9jX21pZ3JhdGlvbl90YXJnZXQsIE5VTEwsXFxuQEAgLTIyNzAsNyArMjI3Myw4IEBAIHN0YXRpYyBpbnQgX19hZGRfZm9saW9fZm9yX21pZ3JhdGlvbihzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgbm9kZSxcXG4gXFx0aWYgKGlzX3plcm9fZm9saW8oZm9saW8pIHx8IGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXFxuIFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiBcXG4tXFx0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcXG4rXFx0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fFxcbitcXHQgICAgIW5vZGVfYWxsb3dzX3VzZXJfbnVtYShmb2xpb19uaWQoZm9saW8pKSlcXG4gXFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuIFxcbiBcXHRpZiAoZm9saW9fbmlkKGZvbGlvKSA9PSBub2RlKVxcbkBAIC0yMzk0LDExICsyMzk4LDE0IEBAIHN0YXRpYyBpbnQgZG9fcGFnZXNfbW92ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgbm9kZW1hc2tfdCB0YXNrX25vZGVzLFxcbiBcXHRcXHRlcnIgPSAtRU5PREVWO1xcbiBcXHRcXHRpZiAobm9kZSBcXHUwMDNjIDAgfHwgbm9kZSBcXHUwMDNlPSBNQVhfTlVNTk9ERVMpXFxuIFxcdFxcdFxcdGdvdG8gb3V0X2ZsdXNoO1xcbi1cXHRcXHRpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKVxcbitcXG4rXFx0XFx0aWYgKCFub2RlX2FsbG93c191c2VyX251bWEobm9kZSkpXFxuIFxcdFxcdFxcdGdvdG8gb3V0X2ZsdXNoO1xcbiBcXG4gXFx0XFx0ZXJyID0gLUVBQ0NFUztcXG4tXFx0XFx0aWYgKCFub2RlX2lzc2V0KG5vZGUsIHRhc2tfbm9kZXMpKVxcbitcXHRcXHQvKiBQcml2YXRlIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0Lm1lbSAqL1xcbitcXHRcXHRpZiAoIW5vZGVfaXNfcHJpdmF0ZShub2RlKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIW5vZGVfaXNzZXQobm9kZSwgdGFza19ub2RlcykpXFxuIFxcdFxcdFxcdGdvdG8gb3V0X2ZsdXNoO1xcbiBcXG4gXFx0XFx0aWYgKGN1cnJlbnRfbm9kZSA9PSBOVU1BX05PX05PREUpIHtcXG5AQCAtMjQ3OSw3ICsyNDg2LDkgQEAgc3RhdGljIHZvaWQgZG9fcGFnZXNfc3RhdF9hcnJheShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4gXFx0XFx0aWYgKGZvbGlvKSB7XFxuIFxcdFxcdFxcdGlmIChpc196ZXJvX2ZvbGlvKGZvbGlvKSB8fCBpc19odWdlX3plcm9fZm9saW8oZm9saW8pKVxcbiBcXHRcXHRcXHRcXHRlcnIgPSAtRUZBVUxUO1xcbi1cXHRcXHRcXHRlbHNlIGlmIChmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXFxuK1xcdFxcdFxcdGVsc2UgaWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fFxcbitcXHRcXHRcXHRcXHQgKGZvbGlvX2lzX3ByaXZhdGVfbm9kZShmb2xpbykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0XFx0ICAhbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKSlcXG4gXFx0XFx0XFx0XFx0ZXJyID0gLUVOT0VOVDtcXG4gXFx0XFx0XFx0ZWxzZVxcbiBcXHRcXHRcXHRcXHRlcnIgPSBmb2xpb19uaWQoZm9saW8pO1xcbmRpZmYgLS1naXQgYS9tbS9tbV9pbml0LmMgYi9tbS9tbV9pbml0LmNcXG5pbmRleCA3MTFmODIxZjdiM2M3Mi4uYWRiNTA2NDdkMjljYWYgMTAwNjQ0XFxuLS0tIGEvbW0vbW1faW5pdC5jXFxuKysrIGIvbW0vbW1faW5pdC5jXFxuQEAgLTI3MDEsNyArMjcwMSw3IEBAIHZvaWQgX19pbml0IG1tX2NvcmVfaW5pdCh2b2lkKVxcbiBcXHRpbml0X3plcm9fcGFnZV9wZm4oKTtcXG4gXFxuIFxcdC8qIEluaXRpYWxpemF0aW9ucyByZWx5aW5nIG9uIFNNUCBzZXR1cCAqL1xcbi1cXHRCVUlMRF9CVUdfT04oTUFYX1pPTkVMSVNUUyBcXHUwMDNlIDIpO1xcbitcXHRCVUlMRF9CVUdfT04oTUFYX1pPTkVMSVNUUyBcXHUwMDNlIDQpO1xcbiBcXHRidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpO1xcbiBcXHRwYWdlX2FsbG9jX2luaXRfY3B1aHAoKTtcXG4gXFx0YWxsb2NfdGFnX3NlY19pbml0KCk7XFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuY1xcbmluZGV4IDA4MTU3YTgyNzc2MTZhLi4zOWUyZDJhOWNkOWJjZiAxMDA2NDRcXG4tLS0gYS9tbS9wYWdlX2FsbG9jLmNcXG4rKysgYi9tbS9wYWdlX2FsbG9jLmNcXG5AQCAtNTEwMiw3ICs1MTAyLDcgQEAgc3RhdGljIGlubGluZSBib29sIHByZXBhcmVfYWxsb2NfcGFnZXMoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcixcXG4gXFx0XFx0dW5zaWduZWQgaW50ICphbGxvY19mbGFncylcXG4ge1xcbiBcXHRhYy1cXHUwMDNlaGlnaGVzdF96b25laWR4ID0gZ2ZwX3pvbmUoZ2ZwX21hc2spO1xcbi1cXHRhYy1cXHUwMDNlem9uZWxpc3QgPSBub2RlX3pvbmVsaXN0KHByZWZlcnJlZF9uaWQsIGdmcF9tYXNrKTtcXG4rXFx0YWMtXFx1MDAzZXpvbmVsaXN0ID0gc2VsZWN0X3pvbmVsaXN0KHByZWZlcnJlZF9uaWQsIGdmcF9tYXNrLCBhYy1cXHUwMDNlYWxsb2NfZmxhZ3MpO1xcbiBcXHRhYy1cXHUwMDNlbm9kZW1hc2sgPSBub2RlbWFzaztcXG4gXFx0YWMtXFx1MDAzZW1pZ3JhdGV0eXBlID0gZ2ZwX21pZ3JhdGV0eXBlKGdmcF9tYXNrKTtcXG4gXFxuQEAgLTUxNjUsOCArNTE2NSw4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwcmVwYXJlX2FsbG9jX3BhZ2VzKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuICAqIEBwYWdlX2FycmF5IHdlcmUgc2V0IHRvICVOVUxMIG9uIGVudHJ5LCB0aGUgc2xvdHMgZnJvbSAwIHRvIHRoZSByZXR1cm4gdmFsdWVcXG4gICogLSAxIHdpbGwgYmUgZmlsbGVkLlxcbiAgKi9cXG4tdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxcbi1cXHRcXHRcXHRub2RlbWFza190ICpub2RlbWFzaywgaW50IG5yX3BhZ2VzLFxcbit1bnNpZ25lZCBsb25nIF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MsXFxuK1xcdFxcdFxcdGludCBwcmVmZXJyZWRfbmlkLCBub2RlbWFza190ICpub2RlbWFzaywgaW50IG5yX3BhZ2VzLFxcbiBcXHRcXHRcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VfYXJyYXkpXFxuIHtcXG4gXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuQEAgLTUxNzQsOCArNTE3NCw4IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCxcXG4gXFx0c3RydWN0IHpvbmVyZWYgKno7XFxuIFxcdHN0cnVjdCBwZXJfY3B1X3BhZ2VzICpwY3A7XFxuIFxcdHN0cnVjdCBsaXN0X2hlYWQgKnBjcF9saXN0O1xcbi1cXHRzdHJ1Y3QgYWxsb2NfY29udGV4dCBhYztcXG4tXFx0dW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzID0gQUxMT0NfV01BUktfTE9XO1xcbitcXHRzdHJ1Y3QgYWxsb2NfY29udGV4dCBhYyA9IHsgLmFsbG9jX2ZsYWdzID0gYWxsb2NfZmxhZ3MgfTtcXG4rXFx0dW5zaWduZWQgaW50IGZhc3RwYXRoX2FsbG9jX2ZsYWdzID0gYWxsb2NfZmxhZ3MgfCBBTExPQ19XTUFSS19MT1c7XFxuIFxcdGludCBucl9wb3B1bGF0ZWQgPSAwLCBucl9hY2NvdW50ID0gMDtcXG4gXFxuIFxcdC8qXFxuQEAgLTUyMTUsNyArNTIxNSw3IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCxcXG4gXFxuIFxcdC8qIE1heSBzZXQgQUxMT0NfTk9GUkFHTUVOVCwgZnJhZ21lbnRhdGlvbiB3aWxsIHJldHVybiAxIHBhZ2UuICovXFxuIFxcdGdmcCBcXHUwMDI2PSBnZnBfYWxsb3dlZF9tYXNrO1xcbi1cXHRpZiAoIXByZXBhcmVfYWxsb2NfcGFnZXMoZ2ZwLCAwLCBwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgXFx1MDAyNmFjLCBcXHUwMDI2Z2ZwLCBcXHUwMDI2YWxsb2NfZmxhZ3MpKVxcbitcXHRpZiAoIXByZXBhcmVfYWxsb2NfcGFnZXMoZ2ZwLCAwLCBwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgXFx1MDAyNmFjLCBcXHUwMDI2Z2ZwLCBcXHUwMDI2ZmFzdHBhdGhfYWxsb2NfZmxhZ3MpKVxcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFxuIFxcdC8qIEZpbmQgYW4gYWxsb3dlZCBsb2NhbCB6b25lIHRoYXQgbWVldHMgdGhlIGxvdyB3YXRlcm1hcmsuICovXFxuQEAgLTUyMjMsNyArNTIyMyw3IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCxcXG4gXFx0Zm9yX25leHRfem9uZV96b25lbGlzdF9ub2RlbWFzayh6b25lLCB6LCBhYy5oaWdoZXN0X3pvbmVpZHgsIGFjLm5vZGVtYXNrKSB7XFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgbWFyaztcXG4gXFxuLVxcdFxcdGlmIChjcHVzZXRzX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiAoYWxsb2NfZmxhZ3MgXFx1MDAyNiBBTExPQ19DUFVTRVQpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdGlmIChjcHVzZXRzX2VuYWJsZWQoKSBcXHUwMDI2XFx1MDAyNiAoZmFzdHBhdGhfYWxsb2NfZmxhZ3MgXFx1MDAyNiBBTExPQ19DUFVTRVQpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdCAgICAhX19jcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIGdmcCkpIHtcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcdFxcdH1cXG5AQCAtNTIzMywxNiArNTIzMywxNyBAQCB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXFxuIFxcdFxcdFxcdGdvdG8gZmFpbGVkO1xcbiBcXHRcXHR9XFxuIFxcbi1cXHRcXHRjb25kX2FjY2VwdF9tZW1vcnkoem9uZSwgMCwgYWxsb2NfZmxhZ3MpO1xcbitcXHRcXHRjb25kX2FjY2VwdF9tZW1vcnkoem9uZSwgMCwgZmFzdHBhdGhfYWxsb2NfZmxhZ3MpO1xcbiByZXRyeV90aGlzX3pvbmU6XFxuLVxcdFxcdG1hcmsgPSB3bWFya19wYWdlcyh6b25lLCBhbGxvY19mbGFncyBcXHUwMDI2IEFMTE9DX1dNQVJLX01BU0spICsgbnJfcGFnZXMgLSBucl9wb3B1bGF0ZWQ7XFxuK1xcdFxcdG1hcmsgPSB3bWFya19wYWdlcyh6b25lLCBmYXN0cGF0aF9hbGxvY19mbGFncyBcXHUwMDI2IEFMTE9DX1dNQVJLX01BU0spICtcXG4rXFx0XFx0ICAgICAgIG5yX3BhZ2VzIC0gbnJfcG9wdWxhdGVkO1xcbiBcXHRcXHRpZiAoem9uZV93YXRlcm1hcmtfZmFzdCh6b25lLCAwLCAgbWFyayxcXG4gXFx0XFx0XFx0XFx0em9uZWxpc3Rfem9uZV9pZHgoYWMucHJlZmVycmVkX3pvbmVyZWYpLFxcbi1cXHRcXHRcXHRcXHRhbGxvY19mbGFncywgZ2ZwKSkge1xcbitcXHRcXHRcXHRcXHRmYXN0cGF0aF9hbGxvY19mbGFncywgZ2ZwKSkge1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbiBcXG4tXFx0XFx0aWYgKGNvbmRfYWNjZXB0X21lbW9yeSh6b25lLCAwLCBhbGxvY19mbGFncykpXFxuK1xcdFxcdGlmIChjb25kX2FjY2VwdF9tZW1vcnkoem9uZSwgMCwgZmFzdHBhdGhfYWxsb2NfZmxhZ3MpKVxcbiBcXHRcXHRcXHRnb3RvIHJldHJ5X3RoaXNfem9uZTtcXG4gXFxuIFxcdFxcdC8qIFRyeSBhZ2FpbiBpZiB6b25lIGhhcyBkZWZlcnJlZCBwYWdlcyAqL1xcbkBAIC01Mjc0LDcgKzUyNzUsNyBAQCB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXHRcXHR9XFxuIFxcbi1cXHRcXHRwYWdlID0gX19ybXF1ZXVlX3BjcGxpc3Qoem9uZSwgMCwgYWMubWlncmF0ZXR5cGUsIGFsbG9jX2ZsYWdzLFxcbitcXHRcXHRwYWdlID0gX19ybXF1ZXVlX3BjcGxpc3Qoem9uZSwgMCwgYWMubWlncmF0ZXR5cGUsIGZhc3RwYXRoX2FsbG9jX2ZsYWdzLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRwY3AsIHBjcF9saXN0KTtcXG4gXFx0XFx0aWYgKHVubGlrZWx5KCFwYWdlKSkge1xcbiBcXHRcXHRcXHQvKiBUcnkgYW5kIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBwYWdlICovXFxuQEAgLTUzMDAsMTEgKzUzMDEsMTkgQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxcbiBcXHRyZXR1cm4gbnJfcG9wdWxhdGVkO1xcbiBcXG4gZmFpbGVkOlxcbi1cXHRwYWdlID0gX19hbGxvY19wYWdlc19ub3Byb2YoZ2ZwLCAwLCBwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgQUxMT0NfREVGQVVMVCk7XFxuK1xcdHBhZ2UgPSBfX2FsbG9jX3BhZ2VzX25vcHJvZihnZnAsIDAsIHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrLCBhbGxvY19mbGFncyk7XFxuIFxcdGlmIChwYWdlKVxcbiBcXHRcXHRwYWdlX2FycmF5W25yX3BvcHVsYXRlZCsrXSA9IHBhZ2U7XFxuIFxcdGdvdG8gb3V0O1xcbiB9XFxuK1xcbit1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXFxuK1xcdFxcdFxcdG5vZGVtYXNrX3QgKm5vZGVtYXNrLCBpbnQgbnJfcGFnZXMsXFxuK1xcdFxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZV9hcnJheSlcXG4re1xcbitcXHRyZXR1cm4gX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsIEFMTE9DX0RFRkFVTFQsIHByZWZlcnJlZF9uaWQsXFxuK1xcdFxcdFxcdFxcdFxcdCBub2RlbWFzaywgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpO1xcbit9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKTtcXG4gXFxuIC8qXFxuQEAgLTUzOTksNyArNTQwOCw3IEBAIHN0cnVjdCBwYWdlICpfX2FsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuIFxcdHVuc2lnbmVkIGludCBmYXN0cGF0aF9hbGxvY19mbGFncyA9IGFsbG9jX2ZsYWdzO1xcbiBcXG4gXFx0LyogT3RoZXIgZmxhZ3MgY291bGQgYmUgc3VwcG9ydGVkIGxhdGVyIGlmIG5lZWRlZC4gKi9cXG4tXFx0aWYgKFdBUk5fT04oYWxsb2NfZmxhZ3MgXFx1MDAyNiB+KEFMTE9DX05PTE9DSyB8IEFMTE9DX05PX0NPREVUQUcpKSlcXG4rXFx0aWYgKFdBUk5fT04oYWxsb2NfZmxhZ3MgXFx1MDAyNiB+KEFMTE9DX05PTE9DSyB8IEFMTE9DX05PX0NPREVUQUcgfCBBTExPQ19aT05FTElTVF9QUklWQVRFKSkpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4gXFx0aWYgKCFhbGxvY19vcmRlcl9hbGxvd2VkKGdmcCwgb3JkZXIsIGFsbG9jX2ZsYWdzKSlcXG5AQCAtNTQ5NSwxMyArNTUwNCwzNiBAQCBzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfbm9kZV9ub3Byb2YoaW50IG5pZCwgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlclxcbiBFWFBPUlRfU1lNQk9MKGFsbG9jX3BhZ2VzX25vZGVfbm9wcm9mKTtcXG4gXFxuIHN0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBwcmVmZXJyZWRfbmlkLFxcbi1cXHRcXHRub2RlbWFza190ICpub2RlbWFzaylcXG4rXFx0XFx0bm9kZW1hc2tfdCAqbm9kZW1hc2ssIHVuc2lnbmVkIGludCBhbGxvY19mbGFncylcXG4ge1xcbiBcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IF9fYWxsb2NfcGFnZXNfbm9wcm9mKGdmcCB8IF9fR0ZQX0NPTVAsIG9yZGVyLFxcbi1cXHRcXHRcXHRcXHRcXHRwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgQUxMT0NfREVGQVVMVCk7XFxuK1xcdFxcdFxcdFxcdFxcdHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrLCBhbGxvY19mbGFncyk7XFxuIFxcdHJldHVybiBwYWdlX3JtYXBwYWJsZV9mb2xpbyhwYWdlKTtcXG4gfVxcbi1FWFBPUlRfU1lNQk9MKF9fZm9saW9fYWxsb2Nfbm9wcm9mKTtcXG4rXFxuK3N0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub2RlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IG5pZClcXG4re1xcbitcXHR3YXJuX2lmX25vZGVfb2ZmbGluZShuaWQsIGdmcCk7XFxuK1xcbitcXHRyZXR1cm4gX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBOVUxMLCBBTExPQ19ERUZBVUxUKTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MKF9fZm9saW9fYWxsb2Nfbm9kZV9ub3Byb2YpO1xcbitcXG4rc3RydWN0IHBhZ2UgKmFsbG9jX3BhZ2VzX25vZGVfcHJpdmF0ZV9ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuK1xcdFxcdGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIF9fYWxsb2NfcGFnZXNfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgTlVMTCxcXG4rXFx0XFx0XFx0XFx0ICAgQUxMT0NfWk9ORUxJU1RfUFJJVkFURSk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoYWxsb2NfcGFnZXNfbm9kZV9wcml2YXRlX25vcHJvZik7XFxuK1xcbitzdHJ1Y3QgZm9saW8gKmZvbGlvX2FsbG9jX25vZGVfcHJpdmF0ZV9ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXFxuK1xcdFxcdGludCBuaWQpXFxuK3tcXG4rXFx0cmV0dXJuIF9fZm9saW9fYWxsb2Nfbm9wcm9mKGdmcCwgb3JkZXIsIG5pZCwgTlVMTCxcXG4rXFx0XFx0XFx0XFx0ICAgQUxMT0NfWk9ORUxJU1RfUFJJVkFURSk7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoZm9saW9fYWxsb2Nfbm9kZV9wcml2YXRlX25vcHJvZik7XFxuIFxcbiAvKlxcbiAgKiBDb21tb24gaGVscGVyIGZ1bmN0aW9ucy4gTmV2ZXIgdXNlIHdpdGggX19HRlBfSElHSE1FTSBiZWNhdXNlIHRoZSByZXR1cm5lZFxcbkBAIC01ODA1LDkgKzU4MzcsMTAgQEAgc3RhdGljIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSxcXG4gc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcXG4gXFxuIC8qKlxcbi0gKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0XFxuKyAqIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4gLSBmaW5kIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3RcXG4gICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSdyZSBhcHBlbmRpbmdcXG4gICogQHVzZWRfbm9kZV9tYXNrOiBub2RlbWFza190IG9mIGFscmVhZHkgdXNlZCBub2Rlc1xcbisgKiBAY2FuZGlkYXRlczogbm9kZW1hc2tfdCBvZiBub2RlcyBlbGlnaWJsZSBmb3Igc2VsZWN0aW9uXFxuICAqXFxuICAqIFdlIHVzZSBhIG51bWJlciBvZiBmYWN0b3JzIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkXFxuICAqIGFwcGVhciBvbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0LiAgVGhlIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFwcGVhcmVkXFxuQEAgLTU4MTksNyArNTg1Miw4IEBAIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XFxuICAqXFxuICAqIFJldHVybjogbm9kZSBpZCBvZiB0aGUgZm91bmQgbm9kZSBvciAlTlVNQV9OT19OT0RFIGlmIG5vIG5vZGUgaXMgZm91bmQuXFxuICAqL1xcbi1pbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXFxuK2ludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcXG4rXFx0XFx0XFx0ICAgY29uc3Qgbm9kZW1hc2tfdCAqY2FuZGlkYXRlcylcXG4ge1xcbiBcXHRpbnQgbiwgdmFsO1xcbiBcXHRpbnQgbWluX3ZhbCA9IElOVF9NQVg7XFxuQEAgLTU4MjksMTIgKzU4NjMsMTIgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxcbiBcXHQgKiBVc2UgdGhlIGxvY2FsIG5vZGUgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCBidXQgZm9yIG1lbW9yeWxlc3MgbG9jYWxcXG4gXFx0ICogbm9kZSwgd2Ugc2hvdWxkIHNraXAgaXQgYW5kIGZhbGwgYmFjayB0byBvdGhlciBub2Rlcy5cXG4gXFx0ICovXFxuLVxcdGlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spIFxcdTAwMjZcXHUwMDI2IG5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKSB7XFxuK1xcdGlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spIFxcdTAwMjZcXHUwMDI2IG5vZGVfaXNzZXQobm9kZSwgKmNhbmRpZGF0ZXMpKSB7XFxuIFxcdFxcdG5vZGVfc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzayk7XFxuIFxcdFxcdHJldHVybiBub2RlO1xcbiBcXHR9XFxuIFxcbi1cXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG4sIE5fTUVNT1JZKSB7XFxuK1xcdGZvcl9lYWNoX25vZGVfbWFzayhuLCAqY2FuZGlkYXRlcykge1xcbiBcXG4gXFx0XFx0LyogRG9uJ3Qgd2FudCBhIG5vZGUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlICovXFxuIFxcdFxcdGlmIChub2RlX2lzc2V0KG4sICp1c2VkX25vZGVfbWFzaykpXFxuQEAgLTU4NzMsMTIgKzU5MDcsMTIgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxcbiAgKiBETUEgem9uZSwgaWYgYW55LS1idXQgcmlza3MgZXhoYXVzdGluZyBETUEgem9uZS5cXG4gICovXFxuIHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnX2RhdGFfdCAqcGdkYXQsIGludCAqbm9kZV9vcmRlcixcXG4tXFx0XFx0dW5zaWduZWQgbnJfbm9kZXMpXFxuK1xcdFxcdHVuc2lnbmVkIGludCBucl9ub2RlcywgaW50IHpsaWR4KVxcbiB7XFxuIFxcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcztcXG4gXFx0aW50IGk7XFxuIFxcbi1cXHR6b25lcmVmcyA9IHBnZGF0LVxcdTAwM2Vub2RlX3pvbmVsaXN0c1taT05FTElTVF9GQUxMQkFDS10uX3pvbmVyZWZzO1xcbitcXHR6b25lcmVmcyA9IHBnZGF0LVxcdTAwM2Vub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzO1xcbiBcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX25vZGVzOyBpKyspIHtcXG4gXFx0XFx0aW50IG5yX3pvbmVzO1xcbkBAIC01ODk4LDM0ICs1OTMyLDQ5IEBAIHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnX2RhdGFfdCAqcGdkYXQsIGludCAqbm9kZV9vcmRlcixcXG4gc3RhdGljIHZvaWQgYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXFxuIHtcXG4gXFx0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzO1xcbi1cXHRpbnQgbnJfem9uZXM7XFxuK1xcdGludCBucl96b25lcyA9IDA7XFxuIFxcbitcXHQvKlxcbitcXHQgKiBOT0ZBTExCQUNLOiB0aGUgbm9kZSdzIG93biB6b25lcy4gRU1QVFkgZm9yIHByaXZhdGUgbm9kZXMgc28gYVxcbitcXHQgKiBzdHJheSBfX0dGUF9USElTTk9ERSBhbGxvY2F0aW9uIGNhbid0IHZpb2xhdGUgaXNvbGF0aW9uLlxcbitcXHQgKi9cXG4gXFx0em9uZXJlZnMgPSBwZ2RhdC1cXHUwMDNlbm9kZV96b25lbGlzdHNbWk9ORUxJU1RfTk9GQUxMQkFDS10uX3pvbmVyZWZzO1xcbitcXHRpZiAoIW5vZGVfaXNfcHJpdmF0ZShwZ2RhdC1cXHUwMDNlbm9kZV9pZCkpXFxuK1xcdFxcdG5yX3pvbmVzID0gYnVpbGRfem9uZXJlZnNfbm9kZShwZ2RhdCwgem9uZXJlZnMpO1xcbitcXHR6b25lcmVmcyArPSBucl96b25lcztcXG4rXFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbitcXHR6b25lcmVmcy1cXHUwMDNlem9uZV9pZHggPSAwO1xcbitcXG4rXFx0LyogUFJJVkFURV9OT0ZBTExCQUNLOiB0aGUgbm9kZSdzIG93biB6b25lcywgcHJpdmF0ZSBub2RlcyBpbmNsdWRlZC4gKi9cXG4rXFx0em9uZXJlZnMgPSBwZ2RhdC1cXHUwMDNlbm9kZV96b25lbGlzdHNbWk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLXS5fem9uZXJlZnM7XFxuIFxcdG5yX3pvbmVzID0gYnVpbGRfem9uZXJlZnNfbm9kZShwZ2RhdCwgem9uZXJlZnMpO1xcbiBcXHR6b25lcmVmcyArPSBucl96b25lcztcXG4gXFx0em9uZXJlZnMtXFx1MDAzZXpvbmUgPSBOVUxMO1xcbiBcXHR6b25lcmVmcy1cXHUwMDNlem9uZV9pZHggPSAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG4rLypcXG4rICogQnVpbGQgb25lIG5vZGUtb3JkZXJlZCBmYWxsYmFjayBsaXN0IGZyb20gYSBjYW5kaWRhdGUgbm9kZW1hc2suXFxuKyAqIHVwZGF0ZV9sb2FkIHJvdW5kLXJvYmlucyBub2RlX2xvYWQgYWNyb3NzIGVxdWlkaXN0YW50IG5vZGVzLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxcbitcXHRcXHRcXHRcXHRpbnQgemxpZHgsIGJvb2wgdXBkYXRlX2xvYWQsXFxuK1xcdFxcdFxcdFxcdGludCAqbm9kZV9vcmRlciwgaW50ICpucilcXG4ge1xcbi1cXHRzdGF0aWMgaW50IG5vZGVfb3JkZXJbTUFYX05VTU5PREVTXTtcXG4tXFx0aW50IG5vZGUsIG5yX25vZGVzID0gMDtcXG4gXFx0bm9kZW1hc2tfdCB1c2VkX21hc2sgPSBOT0RFX01BU0tfTk9ORTtcXG4tXFx0aW50IGxvY2FsX25vZGUsIHByZXZfbm9kZTtcXG4tXFxuLVxcdC8qIE5VTUEtYXdhcmUgb3JkZXJpbmcgb2Ygbm9kZXMgKi9cXG4tXFx0bG9jYWxfbm9kZSA9IHBnZGF0LVxcdTAwM2Vub2RlX2lkO1xcbi1cXHRwcmV2X25vZGUgPSBsb2NhbF9ub2RlO1xcbitcXHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVxcdTAwM2Vub2RlX2lkO1xcbitcXHRpbnQgcHJldl9ub2RlID0gbG9jYWxfbm9kZTtcXG4rXFx0aW50IG5vZGUsIG5yX25vZGVzID0gMDtcXG4gXFxuLVxcdG1lbXNldChub2RlX29yZGVyLCAwLCBzaXplb2Yobm9kZV9vcmRlcikpO1xcbi1cXHR3aGlsZSAoKG5vZGUgPSBmaW5kX25leHRfYmVzdF9ub2RlKGxvY2FsX25vZGUsIFxcdTAwMjZ1c2VkX21hc2spKSBcXHUwMDNlPSAwKSB7XFxuK1xcdHdoaWxlICgobm9kZSA9IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4obG9jYWxfbm9kZSwgXFx1MDAyNnVzZWRfbWFzayxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgY2FuZGlkYXRlcykpIFxcdTAwM2U9IDApIHtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2UgZG9uJ3Qgd2FudCB0byBwcmVzc3VyZSBhIHBhcnRpY3VsYXIgbm9kZS5cXG4gXFx0XFx0ICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZVxcbiBcXHRcXHQgKiBkaXN0YW5jZSBncm91cCB0byBtYWtlIGl0IHJvdW5kLXJvYmluLlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0aWYgKG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgbm9kZSkgIT1cXG4rXFx0XFx0aWYgKHVwZGF0ZV9sb2FkIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIG5vZGUpICE9XFxuIFxcdFxcdCAgICBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIHByZXZfbm9kZSkpXFxuIFxcdFxcdFxcdG5vZGVfbG9hZFtub2RlXSArPSAxO1xcbiBcXG5AQCAtNTkzMywxMiArNTk4Miw0NyBAQCBzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG4gXFx0XFx0cHJldl9ub2RlID0gbm9kZTtcXG4gXFx0fVxcbiBcXG4tXFx0YnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdkYXQsIG5vZGVfb3JkZXIsIG5yX25vZGVzKTtcXG4rXFx0YnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdkYXQsIG5vZGVfb3JkZXIsIG5yX25vZGVzLCB6bGlkeCk7XFxuK1xcdCpuciA9IG5yX25vZGVzO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG4re1xcbitcXHRzdGF0aWMgaW50IG5vZGVfb3JkZXJbTUFYX05VTU5PREVTXTtcXG4rXFx0bm9kZW1hc2tfdCB0aWVyX25vZGVzO1xcbitcXHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVxcdTAwM2Vub2RlX2lkO1xcbitcXHRpbnQgbm9kZSwgbnJfbm9kZXMgPSAwO1xcbitcXG4rXFx0bWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBab25lbGlzdHM6IEZBTExCQUNLLCBOT0ZBTExCQUNLLCBQUklWQVRFXFxuK1xcdCAqXFxuK1xcdCAqIEZBTExCQUNLOiAgIEFsbG9jYXRpb24gb3JkZXIgZm9yIGFsbCBub2Rlcy4gIFByaXZhdGUgbm9kZXMgaGF2ZSBsaXN0c1xcbitcXHQgKiAgICAgICAgICAgICBidXQgbmV2ZXIgYXBwZWFyIGFzIGFuIGVudHJ5IGluIGFueSBsaXN0LiBBbGxvY2F0aW9uc1xcbitcXHQgKiAgICAgICAgICAgICB0YXJnZXRpbmcgYSBwcml2YXRlIG5vZGUgdy8gRkFMTEJBQ0sgbGFuZCBvbiBOX01FTU9SWS5cXG4rXFx0ICpcXG4rXFx0ICogTk9GQUxMQkFDSzogQSBsaXN0IGZvciBlYWNoIG5vZGUgY29udGFpbmluZyBvbmx5IGl0c2VsZi5cXG4rXFx0ICogICAgICAgICAgICAgQWxsb2NhdGlvbnMgdGFyZ2V0aW5nIGEgcHJpdmF0ZSBub2RlIHcvIE5PRkFMTEJBQ0tcXG4rXFx0ICogICAgICAgICAgICAgd2lsbCBhbHdheXMgZmFpbCAodGhlaXIgTk9GQUxMQkFDSyBpcyBlbXB0eSlcXG4rXFx0ICpcXG4rXFx0ICogUFJJVkFURTogICAgKE5fTUVNT1JZIHwgTl9NRU1PUllfUFJJVkFURSkgLSBhbGxvd3MgYWNjZXNzIHRvXFxuK1xcdCAqICAgICAgICAgICAgIHByaXZhdGUgbm9kZXMsIGFuZCBmYWxscyBiYWNrIHRvIG5vcm1hbCBtZW1vcnkgdW5sZXNzXFxuK1xcdCAqICAgICAgICAgICAgIF9fR0ZQX1RISVNOT0RFIG90aGVyd2lzZSBjb25zdHJhaW5zIGl0LlxcbitcXHQgKi9cXG4rXFxuK1xcdGJ1aWxkX25vZGVfem9uZWxpc3QocGdkYXQsIFxcdTAwMjZub2RlX3N0YXRlc1tOX01FTU9SWV0sIFpPTkVMSVNUX0ZBTExCQUNLLFxcbitcXHRcXHRcXHQgICAgdHJ1ZSwgbm9kZV9vcmRlciwgXFx1MDAyNm5yX25vZGVzKTtcXG4gXFx0YnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTtcXG4rXFxuIFxcdHByX2luZm8oXFxcIkZhbGxiYWNrIG9yZGVyIGZvciBOb2RlICVkOiBcXFwiLCBsb2NhbF9ub2RlKTtcXG4gXFx0Zm9yIChub2RlID0gMDsgbm9kZSBcXHUwMDNjIG5yX25vZGVzOyBub2RlKyspXFxuIFxcdFxcdHByX2NvbnQoXFxcIiVkIFxcXCIsIG5vZGVfb3JkZXJbbm9kZV0pO1xcbiBcXHRwcl9jb250KFxcXCJcXFxcblxcXCIpO1xcbitcXG4rXFx0bm9kZXNfb3IodGllcl9ub2Rlcywgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XFxuK1xcdGJ1aWxkX25vZGVfem9uZWxpc3QocGdkYXQsIFxcdTAwMjZ0aWVyX25vZGVzLCBaT05FTElTVF9QUklWQVRFLCBmYWxzZSxcXG4rXFx0XFx0XFx0ICAgIG5vZGVfb3JkZXIsIFxcdTAwMjZucl9ub2Rlcyk7XFxuIH1cXG4gXFxuICNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXFxuQEAgLTY1MzMsNiArNjYxNywxMCBAQCBzdGF0aWMgdm9pZCBjYWxjdWxhdGVfdG90YWxyZXNlcnZlX3BhZ2VzKHZvaWQpXFxuIFxcbiBcXHRcXHRwZ2RhdC1cXHUwMDNldG90YWxyZXNlcnZlX3BhZ2VzID0gMDtcXG4gXFxuK1xcdFxcdC8qIHByaXZhdGUgbm9kZXMgaGF2ZSB6ZXJvIHdhdGVybWFya3MgKi9cXG4rXFx0XFx0aWYgKG5vZGVfaXNfcHJpdmF0ZShwZ2RhdC1cXHUwMDNlbm9kZV9pZCkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4gXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE1BWF9OUl9aT05FUzsgaSsrKSB7XFxuIFxcdFxcdFxcdHN0cnVjdCB6b25lICp6b25lID0gcGdkYXQtXFx1MDAzZW5vZGVfem9uZXMgKyBpO1xcbiBcXHRcXHRcXHRsb25nIG1heCA9IDA7XFxuQEAgLTY2MjUsOSArNjcxMywxNSBAQCBzdGF0aWMgdm9pZCBfX3NldHVwX3Blcl96b25lX3dtYXJrcyh2b2lkKVxcbiBcXHRzdHJ1Y3Qgem9uZSAqem9uZTtcXG4gXFx0dW5zaWduZWQgbG9uZyBmbGFncztcXG4gXFxuLVxcdC8qIENhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2YgIVpPTkVfSElHSE1FTSBhbmQgIVpPTkVfTU9WQUJMRSBwYWdlcyAqL1xcbitcXHQvKlxcbitcXHQgKiBDYWxjdWxhdGUgdG90YWwgbnVtYmVyIG9mICFaT05FX0hJR0hNRU0gYW5kICFaT05FX01PVkFCTEUgcGFnZXNcXG4rXFx0ICpcXG4rXFx0ICogUHJpdmF0ZSBub2RlcyBhcmUgZXhjbHVkZWQgYmVjYXVzZSB0aGV5IGFyZSBub3QgaW4gdGhlIHJlZ3VsYXJcXG4rXFx0ICogYWxsb2NhdGlvbiBmYWxsYmFjayBwYXRoIC0gaW5jbHVkaW5nIHRoZW0gZGlsdXRlcyBEUkFNIHdhdGVybWFya3MuXFxuK1xcdCAqL1xcbiBcXHRmb3JfZWFjaF96b25lKHpvbmUpIHtcXG4tXFx0XFx0aWYgKCFpc19oaWdobWVtKHpvbmUpIFxcdTAwMjZcXHUwMDI2IHpvbmVfaWR4KHpvbmUpICE9IFpPTkVfTU9WQUJMRSlcXG4rXFx0XFx0aWYgKCFpc19oaWdobWVtKHpvbmUpIFxcdTAwMjZcXHUwMDI2IHpvbmVfaWR4KHpvbmUpICE9IFpPTkVfTU9WQUJMRSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIW5vZGVfaXNfcHJpdmF0ZSh6b25lX3RvX25pZCh6b25lKSkpXFxuIFxcdFxcdFxcdGxvd21lbV9wYWdlcyArPSB6b25lX21hbmFnZWRfcGFnZXMoem9uZSk7XFxuIFxcdH1cXG4gXFxuQEAgLTY2MzUsNiArNjcyOSwxNiBAQCBzdGF0aWMgdm9pZCBfX3NldHVwX3Blcl96b25lX3dtYXJrcyh2b2lkKVxcbiBcXHRcXHR1NjQgdG1wO1xcbiBcXG4gXFx0XFx0c3Bpbl9sb2NrX2lycXNhdmUoXFx1MDAyNnpvbmUtXFx1MDAzZWxvY2ssIGZsYWdzKTtcXG4rXFx0XFx0aWYgKCFub2RlX2FsbG93c19yZWNsYWltKHpvbmVfdG9fbmlkKHpvbmUpKSkge1xcbitcXHRcXHRcXHR6b25lLVxcdTAwM2Vfd2F0ZXJtYXJrW1dNQVJLX01JTl0gPSAwO1xcbitcXHRcXHRcXHR6b25lLVxcdTAwM2Vfd2F0ZXJtYXJrW1dNQVJLX0xPV10gPSAwO1xcbitcXHRcXHRcXHR6b25lLVxcdTAwM2Vfd2F0ZXJtYXJrW1dNQVJLX0hJR0hdID0gMDtcXG4rXFx0XFx0XFx0em9uZS1cXHUwMDNlX3dhdGVybWFya1tXTUFSS19QUk9NT10gPSAwO1xcbitcXHRcXHRcXHR6b25lLVxcdTAwM2V3YXRlcm1hcmtfYm9vc3QgPSAwO1xcbitcXHRcXHRcXHRzcGluX3VubG9ja19pcnFyZXN0b3JlKFxcdTAwMjZ6b25lLVxcdTAwM2Vsb2NrLCBmbGFncyk7XFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHR9XFxuK1xcbiBcXHRcXHR0bXAgPSAodTY0KXBhZ2VzX21pbiAqIHpvbmVfbWFuYWdlZF9wYWdlcyh6b25lKTtcXG4gXFx0XFx0dG1wID0gZGl2NjRfdWwodG1wLCBsb3dtZW1fcGFnZXMpO1xcbiBcXHRcXHRpZiAoaXNfaGlnaG1lbSh6b25lKSB8fCB6b25lX2lkeCh6b25lKSA9PSBaT05FX01PVkFCTEUpIHtcXG5AQCAtNzMwOSw2ICs3NDEzLDE1IEBAIGludCBhbGxvY19jb250aWdfZnJvemVuX3JhbmdlX25vcHJvZih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCxcXG4gXFx0aWYgKF9fYWxsb2NfY29udGlnX3ZlcmlmeV9nZnBfbWFzayhnZnBfbWFzaywgKGdmcF90ICopXFx1MDAyNmNjLmdmcF9tYXNrKSlcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbitcXHQvKlxcbitcXHQgKiBQcml2YXRlIG5vZGVzIGFyZSBrZXB0IHVucmVhY2hhYmxlIHZpYSB0aGUgem9uZWxpc3RzLCBidXRcXG4rXFx0ICogYWxsb2NfY29udGlnIHdvcmtzIGRpcmVjdGx5IG9uIGEgem9uZSBkZXJpdmVkIGZyb20gdGhlIGNhbGxlcidzXFxuK1xcdCAqIHBmbiByYW5nZSwgYnlwYXNzaW5nIHRoYXQuICBSZWplY3QgdGhpcyBvcGVyYXRpb24gZXhwbGljaXRseVxcbitcXHQgKiByYXRoZXIgdGhhbiBzaWxlbnRseSBjYXJ2aW5nIG1lbW9yeSBvdXQgb2YgYW4gaXNvbGF0ZWQgbm9kZS5cXG4rXFx0ICovXFxuK1xcdGlmICh1bmxpa2VseShub2RlX2lzX3ByaXZhdGUoem9uZV90b19uaWQoY2Muem9uZSkpKSlcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFxuIFxcdC8qXFxuIFxcdCAqIFdoYXQgd2UgZG8gaGVyZSBpcyB3ZSBtYXJrIGFsbCBwYWdlYmxvY2tzIGluIHJhbmdlIGFzXFxuIFxcdCAqIE1JR1JBVEVfSVNPTEFURS4gIEJlY2F1c2UgcGFnZWJsb2NrIGFuZCBtYXggb3JkZXIgcGFnZXMgbWF5XFxuZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuaCBiL21tL3BhZ2VfYWxsb2MuaFxcbmluZGV4IGI5MjU5ZGVkZGI1OWQ3Li43NDE0NDhkODNjZTc3YyAxMDA2NDRcXG4tLS0gYS9tbS9wYWdlX2FsbG9jLmhcXG4rKysgYi9tbS9wYWdlX2FsbG9jLmhcXG5AQCAtNTcsNiArNTcsOSBAQFxcbiAgKi9cXG4gI2RlZmluZSBBTExPQ19OT19DT0RFVEFHICAgICAgIDB4MTAwMFxcbiBcXG4rLyogU2VsZWN0IHRoZSBOX01FTU9SWV9QUklWQVRFIHpvbmVsaXN0IGZhbWlseSAoc2VlIHNlbGVjdF96b25lbGlzdCgpKS4gKi9cXG4rI2RlZmluZSBBTExPQ19aT05FTElTVF9QUklWQVRFIDB4MjAwMFxcbitcXG4gLyogRmxhZ3MgdGhhdCBhbGxvdyBhbGxvY2F0aW9ucyBiZWxvdyB0aGUgbWluIHdhdGVybWFyay4gKi9cXG4gI2RlZmluZSBBTExPQ19SRVNFUlZFUyAoQUxMT0NfTk9OX0JMT0NLfEFMTE9DX01JTl9SRVNFUlZFfEFMTE9DX0hJR0hBVE9NSUN8QUxMT0NfT09NKVxcbiBcXG5AQCAtOTUsNiArOTgsMjkgQEAgc3RydWN0IGFsbG9jX2NvbnRleHQge1xcbiBcXHR1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3M7XFxuIH07XFxuIFxcbisjaWZkZWYgQ09ORklHX05VTUFcXG4rc3RhdGljX2Fzc2VydChaT05FTElTVF9QUklWQVRFICsgMSA9PSBaT05FTElTVF9QUklWQVRFX05PRkFMTEJBQ0spO1xcbisjZW5kaWZcXG4rXFxuKy8qXFxuKyAqIHNlbGVjdF96b25lbGlzdCAtIHJlc29sdmUgdGhlIHpvbmVsaXN0IGZvciBhbiBhbGxvY2F0aW9uXFxuKyAqXFxuKyAqIFRoZSBkZWZhdWx0IG1hdGNoZXMgbm9kZV96b25lbGlzdCgpOyBBTExPQ19aT05FTElTVF9QUklWQVRFIHNlbGVjdHMgdGhlXFxuKyAqIHByaXZhdGUtbm9kZSBmYW1pbHkgc28gYW4gYWxsb2NhdGlvbiBtYXkgcmVhY2ggYW4gTl9NRU1PUllfUFJJVkFURSBub2RlLlxcbisgKi9cXG4rc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZWxpc3QgKlxcbitzZWxlY3Rfem9uZWxpc3QoaW50IG5pZCwgZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MpXFxuK3tcXG4rI2lmZGVmIENPTkZJR19OVU1BXFxuK1xcdGlmIChhbGxvY19mbGFncyBcXHUwMDI2IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUpIHtcXG4rXFx0XFx0aW50IGlkeCA9IFpPTkVMSVNUX1BSSVZBVEUgKyAhIShnZnAgXFx1MDAyNiBfX0dGUF9USElTTk9ERSk7XFxuK1xcbitcXHRcXHRyZXR1cm4gXFx1MDAyNk5PREVfREFUQShuaWQpLVxcdTAwM2Vub2RlX3pvbmVsaXN0c1tpZHhdO1xcbitcXHR9XFxuKyNlbmRpZlxcbitcXHRyZXR1cm4gbm9kZV96b25lbGlzdChuaWQsIGdmcCk7XFxuK31cXG4rXFxuIC8qXFxuICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgb3JkZXIgb2YgYSBmcmVlIHBhZ2UgaW4gdGhlIGJ1ZGR5IHN5c3RlbS4gSW5cXG4gICogZ2VuZXJhbCwgcGFnZV96b25lKHBhZ2UpLVxcdTAwM2Vsb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyIHRvIHByZXZlbnQgdGhlXFxuQEAgLTI1OCw2ICsyODQsMTQgQEAgc3RydWN0IHBhZ2UgKl9fYWxsb2NfcGFnZXNfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLCBpbnQgcHJlZmVycmVkX25cXG4gXFx0XFx0bm9kZW1hc2tfdCAqbm9kZW1hc2ssIHVuc2lnbmVkIGludCBhbGxvY19mbGFncyk7XFxuICNkZWZpbmUgX19hbGxvY19wYWdlcyguLi4pXFx0XFx0XFx0YWxsb2NfaG9va3MoX19hbGxvY19wYWdlc19ub3Byb2YoX19WQV9BUkdTX18pKVxcbiBcXG4rc3RydWN0IGZvbGlvICpfX2ZvbGlvX2FsbG9jX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IHByZWZlcnJlZF9uaWQsXFxuK1xcdFxcdG5vZGVtYXNrX3QgKm5vZGVtYXNrLCB1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MpO1xcbisjZGVmaW5lIF9fZm9saW9fYWxsb2MoLi4uKVxcdFxcdFxcdGFsbG9jX2hvb2tzKF9fZm9saW9fYWxsb2Nfbm9wcm9mKF9fVkFfQVJHU19fKSlcXG4rXFxuK3Vuc2lnbmVkIGxvbmcgX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBhbGxvY19mbGFncyxcXG4rXFx0XFx0aW50IHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrX3QgKm5vZGVtYXNrLCBpbnQgbnJfcGFnZXMsXFxuK1xcdFxcdHN0cnVjdCBwYWdlICoqcGFnZV9hcnJheSk7XFxuK1xcbiBleHRlcm4gdm9pZCB6b25lX3BjcF9yZXNldChzdHJ1Y3Qgem9uZSAqem9uZSk7XFxuIGV4dGVybiB2b2lkIHpvbmVfcGNwX2Rpc2FibGUoc3RydWN0IHpvbmUgKnpvbmUpO1xcbiBleHRlcm4gdm9pZCB6b25lX3BjcF9lbmFibGUoc3RydWN0IHpvbmUgKnpvbmUpO1xcbmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jXFxuaW5kZXggOWI4ZWU5MDJmOTcyOGEuLjZkODEwYTQyZDQ3ZDY2IDEwMDY0NFxcbi0tLSBhL21tL3Ztc2Nhbi5jXFxuKysrIGIvbW0vdm1zY2FuLmNcXG5AQCAtOTc1LDYgKzk3NSwxMCBAQCBzdGF0aWMgc3RydWN0IGZvbGlvICphbGxvY19kZW1vdGVfZm9saW8oc3RydWN0IGZvbGlvICpzcmMsXFxuIFxcbiBcXHRtdGMgPSAoc3RydWN0IG1pZ3JhdGlvbl90YXJnZXRfY29udHJvbCAqKXByaXZhdGU7XFxuIFxcbitcXHRpZiAobXRjLVxcdTAwM2VubWFzayBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgbm9kZXNfaW50ZXJzZWN0cygqbXRjLVxcdTAwM2VubWFzaywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pKVxcbitcXHRcXHRtdGMtXFx1MDAzZWFsbG9jX2ZsYWdzID0gQUxMT0NfWk9ORUxJU1RfUFJJVkFURTtcXG4rXFxuIFxcdC8qXFxuIFxcdCAqIG1ha2Ugc3VyZSB3ZSBhbGxvY2F0ZSBmcm9tIHRoZSB0YXJnZXQgbm9kZSBmaXJzdCBhbHNvIHRyeWluZyB0b1xcbiBcXHQgKiBkZW1vdGUgb3IgcmVjbGFpbSBwYWdlcyBmcm9tIHRoZSB0YXJnZXQgbm9kZSB2aWEga3N3YXBkIGlmIHdlIGFyZVxcbkBAIC01NDE2LDYgKzU0MjAsMjEgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbHJ1X2dlbl9hdHRyX2dyb3VwID0ge1xcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdmcyBpbnRlcmZhY2VcXG4gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cXG4gXFxuKy8qXFxuKyAqIE5vZGVzIHRoZSBscnVfZ2VuIGRlYnVnZnMgaW50ZXJmYWNlIGxpc3RzOiBvcmRpbmFyeSBtZW1vcnkgbm9kZXMgcGx1cyBhbnlcXG4rICogTl9NRU1PUllfUFJJVkFURSBub2RlcyBvcHRlZCBpbnRvIHJlY2xhaW0uICBydW5fY21kKCkgYWxyZWFkeSBhY2NlcHRzIHRoZVxcbisgKiBsYXR0ZXIsIHNvIGtlZXAgdGhlIGxpc3RpbmcgaW4gc3luYyB3aXRoIHdoYXQgaXQgYWNjZXB0cy5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGxydV9nZW5fc2VxX25vZGVzKG5vZGVtYXNrX3QgKm5vZGVzKVxcbit7XFxuK1xcdGludCBuaWQ7XFxuK1xcbitcXHQqbm9kZXMgPSBub2RlX3N0YXRlc1tOX01FTU9SWV07XFxuK1xcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKVxcbitcXHRcXHRpZiAobm9kZV9hbGxvd3NfcmVjbGFpbShuaWQpKVxcbitcXHRcXHRcXHRub2RlX3NldChuaWQsICpub2Rlcyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkICpscnVfZ2VuX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKVxcbiB7XFxuIFxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcXG5AQCAtNTQyNyw5ICs1NDQ2LDExIEBAIHN0YXRpYyB2b2lkICpscnVfZ2VuX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKVxcbiBcXG4gXFx0bWVtY2cgPSBtZW1fY2dyb3VwX2l0ZXIoTlVMTCwgTlVMTCwgTlVMTCk7XFxuIFxcdGRvIHtcXG4rXFx0XFx0bm9kZW1hc2tfdCBub2RlcztcXG4gXFx0XFx0aW50IG5pZDtcXG4gXFxuLVxcdFxcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkge1xcbitcXHRcXHRscnVfZ2VuX3NlcV9ub2RlcyhcXHUwMDI2bm9kZXMpO1xcbitcXHRcXHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBub2Rlcykge1xcbiBcXHRcXHRcXHRpZiAoIW5yX3RvX3NraXAtLSlcXG4gXFx0XFx0XFx0XFx0cmV0dXJuIGdldF9scnV2ZWMobWVtY2csIG5pZCk7XFxuIFxcdFxcdH1cXG5AQCAtNTQ1MSwxNiArNTQ3MiwxOCBAQCBzdGF0aWMgdm9pZCAqbHJ1X2dlbl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxcbiB7XFxuIFxcdGludCBuaWQgPSBscnV2ZWNfcGdkYXQodiktXFx1MDAzZW5vZGVfaWQ7XFxuIFxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IGxydXZlY19tZW1jZyh2KTtcXG4rXFx0bm9kZW1hc2tfdCBub2RlcztcXG4gXFxuIFxcdCsrKnBvcztcXG4gXFxuLVxcdG5pZCA9IG5leHRfbWVtb3J5X25vZGUobmlkKTtcXG4rXFx0bHJ1X2dlbl9zZXFfbm9kZXMoXFx1MDAyNm5vZGVzKTtcXG4rXFx0bmlkID0gbmV4dF9ub2RlKG5pZCwgbm9kZXMpO1xcbiBcXHRpZiAobmlkID09IE1BWF9OVU1OT0RFUykge1xcbiBcXHRcXHRtZW1jZyA9IG1lbV9jZ3JvdXBfaXRlcihOVUxMLCBtZW1jZywgTlVMTCk7XFxuIFxcdFxcdGlmICghbWVtY2cpXFxuIFxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4tXFx0XFx0bmlkID0gZmlyc3RfbWVtb3J5X25vZGU7XFxuK1xcdFxcdG5pZCA9IGZpcnN0X25vZGUobm9kZXMpO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gZ2V0X2xydXZlYyhtZW1jZywgbmlkKTtcXG5AQCAtNTUyOSwxMCArNTU1MiwxMiBAQCBzdGF0aWMgaW50IGxydV9nZW5fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxcbiBcXHRzdHJ1Y3QgbHJ1X2dlbl9mb2xpbyAqbHJ1Z2VuID0gXFx1MDAyNmxydXZlYy1cXHUwMDNlbHJ1Z2VuO1xcbiBcXHRpbnQgbmlkID0gbHJ1dmVjX3BnZGF0KGxydXZlYyktXFx1MDAzZW5vZGVfaWQ7XFxuIFxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IGxydXZlY19tZW1jZyhscnV2ZWMpO1xcbitcXHRub2RlbWFza190IG5vZGVzO1xcbiBcXHRERUZJTkVfTUFYX1NFUShscnV2ZWMpO1xcbiBcXHRERUZJTkVfTUlOX1NFUShscnV2ZWMpO1xcbiBcXG4tXFx0aWYgKG5pZCA9PSBmaXJzdF9tZW1vcnlfbm9kZSkge1xcbitcXHRscnVfZ2VuX3NlcV9ub2RlcyhcXHUwMDI2bm9kZXMpO1xcbitcXHRpZiAobmlkID09IGZpcnN0X25vZGUobm9kZXMpKSB7XFxuIFxcdFxcdGNvbnN0IGNoYXIgKnBhdGggPSBtZW1jZyA/IG0tXFx1MDAzZXByaXZhdGUgOiBcXFwiXFxcIjtcXG4gXFxuICNpZmRlZiBDT05GSUdfTUVNQ0dcXG5AQCAtNTYzMiw3ICs1NjU3LDkgQEAgc3RhdGljIGludCBydW5fY21kKGNoYXIgY21kLCB1NjQgbWVtY2dfaWQsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc2VxLFxcbiBcXHRpbnQgZXJyID0gLUVJTlZBTDtcXG4gXFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDtcXG4gXFxuLVxcdGlmIChuaWQgXFx1MDAzYyAwIHx8IG5pZCBcXHUwMDNlPSBNQVhfTlVNTk9ERVMgfHwgIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpXFxuK1xcdGlmIChuaWQgXFx1MDAzYyAwIHx8IG5pZCBcXHUwMDNlPSBNQVhfTlVNTk9ERVMgfHxcXG4rXFx0ICAgICEobm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSB8fFxcbitcXHQgICAgICAobm9kZV9pc19wcml2YXRlKG5pZCkgXFx1MDAyNlxcdTAwMjYgbm9kZV9hbGxvd3NfcmVjbGFpbShuaWQpKSkpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXG4gXFx0aWYgKCFtZW1fY2dyb3VwX2Rpc2FibGVkKCkpIHtcXG5AQCAtNjE2MSw2ICs2MTg4LDEzIEBAIHN0YXRpYyB2b2lkIHNocmlua19ub2RlKHBnX2RhdGFfdCAqcGdkYXQsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKVxcbiBcXHRzdHJ1Y3QgbHJ1dmVjICp0YXJnZXRfbHJ1dmVjO1xcbiBcXHRib29sIHJlY2xhaW1hYmxlID0gZmFsc2U7XFxuIFxcbitcXHQvKlxcbitcXHQgKiBQcml2YXRlIG5vZGVzIGRvIG5vdCBzdXBwb3J0IHJlY2xhaW0gYnkgZGVmYXVsdCwgZmlsdGVyaW5nIGhlcmVcXG4rXFx0ICogY2FwdHVyZXMgYWxsIG5vcm1hbCByZWNsYWltIHBhdGhzIHRoYXQgbWF5IGF0dGVtcHQgZXZpY3Rpb24uXFxuK1xcdCAqL1xcbitcXHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0ocGdkYXQtXFx1MDAzZW5vZGVfaWQpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbiBcXHRpZiAoKGxydV9nZW5fZW5hYmxlZCgpIHx8IGxydV9nZW5fc3dpdGNoaW5nKCkpIFxcdTAwMjZcXHUwMDI2IHJvb3RfcmVjbGFpbShzYykpIHtcXG4gXFx0XFx0bWVtc2V0KFxcdTAwMjZzYy1cXHUwMDNlbnIsIDAsIHNpemVvZihzYy1cXHUwMDNlbnIpKTtcXG4gXFx0XFx0bHJ1X2dlbl9zaHJpbmtfbm9kZShwZ2RhdCwgc2MpO1xcbkBAIC02NzcxLDYgKzY4MDUsMTYgQEAgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4gXFx0cmV0dXJuIHNjLm5yX3JlY2xhaW1lZDtcXG4gfVxcbiBcXG4rc3RhdGljIHN0cnVjdCB6b25lbGlzdCAqbWVtY2dfcmVjbGFpbV96b25lbGlzdChpbnQgbmlkLCBnZnBfdCBnZnBfbWFzaylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgYWZsYWdzID0gQUxMT0NfREVGQVVMVDtcXG4rXFxuK1xcdGlmICh1bmxpa2VseSghbm9kZXNfZW1wdHkobm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pKSlcXG4rXFx0XFx0YWZsYWdzID0gQUxMT0NfWk9ORUxJU1RfUFJJVkFURTtcXG4rXFxuK1xcdHJldHVybiBzZWxlY3Rfem9uZWxpc3QobmlkLCBnZnBfbWFzaywgYWZsYWdzKTtcXG4rfVxcbitcXG4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgZ2ZwX3QgZ2ZwX21hc2ssXFxuQEAgLTY3OTcsNyArNjg0MSw4IEBAIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuIFxcdCAqIGVxdWFsIHByZXNzdXJlIG9uIGFsbCB0aGUgbm9kZXMuIFRoaXMgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdFxcbiBcXHQgKiB0aGUgcmVjbGFpbSBkb2VzIG5vdCBiYWlsIG91dCBlYXJseS5cXG4gXFx0ICovXFxuLVxcdHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBub2RlX3pvbmVsaXN0KG51bWFfbm9kZV9pZCgpLCBzYy5nZnBfbWFzayk7XFxuK1xcdHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBtZW1jZ19yZWNsYWltX3pvbmVsaXN0KG51bWFfbm9kZV9pZCgpLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBzYy5nZnBfbWFzayk7XFxuIFxcbiBcXHRzZXRfdGFza19yZWNsYWltX3N0YXRlKGN1cnJlbnQsIFxcdTAwMjZzYy5yZWNsYWltX3N0YXRlKTtcXG4gXFx0dHJhY2VfbW1fdm1zY2FuX21lbWNnX3JlY2xhaW1fYmVnaW4oc2MuZ2ZwX21hc2ssIDAsIG1lbWNnKTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cXG5pbmRleCA2ZmMzNGU5YmY4ZTFiNC4uZTBkZDc3YzY2NGM3ZWMgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cXG5AQCAtMTU1LDYgKzE1NSw3IEBAIFRFU1RfR0VOX1BST0dTX3g4NiArPSBhY2Nlc3NfdHJhY2tpbmdfcGVyZl90ZXN0XFxuIFRFU1RfR0VOX1BST0dTX3g4NiArPSBjb2FsZXNjZWRfaW9fdGVzdFxcbiBURVNUX0dFTl9QUk9HU194ODYgKz0gZGlydHlfbG9nX3BlcmZfdGVzdFxcbiBURVNUX0dFTl9QUk9HU194ODYgKz0gZ3Vlc3RfbWVtZmRfdGVzdFxcbitURVNUX0dFTl9QUk9HU194ODYgKz0gZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3RcXG4gVEVTVF9HRU5fUFJPR1NfeDg2ICs9IGhhcmR3YXJlX2Rpc2FibGVfdGVzdFxcbiBURVNUX0dFTl9QUk9HU194ODYgKz0gbW11X3N0cmVzc190ZXN0XFxuIFRFU1RfR0VOX1BST0dTX3g4NiArPSByc2VxX3Rlc3RcXG5AQCAtMTk1LDYgKzE5Niw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGNvYWxlc2NlZF9pb190ZXN0XFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGRpcnR5X2xvZ19wZXJmX3Rlc3RcXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gZ2V0LXJlZy1saXN0XFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGd1ZXN0X21lbWZkX3Rlc3RcXG4rVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3RcXG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gbW11X3N0cmVzc190ZXN0XFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IHJzZXFfdGVzdFxcbiBURVNUX0dFTl9QUk9HU19hcm02NCArPSBzdGVhbF90aW1lXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL2d1ZXN0X21lbWZkX2JpbmRfbm9kZV90ZXN0LmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi42ZjMzYjFhZTZjNDJhY1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3QuY1xcbkBAIC0wLDAgKzEsMjEzIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIFN0YW5kYWxvbmUgdGVzdCBmb3IgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUuXFxuKyAqXFxuKyAqIFZlcmlmaWVzIHRoYXQgYSBndWVzdF9tZW1mZCBjcmVhdGVkIHdpdGggR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgYWxsb2NhdGVzXFxuKyAqIGl0cyBmb2xpb3Mgb24gdGhlIHJlcXVlc3RlZCBOVU1BIG5vZGUsIHdpdGhvdXQgYW55IHVzZXJzcGFjZSBtYmluZCgpLlxcbisgKlxcbisgKiBUaGUgZm9saW8gcGxhY2VtZW50IGlzIGNoZWNrZWQgd2l0aCBtb3ZlX3BhZ2VzKDIpIChzdGF0dXMgcXVlcnkgbW9kZSkuXFxuKyAqXFxuKyAqIFNlbGYtY29udGFpbmVkOlxcbisgKiAgIC0gaXNzdWVzIHRoZSBLVk0gaW9jdGxzIGRpcmVjdGx5XFxuKyAqXFxuKyAqIEJ1aWxkIGluc2lkZSB0aGUgZ3Vlc3Q6XFxuKyAqICAgZ2NjIC1PMiAtbyBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdCBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdC5jXFxuKyAqXFxuKyAqIFVzYWdlOiBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdCBcXHUwMDNjdGFyZ2V0X25vZGVcXHUwMDNlXFxuKyAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2NlcnIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2Vycm5vLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zdGF0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvc3lzY2FsbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgva3ZtLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rXFxuKy8qIE1pcnJvciB0aGUgKHByb3Bvc2VkKSB1YXBpIGFkZGl0aW9ucyBpbiBjYXNlIHRoZSBob3N0IGhlYWRlcnMgbGFnLiAqL1xcbisjaWZuZGVmIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFxcbisjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFxcdFxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDApXFxuKyNlbmRpZlxcbisjaWZuZGVmIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRURcXG4rI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0lOSVRfU0hBUkVEXFx0KDFVTEwgXFx1MDAzY1xcdTAwM2MgMSlcXG4rI2VuZGlmXFxuKyNpZm5kZWYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVcXG4rI2RlZmluZSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERVxcdCgxVUxMIFxcdTAwM2NcXHUwMDNjIDIpXFxuKyNlbmRpZlxcbisjaWZuZGVmIEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1NcXG4rI2RlZmluZSBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTXFx0MjQ0XFxuKyNlbmRpZlxcbitcXG4rc3RydWN0IGdtZW1mZF9hcmdzIHtcXG4rXFx0X191NjQgc2l6ZTtcXG4rXFx0X191NjQgZmxhZ3M7XFxuK1xcdF9fdTMyIG5vZGU7XFxuK1xcdF9fdTMyIHBhZDtcXG4rXFx0X191NjQgcmVzZXJ2ZWRbNV07XFxuK307XFxuK1xcbisvKiBUcnVlIGlmIHRoZSBub2RlIGhhcyBhbnkgbWVtb3J5IChNZW1Ub3RhbCBcXHUwMDNlIDApLiAqL1xcbitzdGF0aWMgaW50IG5vZGVfaGFzX21lbW9yeShpbnQgbm9kZSlcXG4re1xcbitcXHRjaGFyIHBhdGhbMTI4XTtcXG4rXFx0Y2hhciBsaW5lWzI1Nl07XFxuK1xcdEZJTEUgKmY7XFxuK1xcdGxvbmcgdG90YWwgPSAtMTtcXG4rXFxuK1xcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSxcXG4rXFx0XFx0IFxcXCIvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZSVkL21lbWluZm9cXFwiLCBub2RlKTtcXG4rXFx0ZiA9IGZvcGVuKHBhdGgsIFxcXCJyXFxcIik7XFxuK1xcdGlmICghZilcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7XFxuK1xcdFxcdGlmIChzdHJzdHIobGluZSwgXFxcIk1lbVRvdGFsOlxcXCIpKSB7XFxuK1xcdFxcdFxcdGlmIChzc2NhbmYobGluZSwgXFxcIk5vZGUgJSpkIE1lbVRvdGFsOiAlbGQga0JcXFwiLCBcXHUwMDI2dG90YWwpID09IDEpXFxuK1xcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0ZmNsb3NlKGYpO1xcbitcXHRyZXR1cm4gdG90YWwgXFx1MDAzZSAwO1xcbit9XFxuK1xcbitzdGF0aWMgbG9uZyBtb3ZlX3BhZ2VzX3N0YXR1cyh2b2lkICphZGRyKVxcbit7XFxuK1xcdHZvaWQgKnBhZ2VzWzFdID0geyBhZGRyIH07XFxuK1xcdGludCBzdGF0dXNbMV0gPSB7IC0xIH07XFxuK1xcdGxvbmcgcmV0O1xcbitcXG4rXFx0cmV0ID0gc3lzY2FsbChTWVNfbW92ZV9wYWdlcywgMCwgMSwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdGVycigxLCBcXFwibW92ZV9wYWdlc1xcXCIpO1xcbitcXHRyZXR1cm4gc3RhdHVzWzBdO1xcbit9XFxuK1xcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuK3tcXG4rXFx0aW50IGt2bSwgdm0sIGdtZW0sIHJldDtcXG4rXFx0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XFxuK1xcdHNpemVfdCBzaXplID0gcGFnZV9zaXplICogNDtcXG4rXFx0aW50IHRhcmdldF9ub2RlO1xcbitcXHRzdHJ1Y3QgZ21lbWZkX2FyZ3MgZ2EgPSB7fTtcXG4rXFx0Y2hhciAqbWVtO1xcbitcXHRzaXplX3QgaTtcXG4rXFxuK1xcdGlmIChhcmdjICE9IDIpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJ1c2FnZTogJXMgXFx1MDAzY3RhcmdldF9ub2RlXFx1MDAzZVxcXFxuXFxcIiwgYXJndlswXSk7XFxuK1xcdHRhcmdldF9ub2RlID0gYXRvaShhcmd2WzFdKTtcXG4rXFxuK1xcdGt2bSA9IG9wZW4oXFxcIi9kZXYva3ZtXFxcIiwgT19SRFdSKTtcXG4rXFx0aWYgKGt2bSBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuIC9kZXYva3ZtOiAlc1xcXFxuXFxcIiwgc3RyZXJyb3IoZXJybm8pKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFVzZSBhIGRlZmF1bHQgKG5vbi1wcm90ZWN0ZWQpIFZNOiBpdCBoYXMgbm8gcHJpdmF0ZSBtZW1vcnksIHNvIGl0XFxuK1xcdCAqIGFkdmVydGlzZXMgR1VFU1RfTUVNRkRfRkxBR19JTklUX1NIQVJFRCwgd2hpY2ggbGV0cyB0aGUgaG9zdCBtbWFwIGFuZFxcbitcXHQgKiBmYXVsdCB0aGUgZ21lbSAobmVlZGVkIHRvIG9ic2VydmUgcGxhY2VtZW50IHdpdGggbW92ZV9wYWdlcygpKS4gIEFcXG4rXFx0ICogU1ctcHJvdGVjdGVkIFZNIHdvdWxkIG5vdCBhZHZlcnRpc2UgSU5JVF9TSEFSRUQgYW5kIHRoZSBob3N0IGZhdWx0XFxuK1xcdCAqIHdvdWxkIFNJR0JVUy5cXG4rXFx0ICovXFxuK1xcdHZtID0gaW9jdGwoa3ZtLCBLVk1fQ1JFQVRFX1ZNLCAwVUwpO1xcbitcXHRpZiAodm0gXFx1MDAzYyAwKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiS1ZNX0NSRUFURV9WTTogJXNcXFxcblxcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcbitcXHR7XFxuK1xcdFxcdGxvbmcgY2FwcyA9IGlvY3RsKHZtLCBLVk1fQ0hFQ0tfRVhURU5TSU9OLFxcbitcXHRcXHRcXHRcXHQgIEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1MpO1xcbitcXG4rXFx0XFx0cHJpbnRmKFxcXCJLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTID0gMHglbHhcXFxcblxcXCIsIGNhcHMpO1xcbitcXHRcXHRpZiAoIShjYXBzIFxcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiQklORF9OT0RFIGZsYWcgbm90IGFkdmVydGlzZWQgKG5lZWQgQ09ORklHX05VTUEpXFxcXG5cXFwiKTtcXG4rXFx0XFx0aWYgKCEoY2FwcyBcXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQpKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiSU5JVF9TSEFSRUQgbm90IGFkdmVydGlzZWQ7IGNhbm5vdCBmYXVsdCBmcm9tIGhvc3RcXFxcblxcXCIpO1xcbitcXHR9XFxuK1xcbitcXHQvKiBOZWdhdGl2ZTogcGFkIG11c3QgYmUgemVyby4gKi9cXG4rXFx0Z2EgPSAoc3RydWN0IGdtZW1mZF9hcmdzKXsgLnNpemUgPSBzaXplLFxcbitcXHRcXHRcXHRcXHQgICAuZmxhZ3MgPSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSxcXG4rXFx0XFx0XFx0XFx0ICAgLm5vZGUgPSB0YXJnZXRfbm9kZSwgLnBhZCA9IDEgfTtcXG4rXFx0cmV0ID0gaW9jdGwodm0sIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQsIFxcdTAwMjZnYSk7XFxuK1xcdGlmICghKHJldCBcXHUwMDNjIDAgXFx1MDAyNlxcdTAwMjYgZXJybm8gPT0gRUlOVkFMKSlcXG4rXFx0XFx0ZXJyeCgxLCBcXFwibm9uemVybyBwYWQgc2hvdWxkIGJlIHJlamVjdGVkIChyZXQ9JWQgZXJybm89JWQpXFxcIiwgcmV0LCBlcnJubyk7XFxuK1xcdHByaW50ZihcXFwiT0s6IG5vbnplcm8gcGFkIHJlamVjdGVkXFxcXG5cXFwiKTtcXG4rXFxuK1xcdC8qIE5lZ2F0aXZlOiBvdXQtb2YtcmFuZ2Ugbm9kZS4gKi9cXG4rXFx0Z2EgPSAoc3RydWN0IGdtZW1mZF9hcmdzKXsgLnNpemUgPSBzaXplLFxcbitcXHRcXHRcXHRcXHQgICAuZmxhZ3MgPSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSxcXG4rXFx0XFx0XFx0XFx0ICAgLm5vZGUgPSAxIFxcdTAwM2NcXHUwMDNjIDIwIH07XFxuK1xcdHJldCA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcXHUwMDI2Z2EpO1xcbitcXHRpZiAoIShyZXQgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IGVycm5vID09IEVJTlZBTCkpXFxuK1xcdFxcdGVycngoMSwgXFxcImJvZ3VzIG5vZGUgc2hvdWxkIGJlIHJlamVjdGVkIChyZXQ9JWQgZXJybm89JWQpXFxcIiwgcmV0LCBlcnJubyk7XFxuK1xcdHByaW50ZihcXFwiT0s6IG91dC1vZi1yYW5nZSBub2RlIHJlamVjdGVkXFxcXG5cXFwiKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIE5lZ2F0aXZlOiBub2RlIHNldCB3aXRob3V0IHRoZSBmbGFnLiAgT25seSBtZWFuaW5nZnVsIGZvciBhIG5vbnplcm9cXG4rXFx0ICogbm9kZTogbm9kZSAwIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gXFxcIm5vZGUgZmllbGQgdW5zZXRcXFwiLlxcbitcXHQgKi9cXG4rXFx0aWYgKHRhcmdldF9ub2RlICE9IDApIHtcXG4rXFx0XFx0Z2EgPSAoc3RydWN0IGdtZW1mZF9hcmdzKXsgLnNpemUgPSBzaXplLCAuZmxhZ3MgPSAwLFxcbitcXHRcXHRcXHRcXHRcXHQgICAubm9kZSA9IHRhcmdldF9ub2RlIH07XFxuK1xcdFxcdHJldCA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcXHUwMDI2Z2EpO1xcbitcXHRcXHRpZiAoIShyZXQgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IGVycm5vID09IEVJTlZBTCkpXFxuK1xcdFxcdFxcdGVycngoMSwgXFxcIm5vZGUgd2l0aG91dCBmbGFnIHNob3VsZCBiZSByZWplY3RlZCAocmV0PSVkIGVycm5vPSVkKVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgcmV0LCBlcnJubyk7XFxuK1xcdFxcdHByaW50ZihcXFwiT0s6IG5vZGUtd2l0aG91dC1mbGFnIHJlamVjdGVkXFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogUG9zaXRpdmU6IGJpbmQgdG8gdGFyZ2V0X25vZGUsIG1tYXAsIGZhdWx0LCB2ZXJpZnkgcGxhY2VtZW50LiAqL1xcbitcXHRnYSA9IChzdHJ1Y3QgZ21lbWZkX2FyZ3Mpe1xcbitcXHRcXHQuc2l6ZSA9IHNpemUsXFxuK1xcdFxcdC5mbGFncyA9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIHwgR1VFU1RfTUVNRkRfRkxBR19NTUFQIHxcXG4rXFx0XFx0XFx0IEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQsXFxuK1xcdFxcdC5ub2RlID0gdGFyZ2V0X25vZGUsXFxuK1xcdH07XFxuK1xcdGdtZW0gPSBpb2N0bCh2bSwgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRCwgXFx1MDAyNmdhKTtcXG4rXFx0aWYgKGdtZW0gXFx1MDAzYyAwKSB7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIEEgbm9kZSB0aGF0IGNhbm5vdCBiZSBib3VuZCAtIG1lbW9yeWxlc3Mvb2ZmbGluZSwgb3IgYSBwcml2YXRlXFxuK1xcdFxcdCAqIG5vZGUgdGhhdCBkaWQgbm90IG9wdCBpbnRvIHVzZXJzcGFjZSBwbGFjZW1lbnQgLSBtdXN0IGJlXFxuK1xcdFxcdCAqIHJlamVjdGVkIGF0IGNyZWF0ZSB3aXRoIEVJTlZBTCAobXBvbF9iaW5kX25vZGUoKSBmYWlscyksIG5vdFxcbitcXHRcXHQgKiBwcm9kdWNlIGFuIG9wYXF1ZSBmYWlsdXJlIGxhdGVyLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCFub2RlX2hhc19tZW1vcnkodGFyZ2V0X25vZGUpIFxcdTAwMjZcXHUwMDI2IGVycm5vID09IEVJTlZBTCkge1xcbitcXHRcXHRcXHRwcmludGYoXFxcIk9LOiB1bmJpbmRhYmxlIG5vZGUgJWQgcmVqZWN0ZWQgd2l0aCBFSU5WQUxcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICB0YXJnZXRfbm9kZSk7XFxuK1xcdFxcdFxcdHJldHVybiAwO1xcbitcXHRcXHR9XFxuK1xcdFxcdGVycigxLCBcXFwiS1ZNX0NSRUFURV9HVUVTVF9NRU1GRChiaW5kIG5vZGUgJWQpXFxcIiwgdGFyZ2V0X25vZGUpO1xcbitcXHR9XFxuK1xcdGlmICghbm9kZV9oYXNfbWVtb3J5KHRhcmdldF9ub2RlKSlcXG4rXFx0XFx0ZXJyeCgxLCBcXFwiRkFJTDogdW5iaW5kYWJsZSBub2RlICVkIHNob3VsZCBoYXZlIGJlZW4gcmVqZWN0ZWRcXFwiLFxcbitcXHRcXHQgICAgIHRhcmdldF9ub2RlKTtcXG4rXFx0cHJpbnRmKFxcXCJPSzogY3JlYXRlZCBnbWVtIGZkPSVkIGJvdW5kIHRvIG5vZGUgJWRcXFxcblxcXCIsIGdtZW0sIHRhcmdldF9ub2RlKTtcXG4rXFxuK1xcdG1lbSA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZ21lbSwgMCk7XFxuK1xcdGlmIChtZW0gPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0ZXJyKDEsIFxcXCJtbWFwIGdtZW1cXFwiKTtcXG4rXFxuK1xcdC8qIEZhdWx0IGV2ZXJ5IHBhZ2UgaW4gKG5vIG1iaW5kIG9uIHRoaXMgbWFwcGluZykuICovXFxuK1xcdG1lbXNldChtZW0sIDB4YWEsIHNpemUpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNpemUgLyBwYWdlX3NpemU7IGkrKykge1xcbitcXHRcXHRsb25nIG5vZGUgPSBtb3ZlX3BhZ2VzX3N0YXR1cyhtZW0gKyBpICogcGFnZV9zaXplKTtcXG4rXFxuK1xcdFxcdHByaW50ZihcXFwicGFnZSAlenUgLVxcdTAwM2Ugbm9kZSAlbGQgKHdhbnQgJWQpXFxcXG5cXFwiLCBpLCBub2RlLCB0YXJnZXRfbm9kZSk7XFxuK1xcdFxcdGlmIChub2RlICE9IHRhcmdldF9ub2RlKVxcbitcXHRcXHRcXHRlcnJ4KDEsIFxcXCJGQUlMOiBwYWdlICV6dSBsYW5kZWQgb24gbm9kZSAlbGQsIHdhbnRlZCAlZFxcXCIsXFxuK1xcdFxcdFxcdCAgICAgaSwgbm9kZSwgdGFyZ2V0X25vZGUpO1xcbitcXHR9XFxuK1xcbitcXHRwcmludGYoXFxcIlBBU1M6IGFsbCAlenUgcGFnZXMgb24gbm9kZSAlZCB2aWEgRkxBR19CSU5EX05PREUgKG5vIG1iaW5kKVxcXFxuXFxcIixcXG4rXFx0ICAgICAgIHNpemUgLyBwYWdlX3NpemUsIHRhcmdldF9ub2RlKTtcXG4rXFxuK1xcdG11bm1hcChtZW0sIHNpemUpO1xcbitcXHRjbG9zZShnbWVtKTtcXG4rXFx0Y2xvc2Uodm0pO1xcbitcXHRjbG9zZShrdm0pO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbmluZGV4IGYwZTVkYTQ5MDg2NjA0Li5kZTMyMGRmMDhlMGZmNCAxMDA2NDRcXG4tLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXFxuKysrIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xcbkBAIC00NTYsNiArNDU2LDI2IEBAIHN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICprdm1fZ21lbV9nZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHQgKi9cXG4gXFx0cmV0dXJuIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoXFx1MDAyNkdNRU1fSShpbm9kZSktXFx1MDAzZXBvbGljeSwgcGdvZmYpO1xcbiB9XFxuK1xcbitzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcXG4re1xcbitcXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRwb2wgPSBtcG9sX2JpbmRfbm9kZShub2RlKTtcXG4rXFx0aWYgKElTX0VSUihwb2wpKVxcbitcXHRcXHRyZXR1cm4gUFRSX0VSUihwb2wpO1xcbitcXG4rXFx0ZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShcXHUwMDI2R01FTV9JKGlub2RlKS1cXHUwMDNlcG9saWN5LCAwLFxcbitcXHRcXHRcXHRcXHRcXHQgIE1BWF9MRlNfRklMRVNJWkUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCwgcG9sKTtcXG4rXFx0bXBvbF9wdXQocG9sKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbisjZWxzZVxcbitzdGF0aWMgaW50IGt2bV9nbWVtX2JpbmRfbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbm9kZSlcXG4re1xcbitcXHRyZXR1cm4gLUVJTlZBTDtcXG4rfVxcbiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG4gXFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2dtZW1fdm1fb3BzID0ge1xcbkBAIC01NTcsNyArNTc3LDcgQEAgYm9vbCBfX3dlYWsga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pXFxuIFxcdHJldHVybiB0cnVlO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncylcXG4rc3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKVxcbiB7XFxuIFxcdHN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gXFxcIltrdm0tZ21lbV1cXFwiO1xcbiBcXHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xcbkBAIC01OTgsNiArNjE4LDEyIEBAIHN0YXRpYyBpbnQgX19rdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBsb2ZmX3Qgc2l6ZSwgdTY0IGZsYWdzKVxcbiBcXG4gXFx0R01FTV9JKGlub2RlKS1cXHUwMDNlZmxhZ3MgPSBmbGFncztcXG4gXFxuK1xcdGlmIChmbGFncyBcXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFKSB7XFxuK1xcdFxcdGVyciA9IGt2bV9nbWVtX2JpbmRfbm9kZShpbm9kZSwgbm9kZSk7XFxuK1xcdFxcdGlmIChlcnIpXFxuK1xcdFxcdFxcdGdvdG8gZXJyX2lub2RlO1xcbitcXHR9XFxuK1xcbiBcXHRmaWxlID0gYWxsb2NfZmlsZV9wc2V1ZG8oaW5vZGUsIGt2bV9nbWVtX21udCwgbmFtZSwgT19SRFdSLCBcXHUwMDI2a3ZtX2dtZW1fZm9wcyk7XFxuIFxcdGlmIChJU19FUlIoZmlsZSkpIHtcXG4gXFx0XFx0ZXJyID0gUFRSX0VSUihmaWxlKTtcXG5AQCAtNjMwLDYgKzY1Niw3IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcXG4ge1xcbiBcXHRsb2ZmX3Qgc2l6ZSA9IGFyZ3MtXFx1MDAzZXNpemU7XFxuIFxcdHU2NCBmbGFncyA9IGFyZ3MtXFx1MDAzZWZsYWdzO1xcbitcXHRpbnQgbm9kZSA9IE5VTUFfTk9fTk9ERTtcXG4gXFxuIFxcdGlmIChmbGFncyBcXHUwMDI2IH5rdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSkpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbkBAIC02MzcsNyArNjY0LDE1IEBAIGludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcXG4gXFx0aWYgKHNpemUgXFx1MDAzYz0gMCB8fCAhUEFHRV9BTElHTkVEKHNpemUpKVxcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFxuLVxcdHJldHVybiBfX2t2bV9nbWVtX2NyZWF0ZShrdm0sIHNpemUsIGZsYWdzKTtcXG4rXFx0aWYgKGZsYWdzIFxcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcXG4rXFx0XFx0aWYgKGFyZ3MtXFx1MDAzZXBhZCB8fCBhcmdzLVxcdTAwM2Vub2RlIFxcdTAwM2U9IE1BWF9OVU1OT0RFUylcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdFxcdG5vZGUgPSBhcmdzLVxcdTAwM2Vub2RlO1xcbitcXHR9IGVsc2UgaWYgKGFyZ3MtXFx1MDAzZW5vZGUgfHwgYXJncy1cXHUwMDNlcGFkKSB7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncywgbm9kZSk7XFxuIH1cXG4gXFxuIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjNUMDI6NTI6NTcuMTMzNDIwNDYyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6OTc0MDMwNDg4MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiS1ZNXCIsXG4gICAgXCJOVU1BXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwia3ZtX2dtZW1fY3JlYXRlXCIsXG4gICAgXCJfX2t2bV9nbWVtX2NyZWF0ZVwiLFxuICAgIFwia3ZtX2dtZW1fYmluZF9ub2RlXCIsXG4gICAgXCJtcG9sX2JpbmRfbm9kZVwiLFxuICAgIFwiX19tcG9sX2JpbmRfbm9kZVwiLFxuICAgIFwibXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHByaXZhdGUgbWVtb3J5IG5vZGVzIGFuZCBhZGRzIHN1cHBvcnQgZm9yIHRoZW0gYWNyb3NzIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIFdoaWxlIHRoZSBkcml2ZXItZmFjaW5nIEFQSSBpcyBub3QgeWV0IHVzZWQgYnkgYW55IGluLXRyZWUgZHJpdmVyLCB0aGUgcGF0Y2ggYWxzbyBpbnRyb2R1Y2VzIGEgbmV3IEtWTSBmZWF0dXJlIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFIHdoaWNoIGFsbG93cyBiaW5kaW5nIGEgZ3Vlc3RfbWVtZmQgdG8gYSBzcGVjaWZpYyBOVU1BIG5vZGUuIFRoaXMgZmVhdHVyZSBpcyBmdWxseSByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIHRoZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEIGlvY3RsIGFuZCByZWxpZXMgb24gdGhlIG5ld2x5IGFkZGVkIG1wb2xfYmluZF9ub2RlIGFuZCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlIGZ1bmN0aW9ucy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIEtWTSBhbmQgY29yZSBtbSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYzhhOTc1OTgzMmVlZjdkNTI2ZTczZTUyNTkyZWMzMGM2NjgwZmVhNlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgSnVsIDIzIDAyOjUyOjU1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMtbm9kZSBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzLW5vZGVcbmluZGV4IDJkMGUwMjNmMjJhNzFhLi44YTM2ZmJjM2Q0MDI4NyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzLW5vZGVcbisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzLW5vZGVcbkBAIC0yOSw2ICsyOSwxNiBAQCBEZXNjcmlwdGlvbjpcbiBcdFx0Tm9kZXMgdGhhdCBoYXZlIHJlZ3VsYXIgb3IgaGlnaCBtZW1vcnkuXG4gXHRcdERlcGVuZHMgb24gQ09ORklHX0hJR0hNRU0uXG4gXG4rV2hhdDpcdFx0L3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL2hhc19wcml2YXRlX21lbW9yeVxuK0NvbnRhY3Q6XHRMaW51eCBNZW1vcnkgTWFuYWdlbWVudCBsaXN0IFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1x1MDAzZVxuK0Rlc2NyaXB0aW9uOlxuK1x0XHROb2RlcyB0aGF0IGhhdmUgcHJpdmF0ZSAoTl9NRU1PUllfUFJJVkFURSkgbWVtb3J5OiBtZW1vcnlcbitcdFx0aG90cGx1Z2dlZCBieSBhIGRyaXZlciBvbnRvIGEgQ1BVLWxlc3Mgbm9kZSBhbmQgaXNvbGF0ZWQgZnJvbVxuK1x0XHR0aGUgcGFnZSBhbGxvY2F0b3IncyBub3JtYWwgYW5kIGZhbGxiYWNrIHpvbmVsaXN0cy4gIEEgbm9kZSBpc1xuK1x0XHRsaXN0ZWQgaGVyZSBmb3IgYXMgbG9uZyBhcyBpdCBob2xkcyBwcml2YXRlIG1lbW9yeTsgaXQgaXMgbmV2ZXJcbitcdFx0bGlzdGVkIGluIGhhc19tZW1vcnkgYXQgdGhlIHNhbWUgdGltZSAodGhlIHR3byBzdGF0ZXMgYXJlXG4rXHRcdG11dHVhbGx5IGV4Y2x1c2l2ZSkuICBTZWUgRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0LlxuK1xuIFdoYXQ6XHRcdC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlWFxuIERhdGU6XHRcdE9jdG9iZXIgMjAwMlxuIENvbnRhY3Q6XHRMaW51eCBNZW1vcnkgTWFuYWdlbWVudCBsaXN0IFx1MDAzY2xpbnV4LW1tQGt2YWNrLm9yZ1x1MDAzZVxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbW0vaW5kZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9tbS9pbmRleC5yc3RcbmluZGV4IDEzYTc5ZjVkMDkyYzBlLi5mNjA3MDRkZjYxMDRjMSAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vbW0vaW5kZXgucnN0XG4rKysgYi9Eb2N1bWVudGF0aW9uL21tL2luZGV4LnJzdFxuQEAgLTY1LDYgKzY1LDcgQEAgZG9jdW1lbnRhdGlvbiwgb3IgZGVsZXRlZCBpZiBpdCBoYXMgc2VydmVkIGl0cyBwdXJwb3NlLlxuICAgIG1tdV9ub3RpZmllclxuICAgIG11bHRpZ2VuX2xydVxuICAgIG51bWFcbisgICBudW1hX3ByaXZhdGVfbm9kZXNcbiAgICBvdmVyY29tbWl0LWFjY291bnRpbmdcbiAgICBwYWdlX21pZ3JhdGlvblxuICAgIHBhZ2VfZnJhZ3NcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QgYi9Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3Rcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uM2IyN2EyZTI0YjA4Njdcbi0tLSAvZGV2L251bGxcbisrKyBiL0RvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdFxuQEAgLTAsMCArMSwxNjAgQEBcbisuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKz09PT09PT09PT09PT09PT09PT09XG4rUHJpdmF0ZSBtZW1vcnkgbm9kZXNcbis9PT09PT09PT09PT09PT09PT09PVxuK1xuK0EgKnByaXZhdGUgbWVtb3J5IG5vZGUqIGlzIGEgTlVNQSBub2RlIHdob3NlIG1lbW9yeSBpcyBob3RwbHVnZ2VkIGJ5IGEgZHJpdmVyXG4rYW5kIGRlbGliZXJhdGVseSBoaWRkZW4gZnJvbSB0aGUga2VybmVsJ3Mgbm9ybWFsIG1lbW9yeSBtYW5hZ2VtZW50LiAgU3VjaCBhXG4rbm9kZSBpcyBtYXJrZWQgYGBOX01FTU9SWV9QUklWQVRFYGAgaW5zdGVhZCBvZiBgYE5fTUVNT1JZYGA7IHRoZSB0d28gc3RhdGVzXG4rYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgc28gYSBwcml2YXRlIG5vZGUgaXMgbmV2ZXIgY29uc2lkZXJlZCBieSB0aGUgcGFnZVxuK2FsbG9jYXRvcidzIG5vcm1hbCBvciBmYWxsYmFjayBwYXRocy5cbitcbitUaGUgaW50ZW50IGlzIHRvIGdpdmUgYSBkcml2ZXIgYSBibG9jayBvZiBOVU1BLWFkZHJlc3NhYmxlIG1lbW9yeSB0aGF0IHRoZSByZXN0XG4rb2YgdGhlIGtlcm5lbCB3aWxsIG5vdCBhbGxvY2F0ZSBmcm9tIG9uIGl0cyBvd24sIHdoaWxlIHN0aWxsIGxldHRpbmcgdGhhdCBtZW1vcnlcbitiZSBtYXBwZWQgaW50byBwcm9jZXNzZXMgYXMgb3JkaW5hcnksIHN0cnVjdC1wYWdlLCBMUlUtbWFuYWdlZCBmb2xpb3MgLS0gYW5kIHRvXG4rbGV0IHRoZSBkcml2ZXIgcmUtZW5hYmxlIGluZGl2aWR1YWwgbW0gc2VydmljZXMgaXQgaXMgY2FwYWJsZSBvZiBhbGxvd2luZy5cbitcbitQcmVjb25kaXRpb25zXG4rPT09PT09PT09PT09PVxuK1xuK2BgTl9NRU1PUllfUFJJVkFURWBgIGFuZCBgYE5fTUVNT1JZYGAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgc28gdGhlIGJhY2tpbmdcbittZW1vcnkgbXVzdCBjb21lIHVwIG9uIGEgbm9kZSB0aGF0IGhhcyBubyBEUkFNIG9mIGl0cyBvd24gKG90aGVyd2lzZSB0aGUgbm9kZVxuK3dvdWxkIGFscmVhZHkgYmUgYGBOX01FTU9SWWBgKS5cbitcbitJbiBwcmFjdGljZSB0aGUgbWVtb3J5IGlzIHByb3ZpZGVkIGJ5IGEgZGV2aWNlIGRyaXZlciBvciBhIERBWCBkZXZpY2Ugd2hvc2Vcbit0YXJnZXQgbm9kZSBoYXMgbm8gb3RoZXIgbWVtb3J5LCBhbmQgdXN1YWxseSBubyBDUFVzLlxuK1xuK0lzb2xhdGlvbiBtb2RlbFxuKz09PT09PT09PT09PT09PVxuK1xuK0lzb2xhdGlvbiBpcyAqb3B0LWluIGJ5IGV4Y2x1c2lvbiogYW5kIGlzICoqc3RydWN0dXJhbCoqOiBieSBkZWZhdWx0IG5vdGhpbmcgaW5cbit0aGUga2VybmVsIGNhbiBwbGFjZSBtZW1vcnkgb24gYSBwcml2YXRlIG5vZGUgYmVjYXVzZSB0aGUgbm9kZSBpcyBhYnNlbnQgZnJvbSB0aGVcbit6b25lbGlzdHMgYW4gb3JkaW5hcnkgYWxsb2NhdGlvbiB3YWxrcy5cbitcbitab25lbGlzdCBleGNsdXNpb25cbisgICAgVGhlIGtlcm5lbCBwYWdlIGFsbG9jYXRvciBkZXBlbmRzIG9uIHRoZSBgYEZBTExCQUNLYGAgYW5kIGBgTk9GQUxMQkFDS2BgXG4rICAgIHpvbmVsaXN0cyB0byBhbGxvY2F0ZSBtZW1vcnkuICBBIG5vcm1hbCBgYE5fTUVNT1JZYGAgbm9kZSdzIHpvbmVzIChleGNlcHRcbisgICAgYGBaT05FX0RFVklDRWBgKSBhcHBlYXIgaW4gdGhlc2UgbGlzdHMgYW5kIGFsbG93IGFsbG9jYXRpb25zIHRvIGZhbGwtYmFja1xuKyAgICB0byBsZXNzIHByZWZlcmFibGUgbG9jYXRpb25zIGlmIHRoZSBwcmVmZXJyZWQgbG9jYXRpb24gaXMgcHJlc3N1cmVkLlxuK1xuKyAgICBgYF9fR0ZQX1RISVNOT0RFYGAgaXMgdXNlZCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiB0byBzd2l0Y2ggYmV0d2VlblxuKyAgICBgYEZBTExCQUNLYGAgYW5kIGBgTk9GQUxMQkFDS2BgLCB3aGVyZSBgYE5PRkFMTEJBQ0tgYCBvbmx5IGNvbnRhaW5zIHRoZVxuKyAgICB6b25lbGlzdHMgb2YgdGhlIHByZWZlcnJlZCBub2RlLlxuK1xuKyAgICBgYE5fTUVNT1JZX1BSSVZBVEVgYCBub2RlcyBhcmUgKipleGNsdWRlZCoqIGZyb20gYm90aCBgYEZBTExCQUNLYGAgYW5kXG4rICAgIGBgTk9GQUxMQkFDS2BgIHpvbmVsaXN0cy4gIEluc3RlYWQgdGhleSBhcmUgYWRkZWQgdG8gYGBaT05FTElTVF9QUklWQVRFYGAsXG4rICAgIHdoaWNoIGluY2x1ZGVzIGJvdGggYGBOX01FTU9SWWBgIGFuZCBgYE5fTUVNT1JZX1BSSVZBVEVgYCBub2Rlcy4gIFRoaXMgaXNcbisgICAgdGhlIG9ubHkgem9uZWxpc3QgdGhhdCBjb250YWlucyBwcml2YXRlLW5vZGUgem9uZXMsIGFuZCBzbyB0aGUgb25seSB3YXlcbisgICAgdG8gYWNxdWlyZSBwcml2YXRlIG5vZGUgYWxsb2NhdGlvbnMgaXMgdG8gZXhwbGljaXRseSByZXF1ZXN0IHRoYXQgem9uZWxpc3QuXG4rXG4rICAgIEV2ZW4gYW4gYWxsb2NhdGlvbiBjYXJyeWluZyBgYF9fR0ZQX1RISVNOT0RFYGAgY2Fubm90IGFjY2VzcyB0aGUgbm9kZSdzXG4rICAgIG1lbW9yeSB3aXRob3V0IGFsc28gZXhwbGljaXRseSBwYXNzaW5nIHRoZSBwcml2YXRlIHpvbmVsaXN0LiAgVGhpcyBwcmV2ZW50c1xuKyAgICBpbmNpZGVudGFsIGFsbG9jYXRpb24gb2YgcHJpdmF0ZSBtZW1vcnkgYnkgdXNlcnMgb2YgcG9zc2libGUvb25saW5lXG4rICAgIG5vZGVsaXN0cy5cbitcbisgICAgV2hlbiBgYENPTkZJR19OVU1BYGAgaXMgZGlzYWJsZWQgYGBaT05FTElTVF9QUklWQVRFYGAgYWxpYXNlc1xuKyAgICBgYFpPTkVMSVNUX0ZBTExCQUNLYGAgYW5kIGlzIG5ldmVyIHNlbGVjdGVkLlxuK1xuK1RoZSB1c2VyX251bWEgcGF0aFxuK1xuKyAgICBgYE1QT0xfRl9QUklWQVRFYGAgaXMgYW4gaW50ZXJuYWwgdXNlcl9udW1hIGZsYWcgKG5ldmVyIGFjY2VwdGVkIGZyb21cbisgICAgdXNlcnNwYWNlKSBtYXJraW5nIHRoYXQgYSBtZW1wb2xpY3kgaGFzIGEgcHJpdmF0ZSBub2RlIGluIGl0cyBub2RlbWFzay5cbitcbisgICAgV2hlbiBgYENBUF9VU0VSX05VTUFgYCBmb3IgYSBwcml2YXRlIG5vZGUgaXMgc2V0LCB1c2VyLXNvdXJjZWQgbWVtcG9saWN5XG4rICAgIChgYHNldF9tZW1wb2xpY3koMilgYCkgYW5kIG1pZ3JhdGlvbiAoYGBtb3ZlX3BhZ2VzKDIpYGApIG9wZXJhdGlvbnMgYXJlXG4rICAgIGFsbG93ZWQgdG8gaW5jbHVkZSB0aGF0IG5vZGUgaW4gbm9kZW1hc2tzIGFuZCB0YXJnZXRzIHJlc3BlY3RpdmVseS5cbitcbisgICAgYGBtYmluZChNUE9MX01GX01PVkUpYGAgaXMgYm90aCBhIG1lbXBvbGljeSBhbmQgYSBtaWdyYXRpb24gb3BlcmF0aW9uLFxuKyAgICBzbyBwbGFjZW1lbnQgYW5kIG1pZ3JhdGlvbiBzaGFyZSB0aGUgc2FtZSBjYXBhYmlsaXR5LlxuK1xuKyAgICBUaGUgbWVtcG9saWN5IGNvbXBvbmVudCB1c2VzIGBgTVBPTF9GX1BSSVZBVEVgYCBhdCBmYXVsdC10aW1lIHRvIHNlbGVjdFxuKyAgICBgYFpPTkVMSVNUX1BSSVZBVEVgYCBhbmQgbWFrZXMgdGhlIG5vZGUncyBtZW1vcnkgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLlxuKyAgICBJdCBpcyBvdGhlcndpc2UgYW4gb3JkaW5hcnksIHJlbGF4YWJsZSBtZW1wb2xpY3k6IGFuIHVuc2F0aXNmaWFibGUgcmVxdWVzdFxuKyAgICAoYW4gdW5tb3ZhYmxlIGFsbG9jYXRpb24gb24gYSBtb3ZhYmxlLW9ubHkgcHJpdmF0ZSBub2RlKSBzaW1wbHkgZmFsbHMgYmFjay5cbitcbitcbitjcHVzZXQgaW50ZXJhY3Rpb25cbis9PT09PT09PT09PT09PT09PT1cbitcbitjcHVzZXQubWVtcyBkb2VzICoqbm90KiogcGFydGl0aW9uIHByaXZhdGUgbm9kZXMuICBjcHVzZXQgbmVpdGhlciBncmFudHMgbm9yXG4rZGVuaWVzIGFjY2VzcywgYW5kIHJlYmluZGluZyBjcHVzZXQubWVtcyBub2RlbWFza3MgZG8gbm90IGFmZmVjdCBhIHByaXZhdGUgbm9kZSdzXG4rcmVzaWRlbmN5IGluIGFueSBub2RlbWFzay5cbitcbitMaWtld2lzZSwgYSBwcml2YXRlIG5vZGUncyBpbmNsdXNpb24gaW4gYSBub2RlbWFzayBkb2VzIG5vdCBhZmZlY3QgY3B1c2V0Lm1lbXMnXG4rZmlsdGVyaW5nIG9mIGFueSBgYE5fTUVNT1JZYGAgLSB0aGV5IHJlbWFpbiBwYXJ0aXRpb25lZCBhY2NvcmRpbmcgdG8gY3B1c2V0LlxuK1xuK1xuK1Byb3Zpc2lvbmluZ1xuKz09PT09PT09PT09PVxuK1xuK0EgZHJpdmVyIGJyaW5ncyBtZW1vcnkgdXAgYXMgcHJpdmF0ZSB3aXRoOjpcbitcbisgIGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZChuaWQsIHN0YXJ0LCBzaXplLCByZXNvdXJjZV9uYW1lLFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ocF9mbGFncywgb25saW5lX3R5cGUsIG5wKVxuK1xuK3doaWNoIG9ubGluZXMgdGhlIHJhbmdlIGFuZCByZWdpc3RlcnMgdGhlIGRyaXZlci1vd25lZCBgYHN0cnVjdCBub2RlX3ByaXZhdGVgYFxuKyhgYG5wYGApIGRlc2NyaWJpbmcgdGhlIG5vZGUsIGluY2x1ZGluZyBpdHMgY2FwYWJpbGl0eSBiaXRtYXAgKHNlZSBiZWxvdykuXG4rXG4rT25seSBvbmUgZHJpdmVyL3NlcnZpY2UgbWF5IHJlZ2lzdGVyIGEgYGBzdHJ1Y3Qgbm9kZV9wcml2YXRlYGAsIHdoaWNoXG4raGVhdmlseSBpbXBsaWVzIGEgXCJvbmUtbm9kZS1wZXItZGV2aWNlXCIgZGVzaWduIG9mIHRoZSBzeXN0ZW0uXG4rXG4rVGhlIG5vZGUgbGVhdmVzIGBgTl9NRU1PUllfUFJJVkFURWBgIG9ubHkgd2hlbiB0aGUgbGFzdCByYW5nZSBpcyBvZmZsaW5lZC5cbitcbisuLiBrZXJuZWwtZG9jOjogbW0vbWVtb3J5X2hvdHBsdWcuY1xuKyAgIDppZGVudGlmaWVyczogX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkXG4rXG4rLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9ub2RlLmNcbisgICA6aWRlbnRpZmllcnM6IG5vZGVfcHJpdmF0ZV9yZWdpc3RlciBub2RlX3ByaXZhdGVfdW5yZWdpc3RlclxuK1xuK0NhcGFiaWxpdGllcyAocGVyLXNlcnZpY2Ugb3B0LWlucylcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4rXG4rQmVjYXVzZSB0aGUgZGVmYXVsdCBpcyBcIm5vIG1tIHNlcnZpY2UgdG91Y2hlcyB0aGUgbm9kZVwiLCBlYWNoIHNlcnZpY2UgYSBkcml2ZXJcbit3YW50cyBiYWNrIGlzIHJlcXVlc3RlZCBleHBsaWNpdGx5IHRocm91Z2ggYSBjYXBhYmlsaXR5IGJpdCBpblxuK2BgbnAtXHUwMDNlY2Fwc2BgLiAgVGhlIG1tIHNpZGUgY2hlY2tzIHRoZSBtYXRjaGluZyBgYG5vZGVfYWxsb3dzXyooKWBgIC9cbitgYGZvbGlvX2FsbG93c18qKClgYCBwcmVkaWNhdGUgYmVmb3JlIGFjdGluZzpcbitcbisuLiBsaXN0LXRhYmxlOjpcbisgICA6aGVhZGVyLXJvd3M6IDFcbisgICA6d2lkdGhzOiAzNSA2NVxuK1xuKyAgICogLSBDYXBhYmlsaXR5XG4rICAgICAtIFJlLWVuYWJsZXNcbisgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX1JFQ0xBSU1gYFxuKyAgICAgLSByZWNsYWltIG9mIHRoZSBub2RlJ3MgZm9saW9zLCBieSB0aGUgbW0gYW5kIGJ5IHVzZXJzcGFjZVxuKyAgICAgICBgYE1BRFZfQ09MRGBgIC8gYGBQQUdFT1VUYGAgLyBgYEZSRUVgYCAodXNlcmxhbmQtZHJpdmVuIHJlY2xhaW0pXG4rICAgKiAtIGBgTk9ERV9QUklWQVRFX0NBUF9VU0VSX05VTUFgYFxuKyAgICAgLSBhbGwgdXNlcnNwYWNlLWRpcmVjdGVkIHBsYWNlbWVudCBhbmQgbWlncmF0aW9uOiBgYG1iaW5kKClgYCAvXG4rICAgICAgIGBgc2V0X21lbXBvbGljeSgpYGAgLyBob21lIG5vZGUsIGFuZCBgYG1vdmVfcGFnZXMoKWBgIC9cbisgICAgICAgYGBtaWdyYXRlX3BhZ2VzKClgYCB0by9mcm9tIHRoZSBub2RlXG4rICAgKiAtIGBgTk9ERV9QUklWQVRFX0NBUF9IT1RVTlBMVUdgYFxuKyAgICAgLSBob3QtdW5wbHVnIHZpYSBtaWdyYXRpb25cbisgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX0RFTU9USU9OYGBcbisgICAgIC0gcmVjbGFpbS1kcml2ZW4gdGllcmluZyBkZW1vdGlvbiBvbnRvIHRoZSBub2RlICh0aGUgbm9kZSBqb2lucyB0aGVcbisgICAgICAgZGVtb3Rpb24gaGllcmFyY2h5KVxuKyAgICogLSBgYE5PREVfUFJJVkFURV9DQVBfTlVNQV9CQUxBTkNJTkdgYFxuKyAgICAgLSBhY2Nlc3MtYmFzZWQgTlVNQSBiYWxhbmNpbmcgc2Nhbi9taWdyYXRpb24gb2YgdGhlIG5vZGUncyBmb2xpb3NcbisgICAqIC0gYGBOT0RFX1BSSVZBVEVfQ0FQX0xUUElOYGBcbisgICAgIC0gYGBGT0xMX0xPTkdURVJNYGAgR1VQIHBpbnNcbitcbitraHVnZXBhZ2VkIG5ldmVyIG9wZXJhdGVzIG9uIHByaXZhdGUtbm9kZSBmb2xpb3MgKGxpa2UgWk9ORV9ERVZJQ0UpLCBhbmQgREFNT05cbitkb2VzIG5vdCBhY3Qgb24gdGhlbTsgYGBNQURWX0NPTExBUFNFYGAgaXMgY292ZXJlZCBieSBgYENBUF9VU0VSX05VTUFgYC5cbitcbitEZXBlbmRlbmNpZXMgYmV0d2VlbiBjYXBhYmlsaXRpZXMgYXJlIGVuZm9yY2VkICoqb25jZSoqLCBieVxuK2Bgbm9kZV9wcml2YXRlX3JlZ2lzdGVyKClgYCBhdCBob3RwbHVnLCByYXRoZXIgdGhhbiBieSB3aGF0ZXZlciBzZXRzIHRoZSBiaXRzOlxuK1xuKyogYGBERU1PVElPTmBgIHJlcXVpcmVzIGBgUkVDTEFJTWBgIChhIGRlbW90aW9uIHRhcmdldCBhY2N1bXVsYXRlcyBkZW1vdGVkXG4rICBwYWdlcywgc28gd2l0aG91dCByZWNsYWltIGFzIGEgc2FmZXR5IHZhbHZlIGl0IHdvdWxkIGp1c3QgZmlsbCB1cCkuXG4rXG4rQ2FwYWJpbGl0eSBmbGFncyBhcmUgZXhwZWN0ZWQgdG8gYmUgc3RhYmxlIGF0IHJ1bnRpbWUuXG4rXG4rT2JzZXJ2YWJpbGl0eVxuKz09PT09PT09PT09PT1cbitcbitBIHByaXZhdGUgbm9kZSBpcyByZXBvcnRlZCB0aHJvdWdoOlxuK1xuKyogYGAvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvaGFzX3ByaXZhdGVfbWVtb3J5YGBcbisqIGBgL3Byb2MvXHUwMDNjcGlkXHUwMDNlL251bWFfbWFwc2BgIC0tIHBlci1ub2RlIHJlc2lkZW5jeSBpbmNsdWRlcyBwcml2YXRlIG5vZGVzXG4rKiBgYC9wcm9jL2tjb3JlYGAgLS0gcHJpdmF0ZS1ub2RlIFJBTSBhcHBlYXJzIGluIHRoZSBrY29yZSBSQU0gbWFwXG4rKiBtZW1jZyBwZXItbm9kZSBzdGF0aXN0aWNzIGFjY291bnQgcHJpdmF0ZS1ub2RlIG1lbW9yeS5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jIGIvZHJpdmVycy9iYXNlL25vZGUuY1xuaW5kZXggM2RhOTE5MjlhZDRlMzcuLjNkNjFjYTFiODA1ZGMwIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9iYXNlL25vZGUuY1xuKysrIGIvZHJpdmVycy9iYXNlL25vZGUuY1xuQEAgLTIyLDYgKzIyLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1ibG9jay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ1c190eXBlIG5vZGVfc3Vic3lzID0ge1xuIFx0Lm5hbWUgPSBcIm5vZGVcIixcbkBAIC04NjgsNiArODY5LDEyMSBAQCB2b2lkIHJlZ2lzdGVyX21lbW9yeV9ibG9ja3NfdW5kZXJfbm9kZV9ob3RwbHVnKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLFxuIFx0XHRcdCAgICh2b2lkICopXHUwMDI2bmlkLCByZWdpc3Rlcl9tZW1fYmxvY2tfdW5kZXJfbm9kZV9ob3RwbHVnKTtcbiBcdHJldHVybjtcbiB9XG4rXG4rc3RhdGljIERFRklORV9NVVRFWChub2RlX3ByaXZhdGVfbG9jayk7XG4rXG4rLyoqXG4rICogbm9kZV9wcml2YXRlX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgYSBwcml2YXRlIG5vZGVcbisgKiBAbmlkOiBOb2RlIGlkZW50aWZpZXJcbisgKiBAbnA6IFRoZSBub2RlX3ByaXZhdGUgc3RydWN0dXJlIChkcml2ZXItYWxsb2NhdGVkLCBkcml2ZXItb3duZWQpXG4rICpcbisgKiBSZWdpc3RlciBhbiBvd25lciBmb3IgYSBwcml2YXRlIG5vZGUuIElmIGFuIG93bmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuKyAqIChkaWZmZXJlbnQgbnApLCByZXR1cm4gLUVCVVNZLlxuKyAqXG4rICogUmUtcmVnaXN0cmF0aW9uIHdpdGggdGhlIHNhbWUgbnAgaXMgYWxsb3dlZC5cbisgKlxuKyAqIFRoZSBjYWxsZXIgb3ducyB0aGUgbm9kZV9wcml2YXRlIG1lbW9yeSBhbmQgbXVzdCBlbnN1cmUgaXQgcmVtYWlucyB2YWxpZFxuKyAqIHVudGlsIGFmdGVyIG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKCkgcmV0dXJucy5cbisgKlxuKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLlxuKyAqL1xuK2ludCBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoaW50IG5pZCwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApXG4re1xuK1x0c3RydWN0IG5vZGVfcHJpdmF0ZSAqZXhpc3Rpbmc7XG4rXHRwZ19kYXRhX3QgKnBnZGF0O1xuK1x0aW50IHJldCA9IDA7XG4rXG4rXHRpZiAoIW5wIHx8ICFub2RlX3Bvc3NpYmxlKG5pZCkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0LyogRGVtb3Rpb24gaXMgZHJpdmVuIGJ5IHJlY2xhaW0sIHNvIGl0IHJlcXVpcmVzIHJlY2xhaW0uICovXG4rXHRpZiAoKG5wLVx1MDAzZWNhcHMgXHUwMDI2IE5PREVfUFJJVkFURV9DQVBfREVNT1RJT04pIFx1MDAyNlx1MDAyNlxuK1x0ICAgICEobnAtXHUwMDNlY2FwcyBcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9SRUNMQUlNKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNm5vZGVfcHJpdmF0ZV9sb2NrKTtcbitcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XG4rXG4rXHQvKiBOX01FTU9SWV9QUklWQVRFIGFuZCBOX01FTU9SWSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovXG4rXHRpZiAobm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSkge1xuK1x0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0cGdkYXQgPSBOT0RFX0RBVEEobmlkKTtcbitcdGV4aXN0aW5nID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwZ2RhdC1cdTAwM2Vub2RlX3ByaXZhdGUsXG4rXHRcdFx0XHRcdCAgICAgbG9ja2RlcF9pc19oZWxkKFx1MDAyNm5vZGVfcHJpdmF0ZV9sb2NrKSk7XG4rXG4rXHQvKiBJZiBpdCBleGlzdHMsIHJlc3RyaWN0IHRvIHNpbmdsZSBvd25lciAqL1xuK1x0aWYgKGV4aXN0aW5nKSB7XG4rXHRcdGlmIChleGlzdGluZyAhPSBucClcbitcdFx0XHRyZXQgPSAtRUJVU1k7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0cmN1X2Fzc2lnbl9wb2ludGVyKHBnZGF0LVx1MDAzZW5vZGVfcHJpdmF0ZSwgbnApO1xuK291dDpcbitcdG1lbV9ob3RwbHVnX2RvbmUoKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZub2RlX3ByaXZhdGVfbG9jayk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChub2RlX3ByaXZhdGVfcmVnaXN0ZXIpO1xuK1xuKy8qKlxuKyAqIG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyIC0gVW5yZWdpc3RlciBhIHByaXZhdGUgbm9kZVxuKyAqIEBuaWQ6IE5vZGUgaWRlbnRpZmllclxuKyAqXG4rICogVW5yZWdpc3RlciB0aGUgZHJpdmVyIGZyb20gYSBwcml2YXRlIG5vZGUuXG4rICpcbisgKiBPbmx5IHN1Y2NlZWRzIGlmIGFsbCBtZW1vcnkgaGFzIGJlZW4gb2ZmbGluZWQgKE5fTUVNT1JZX1BSSVZBVEUgY2xlYXJlZCkuXG4rICpcbisgKiBOX01FTU9SWV9QUklWQVRFIHN0YXRlIGlzIGNsZWFyZWQgYnkgb2ZmbGluZV9wYWdlcygpIHdoZW4gdGhlIGxhc3RcbisgKiBtZW1vcnkgaXMgb2ZmbGluZWQsIG5vdCBieSB0aGlzIGZ1bmN0aW9uLlxuKyAqXG4rICogQWZ0ZXIgdGhpcyByZXR1cm5zLCB0aGUgbm9kZV9wcml2YXRlIHBvaW50ZXIgaXMgbm8gbG9uZ2VyIHZpc2libGUgYW5kXG4rICogYW4gUkNVIGdyYWNlIHBlcmlvZCBoYXMgZWxhcHNlZCwgc28gdGhlIGRyaXZlciBtYXkgZnJlZSBpdHMgY29udGV4dC5cbisgKlxuKyAqIFJldHVybjogMCBpZiB1bnJlZ2lzdGVyZWQsIC1FQlVTWSBpZiBOX01FTU9SWV9QUklWQVRFIGlzIHN0aWxsIHNldC5cbisgKi9cbitpbnQgbm9kZV9wcml2YXRlX3VucmVnaXN0ZXIoaW50IG5pZClcbit7XG4rXHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDtcbitcdHBnX2RhdGFfdCAqcGdkYXQ7XG4rXG4rXHRpZiAoIW5vZGVfcG9zc2libGUobmlkKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNm5vZGVfcHJpdmF0ZV9sb2NrKTtcbitcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XG4rXG4rXHRwZ2RhdCA9IE5PREVfREFUQShuaWQpO1xuK1x0bnAgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHBnZGF0LVx1MDAzZW5vZGVfcHJpdmF0ZSxcbitcdFx0XHRcdCAgICAgICBsb2NrZGVwX2lzX2hlbGQoXHUwMDI2bm9kZV9wcml2YXRlX2xvY2spKTtcbitcdGlmICghbnApIHtcbitcdFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuK1x0XHRtdXRleF91bmxvY2soXHUwMDI2bm9kZV9wcml2YXRlX2xvY2spO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBPbmx5IHVucmVnaXN0ZXIgaWYgTl9NRU1PUllfUFJJVkFURSBpcyBjbGVhcmVkIChvbmx5IG9jY3VycyB3aGVuXG4rXHQgKiB0aGUgbGFzdCBtZW1vcnkgYmxvY2sgaXMgb2ZmbGluZWQgaW4gb2ZmbGluZV9wYWdlcygpKVxuK1x0ICovXG4rXHRpZiAobm9kZV9pc19wcml2YXRlKG5pZCkpIHtcbitcdFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuK1x0XHRtdXRleF91bmxvY2soXHUwMDI2bm9kZV9wcml2YXRlX2xvY2spO1xuK1x0XHRyZXR1cm4gLUVCVVNZO1xuK1x0fVxuK1xuK1x0cmN1X2Fzc2lnbl9wb2ludGVyKHBnZGF0LVx1MDAzZW5vZGVfcHJpdmF0ZSwgTlVMTCk7XG4rXG4rXHRtZW1faG90cGx1Z19kb25lKCk7XG4rXHRtdXRleF91bmxvY2soXHUwMDI2bm9kZV9wcml2YXRlX2xvY2spO1xuK1xuK1x0c3luY2hyb25pemVfcmN1KCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwobm9kZV9wcml2YXRlX3VucmVnaXN0ZXIpO1xuICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi9cbiBcbiAvKipcbkBAIC05NjYsNiArMTA4Miw3IEBAIHN0YXRpYyBzdHJ1Y3Qgbm9kZV9hdHRyIG5vZGVfc3RhdGVfYXR0cltdID0ge1xuIFx0W05fSElHSF9NRU1PUlldID0gX05PREVfQVRUUihoYXNfaGlnaF9tZW1vcnksIE5fSElHSF9NRU1PUlkpLFxuICNlbmRpZlxuIFx0W05fTUVNT1JZXSA9IF9OT0RFX0FUVFIoaGFzX21lbW9yeSwgTl9NRU1PUlkpLFxuK1x0W05fTUVNT1JZX1BSSVZBVEVdID0gX05PREVfQVRUUihoYXNfcHJpdmF0ZV9tZW1vcnksIE5fTUVNT1JZX1BSSVZBVEUpLFxuIFx0W05fQ1BVXSA9IF9OT0RFX0FUVFIoaGFzX2NwdSwgTl9DUFUpLFxuIFx0W05fR0VORVJJQ19JTklUSUFUT1JdID0gX05PREVfQVRUUihoYXNfZ2VuZXJpY19pbml0aWF0b3IsXG4gXHRcdFx0XHRcdCAgIE5fR0VORVJJQ19JTklUSUFUT1IpLFxuQEAgLTk3OSw2ICsxMDk2LDcgQEAgc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm5vZGVfc3RhdGVfYXR0cnNbXSA9IHtcbiBcdFx1MDAyNm5vZGVfc3RhdGVfYXR0cltOX0hJR0hfTUVNT1JZXS5hdHRyLmF0dHIsXG4gI2VuZGlmXG4gXHRcdTAwMjZub2RlX3N0YXRlX2F0dHJbTl9NRU1PUlldLmF0dHIuYXR0cixcbitcdFx1MDAyNm5vZGVfc3RhdGVfYXR0cltOX01FTU9SWV9QUklWQVRFXS5hdHRyLmF0dHIsXG4gXHRcdTAwMjZub2RlX3N0YXRlX2F0dHJbTl9DUFVdLmF0dHIuYXR0cixcbiBcdFx1MDAyNm5vZGVfc3RhdGVfYXR0cltOX0dFTkVSSUNfSU5JVElBVE9SXS5hdHRyLmF0dHIsXG4gXHROVUxMXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9kYXgva21lbS5jIGIvZHJpdmVycy9kYXgva21lbS5jXG5pbmRleCBhNDhkNjk5Y2YzNDRjOS4uYzNmYWYxOGU3Zjg1ZGUgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2RheC9rbWVtLmNcbisrKyBiL2RyaXZlcnMvZGF4L2ttZW0uY1xuQEAgLTEyNiw3ICsxMjYsNyBAQCBzdGF0aWMgaW50IGRheF9rbWVtX2RvX2hvdHBsdWcoc3RydWN0IGRldl9kYXggKmRldl9kYXgsXG4gXHRcdCAqL1xuIFx0XHRyYyA9IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChkYXRhLVx1MDAzZW1naWQsIHJhbmdlLnN0YXJ0LFxuIFx0XHRcdFx0cmFuZ2VfbGVuKFx1MDAyNnJhbmdlKSwga21lbV9uYW1lLCBtaHBfZmxhZ3MsXG4tXHRcdFx0XHRvbmxpbmVfdHlwZSk7XG4rXHRcdFx0XHRvbmxpbmVfdHlwZSwgTlVMTCk7XG4gXG4gXHRcdGlmIChyYykge1xuIFx0XHRcdGRldl93YXJuKGRldiwgXCJtYXBwaW5nJWQ6ICUjbGx4LSUjbGx4IG1lbW9yeSBhZGQgZmFpbGVkXFxuXCIsXG5kaWZmIC0tZ2l0IGEvZnMvcHJvYy9rY29yZS5jIGIvZnMvcHJvYy9rY29yZS5jXG5pbmRleCAzOTA1NDdiOTkyYWNkOS4uZjY3MTk0ZGMyYTliODUgMTAwNjQ0XG4tLS0gYS9mcy9wcm9jL2tjb3JlLmNcbisrKyBiL2ZzL3Byb2Mva2NvcmUuY1xuQEAgLTI1MSwxMSArMjUxLDE0IEBAIHN0YXRpYyBpbnQga2NvcmVfcmFtX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcbiB7XG4gXHRpbnQgbmlkLCByZXQ7XG4gXHR1bnNpZ25lZCBsb25nIGVuZF9wZm47XG4rXHRub2RlbWFza190IG1lbTtcbiBcbiBcdC8qIE5vdCBpbml0aWFsaXplZC4uLi51cGRhdGUgbm93ICovXG4gXHQvKiBmaW5kIG91dCBcIm1heCBwZm5cIiAqL1xuIFx0ZW5kX3BmbiA9IDA7XG4tXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpIHtcbitcdC8qIEluY2x1ZGUgcHJpdmF0ZSBub2RlIG1lbW9yeSBpbiB0aGUgc2NhbiAqL1xuK1x0bm9kZXNfb3IobWVtLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcbitcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsIG1lbSkge1xuIFx0XHR1bnNpZ25lZCBsb25nIG5vZGVfZW5kO1xuIFx0XHRub2RlX2VuZCA9IG5vZGVfZW5kX3BmbihuaWQpO1xuIFx0XHRpZiAoZW5kX3BmbiBcdTAwM2Mgbm9kZV9lbmQpXG5kaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX21tdS5jIGIvZnMvcHJvYy90YXNrX21tdS5jXG5pbmRleCA4MTdlM2UwZjkxOTQzMC4uZTExNmNkNWYxNTdiOWEgMTAwNjQ0XG4tLS0gYS9mcy9wcm9jL3Rhc2tfbW11LmNcbisrKyBiL2ZzL3Byb2MvdGFza19tbXUuY1xuQEAgLTMzODksNyArMzM4OSw4IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqY2FuX2dhdGhlcl9udW1hX3N0YXRzKHB0ZV90IHB0ZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuIFx0bmlkID0gcGFnZV90b19uaWQocGFnZSk7XG4tXHRpZiAoIW5vZGVfaXNzZXQobmlkLCBub2RlX3N0YXRlc1tOX01FTU9SWV0pKVxuK1x0aWYgKCFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKSBcdTAwMjZcdTAwMjZcbitcdCAgICAhbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSlcbiBcdFx0cmV0dXJuIE5VTEw7XG4gXG4gXHRyZXR1cm4gcGFnZTtcbkBAIC0zNDE0LDcgKzM0MTUsOCBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmNhbl9nYXRoZXJfbnVtYV9zdGF0c19wbWQocG1kX3QgcG1kLFxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbiBcdG5pZCA9IHBhZ2VfdG9fbmlkKHBhZ2UpO1xuLVx0aWYgKCFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKSlcbitcdGlmICghbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgIW5vZGVfaXNzZXQobmlkLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSkpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuIFx0cmV0dXJuIHBhZ2U7XG5AQCAtMzYwMiw2ICszNjA0LDEwIEBAIHN0YXRpYyBpbnQgc2hvd19udW1hX21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4gXHRcdGlmIChtZC1cdTAwM2Vub2RlW25pZF0pXG4gXHRcdFx0c2VxX3ByaW50ZihtLCBcIiBOJWQ9JWx1XCIsIG5pZCwgbWQtXHUwMDNlbm9kZVtuaWRdKTtcbiBcbitcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKVxuK1x0XHRpZiAobWQtXHUwMDNlbm9kZVtuaWRdKVxuK1x0XHRcdHNlcV9wcmludGYobSwgXCIgTiVkPSVsdVwiLCBuaWQsIG1kLVx1MDAzZW5vZGVbbmlkXSk7XG4rXG4gXHRzZXFfcHJpbnRmKG0sIFwiIGtlcm5lbHBhZ2VzaXplX2tCPSVsdVwiLCB2bWFfa2VybmVsX3BhZ2VzaXplKHZtYSkgXHUwMDNlXHUwMDNlIDEwKTtcbiBvdXQ6XG4gXHRzZXFfcHV0YyhtLCAnXFxuJyk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZnAuaCBiL2luY2x1ZGUvbGludXgvZ2ZwLmhcbmluZGV4IDg3MmJjNTNmMzJlYzg3Li5mM2U4NjdkZTc0NGY2ZCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmhcbisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmhcbkBAIC0yMDQsOSArMjA0LDE2IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2ZyZWVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKSB7IH1cbiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9hbGxvY19wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3JkZXIpIHsgfVxuICNlbmRpZlxuIFxuLXN0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBwcmVmZXJyZWRfbmlkLFxuLVx0XHRub2RlbWFza190ICpub2RlbWFzayk7XG4tI2RlZmluZSBfX2ZvbGlvX2FsbG9jKC4uLilcdFx0XHRhbGxvY19ob29rcyhfX2ZvbGlvX2FsbG9jX25vcHJvZihfX1ZBX0FSR1NfXykpXG4rLyogQWxsb2NhdGUgZnJvbSBhbiBOX01FTU9SWV9QUklWQVRFIG5vZGUgKHNlbGVjdHMgdGhlIHByaXZhdGUgem9uZWxpc3QpLiAqL1xuK3N0cnVjdCBwYWdlICphbGxvY19wYWdlc19ub2RlX3ByaXZhdGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuK1x0XHRpbnQgbmlkKTtcbisjZGVmaW5lIGFsbG9jX3BhZ2VzX25vZGVfcHJpdmF0ZSguLi4pXHRcdFx0XHRcXFxuK1x0YWxsb2NfaG9va3MoYWxsb2NfcGFnZXNfbm9kZV9wcml2YXRlX25vcHJvZihfX1ZBX0FSR1NfXykpXG4rXG4rc3RydWN0IGZvbGlvICpmb2xpb19hbGxvY19ub2RlX3ByaXZhdGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuK1x0XHRpbnQgbmlkKTtcbisjZGVmaW5lIGZvbGlvX2FsbG9jX25vZGVfcHJpdmF0ZSguLi4pXHRcdFx0XHRcXFxuK1x0YWxsb2NfaG9va3MoZm9saW9fYWxsb2Nfbm9kZV9wcml2YXRlX25vcHJvZihfX1ZBX0FSR1NfXykpXG4gXG4gdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxuIFx0XHRcdFx0bm9kZW1hc2tfdCAqbm9kZW1hc2ssIGludCBucl9wYWdlcyxcbkBAIC0yNTIsMTQgKzI1OSw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB3YXJuX2lmX25vZGVfb2ZmbGluZShpbnQgdGhpc19ub2RlLCBnZnBfdCBnZnBfbWFzaylcbiBcdGR1bXBfc3RhY2soKTtcbiB9XG4gXG4tc3RhdGljIGlubGluZVxuLXN0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub2RlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IG5pZClcbi17XG4tXHR3YXJuX2lmX25vZGVfb2ZmbGluZShuaWQsIGdmcCk7XG4tXG4tXHRyZXR1cm4gX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBOVUxMKTtcbi19XG4tXG4rc3RydWN0IGZvbGlvICpfX2ZvbGlvX2FsbG9jX25vZGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLCBpbnQgbmlkKTtcbiAjZGVmaW5lICBfX2ZvbGlvX2FsbG9jX25vZGUoLi4uKVx0XHRhbGxvY19ob29rcyhfX2ZvbGlvX2FsbG9jX25vZGVfbm9wcm9mKF9fVkFfQVJHU19fKSlcbiBcbiAvKlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaFxuaW5kZXggYWI4Y2ZhZWM4MmQzMWUuLmY2NDQ4YTczZDQ2NGM4IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmhcbkBAIC03MzksNiArNzM5LDkgQEAgc3RhdGljIGlubGluZSB1NjQga3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFncyhzdHJ1Y3Qga3ZtICprdm0pXG4gXHRpZiAoIWt2bSB8fCBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKGt2bSkpXG4gXHRcdGZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQ7XG4gXG4rXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQSkpXG4rXHRcdGZsYWdzIHw9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFO1xuK1xuIFx0cmV0dXJuIGZsYWdzO1xuIH1cbiAjZW5kaWZcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmggYi9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmhcbmluZGV4IGIzOTYwNWQzMDg5NjMyLi5mY2NlYjBhNDIzNTc5YiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaFxuKysrIGIvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oXG5AQCAtMzA1LDcgKzMwNSwxMCBAQCBleHRlcm4gaW50IGFkZF9tZW1vcnlfcmVzb3VyY2UoaW50IG5pZCwgc3RydWN0IHJlc291cmNlICpyZXNvdXJjZSxcbiBcdFx0XHQgICAgICAgbWhwX3QgbWhwX2ZsYWdzKTtcbiBpbnQgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXG4gXHRcdFx0XHRjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lLCBtaHBfdCBtaHBfZmxhZ3MsXG4tXHRcdFx0XHRlbnVtIG1tb3Agb25saW5lX3R5cGUpO1xuK1x0XHRcdFx0ZW51bSBtbW9wIG9ubGluZV90eXBlLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucCk7XG4raW50IGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxuK1x0XHRcdFx0ICAgICAgY29uc3QgY2hhciAqcmVzb3VyY2VfbmFtZSwgbWhwX3QgbWhwX2ZsYWdzLFxuK1x0XHRcdFx0ICAgICAgZW51bSBtbW9wIG9ubGluZV90eXBlLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucCk7XG4gZXh0ZXJuIGludCBhZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXG4gXHRcdFx0XHQgICAgIGNvbnN0IGNoYXIgKnJlc291cmNlX25hbWUsXG4gXHRcdFx0XHQgICAgIG1ocF90IG1ocF9mbGFncyk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbmluZGV4IDY1YzczMmQ0NDBkMmY0Li4xMzQ4ZTlmNWYyY2Y5MiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbisrKyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmhcbkBAIC03LDYgKzcsNyBAQFxuICNkZWZpbmUgX0xJTlVYX01FTVBPTElDWV9IIDFcbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbXpvbmUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JidHJlZS5oXHUwMDNlXG5AQCAtMTI0LDEwICsxMjUsMTUgQEAgaW50IHZtYV9kdXBfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmRzdCk7XG4gdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xuIGludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbiBcdFx0XHQgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCk7XG4raW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LFxuK1x0XHRcdFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKTtcbiB2b2lkIG1wb2xfZnJlZV9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCk7XG4gc3RydWN0IG1lbXBvbGljeSAqbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXG4gXHRcdFx0XHRcdCAgICBwZ29mZl90IGlkeCk7XG4gXG4rc3RydWN0IG1lbXBvbGljeSAqbXBvbF9wcml2YXRlX2JpbmQoaW50IG5pZCk7XG4rc3RydWN0IG1lbXBvbGljeSAqbXBvbF9iaW5kX25vZGUoaW50IG5pZCk7XG4rXG4gc3RydWN0IG1lbXBvbGljeSAqZ2V0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7XG4gc3RydWN0IG1lbXBvbGljeSAqX19nZXRfdm1hX3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0dW5zaWduZWQgbG9uZyBhZGRyLCBwZ29mZl90ICppbHgpO1xuQEAgLTIyNiw2ICsyMzIsMTYgQEAgbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3QgaWR4KVxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1lbXBvbGljeSAqbXBvbF9wcml2YXRlX2JpbmQoaW50IG5pZClcbit7XG4rXHRyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1lbXBvbGljeSAqbXBvbF9iaW5kX25vZGUoaW50IG5pZClcbit7XG4rXHRyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1lbXBvbGljeSAqZ2V0X3ZtYV9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0XHR1bnNpZ25lZCBsb25nIGFkZHIsIGludCBvcmRlciwgcGdvZmZfdCAqaWx4KVxuIHtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaFxuaW5kZXggNGMwZGU3ODgyYmJiNjQuLmYzOTM1NzJkNzQwMWRhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaFxuKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaFxuQEAgLTI2LDYgKzI2LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuIFxuK3N0cnVjdCBub2RlX3ByaXZhdGU7XG4rXG4gLyogRnJlZSBtZW1vcnkgbWFuYWdlbWVudCAtIHpvbmVkIGJ1ZGR5IGFsbG9jYXRvci4gICovXG4gI2lmbmRlZiBDT05GSUdfQVJDSF9GT1JDRV9NQVhfT1JERVJcbiAjZGVmaW5lIE1BWF9QQUdFX09SREVSIDEwXG5AQCAtMTM5MSwxMyArMTM5MywyMiBAQCBlbnVtIHtcbiAjaWZkZWYgQ09ORklHX05VTUFcbiBcdC8qXG4gXHQgKiBUaGUgTlVNQSB6b25lbGlzdHMgYXJlIGRvdWJsZWQgYmVjYXVzZSB3ZSBuZWVkIHpvbmVsaXN0cyB0aGF0XG4tXHQgKiByZXN0cmljdCB0aGUgYWxsb2NhdGlvbnMgdG8gYSBzaW5nbGUgbm9kZSBmb3IgX19HRlBfVEhJU05PREUuXG4rXHQgKiByZXN0cmljdCB0aGUgYWxsb2NhdGlvbnMgdG8gYSBzaW5nbGUgbm9kZSBmb3IgX19HRlBfVEhJU05PREVcbitcdCAqIGFuZCBOX01FTU9SWV9QUklWQVRFIG5vZGVzIChpc29sYXRlZCBmcm9tIGRlZmF1bHQgbGlzdHMpLlxuIFx0ICovXG4gXHRaT05FTElTVF9OT0ZBTExCQUNLLFx0Lyogem9uZWxpc3Qgd2l0aG91dCBmYWxsYmFjayAoX19HRlBfVEhJU05PREUpICovXG4rXHRaT05FTElTVF9QUklWQVRFLFx0LyogTl9NRU1PUllfUFJJVkFURSBhY2Nlc3MsIGZhbGxzIGJhY2sgdG8gRFJBTSAqL1xuK1x0Wk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLLCAvKiBOX01FTU9SWV9QUklWQVRFIGFjY2VzcywgX19HRlBfVEhJU05PREUgKi9cbiAjZW5kaWZcbiBcdE1BWF9aT05FTElTVFNcbiB9O1xuIFxuKyNpZm5kZWYgQ09ORklHX05VTUFcbisvKiBXaXRob3V0IE5VTUEgb25seSBaT05FTElTVF9GQUxMQkFDSyBleGlzdHMgc28gZXZlcnl0aGluZyBjb2xsYXBzZXMgdGhlcmUgKi9cbisjZGVmaW5lIFpPTkVMSVNUX1BSSVZBVEVcdFx0Wk9ORUxJU1RfRkFMTEJBQ0tcbisjZGVmaW5lIFpPTkVMSVNUX1BSSVZBVEVfTk9GQUxMQkFDS1x0Wk9ORUxJU1RfRkFMTEJBQ0tcbisjZW5kaWZcbitcbiAvKlxuICAqIFRoaXMgc3RydWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgem9uZSBpbiBhIHpvbmVsaXN0LiBJdCBpcyBzdG9yZWRcbiAgKiBoZXJlIHRvIGF2b2lkIGRlcmVmZXJlbmNlcyBpbnRvIGxhcmdlIHN0cnVjdHVyZXMgYW5kIGxvb2t1cHMgb2YgdGFibGVzXG5AQCAtMTU5NywxMiArMTYwOCwyNSBAQCB0eXBlZGVmIHN0cnVjdCBwZ2xpc3RfZGF0YSB7XG4gXHRhdG9taWNfbG9uZ190XHRcdHZtX3N0YXRbTlJfVk1fTk9ERV9TVEFUX0lURU1TXTtcbiAjaWZkZWYgQ09ORklHX05VTUFcbiBcdHN0cnVjdCBtZW1vcnlfdGllciBfX3JjdSAqbWVtdGllcjtcbitcdHN0cnVjdCBub2RlX3ByaXZhdGUgX19yY3UgKm5vZGVfcHJpdmF0ZTtcbiAjZW5kaWZcbiAjaWZkZWYgQ09ORklHX01FTU9SWV9GQUlMVVJFXG4gXHRzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfc3RhdHMgbWZfc3RhdHM7XG4gI2VuZGlmXG4gfSBwZ19kYXRhX3Q7XG4gXG4rI2lmZGVmIENPTkZJR19OVU1BXG4rc3RhdGljIGlubGluZSBib29sIHBnZGF0X2lzX3ByaXZhdGUocGdfZGF0YV90ICpwZ2RhdClcbit7XG4rXHRyZXR1cm4gISFwZ2RhdC1cdTAwM2Vub2RlX3ByaXZhdGU7XG4rfVxuKyNlbHNlXG4rc3RhdGljIGlubGluZSBib29sIHBnZGF0X2lzX3ByaXZhdGUocGdfZGF0YV90ICpwZ2RhdClcbit7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuKyNlbmRpZlxuK1xuICNkZWZpbmUgbm9kZV9wcmVzZW50X3BhZ2VzKG5pZClcdChOT0RFX0RBVEEobmlkKS1cdTAwM2Vub2RlX3ByZXNlbnRfcGFnZXMpXG4gI2RlZmluZSBub2RlX3NwYW5uZWRfcGFnZXMobmlkKVx0KE5PREVfREFUQShuaWQpLVx1MDAzZW5vZGVfc3Bhbm5lZF9wYWdlcylcbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oIGIvaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi42ZjU2OGJjMGQ0NmM3OVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaFxuQEAgLTAsMCArMSwyNjIgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuKyNpZm5kZWYgX0xJTlVYX05PREVfUFJJVkFURV9IXG4rI2RlZmluZSBfTElOVVhfTk9ERV9QUklWQVRFX0hcbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZW1hc2suaFx1MDAzZVxuK1xuK3N0cnVjdCBwYWdlO1xuK1xuKy8qXG4rICogUGVyLW5vZGUgc2VydmljZSBvcHQtaW5zIChub2RlX3ByaXZhdGUuY2FwcykuICBBIHByaXZhdGUgbm9kZSBpcyBpc29sYXRlZFxuKyAqIGZyb20gYWxsIGdlbmVyYWwgbW0gc2VydmljZXMgYnkgZGVmYXVsdDsgdGhlIHJlZ2lzdGVyaW5nIGRyaXZlciBzZXRzIHRoZXNlXG4rICogdG8gbGV0IHNwZWNpZmljIHNlcnZpY2VzIG9wZXJhdGUgb24gaXRzIG5vZGUuXG4rICovXG4rI2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX1JFQ0xBSU1cdCgxVUwgXHUwMDNjXHUwMDNjIDApXHQvKiBhbGxvdyBtbSByZWNsYWltICovXG4rI2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX1VTRVJfTlVNQVx0KDFVTCBcdTAwM2NcdTAwM2MgMSlcdC8qIGFsbG93IG1lbXBvbGljeSAqL1xuKyNkZWZpbmUgTk9ERV9QUklWQVRFX0NBUF9IT1RVTlBMVUdcdCgxVUwgXHUwMDNjXHUwMDNjIDIpXHQvKiBhbGxvdyBob3QtdW5wbHVnICovXG4rI2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX0RFTU9USU9OXHQoMVVMIFx1MDAzY1x1MDAzYyAzKVx0LyogYWxsb3cgdGllcmluZyBkZW1vdGlvbiAqL1xuKyNkZWZpbmUgTk9ERV9QUklWQVRFX0NBUF9OVU1BX0JBTEFOQ0lOR1x0KDFVTCBcdTAwM2NcdTAwM2MgNClcdC8qIGFsbG93IE5VTUEgYmFsYW5jaW5nICovXG4rI2RlZmluZSBOT0RFX1BSSVZBVEVfQ0FQX0xUUElOXHRcdCgxVUwgXHUwMDNjXHUwMDNjIDUpXHQvKiBhbGxvdyBHVVAgcGlucyAqL1xuK1xuKy8qKlxuKyAqIHN0cnVjdCBub2RlX3ByaXZhdGUgLSBQZXItbm9kZSBjb250YWluZXIgZm9yIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXNcbisgKlxuKyAqIEFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIGFuZCBwYXNzZWQgdG8gbm9kZV9wcml2YXRlX3JlZ2lzdGVyKCkuXG4rICogVGhlIGRyaXZlciBvd25zIHRoZSBtZW1vcnkgYW5kIG11c3QgZW5zdXJlIGl0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXJcbisgKiBub2RlX3ByaXZhdGVfdW5yZWdpc3RlcigpIHJldHVybnMuXG4rICpcbisgKiBAb3duZXI6IE9wYXF1ZSBkcml2ZXIgaWRlbnRpZmllclxuKyAqIEBjYXBzOiBOT0RFX1BSSVZBVEVfQ0FQXyogc2VydmljZSBvcHQtaW5zIGZvciB0aGUgbm9kZSAoemVybyBieSBkZWZhdWx0O1xuKyAqXHQgIGluZGl2aWR1YWwgY2FwYWJpbGl0aWVzIGFyZSBkZWZpbmVkIGFuZCBjb25zdW1lZCBieSBsYXRlciBjaGFuZ2VzKVxuKyAqL1xuK3N0cnVjdCBub2RlX3ByaXZhdGUge1xuK1x0dm9pZCAqb3duZXI7XG4rXHR1bnNpZ25lZCBsb25nIGNhcHM7XG4rfTtcbitcbisjaWZkZWYgQ09ORklHX05VTUFcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tbXpvbmUuaFx1MDAzZVxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19pc19wcml2YXRlX25vZGUoc3RydWN0IGZvbGlvICpmb2xpbylcbit7XG4rXHRyZXR1cm4gbm9kZV9zdGF0ZShmb2xpb19uaWQoZm9saW8pLCBOX01FTU9SWV9QUklWQVRFKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIHBhZ2VfaXNfcHJpdmF0ZV9ub2RlKHN0cnVjdCBwYWdlICpwYWdlKVxuK3tcbitcdHJldHVybiBub2RlX3N0YXRlKHBhZ2VfdG9fbmlkKHBhZ2UpLCBOX01FTU9SWV9QUklWQVRFKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfaXNfcHJpdmF0ZShpbnQgbmlkKVxuK3tcbitcdHJldHVybiBub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSk7XG4rfVxuK1xuKy8qKlxuKyAqIG5vZGVfYWxsb3dzX3JlY2xhaW0gLSBtYXkgdGhlIG1tIHJlY2xhaW0gZnJvbSB0aGlzIG5vZGU/XG4rICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdFxuKyAqXG4rICogT25seSBhIHByaXZhdGUgbm9kZSBpcyBldmVyIGV4Y2x1ZGVkLiAgRXZlcnkgb3RoZXIgbm9kZSBjYW4gc2FmZWx5XG4rICogYmUgb3BlcmF0ZWQgb24gYnkgcmVjbGFpbS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfcmVjbGFpbShpbnQgbmlkKVxuK3tcbitcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xuK1x0Ym9vbCByZXQ7XG4rXG4rXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXHRyY3VfcmVhZF9sb2NrKCk7XG4rXHRucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS1cdTAwM2Vub2RlX3ByaXZhdGUpO1xuK1x0cmV0ID0gbnAgXHUwMDI2XHUwMDI2IChucC1cdTAwM2VjYXBzIFx1MDAyNiBOT0RFX1BSSVZBVEVfQ0FQX1JFQ0xBSU0pO1xuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBub2RlX2FsbG93c191c2VyX251bWEgLSBtYXkgdXNlcnNwYWNlIHBsYWNlIG9yIG1pZ3JhdGUgbWVtb3J5IGhlcmU/XG4rICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdFxuKyAqXG4rICogR2F0ZSBhbGwgdXNlcnNwYWNlLWRpcmVjdGVkIG1lbW9yeSBvcGVyYXRpb25zIG9uIGEgcHJpdmF0ZSBub2RlLlxuKyAqICAgLSBtYmluZCgpL3NldF9tZW1wb2xpY3koKVxuKyAqICAgLSBtb3ZlX3BhZ2VzKCkvbWlncmF0ZV9wYWdlcygpXG4rICpcbisgKiByZXR1cm46IHRydWUgZm9yIE5fTUVNT1JZIGFuZCBOX01FTU9SWV9QUklWQVRFIHdpdGggQ0FQX1VTRVJfTlVNQS5cbisgKiAgICAgICAgIGZhbHNlIGZvciBtZW1vcnlsZXNzIG9yIG9wdGVkLW91dCBwcml2YXRlIG5vZGUuXG4rICovXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX3VzZXJfbnVtYShpbnQgbmlkKVxuK3tcbitcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xuK1x0Ym9vbCByZXQ7XG4rXG4rXHRpZiAobm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktXHUwMDNlbm9kZV9wcml2YXRlKTtcbitcdHJldCA9IG5wIFx1MDAyNlx1MDAyNiAobnAtXHUwMDNlY2FwcyBcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9VU0VSX05VTUEpO1xuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBub2RlX2FsbG93c19ob3R1bnBsdWcgLSBtYXkgaG90LXVucGx1ZyBtaWdyYXRlIHRoaXMgbm9kZSdzIGZvbGlvcz9cbisgKiBAbmlkOiB0aGUgbm9kZSB0byB0ZXN0XG4rICpcbisgKiBUcnVlIGZvciBub3JtYWwgbm9kZXMgYW5kIHByaXZhdGUgbm9kZXMgb3B0ZWQgaW50byBDQVBfSE9UVU5QTFVHLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19ob3R1bnBsdWcoaW50IG5pZClcbit7XG4rXHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDtcbitcdGJvb2wgcmV0O1xuK1xuK1x0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktXHUwMDNlbm9kZV9wcml2YXRlKTtcbitcdHJldCA9IG5wIFx1MDAyNlx1MDAyNiAobnAtXHUwMDNlY2FwcyBcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9IT1RVTlBMVUcpO1xuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBub2RlX2FsbG93c19kZW1vdGlvbiAtIG1heSBrZXJuZWwgdGllcmluZyBkZW1vdGUgdG8gdGhpcyBub2RlP1xuKyAqIEBuaWQ6IHRoZSBub2RlIHRvIHRlc3RcbisgKlxuKyAqIEdvdmVybnMgd2hldGhlciBhIHByaXZhdGUgbm9kZSBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGRlbW90aW9uIGhpZXJhcmNoeS5cbisgKiBEZW1vdGlvbiBhY2N1bXVsYXRlcyBwYWdlcyBvbiB0aGUgbm9kZSwgc28gQ0FQX0RFTU9USU9OIHJlcXVpcmVzIENBUF9SRUNMQUlNXG4rICogKGVuZm9yY2VkIGF0IHJlZ2lzdHJhdGlvbikgYXMgYSBzYWZldHkgdmFsdmUuXG4rICpcbisgKiByZXR1cm46IHRydWUgZm9yIG5vcm1hbCBub2RlcyBhbmQgcHJpdmF0ZSBub2RlcyBvcHRlZCBpbnRvIENBUF9ERU1PVElPTi5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfZGVtb3Rpb24oaW50IG5pZClcbit7XG4rXHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDtcbitcdGJvb2wgcmV0O1xuK1xuK1x0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktXHUwMDNlbm9kZV9wcml2YXRlKTtcbitcdHJldCA9IG5wIFx1MDAyNlx1MDAyNiAobnAtXHUwMDNlY2FwcyBcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9ERU1PVElPTik7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIG5vZGVfYWxsb3dzX251bWFfYmFsYW5jaW5nIC0gbWF5IE5VTUEgYmFsYW5jaW5nIHNjYW4vbWlncmF0ZSB0aGlzIG5vZGU/XG4rICogQG5pZDogdGhlIG5vZGUgdG8gdGVzdFxuKyAqXG4rICogQWNjZXNzLWJhc2VkIHByb21vdGlvbi9taWdyYXRpb24uICBVbmxpa2UgZGVtb3Rpb24gdGhpcyBpcyBub3QgcmVjbGFpbS1kcml2ZW4sXG4rICogc28gQ0FQX05VTUFfQkFMQU5DSU5HIHN0YW5kcyBhbG9uZSAobm8gQ0FQX1JFQ0xBSU0gZGVwZW5kZW5jeSkuXG4rICpcbisgKiByZXR1cm46IHRydWUgZm9yIG5vcm1hbCBub2RlcyBhbmQgcHJpdmF0ZSBub2RlcyBvcHRlZCBpbnRvIENBUF9OVU1BX0JBTEFOQ0lORy5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfbnVtYV9iYWxhbmNpbmcoaW50IG5pZClcbit7XG4rXHRzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucDtcbitcdGJvb2wgcmV0O1xuK1xuK1x0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bnAgPSByY3VfZGVyZWZlcmVuY2UoTk9ERV9EQVRBKG5pZCktXHUwMDNlbm9kZV9wcml2YXRlKTtcbitcdHJldCA9IG5wIFx1MDAyNlx1MDAyNiAobnAtXHUwMDNlY2FwcyBcdTAwMjYgTk9ERV9QUklWQVRFX0NBUF9OVU1BX0JBTEFOQ0lORyk7XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIG5vZGVfYWxsb3dzX2x0cGluIC0gbWF5IGEgZm9saW8gb24gdGhpcyBub2RlIGJlIGxvbmctdGVybSBHVVAtcGlubmVkP1xuKyAqIEBuaWQ6IHRoZSBub2RlIHRvIHRlc3RcbisgKlxuKyAqIE9wdGVkLW91dCBwcml2YXRlIG5vZGVzIGNhdXNlIGxvbmd0ZXJtIHBpbnMgdG8gb3V0cmlnaHQgZmFpbCByZWdhcmRsZXNzXG4rICogb2YgWk9ORSBwbGFjZW1lbnQgKE5PUk1BTCB3b3VsZCBhbGxvdywgTU9WQUJMRSB3b3VsZCBtaWdyYXRlIGZpcnN0KS5cbisgKlxuKyAqIE9wdGVkLWluIHByaXZhdGUgbm9kZXMgYWxsb3cgbG9uZ3Rlcm0gcGlucyB0byBvcGVyYXRlIG5vcm1hbGx5LlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19sdHBpbihpbnQgbmlkKVxuK3tcbitcdHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wO1xuK1x0Ym9vbCByZXQ7XG4rXG4rXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXHRyY3VfcmVhZF9sb2NrKCk7XG4rXHRucCA9IHJjdV9kZXJlZmVyZW5jZShOT0RFX0RBVEEobmlkKS1cdTAwM2Vub2RlX3ByaXZhdGUpO1xuK1x0cmV0ID0gbnAgXHUwMDI2XHUwMDI2IChucC1cdTAwM2VjYXBzIFx1MDAyNiBOT0RFX1BSSVZBVEVfQ0FQX0xUUElOKTtcbitcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rI2Vsc2UgLyogIUNPTkZJR19OVU1BICovXG4rXG4rc3RhdGljIGlubGluZSBib29sIGZvbGlvX2lzX3ByaXZhdGVfbm9kZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIHBhZ2VfaXNfcHJpdmF0ZV9ub2RlKHN0cnVjdCBwYWdlICpwYWdlKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfaXNfcHJpdmF0ZShpbnQgbmlkKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX3JlY2xhaW0oaW50IG5pZClcbit7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX3VzZXJfbnVtYShpbnQgbmlkKVxuK3tcbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfaG90dW5wbHVnKGludCBuaWQpXG4re1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19kZW1vdGlvbihpbnQgbmlkKVxuK3tcbitcdHJldHVybiB0cnVlO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfbnVtYV9iYWxhbmNpbmcoaW50IG5pZClcbit7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2x0cGluKGludCBuaWQpXG4re1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKyNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xuK1xuKyNpZiBkZWZpbmVkKENPTkZJR19OVU1BKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpXG4rXG4raW50IG5vZGVfcHJpdmF0ZV9yZWdpc3RlcihpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucCk7XG4raW50IG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKGludCBuaWQpO1xuK1xuKyNlbHNlIC8qICFDT05GSUdfTlVNQSB8fCAhQ09ORklHX01FTU9SWV9IT1RQTFVHICovXG4rXG4rc3RhdGljIGlubGluZSBpbnQgbm9kZV9wcml2YXRlX3JlZ2lzdGVyKGludCBuaWQsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKVxuK3tcbitcdHJldHVybiAtRU5PREVWO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBub2RlX3ByaXZhdGVfdW5yZWdpc3RlcihpbnQgbmlkKVxuK3tcbitcdHJldHVybiAwO1xuK31cbitcbisjZW5kaWYgLyogQ09ORklHX05VTUEgXHUwMDI2XHUwMDI2IENPTkZJR19NRU1PUllfSE9UUExVRyAqL1xuK1xuKyNlbmRpZiAvKiBfTElOVVhfTk9ERV9QUklWQVRFX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmggYi9pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmhcbmluZGV4IGI4NDJhYTUyNTU0NjQ0Li5iYTNlNmM1NzBhMTEyZCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvbm9kZW1hc2suaFxuKysrIGIvaW5jbHVkZS9saW51eC9ub2RlbWFzay5oXG5AQCAtMzkxLDYgKzM5MSw3IEBAIGVudW0gbm9kZV9zdGF0ZXMge1xuIFx0Tl9ISUdIX01FTU9SWSA9IE5fTk9STUFMX01FTU9SWSxcbiAjZW5kaWZcbiBcdE5fTUVNT1JZLFx0XHQvKiBUaGUgbm9kZSBoYXMgbWVtb3J5KHJlZ3VsYXIsIGhpZ2gsIG1vdmFibGUpICovXG4rXHROX01FTU9SWV9QUklWQVRFLFx0LyogVGhlIG5vZGUncyBtZW1vcnkgaXMgcHJpdmF0ZSAqL1xuIFx0Tl9DUFUsXHRcdC8qIFRoZSBub2RlIGhhcyBvbmUgb3IgbW9yZSBjcHVzICovXG4gXHROX0dFTkVSSUNfSU5JVElBVE9SLFx0LyogVGhlIG5vZGUgaGFzIG9uZSBvciBtb3JlIEdlbmVyaWMgSW5pdGlhdG9ycyAqL1xuIFx0TlJfTk9ERV9TVEFURVNcbkBAIC00NTcsNyArNDU4LDcgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIG5vZGVfc2V0X29mZmxpbmUoaW50IG5pZClcbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBub2RlX3N0YXRlKGludCBub2RlLCBlbnVtIG5vZGVfc3RhdGVzIHN0YXRlKVxuIHtcbi1cdHJldHVybiBub2RlID09IDA7XG4rXHRyZXR1cm4gbm9kZSA9PSAwIFx1MDAyNlx1MDAyNiBzdGF0ZSAhPSBOX01FTU9SWV9QUklWQVRFO1xuIH1cbiBcbiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgbm9kZV9zZXRfc3RhdGUoaW50IG5vZGUsIGVudW0gbm9kZV9zdGF0ZXMgc3RhdGUpXG5AQCAtNDcwLDExICs0NzEsMTEgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIG5vZGVfY2xlYXJfc3RhdGUoaW50IG5vZGUsIGVudW0gbm9kZV9zdGF0ZXMgc3RhdGUpXG4gXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgbnVtX25vZGVfc3RhdGUoZW51bSBub2RlX3N0YXRlcyBzdGF0ZSlcbiB7XG4tXHRyZXR1cm4gMTtcbitcdHJldHVybiBzdGF0ZSA9PSBOX01FTU9SWV9QUklWQVRFID8gMCA6IDE7XG4gfVxuIFxuICNkZWZpbmUgZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBfX3N0YXRlKSBcXFxuLVx0Zm9yICggKG5vZGUpID0gMDsgKG5vZGUpID09IDA7IChub2RlKSA9IDEpXG4rXHRmb3IgKChub2RlKSA9IDA7IChub2RlKSA9PSAwIFx1MDAyNlx1MDAyNiAoX19zdGF0ZSkgIT0gTl9NRU1PUllfUFJJVkFURTsgKG5vZGUpID0gMSlcbiBcbiAjZGVmaW5lIGZpcnN0X29ubGluZV9ub2RlXHQwXG4gI2RlZmluZSBmaXJzdF9tZW1vcnlfbm9kZVx0MFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaCBiL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaFxuaW5kZXggNDE5MDExMDk3ZmE4ZTIuLmE4ZmYxNTBlMmNiYjc3IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmhcbkBAIC0xNjU0LDExICsxNjU0LDE0IEBAIHN0cnVjdCBrdm1fbWVtb3J5X2F0dHJpYnV0ZXMge1xuICNkZWZpbmUgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRFx0X0lPV1IoS1ZNSU8sICAweGQ0LCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZClcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFx0XHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcbiAjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRURcdCgxVUxMIFx1MDAzY1x1MDAzYyAxKVxuKyNkZWZpbmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVcdCgxVUxMIFx1MDAzY1x1MDAzYyAyKVxuIFxuIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkIHtcbiBcdF9fdTY0IHNpemU7XG4gXHRfX3U2NCBmbGFncztcbi1cdF9fdTY0IHJlc2VydmVkWzZdO1xuK1x0X191MzIgbm9kZTtcbitcdF9fdTMyIHBhZDtcbitcdF9fdTY0IHJlc2VydmVkWzVdO1xuIH07XG4gXG4gI2RlZmluZSBLVk1fUFJFX0ZBVUxUX01FTU9SWVx0X0lPV1IoS1ZNSU8sIDB4ZDUsIHN0cnVjdCBrdm1fcHJlX2ZhdWx0X21lbW9yeSlcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL3VhcGkvbGludXgvbWVtcG9saWN5LmhcbmluZGV4IDdmNmZjOTU5OTY5M2I2Li44N2FmMThjODRiOTQ3NSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9tZW1wb2xpY3kuaFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21lbXBvbGljeS5oXG5AQCAtNjcsNiArNjcsNyBAQCBlbnVtIG1lbXBvbGljeV9tb2RlIHtcbiAjZGVmaW5lIE1QT0xfRl9TSEFSRUQgICgxIFx1MDAzY1x1MDAzYyAwKVx0LyogaWRlbnRpZnkgc2hhcmVkIHBvbGljaWVzICovXG4gI2RlZmluZSBNUE9MX0ZfTU9GXHQoMSBcdTAwM2NcdTAwM2MgMykgLyogdGhpcyBwb2xpY3kgd2FudHMgbWlncmF0ZSBvbiBmYXVsdCAqL1xuICNkZWZpbmUgTVBPTF9GX01PUk9OXHQoMSBcdTAwM2NcdTAwM2MgNCkgLyogTWlncmF0ZSBPbiBwcm90bm9uZSBSZWZlcmVuY2UgT24gTm9kZSAqL1xuKyNkZWZpbmUgTVBPTF9GX1BSSVZBVEVcdCgxIFx1MDAzY1x1MDAzYyA1KSAvKiBub2RlbWFzayBjb250YWlucyBwcml2YXRlIG5vZGVzICovXG4gXG4gLypcbiAgKiBFbmFibGluZyB6b25lIHJlY2xhaW0gbWVhbnMgdGhlIHBhZ2UgYWxsb2NhdG9yIHdpbGwgYXR0ZW1wdCB0byBmdWxmaWxsXG5kaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC9jcHVzZXQuYyBiL2tlcm5lbC9jZ3JvdXAvY3B1c2V0LmNcbmluZGV4IGVlNDAyNWI5NzA3YTIyLi43OGE0Zjk0ODU2NTYwZCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9jZ3JvdXAvY3B1c2V0LmNcbisrKyBiL2tlcm5lbC9jZ3JvdXAvY3B1c2V0LmNcbkBAIC0yNiw2ICsyNiw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtcG9saWN5LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9ub2RlX3ByaXZhdGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdXBkYXRlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvZGVhZGxpbmUuaFx1MDAzZVxuQEAgLTM4NzIsNyArMzg3Myw4IEBAIHN0YXRpYyB2b2lkIGNwdXNldF9oYW5kbGVfaG90cGx1Zyh2b2lkKVxuIFx0c3RhdGljIERFQ0xBUkVfV09SSyhoa19zZF93b3JrLCBoa19zZF93b3JrZm4pO1xuIFx0c3RhdGljIGNwdW1hc2tfdCBuZXdfY3B1cztcbiBcdHN0YXRpYyBub2RlbWFza190IG5ld19tZW1zO1xuLVx0Ym9vbCBjcHVzX3VwZGF0ZWQsIG1lbXNfdXBkYXRlZDtcbitcdHN0YXRpYyBub2RlbWFza190IHByZXZfcHJpdl9tZW1zO1xuK1x0Ym9vbCBjcHVzX3VwZGF0ZWQsIG1lbXNfdXBkYXRlZCwgcHJpdl9zaHJhbms7XG4gXHRib29sIG9uX2RmbCA9IGlzX2luX3YyX21vZGUoKTtcbiBcdHN0cnVjdCB0bXBtYXNrcyB0bXAsICpwdG1wID0gTlVMTDtcbiBcbkBAIC0zODk1LDYgKzM4OTcsMTQgQEAgc3RhdGljIHZvaWQgY3B1c2V0X2hhbmRsZV9ob3RwbHVnKHZvaWQpXG4gXHRcdCAgICAgICAhY3B1bWFza19lbXB0eShzdWJwYXJ0aXRpb25zX2NwdXMpO1xuIFx0bWVtc191cGRhdGVkID0gIW5vZGVzX2VxdWFsKHRvcF9jcHVzZXQuZWZmZWN0aXZlX21lbXMsIG5ld19tZW1zKTtcbiBcbitcdC8qXG4rXHQgKiBQcml2YXRlIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0LCBidXQgaWYgb25lIGxlYXZlc1xuK1x0ICogTl9NRU1PUllfUFJJVkFURSB3ZSBzdGlsbCBuZWVkIHRvIHJ1biBtcG9sX3JlYmluZF8qIHRvIGNsZWFuIHVwXG4rXHQgKiBtZW1wb2xpY2llcyB0aGF0IGFyZSBiaW5kaW5nIHRoZW0uXG4rXHQgKi9cbitcdHByaXZfc2hyYW5rID0gIW5vZGVzX3N1YnNldChwcmV2X3ByaXZfbWVtcywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xuK1x0cHJldl9wcml2X21lbXMgPSBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXTtcbitcbiBcdC8qIEZvciB2MSwgc3luY2hyb25pemUgY3B1c19hbGxvd2VkIHRvIGNwdV9hY3RpdmVfbWFzayAqL1xuIFx0aWYgKGNwdXNfdXBkYXRlZCkge1xuIFx0XHRjcHVzZXRfZm9yY2VfcmVidWlsZCgpO1xuQEAgLTM5MjcsOSArMzkzNywxMiBAQCBzdGF0aWMgdm9pZCBjcHVzZXRfaGFuZGxlX2hvdHBsdWcodm9pZClcbiBcdFx0XHR0b3BfY3B1c2V0Lm1lbXNfYWxsb3dlZCA9IG5ld19tZW1zO1xuIFx0XHR0b3BfY3B1c2V0LmVmZmVjdGl2ZV9tZW1zID0gbmV3X21lbXM7XG4gXHRcdHNwaW5fdW5sb2NrX2lycShcdTAwMjZjYWxsYmFja19sb2NrKTtcbi1cdFx0Y3B1c2V0X3VwZGF0ZV90YXNrc19ub2RlbWFzayhcdTAwMjZ0b3BfY3B1c2V0KTtcbiBcdH1cbiBcbitcdC8qIFJlYmluZCB0YXNrIG1lbXBvbGljaWVzIGlmIGFueSBtZW1vcnkgbm9kZSBjaGFuZ2VkIHN0YXRlICovXG4rXHRpZiAobWVtc191cGRhdGVkIHx8IHByaXZfc2hyYW5rKVxuK1x0XHRjcHVzZXRfdXBkYXRlX3Rhc2tzX25vZGVtYXNrKFx1MDAyNnRvcF9jcHVzZXQpO1xuK1xuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmNwdXNldF9tdXRleCk7XG4gXG4gXHQvKiBpZiBjcHVzIG9yIG1lbXMgY2hhbmdlZCwgd2UgbmVlZCB0byBwcm9wYWdhdGUgdG8gZGVzY2VuZGFudHMgKi9cbkBAIC00MTYwLDExICs0MTczLDEzIEBAIG5vZGVtYXNrX3QgY3B1c2V0X21lbXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcbiAgKiBjcHVzZXRfbm9kZW1hc2tfdmFsaWRfbWVtc19hbGxvd2VkIC0gY2hlY2sgbm9kZW1hc2sgdnMuIGN1cnJlbnQgbWVtc19hbGxvd2VkXG4gICogQG5vZGVtYXNrOiB0aGUgbm9kZW1hc2sgdG8gYmUgY2hlY2tlZFxuICAqXG4tICogQXJlIGFueSBvZiB0aGUgbm9kZXMgaW4gdGhlIG5vZGVtYXNrIGFsbG93ZWQgaW4gY3VycmVudC1cdTAwM2VtZW1zX2FsbG93ZWQ/XG4rICogQXJlIGFueSBvZiB0aGUgbm9kZXMgaW4gdGhlIG5vZGVtYXNrIHVzYWJsZT8gIE5fTUVNT1JZIG5vZGVzIG11c3QgYmUgaW5cbisgKiBjdXJyZW50LVx1MDAzZW1lbXNfYWxsb3dlZCwgd2hpbGUgTl9NRU1PUllfUFJJVkFURSBub2RlcyBhcmUgYWx3YXlzIHZhbGlkLlxuICAqL1xuIGludCBjcHVzZXRfbm9kZW1hc2tfdmFsaWRfbWVtc19hbGxvd2VkKGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVtYXNrKVxuIHtcbi1cdHJldHVybiBub2Rlc19pbnRlcnNlY3RzKCpub2RlbWFzaywgY3VycmVudC1cdTAwM2VtZW1zX2FsbG93ZWQpO1xuK1x0cmV0dXJuIG5vZGVzX2ludGVyc2VjdHMoKm5vZGVtYXNrLCBjdXJyZW50LVx1MDAzZW1lbXNfYWxsb3dlZCkgfHxcbitcdCAgICAgICBub2Rlc19pbnRlcnNlY3RzKCpub2RlbWFzaywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xuIH1cbiBcbiAvKlxuQEAgLTQyMjgsNiArNDI0Myw5IEBAIGJvb2wgY3B1c2V0X2N1cnJlbnRfbm9kZV9hbGxvd2VkKGludCBub2RlLCBnZnBfdCBnZnBfbWFzaylcbiBcbiBcdGlmIChpbl9pbnRlcnJ1cHQoKSlcbiBcdFx0cmV0dXJuIHRydWU7XG4rXHQvKiBOX01FTU9SWV9QUklWQVRFIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0cy5tZW1zICovXG4rXHRpZiAobm9kZV9pc19wcml2YXRlKG5vZGUpKVxuK1x0XHRyZXR1cm4gdHJ1ZTtcbiBcdGlmIChub2RlX2lzc2V0KG5vZGUsIGN1cnJlbnQtXHUwMDNlbWVtc19hbGxvd2VkKSlcbiBcdFx0cmV0dXJuIHRydWU7XG4gXHQvKlxuZGlmZiAtLWdpdCBhL21tL2NvbXBhY3Rpb24uYyBiL21tL2NvbXBhY3Rpb24uY1xuaW5kZXggOWY4MTA1NWEzNThlZDEuLmI5YzI1YzU5OTczMmZkIDEwMDY0NFxuLS0tIGEvbW0vY29tcGFjdGlvbi5jXG4rKysgYi9tbS9jb21wYWN0aW9uLmNcbkBAIC0yNSw2ICsyNSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcHNpLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVzZXQuaFx1MDAzZVxuICNpbmNsdWRlIFwicGFnZV9hbGxvYy5oXCJcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9ub2RlX3ByaXZhdGUuaFx1MDAzZVxuICNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4gXG4gI2lmZGVmIENPTkZJR19DT01QQUNUSU9OXG5AQCAtMjQ2Miw2ICsyNDYzLDkgQEAgYm9vbCBjb21wYWN0aW9uX3pvbmVsaXN0X3N1aXRhYmxlKHN0cnVjdCBhbGxvY19jb250ZXh0ICphYywgaW50IG9yZGVyLFxuIFx0XHQgICAgIV9fY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lLCBnZnBfbWFzaykpXG4gXHRcdFx0Y29udGludWU7XG4gXG4rXHRcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbSh6b25lX3RvX25pZCh6b25lKSkpXG4rXHRcdFx0Y29udGludWU7XG4rXG4gXHRcdC8qXG4gXHRcdCAqIERvIG5vdCBjb25zaWRlciBhbGwgdGhlIHJlY2xhaW1hYmxlIG1lbW9yeSBiZWNhdXNlIHdlIGRvIG5vdFxuIFx0XHQgKiB3YW50IHRvIHRyYXNoIGp1c3QgZm9yIGEgc2luZ2xlIGhpZ2ggb3JkZXIgYWxsb2NhdGlvbiB3aGljaFxuQEAgLTI4NTMsNiArMjg1Nyw5IEBAIGVudW0gY29tcGFjdF9yZXN1bHQgdHJ5X3RvX2NvbXBhY3RfcGFnZXMoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcixcbiBcdFx0XHQhX19jcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIGdmcF9tYXNrKSlcbiBcdFx0XHRcdGNvbnRpbnVlO1xuIFxuK1x0XHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0oem9uZV90b19uaWQoem9uZSkpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuIFx0XHRpZiAocHJpbyBcdTAwM2UgTUlOX0NPTVBBQ1RfUFJJT1JJVFlcbiBcdFx0XHRcdFx0XHUwMDI2XHUwMDI2IGNvbXBhY3Rpb25fZGVmZXJyZWQoem9uZSwgb3JkZXIpKSB7XG4gXHRcdFx0cmMgPSBtYXhfdChlbnVtIGNvbXBhY3RfcmVzdWx0LCBDT01QQUNUX0RFRkVSUkVELCByYyk7XG5AQCAtMjkyMiw2ICsyOTI5LDkgQEAgc3RhdGljIGludCBjb21wYWN0X25vZGUocGdfZGF0YV90ICpwZ2RhdCwgYm9vbCBwcm9hY3RpdmUpXG4gXHRcdC5wcm9hY3RpdmVfY29tcGFjdGlvbiA9IHByb2FjdGl2ZSxcbiBcdH07XG4gXG4rXHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0ocGdkYXQtXHUwMDNlbm9kZV9pZCkpXG4rXHRcdHJldHVybiAwO1xuK1xuIFx0Zm9yICh6b25laWQgPSAwOyB6b25laWQgXHUwMDNjIE1BWF9OUl9aT05FUzsgem9uZWlkKyspIHtcbiBcdFx0em9uZSA9IFx1MDAyNnBnZGF0LVx1MDAzZW5vZGVfem9uZXNbem9uZWlkXTtcbiBcdFx0aWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSlcbkBAIC0zMDE3LDYgKzMwMjcsOSBAQCBzdGF0aWMgc3NpemVfdCBjb21wYWN0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldixcbiB7XG4gXHRpbnQgbmlkID0gZGV2LVx1MDAzZWlkO1xuIFxuK1x0aWYgKCFub2RlX2FsbG93c19yZWNsYWltKG5pZCkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuIFx0aWYgKG5pZCBcdTAwM2U9IDAgXHUwMDI2XHUwMDI2IG5pZCBcdTAwM2MgbnJfbm9kZV9pZHMgXHUwMDI2XHUwMDI2IG5vZGVfb25saW5lKG5pZCkpIHtcbiBcdFx0LyogRmx1c2ggcGVuZGluZyB1cGRhdGVzIHRvIHRoZSBMUlUgbGlzdHMgKi9cbiBcdFx0bHJ1X2FkZF9kcmFpbl9hbGwoKTtcbmRpZmYgLS1naXQgYS9tbS9kYW1vbi9wYWRkci5jIGIvbW0vZGFtb24vcGFkZHIuY1xuaW5kZXggZTRmOThkNjc0NjFmNTAuLmI2NjhjZjU1ZDFiNjczIDEwMDY0NFxuLS0tIGEvbW0vZGFtb24vcGFkZHIuY1xuKysrIGIvbW0vZGFtb24vcGFkZHIuY1xuQEAgLTEyLDYgKzEyLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1vcnktdGllcnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21tX2lubGluZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcIi4uL2ludGVybmFsLmhcIlxuICNpbmNsdWRlIFwib3BzLWNvbW1vbi5oXCJcbkBAIC0yNTAsNiArMjUxLDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRhbW9uX3BhX3BhZ2VvdXQoc3RydWN0IGRhbW9uX3JlZ2lvbiAqcixcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0fVxuIFxuK1x0XHQvKiBEQU1PUyBwYWdlb3V0IGlzIHJlY2xhaW07IGdhdGUgYSBwcml2YXRlIG5vZGUgb24gQ0FQX1JFQ0xBSU0gKi9cbitcdFx0aWYgKCFub2RlX2FsbG93c19yZWNsYWltKGZvbGlvX25pZChmb2xpbykpKVxuK1x0XHRcdGdvdG8gcHV0X2ZvbGlvO1xuK1xuIFx0XHRpZiAoZGFtb3NfcGFfZmlsdGVyX291dChzLCBmb2xpbykpXG4gXHRcdFx0Z290byBwdXRfZm9saW87XG4gXHRcdGVsc2VcbkBAIC0zNDQsNiArMzQ5LDEwIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRhbW9uX3BhX21pZ3JhdGUoc3RydWN0IGRhbW9uX3JlZ2lvbiAqcixcbiBcdFx0ZWxzZVxuIFx0XHRcdCpzel9maWx0ZXJfcGFzc2VkICs9IGZvbGlvX3NpemUoZm9saW8pIC8gYWRkcl91bml0O1xuIFxuK1x0XHQvKiBwcml2YXRlIG5vZGVzIGRvIG5vdCBzdXBwb3J0IG1pZ3JhdGlvbiBieSBkZWZhdWx0ICovXG4rXHRcdGlmIChmb2xpb19pc19wcml2YXRlX25vZGUoZm9saW8pKVxuK1x0XHRcdGdvdG8gcHV0X2ZvbGlvO1xuK1xuIFx0XHRpZiAoIWZvbGlvX2lzb2xhdGVfbHJ1KGZvbGlvKSlcbiBcdFx0XHRnb3RvIHB1dF9mb2xpbztcbiBcdFx0bGlzdF9hZGQoXHUwMDI2Zm9saW8tXHUwMDNlbHJ1LCBcdTAwMjZmb2xpb19saXN0KTtcbmRpZmYgLS1naXQgYS9tbS9ndXAuYyBiL21tL2d1cC5jXG5pbmRleCA5OTkwMmMxNTcwM2IwMS4uODIxODM5YjcxM2JiNDUgMTAwNjQ0XG4tLS0gYS9tbS9ndXAuY1xuKysrIGIvbW0vZ3VwLmNcbkBAIC01NDcsMTAgKzU0NywxMSBAQCBzdGF0aWMgc3RydWN0IGZvbGlvICp0cnlfZ3JhYl9mb2xpb19mYXN0KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcmVmcyxcbiBcdC8qXG4gXHQgKiBDYW4ndCBkbyBGT0xMX0xPTkdURVJNICsgRk9MTF9QSU4gZ3VwIGZhc3QgcGF0aCBpZiBub3QgaW4gYVxuIFx0ICogcmlnaHQgem9uZSwgc28gZmFpbCBhbmQgbGV0IHRoZSBjYWxsZXIgZmFsbCBiYWNrIHRvIHRoZSBzbG93XG4tXHQgKiBwYXRoLlxuK1x0ICogcGF0aC4gIEZhaWwgZm9yIG5vbi1vcHRlZC1pbiBwcml2YXRlIG5vZGUgZm9saW9zIGhlcmUgc28gdGhlXG4rXHQgKiBzbG93IHBhdGggY2FuIHJlamVjdCB0aGUgcGluIGVudGlyZWx5LlxuIFx0ICovXG4gXHRpZiAodW5saWtlbHkoKGZsYWdzIFx1MDAyNiBGT0xMX0xPTkdURVJNKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICAhZm9saW9faXNfbG9uZ3Rlcm1fcGlubmFibGUoZm9saW8pKSkge1xuK1x0XHQgICAgICFmb2xpb19hbGxvd3NfbG9uZ3Rlcm1fcGluKGZvbGlvKSkpIHtcbiBcdFx0Zm9saW9fcHV0X3JlZnMoZm9saW8sIHJlZnMpO1xuIFx0XHRyZXR1cm4gTlVMTDtcbiBcdH1cbkBAIC0yMzgyLDEyICsyMzgzLDM1IEBAIG1pZ3JhdGVfbG9uZ3Rlcm1fdW5waW5uYWJsZV9mb2xpb3Moc3RydWN0IGxpc3RfaGVhZCAqbW92YWJsZV9mb2xpb19saXN0LFxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4rLypcbisgKiBUcnVlIGlmIGFueSBmb2xpbyBzaXRzIG9uIGEgcHJpdmF0ZSBub2RlIHdob3NlIGZvbGlvcyBtYXkgbm90IGJlIGxvbmd0ZXJtXG4rICogcGlubmVkLiAgU3VjaCBmb2xpb3MgY2FuIG5laXRoZXIgYmUgcGlubmVkIG5vciBtaWdyYXRlZCwgc28gdGhlIHdob2xlIHBpblxuKyAqIG11c3QgZmFpbCBiZWZvcmUgbWlncmF0aW9uLiAgQ2hlY2tlZCBiZWZvcmUgYW55IGlzb2xhdGlvbiBvY2N1cnMuXG4rICovXG4rc3RhdGljIGJvb2wgcG9mc19oYXNfbHRwaW5fZm9yYmlkZGVuKHN0cnVjdCBwYWdlc19vcl9mb2xpb3MgKnBvZnMpXG4re1xuK1x0c3RydWN0IGZvbGlvICpmb2xpbztcbitcdGxvbmcgaSA9IDA7XG4rXG4rXHRmb3IgKGZvbGlvID0gcG9mc19nZXRfZm9saW8ocG9mcywgaSk7IGZvbGlvO1xuK1x0ICAgICBmb2xpbyA9IHBvZnNfbmV4dF9mb2xpbyhmb2xpbywgcG9mcywgXHUwMDI2aSkpIHtcbitcdFx0aWYgKGZvbGlvX2xvbmd0ZXJtX3Bpbl9mb3JiaWRkZW4oZm9saW8pKVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbiBzdGF0aWMgbG9uZ1xuIGNoZWNrX2FuZF9taWdyYXRlX21vdmFibGVfcGFnZXNfb3JfZm9saW9zKHN0cnVjdCBwYWdlc19vcl9mb2xpb3MgKnBvZnMpXG4ge1xuIFx0TElTVF9IRUFEKG1vdmFibGVfZm9saW9fbGlzdCk7XG4gXHR1bnNpZ25lZCBsb25nIGNvbGxlY3RlZDtcbiBcbitcdGlmIChwb2ZzX2hhc19sdHBpbl9mb3JiaWRkZW4ocG9mcykpIHtcbitcdFx0cG9mc191bnBpbihwb2ZzKTtcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXHR9XG4rXG4gXHRjb2xsZWN0ZWQgPSBjb2xsZWN0X2xvbmd0ZXJtX3VucGlubmFibGVfZm9saW9zKFx1MDAyNm1vdmFibGVfZm9saW9fbGlzdCxcbiBcdFx0XHRcdFx0XHQgICAgICAgcG9mcyk7XG4gXHRpZiAoIWNvbGxlY3RlZClcbmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuY1xuaW5kZXggMDRlOGE2YjU1MzQzNWYuLjNhZDczNTBmYzQyN2U1IDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTM3LDYgKzM3LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlX293bmVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9zeXNjdGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb21wYXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BnYWxsb2MuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3BnYWxsb2NfdGFnLmhcdTAwM2VcbkBAIC0yMzM4LDYgKzIzMzksMTAgQEAgYm9vbCBtYWR2aXNlX2ZyZWVfaHVnZV9wbWQoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHR9XG4gXG4gXHRmb2xpbyA9IHBtZF9mb2xpbyhvcmlnX3BtZCk7XG4rXG4rXHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0oZm9saW9fbmlkKGZvbGlvKSkpXG4rXHRcdGdvdG8gb3V0O1xuK1xuIFx0LypcbiBcdCAqIElmIG90aGVyIHByb2Nlc3NlcyBhcmUgbWFwcGluZyB0aGlzIGZvbGlvLCB3ZSBjb3VsZG4ndCBkaXNjYXJkXG4gXHQgKiB0aGUgZm9saW8gdW5sZXNzIHRoZXkgYWxsIGRvIE1BRFZfRlJFRSBzbyBsZXQncyBza2lwIHRoZSBmb2xpby5cbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggNTFlZTRjMTMxMDkwOGQuLjE3YTdhZWY4YTc4OWRmIDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuKysrIGIvbW0vaW50ZXJuYWwuaFxuQEAgLTEyLDYgKzEyLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW1faW5saW5lLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tbXVfbm90aWZpZXIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L25vZGVfcHJpdmF0ZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZW1hcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZXdhbGsuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JtYXAuaFx1MDAzZVxuQEAgLTk4LDYgKzk5LDk1IEBAIGV4dGVybiBpbnQgc3lzY3RsX21pbl91bm1hcHBlZF9yYXRpbztcbiBleHRlcm4gaW50IHN5c2N0bF9taW5fc2xhYl9yYXRpbztcbiAjZW5kaWZcbiBcbisvKiBmb2xpb19pc19wcml2YXRlX21hbmFnZWQoKSAtIGZvbGlvIGhhcyBzcGVjaWFsIG1tIG1hbmFnZW1lbnQgcnVsZXMgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9faXNfcHJpdmF0ZV9tYW5hZ2VkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4re1xuK1x0cmV0dXJuIGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCBmb2xpb19pc19wcml2YXRlX25vZGUoZm9saW8pO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9pc19wcml2YXRlX21hbmFnZWQoc3RydWN0IHBhZ2UgKnBhZ2UpXG4re1xuK1x0cmV0dXJuIGZvbGlvX2lzX3ByaXZhdGVfbWFuYWdlZChwYWdlX2ZvbGlvKHBhZ2UpKTtcbit9XG4rXG4rLypcbisgKiBmb2xpb19hbGxvd3NfbWFkdmlzZSgpIC0gbWF5IG1hZHZpc2UgcmVjbGFpbSBoaW50cyBhY3Qgb24gdGhpcyBmb2xpbz9cbisgKlxuKyAqIG1hZHZpc2UgcmVjbGFpbSBoaW50cyAoQ09MRC9QQUdFT1VUL0ZSRUUpIGFyZSB1c2VybGFuZC1kcml2ZW4gcmVjbGFpbSwgc29cbisgKiB0aGV5IGZvbGxvdyByZWNsYWltIG9wdC1pbjogZmFsc2UgZm9yIFpPTkVfREVWSUNFIGFuZCBmb3IgTl9NRU1PUllfUFJJVkFURVxuKyAqIG5vZGVzIHdpdGhvdXQgQ0FQX1JFQ0xBSU0sIHRydWUgZm9yIGFsbCBvdGhlciBub3JtYWwgZm9saW9zLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBmb2xpb19hbGxvd3NfbWFkdmlzZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuK3tcbitcdHJldHVybiAhZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIFx1MDAyNlx1MDAyNlxuK1x0ICAgICAgIG5vZGVfYWxsb3dzX3JlY2xhaW0oZm9saW9fbmlkKGZvbGlvKSk7XG4rfVxuK1xuKy8qXG4rICogZm9saW9fYWxsb3dzX251bWFfYmFsYW5jZSgpIC0gbWF5IE5VTUEgYmFsYW5jaW5nIHNjYW4vbWlncmF0ZSB0aGlzIGZvbGlvP1xuKyAqXG4rICogTlVNQSBiYWxhbmNpbmcgaXMgYWNjZXNzLWF3YXJlIHRpZXJpbmcgbWlncmF0aW9uLCBzbyBpdCBmb2xsb3dzIHRoZSB0aWVyaW5nXG4rICogb3B0LWluOiBmYWxzZSBmb3IgWk9ORV9ERVZJQ0UgYW5kIGZvciBOX01FTU9SWV9QUklWQVRFIG5vZGVzIHdpdGhvdXRcbisgKiBDQVBfTlVNQV9CQUxBTkNJTkcsIHRydWUgZm9yIGFsbCBvdGhlciBmb2xpb3MuXG4rICovXG4rc3RhdGljIGlubGluZSBib29sIGZvbGlvX2FsbG93c19udW1hX2JhbGFuY2Uoc3RydWN0IGZvbGlvICpmb2xpbylcbit7XG4rXHRyZXR1cm4gIWZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSBcdTAwMjZcdTAwMjZcbitcdCAgICAgICBub2RlX2FsbG93c19udW1hX2JhbGFuY2luZyhmb2xpb19uaWQoZm9saW8pKTtcbit9XG4rXG4rLypcbisgKiBmb2xpb19hbGxvd3NfY29sbGFwc2UoKSAtIG1heSBjb2xsYXBzZSBmb2xkIHRoaXMgZm9saW8gaW50byBhIFRIUD9cbisgKiBAaXNfa2h1Z2VwYWdlZDogdHJ1ZSBmb3IgdGhlIGtodWdlcGFnZWQsIGZhbHNlIGZvciBNQURWX0NPTExBUFNFLlxuKyAqXG4rICogQ29sbGFwc2UgaXMgYSByZXNpZGVuY3kgb3BlcmF0aW9uIGdhdGVkIGJ5IHRoZSBhY3RvciBjYWxsaW5nIGl0OlxuKyAqICAgLSBraHVnZXBhZ2VkIG5ldmVyIG9wZXJhdGVzIG9uIHByaXZhdGUtbm9kZSBmb2xpb3MgKGxpa2UgWk9ORV9ERVZJQ0UpXG4rICogICAtIE1BRFZfQ09MTEFQU0UgaXMgZ2F0ZWQgYnkgQ0FQX1VTRVJfTlVNQVxuKyAqXG4rICogTmV2ZXIgdHJ1ZSBmb3IgWk9ORV9ERVZJQ0UuXG4rICovXG4rc3RhdGljIGlubGluZSBib29sIGZvbGlvX2FsbG93c19jb2xsYXBzZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGlzX2todWdlcGFnZWQpXG4re1xuK1x0aW50IG5pZCA9IGZvbGlvX25pZChmb2xpbyk7XG4rXG4rXHRpZiAoZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAoaXNfa2h1Z2VwYWdlZClcbitcdFx0cmV0dXJuICFub2RlX2lzX3ByaXZhdGUobmlkKTtcbitcdHJldHVybiBub2RlX2FsbG93c191c2VyX251bWEobmlkKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIHBhZ2VfYWxsb3dzX2NvbGxhcHNlKHN0cnVjdCBwYWdlICpwYWdlLCBib29sIGlzX2todWdlcGFnZWQpXG4re1xuK1x0cmV0dXJuIGZvbGlvX2FsbG93c19jb2xsYXBzZShwYWdlX2ZvbGlvKHBhZ2UpLCBpc19raHVnZXBhZ2VkKTtcbit9XG4rXG4rLypcbisgKiBmb2xpb19hbGxvd3NfbG9uZ3Rlcm1fcGluKCkgLSBtYXkgdGhpcyBmb2xpbyBiZSBsb25nLXRlcm0gR1VQLXBpbm5lZD9cbisgKlxuKyAqIGNoZWNrcyBmb2xpb19pc19sb25ndGVybV9waW5uYWJsZSgpIHJ1bGVzIHBsdXMgcHJpdmF0ZSBub2RlIHBlcm1pc3Npb25zLlxuKyAqIHByaXZhdGUgbm9kZSBwZXJtaXNzaW9uIGlzIGNoZWNrZWQgaGVyZSB0byByZXNvbHZlIGNpcmN1bGFyIGhlYWRlclxuKyAqIGRlcGVuZGVuY2llcyBpbiBmb2xpb19pc19sb25ndGVybV9waW5uYWJsZS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fYWxsb3dzX2xvbmd0ZXJtX3BpbihzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuK3tcbitcdHJldHVybiBmb2xpb19pc19sb25ndGVybV9waW5uYWJsZShmb2xpbykgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgbm9kZV9hbGxvd3NfbHRwaW4oZm9saW9fbmlkKGZvbGlvKSk7XG4rfVxuK1xuKy8qXG4rICogZm9saW9fbG9uZ3Rlcm1fcGluX2ZvcmJpZGRlbigpIC0gbXVzdCBhIGxvbmd0ZXJtIHBpbiBvZiB0aGlzIGZvbGlvIGZhaWxcbisgKiBvdXRyaWdodCAobmVpdGhlciBwaW5uZWQgaW4gcGxhY2Ugbm9yIG1pZ3JhdGVkIG9mZiB0aGUgbm9kZSk/XG4rICpcbisgKiBUcnVlIG9ubHkgZm9yIGEgZm9saW8gb24gYSBwcml2YXRlIG5vZGUgdGhhdCBkaWQgbm90IG9wdCBpbnRvIGxvbmd0ZXJtXG4rICogcGlubmluZyAoTk9ERV9QUklWQVRFX0NBUF9MVFBJTik7IG5vZGVfYWxsb3dzX2x0cGluKCkgaXMgdHJ1ZSBmb3Igb3JkaW5hcnlcbisgKiBub2RlcyBhbmQgZm9yIG9wdGVkLWluIHByaXZhdGUgbm9kZXMsIHNvIHRoaXMgbmV2ZXIgdHJpcHMgdGhlbS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fbG9uZ3Rlcm1fcGluX2ZvcmJpZGRlbihzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuK3tcbitcdHJldHVybiAhbm9kZV9hbGxvd3NfbHRwaW4oZm9saW9fbmlkKGZvbGlvKSk7XG4rfVxuK1xuIC8qXG4gICogTWFpbnRhaW5zIHN0YXRlIGFjcm9zcyBhIHBhZ2UgdGFibGUgbW92ZS4gVGhlIG9wZXJhdGlvbiBhc3N1bWVzIGJvdGggc291cmNlXG4gICogYW5kIGRlc3RpbmF0aW9uIFZNQXMgYWxyZWFkeSBleGlzdCBhbmQgYXJlIHNwZWNpZmllZCBieSB0aGUgdXNlci5cbkBAIC0xMTQ3LDcgKzEyMzcsOCBAQCBleHRlcm4gaW50IG5vZGVfcmVjbGFpbV9tb2RlO1xuIFxuIGV4dGVybiB1bnNpZ25lZCBsb25nIG5vZGVfcmVjbGFpbShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LFxuIFx0XHRcdFx0ICBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTtcbi1leHRlcm4gaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKTtcbitleHRlcm4gaW50IGZpbmRfbmV4dF9iZXN0X25vZGVfaW4oaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrLFxuK1x0XHRcdFx0ICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKTtcbiAjZWxzZVxuICNkZWZpbmUgbm9kZV9yZWNsYWltX21vZGUgMFxuIFxuQEAgLTExNTYsNyArMTI0Nyw4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX3JlY2xhaW0oc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCxcbiB7XG4gXHRyZXR1cm4gMDtcbiB9XG4tc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4rc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2ssXG4rXHRcdFx0XHRcdCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxuIHtcbiBcdHJldHVybiBOVU1BX05PX05PREU7XG4gfVxuQEAgLTEyNDIsNiArMTMzNCw3IEBAIHN0cnVjdCBtaWdyYXRpb25fdGFyZ2V0X2NvbnRyb2wge1xuIFx0bm9kZW1hc2tfdCAqbm1hc2s7XG4gXHRnZnBfdCBnZnBfbWFzaztcbiBcdGVudW0gbWlncmF0ZV9yZWFzb24gcmVhc29uO1xuK1x0dW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzO1xuIH07XG4gXG4gLypcbmRpZmYgLS1naXQgYS9tbS9raHVnZXBhZ2VkLmMgYi9tbS9raHVnZXBhZ2VkLmNcbmluZGV4IDI3ZThmMzA3N2U4MGZlLi41ZjIwODM5ODU3NzM4MiAxMDA2NDRcbi0tLSBhL21tL2todWdlcGFnZWQuY1xuKysrIGIvbW0va2h1Z2VwYWdlZC5jXG5AQCAtNzAwLDcgKzcwMCw4IEBAIHN0YXRpYyBlbnVtIHNjYW5fcmVzdWx0IF9fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbiBcdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuK1x0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8XG4rXHRcdCAgICB1bmxpa2VseSghcGFnZV9hbGxvd3NfY29sbGFwc2UocGFnZSwgY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCkpKSB7XG4gXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XG4gXHRcdFx0Z290byBvdXQ7XG4gXHRcdH1cbkBAIC0xMjQxLDkgKzEyNDIsMTcgQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgYWxsb2NfY2hhcmdlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqKmZvbGlvcCwgc3RydWN0IG1tX3N0cnVcbiBcdGdmcF90IGdmcCA9IChjYy1cdTAwM2Vpc19raHVnZXBhZ2VkID8gYWxsb2NfaHVnZXBhZ2Vfa2h1Z2VwYWdlZF9nZnBtYXNrKCkgOlxuIFx0XHQgICAgIEdGUF9UUkFOU0hVR0UpO1xuIFx0aW50IG5vZGUgPSBjb2xsYXBzZV9maW5kX3RhcmdldF9ub2RlKGNjKTtcbitcdHVuc2lnbmVkIGludCBhZmxhZ3M7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0Ym9vbCBhbGxvdztcbiBcbi1cdGZvbGlvID0gX19mb2xpb19hbGxvYyhnZnAsIG9yZGVyLCBub2RlLCBcdTAwMjZjYy1cdTAwM2VhbGxvY19ubWFzayk7XG4rXHQvKiBQcml2YXRlIG5vZGUgYWNjZXNzOiBraHVnZXBhZ2VkIG5ldmVyLCBtYWR2aXNlIHdpdGggQ0FQX1VTRVJfTlVNQSAqL1xuK1x0YWxsb3cgPSBjYy1cdTAwM2Vpc19raHVnZXBhZ2VkID8gIW5vZGVfaXNfcHJpdmF0ZShub2RlKVxuK1x0XHRcdFx0ICA6IG5vZGVfYWxsb3dzX3VzZXJfbnVtYShub2RlKTtcbitcdGFmbGFncyA9IChhbGxvdyBcdTAwMjZcdTAwMjYgbm9kZV9pc19wcml2YXRlKG5vZGUpKSA/XG4rXHRcdEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOiBBTExPQ19ERUZBVUxUO1xuK1xuK1x0Zm9saW8gPSBfX2ZvbGlvX2FsbG9jKGdmcCwgb3JkZXIsIG5vZGUsIFx1MDAyNmNjLVx1MDAzZWFsbG9jX25tYXNrLCBhZmxhZ3MpO1xuIFx0aWYgKCFmb2xpbykge1xuIFx0XHQqZm9saW9wID0gTlVMTDtcbiBcdFx0aWYgKGlzX3BtZF9vcmRlcihvcmRlcikpXG5AQCAtMTY4Nyw3ICsxNjk2LDggQEAgc3RhdGljIGVudW0gc2Nhbl9yZXN1bHQgY29sbGFwc2Vfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sXG4gXHRcdH1cbiBcbiBcdFx0cGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkciwgcHRldmFsKTtcbi1cdFx0aWYgKHVubGlrZWx5KCFwYWdlKSB8fCB1bmxpa2VseShpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSkge1xuK1x0XHRpZiAodW5saWtlbHkoIXBhZ2UpIHx8XG4rXHRcdCAgICB1bmxpa2VseSghcGFnZV9hbGxvd3NfY29sbGFwc2UocGFnZSwgY2MtXHUwMDNlaXNfa2h1Z2VwYWdlZCkpKSB7XG4gXHRcdFx0cmVzdWx0ID0gU0NBTl9QQUdFX05VTEw7XG4gXHRcdFx0Z290byBvdXRfdW5tYXA7XG4gXHRcdH1cbkBAIC0xOTQ0LDcgKzE5NTQsNyBAQCBzdGF0aWMgZW51bSBzY2FuX3Jlc3VsdCB0cnlfY29sbGFwc2VfcHRlX21hcHBlZF90aHAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnblxuIFx0XHR9XG4gXG4gXHRcdHBhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHIsIHB0ZW50KTtcbi1cdFx0aWYgKFdBUk5fT05fT05DRShwYWdlIFx1MDAyNlx1MDAyNiBpc196b25lX2RldmljZV9wYWdlKHBhZ2UpKSlcbitcdFx0aWYgKFdBUk5fT05fT05DRShwYWdlIFx1MDAyNlx1MDAyNiBwYWdlX2lzX3ByaXZhdGVfbWFuYWdlZChwYWdlKSkpXG4gXHRcdFx0cGFnZSA9IE5VTEw7XG4gXHRcdC8qXG4gXHRcdCAqIE5vdGUgdGhhdCB1cHJvYmUsIGRlYnVnZ2VyLCBvciBNQVBfUFJJVkFURSBtYXkgY2hhbmdlIHRoZVxuZGlmZiAtLWdpdCBhL21tL2tzbS5jIGIvbW0va3NtLmNcbmluZGV4IGI5YjMyZjdiZmI2OTFlLi5mZjIzMTNmYzQ1ZDUzYSAxMDA2NDRcbi0tLSBhL21tL2tzbS5jXG4rKysgYi9tbS9rc20uY1xuQEAgLTgyNyw3ICs4MjcsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmdldF9tZXJnZWFibGVfcGFnZShzdHJ1Y3Qga3NtX3JtYXBfaXRlbSAqcm1hcF9pdGVtKVxuIFxuIFx0Zm9saW8gPSBmb2xpb193YWxrX3N0YXJ0KFx1MDAyNmZ3LCB2bWEsIGFkZHIsIDApO1xuIFx0aWYgKGZvbGlvKSB7XG4tXHRcdGlmICghZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIFx1MDAyNlx1MDAyNlxuK1x0XHRpZiAoIWZvbGlvX2lzX3ByaXZhdGVfbWFuYWdlZChmb2xpbykgXHUwMDI2XHUwMDI2XG4gXHRcdCAgICBmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4gXHRcdFx0Zm9saW9fZ2V0KGZvbGlvKTtcbiBcdFx0XHRwYWdlID0gZncucGFnZTtcbkBAIC0yNTU5LDcgKzI1NTksOCBAQCBzdGF0aWMgaW50IGtzbV9uZXh0X3BhZ2VfcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvblxuIFx0XHRcdFx0Z290byBub3RfZm91bmRfdW5sb2NrO1xuIFx0XHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiBcbi1cdFx0XHRpZiAoZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuK1x0XHRcdGlmICh1bmxpa2VseShmb2xpb19pc19wcml2YXRlX21hbmFnZWQoZm9saW8pKSB8fFxuK1x0XHRcdCAgICAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbiBcdFx0XHRcdGdvdG8gbm90X2ZvdW5kX3VubG9jaztcbiBcbiBcdFx0XHRwYWdlICs9ICgoYWRkciBcdTAwMjYgKFBNRF9TSVpFIC0gMSkpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKTtcbkBAIC0yNTgzLDcgKzI1ODQsOCBAQCBzdGF0aWMgaW50IGtzbV9uZXh0X3BhZ2VfcG1kX2VudHJ5KHBtZF90ICpwbWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvblxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4gXG4tXHRcdGlmIChmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRcdGlmICh1bmxpa2VseShmb2xpb19pc19wcml2YXRlX21hbmFnZWQoZm9saW8pKSB8fFxuK1x0XHQgICAgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdGdvdG8gZm91bmRfdW5sb2NrO1xuIFx0fVxuZGlmZiAtLWdpdCBhL21tL21hZHZpc2UuYyBiL21tL21hZHZpc2UuY1xuaW5kZXggMDdhMjFjYTMxYmFkNGQuLjU2Y2E5NzQ1NDI3MDc4IDEwMDY0NFxuLS0tIGEvbW0vbWFkdmlzZS5jXG4rKysgYi9tbS9tYWR2aXNlLmNcbkBAIC0zMiw2ICszMiw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbGVhZm9wcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2htZW1fZnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21tdV9ub3RpZmllci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2Nhc20vdGxiLmhcdTAwM2VcbiBcbkBAIC0zOTUsNiArMzk2LDkgQEAgc3RhdGljIGludCBtYWR2aXNlX2NvbGRfb3JfcGFnZW91dF9wdGVfcmFuZ2UocG1kX3QgKnBtZCxcbiBcbiBcdFx0Zm9saW8gPSBwbWRfZm9saW8ob3JpZ19wbWQpO1xuIFxuK1x0XHRpZiAoIW5vZGVfYWxsb3dzX3JlY2xhaW0oZm9saW9fbmlkKGZvbGlvKSkpXG4rXHRcdFx0Z290byBodWdlX3VubG9jaztcbitcbiBcdFx0LyogRG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIG1hcHBpbmdzIG9mIHRoaXMgZm9saW8gKi9cbiBcdFx0aWYgKGZvbGlvX21heWJlX21hcHBlZF9zaGFyZWQoZm9saW8pKVxuIFx0XHRcdGdvdG8gaHVnZV91bmxvY2s7XG5AQCAtNDc0LDcgKzQ3OCw3IEBAIHN0YXRpYyBpbnQgbWFkdmlzZV9jb2xkX29yX3BhZ2VvdXRfcHRlX3JhbmdlKHBtZF90ICpwbWQsXG4gXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xuLVx0XHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbitcdFx0aWYgKCFmb2xpbyB8fCAhZm9saW9fYWxsb3dzX21hZHZpc2UoZm9saW8pKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHQvKlxuQEAgLTcwMyw3ICs3MDcsNyBAQCBzdGF0aWMgaW50IG1hZHZpc2VfZnJlZV9wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLFxuIFx0XHR9XG4gXG4gXHRcdGZvbGlvID0gdm1fbm9ybWFsX2ZvbGlvKHZtYSwgYWRkciwgcHRlbnQpO1xuLVx0XHRpZiAoIWZvbGlvIHx8IGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbitcdFx0aWYgKCFmb2xpbyB8fCAhZm9saW9fYWxsb3dzX21hZHZpc2UoZm9saW8pKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuIFx0XHQvKlxuZGlmZiAtLWdpdCBhL21tL21lbWNvbnRyb2wtdjEuYyBiL21tL21lbWNvbnRyb2wtdjEuY1xuaW5kZXggMmRjNTk5NDg0ZDAwNmYuLjVlNDY0ZTUyZGZiOWE4IDEwMDY0NFxuLS0tIGEvbW0vbWVtY29udHJvbC12MS5jXG4rKysgYi9tbS9tZW1jb250cm9sLXYxLmNcbkBAIC0yMTMyLDE0ICsyMTMyLDE4IEBAIHN0YXRpYyBpbnQgbWVtY2dfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxuIFx0Y29uc3Qgc3RydWN0IG51bWFfc3RhdCAqc3RhdDtcbiBcdGludCBuaWQ7XG4gXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fc2VxKG0pO1xuK1x0bm9kZW1hc2tfdCByZXBvcnRhYmxlO1xuIFxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gXG4rXHQvKiBQcml2YXRlIG5vZGVzIGhvbGQgY2dyb3VwIG1lbW9yeSB0b28sIHJlcG9ydCB0aGVtLiAqL1xuK1x0bm9kZXNfb3IocmVwb3J0YWJsZSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XG4rXG4gXHRmb3IgKHN0YXQgPSBzdGF0czsgc3RhdCBcdTAwM2MgQVJSQVlfRU5EKHN0YXRzKTsgc3RhdCsrKSB7XG4gXHRcdHNlcV9wcmludGYobSwgXCIlcz0lbHVcIiwgc3RhdC1cdTAwM2VuYW1lLFxuIFx0XHRcdCAgIG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBzdGF0LVx1MDAzZWxydV9tYXNrLFxuIFx0XHRcdFx0XHRcdCAgIGZhbHNlKSk7XG4tXHRcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSlcbitcdFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgcmVwb3J0YWJsZSlcbiBcdFx0XHRzZXFfcHJpbnRmKG0sIFwiIE4lZD0lbHVcIiwgbmlkLFxuIFx0XHRcdFx0ICAgbWVtX2Nncm91cF9ub2RlX25yX2xydV9wYWdlcyhtZW1jZywgbmlkLFxuIFx0XHRcdFx0XHRcdFx0c3RhdC1cdTAwM2VscnVfbWFzaywgZmFsc2UpKTtcbkBAIC0yMTUxLDcgKzIxNTUsNyBAQCBzdGF0aWMgaW50IG1lbWNnX251bWFfc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcbiBcdFx0c2VxX3ByaW50ZihtLCBcImhpZXJhcmNoaWNhbF8lcz0lbHVcIiwgc3RhdC1cdTAwM2VuYW1lLFxuIFx0XHRcdCAgIG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBzdGF0LVx1MDAzZWxydV9tYXNrLFxuIFx0XHRcdFx0XHRcdCAgIHRydWUpKTtcbi1cdFx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKVxuK1x0XHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCByZXBvcnRhYmxlKVxuIFx0XHRcdHNlcV9wcmludGYobSwgXCIgTiVkPSVsdVwiLCBuaWQsXG4gXHRcdFx0XHQgICBtZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBuaWQsXG4gXHRcdFx0XHRcdFx0XHRzdGF0LVx1MDAzZWxydV9tYXNrLCB0cnVlKSk7XG5kaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC5jIGIvbW0vbWVtY29udHJvbC5jXG5pbmRleCA4MzE5YWQ4YzVjMjNhYy4uNGQ3OWUyMzhiYzU3ZDggMTAwNjQ0XG4tLS0gYS9tbS9tZW1jb250cm9sLmNcbisrKyBiL21tL21lbWNvbnRyb2wuY1xuQEAgLTQ0OTYsNiArNDQ5Niw3IEBAIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY3NzX3JzdGF0X2ZsdXNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsIGludCBjcHUpXG4gXHRzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50ID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpO1xuIFx0c3RydWN0IG1lbWNnX3Ztc3RhdHNfcGVyY3B1ICpzdGF0YztcbiBcdHN0cnVjdCBhZ2dyZWdhdGVfY29udHJvbCBhYztcbitcdG5vZGVtYXNrX3QgcmVwb3J0YWJsZTtcbiBcdGludCBuaWQ7XG4gXG4gXHRmbHVzaF9ubWlfc3RhdHMobWVtY2csIHBhcmVudCk7XG5AQCAtNDUyNCw3ICs0NTI1LDkgQEAgc3RhdGljIHZvaWQgbWVtX2Nncm91cF9jc3NfcnN0YXRfZmx1c2goc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcywgaW50IGNwdSlcbiBcdH07XG4gXHRtZW1fY2dyb3VwX3N0YXRfYWdncmVnYXRlKFx1MDAyNmFjKTtcbiBcbi1cdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkge1xuK1x0LyogUHJpdmF0ZSBub2RlcyBtdXN0IGFsc28gYmUgYWNjb3VudGVkIG9yIG51bWFfc3RhdCBpcyBtaXNsZWFkaW5nICovXG4rXHRub2Rlc19vcihyZXBvcnRhYmxlLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcbitcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsIHJlcG9ydGFibGUpIHtcbiBcdFx0c3RydWN0IG1lbV9jZ3JvdXBfcGVyX25vZGUgKnBuID0gbWVtY2ctXHUwMDNlbm9kZWluZm9bbmlkXTtcbiBcdFx0c3RydWN0IGxydXZlY19zdGF0cyAqbHN0YXRzID0gcG4tXHUwMDNlbHJ1dmVjX3N0YXRzO1xuIFx0XHRzdHJ1Y3QgbHJ1dmVjX3N0YXRzICpwbHN0YXRzID0gTlVMTDtcbkBAIC00OTQ3LDkgKzQ5NTAsMTMgQEAgc3RhdGljIGludCBtZW1vcnlfbnVtYV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KVxuIHtcbiBcdGludCBpO1xuIFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX3NlcShtKTtcbitcdG5vZGVtYXNrX3QgcmVwb3J0YWJsZTtcbiBcbiBcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xuIFxuK1x0LyogUHJpdmF0ZSBub2RlcyBob2xkIGNncm91cCBtZW1vcnkgdG9vLCByZXBvcnQgdGhlbS4gKi9cbitcdG5vZGVzX29yKHJlcG9ydGFibGUsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xuK1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShtZW1vcnlfc3RhdHMpOyBpKyspIHtcbiBcdFx0aW50IG5pZDtcbiBcbkBAIC00OTU3LDcgKzQ5NjQsNyBAQCBzdGF0aWMgaW50IG1lbW9yeV9udW1hX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4gXHRcdFx0Y29udGludWU7XG4gXG4gXHRcdHNlcV9wcmludGYobSwgXCIlc1wiLCBtZW1vcnlfc3RhdHNbaV0ubmFtZSk7XG4tXHRcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkge1xuK1x0XHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCByZXBvcnRhYmxlKSB7XG4gXHRcdFx0dTY0IHNpemU7XG4gXHRcdFx0c3RydWN0IGxydXZlYyAqbHJ1dmVjO1xuIFxuQEAgLTYwNjksNiArNjA3Niw4IEBAIHZvaWQgbWVtX2Nncm91cF9ub2RlX2ZpbHRlcl9hbGxvd2VkKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgbm9kZW1hc2tfdCAqbWFzaylcbiBcdCAqIG1hc2sgaXMgYWNjZXB0YWJsZS5cbiBcdCAqL1xuIFx0Y3B1c2V0X25vZGVzX2FsbG93ZWQobWVtY2ctXHUwMDNlY3NzLmNncm91cCwgXHUwMDI2YWxsb3dlZCk7XG4rXHQvKiBOX01FTU9SWV9QUklWQVRFIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0LCBpbmNsdWRlIHRoZW0gKi9cbitcdG5vZGVzX29yKGFsbG93ZWQsIGFsbG93ZWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcbiBcdG5vZGVzX2FuZCgqbWFzaywgKm1hc2ssIGFsbG93ZWQpO1xuIH1cbiBcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnktdGllcnMuYyBiL21tL21lbW9yeS10aWVycy5jXG5pbmRleCA1NDg1MWQ4YTE5NWIwMy4uYzY3MzA4MGQxNTNlNDEgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnktdGllcnMuY1xuKysrIGIvbW0vbWVtb3J5LXRpZXJzLmNcbkBAIC03LDYgKzcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS10aWVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbm90aWZpZXIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3N5c2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcImludGVybmFsLmhcIlxuIFxuQEAgLTMxNyw2ICszMTgsMjEgQEAgdm9pZCBub2RlX2dldF9hbGxvd2VkX3RhcmdldHMocGdfZGF0YV90ICpwZ2RhdCwgbm9kZW1hc2tfdCAqdGFyZ2V0cylcbiBcdHJjdV9yZWFkX3VubG9jaygpO1xuIH1cbiBcbisvKiBUaWVyaW5nIHNldDogTl9NRU1PUlkgfCAoTl9NRU1PUllfUFJJVkFURSB3LyBDQVBfREVNT1RJT04pICovXG4rc3RhdGljIG5vZGVtYXNrX3QgdGllcmFibGVfbm9kZXM7XG4rXG4rc3RhdGljIHZvaWQgdXBkYXRlX3RpZXJhYmxlX25vZGVzKHZvaWQpXG4re1xuK1x0aW50IG5vZGU7XG4rXG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkX29uY2UoXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XG4rXG4rXHR0aWVyYWJsZV9ub2RlcyA9IG5vZGVfc3RhdGVzW05fTUVNT1JZXTtcbitcdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUllfUFJJVkFURSlcbitcdFx0aWYgKG5vZGVfYWxsb3dzX2RlbW90aW9uKG5vZGUpKVxuK1x0XHRcdG5vZGVfc2V0KG5vZGUsIHRpZXJhYmxlX25vZGVzKTtcbit9XG4rXG4gLyoqXG4gICogbmV4dF9kZW1vdGlvbl9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGUgZGVtb3Rpb24gcGF0aFxuICAqIEBub2RlOiBUaGUgc3RhcnRpbmcgbm9kZSB0byBsb29rdXAgdGhlIG5leHQgbm9kZVxuQEAgLTMzMCw3ICszNDYsNyBAQCB2b2lkIG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ19kYXRhX3QgKnBnZGF0LCBub2RlbWFza190ICp0YXJnZXRzKVxuIGludCBuZXh0X2RlbW90aW9uX25vZGUoaW50IG5vZGUsIGNvbnN0IG5vZGVtYXNrX3QgKmFsbG93ZWRfbWFzaylcbiB7XG4gXHRzdHJ1Y3QgZGVtb3Rpb25fbm9kZXMgKm5kO1xuLVx0bm9kZW1hc2tfdCBtYXNrO1xuK1x0bm9kZW1hc2tfdCBtYXNrLCB0aWVyYWJsZTtcbiBcbiBcdGlmICghbm9kZV9kZW1vdGlvbilcbiBcdFx0cmV0dXJuIE5VTUFfTk9fTk9ERTtcbkBAIC0zNzAsNyArMzg2LDggQEAgaW50IG5leHRfZGVtb3Rpb25fbm9kZShpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqYWxsb3dlZF9tYXNrKVxuIFx0ICogY2xvc2VzdCBkZW1vdGlvbiB0YXJnZXQuXG4gXHQgKi9cbiBcdG5vZGVzX2NvbXBsZW1lbnQobWFzaywgKmFsbG93ZWRfbWFzayk7XG4tXHRyZXR1cm4gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCBcdTAwMjZtYXNrKTtcbitcdHRpZXJhYmxlID0gdGllcmFibGVfbm9kZXM7XG4rXHRyZXR1cm4gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihub2RlLCBcdTAwMjZtYXNrLCBcdTAwMjZ0aWVyYWJsZSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsX2RlbW90aW9uX3RhcmdldHModm9pZClcbkBAIC0zNzgsNyArMzk1LDcgQEAgc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZGVtb3Rpb25fdGFyZ2V0cyh2b2lkKVxuIFx0c3RydWN0IG1lbW9yeV90aWVyICptZW10aWVyO1xuIFx0aW50IG5vZGU7XG4gXG4tXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSB7XG4rXHRmb3JfZWFjaF9ub2RlX21hc2sobm9kZSwgdGllcmFibGVfbm9kZXMpIHtcbiBcdFx0bm9kZV9kZW1vdGlvbltub2RlXS5wcmVmZXJyZWQgPSBOT0RFX01BU0tfTk9ORTtcbiBcdFx0LypcbiBcdFx0ICogV2UgYXJlIGhvbGRpbmcgbWVtb3J5X3RpZXJfbG9jaywgaXQgaXMgc2FmZVxuQEAgLTQwMSw3ICs0MTgsNyBAQCBzdGF0aWMgdm9pZCBkdW1wX2RlbW90aW9uX3RhcmdldHModm9pZClcbiB7XG4gXHRpbnQgbm9kZTtcbiBcbi1cdGZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIHtcbitcdGZvcl9lYWNoX25vZGVfbWFzayhub2RlLCB0aWVyYWJsZV9ub2Rlcykge1xuIFx0XHRzdHJ1Y3QgbWVtb3J5X3RpZXIgKm1lbXRpZXIgPSBfX25vZGVfZ2V0X21lbW9yeV90aWVyKG5vZGUpO1xuIFx0XHRub2RlbWFza190IHByZWZlcnJlZCA9IG5vZGVfZGVtb3Rpb25bbm9kZV0ucHJlZmVycmVkO1xuIFxuQEAgLTQzNSw5ICs0NTIsMTAgQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbiBcdGlmICghbm9kZV9kZW1vdGlvbilcbiBcdFx0cmV0dXJuO1xuIFxuK1x0dXBkYXRlX3RpZXJhYmxlX25vZGVzKCk7XG4gXHRkaXNhYmxlX2FsbF9kZW1vdGlvbl90YXJnZXRzKCk7XG4gXG4tXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSB7XG4rXHRmb3JfZWFjaF9ub2RlX21hc2sobm9kZSwgdGllcmFibGVfbm9kZXMpIHtcbiBcdFx0YmVzdF9kaXN0YW5jZSA9IC0xO1xuIFx0XHRuZCA9IFx1MDAyNm5vZGVfZGVtb3Rpb25bbm9kZV07XG4gXG5AQCAtNDUwLDEyICs0NjgsMTIgQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbiBcdFx0bWVtdGllciA9IGxpc3RfbmV4dF9lbnRyeShtZW10aWVyLCBsaXN0KTtcbiBcdFx0dGllcl9ub2RlcyA9IGdldF9tZW10aWVyX25vZGVtYXNrKG1lbXRpZXIpO1xuIFx0XHQvKlxuLVx0XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlLCB1c2UgJ3VzZWQnIG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0LlxuK1x0XHQgKiBmaW5kX25leHRfYmVzdF9ub2RlX2luLCB1c2UgJ3VzZWQnIG5vZGVtYXNrIGFzIGEgc2tpcCBsaXN0LlxuIFx0XHQgKiBBZGQgYWxsIG1lbW9yeSBub2RlcyBleGNlcHQgdGhlIHNlbGVjdGVkIG1lbW9yeSB0aWVyXG4gXHRcdCAqIG5vZGVsaXN0IHRvIHNraXAgbGlzdCBzbyB0aGF0IHdlIGZpbmQgdGhlIGJlc3Qgbm9kZSBmcm9tIHRoZVxuIFx0XHQgKiBtZW10aWVyIG5vZGVsaXN0LlxuIFx0XHQgKi9cbi1cdFx0bm9kZXNfYW5kbm90KHRpZXJfbm9kZXMsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgdGllcl9ub2Rlcyk7XG4rXHRcdG5vZGVzX2FuZG5vdCh0aWVyX25vZGVzLCB0aWVyYWJsZV9ub2RlcywgdGllcl9ub2Rlcyk7XG4gXG4gXHRcdC8qXG4gXHRcdCAqIEZpbmQgYWxsIHRoZSBub2RlcyBpbiB0aGUgbWVtb3J5IHRpZXIgbm9kZSBsaXN0IG9mIHNhbWUgYmVzdCBkaXN0YW5jZS5cbkBAIC00NjMsNyArNDgxLDggQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbiBcdFx0ICogaW4gdGhlIHByZWZlcnJlZCBtYXNrIHdoZW4gYWxsb2NhdGluZyBwYWdlcyBkdXJpbmcgZGVtb3Rpb24uXG4gXHRcdCAqL1xuIFx0XHRkbyB7XG4tXHRcdFx0dGFyZ2V0ID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShub2RlLCBcdTAwMjZ0aWVyX25vZGVzKTtcbitcdFx0XHR0YXJnZXQgPSBmaW5kX25leHRfYmVzdF9ub2RlX2luKG5vZGUsIFx1MDAyNnRpZXJfbm9kZXMsXG4rXHRcdFx0XHRcdFx0XHRcdTAwMjZ0aWVyYWJsZV9ub2Rlcyk7XG4gXHRcdFx0aWYgKHRhcmdldCA9PSBOVU1BX05PX05PREUpXG4gXHRcdFx0XHRicmVhaztcbiBcbkBAIC01MDIsNyArNTIxLDcgQEAgc3RhdGljIHZvaWQgZXN0YWJsaXNoX2RlbW90aW9uX3RhcmdldHModm9pZClcbiBcdCAqIGFsbG9jYXRpb24gdG8gYSBzZXQgb2Ygbm9kZXMgdGhhdCBpcyBjbG9zZXIgdGhlIGFib3ZlIHNlbGVjdGVkXG4gXHQgKiBwcmVmZXJyZWQgbm9kZS5cbiBcdCAqL1xuLVx0bG93ZXJfdGllciA9IG5vZGVfc3RhdGVzW05fTUVNT1JZXTtcbitcdGxvd2VyX3RpZXIgPSB0aWVyYWJsZV9ub2RlcztcbiBcdGxpc3RfZm9yX2VhY2hfZW50cnkobWVtdGllciwgXHUwMDI2bWVtb3J5X3RpZXJzLCBsaXN0KSB7XG4gXHRcdC8qXG4gXHRcdCAqIEtlZXAgcmVtb3ZpbmcgY3VycmVudCB0aWVyIGZyb20gbG93ZXJfdGllciBub2RlcyxcbkBAIC01NDksNyArNTY4LDggQEAgc3RhdGljIHN0cnVjdCBtZW1vcnlfdGllciAqc2V0X25vZGVfbWVtb3J5X3RpZXIoaW50IG5vZGUpXG4gXG4gXHRsb2NrZGVwX2Fzc2VydF9oZWxkX29uY2UoXHUwMDI2bWVtb3J5X3RpZXJfbG9jayk7XG4gXG4tXHRpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpKVxuK1x0LyogSW5jbHVkZSBOX01FTU9SWSBhbmQgTl9NRU1PUllfUFJJVkFURSB3aXRoIENBUF9ERU1PVElPTiAqL1xuK1x0aWYgKCFub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSBcdTAwMjZcdTAwMjYgIW5vZGVfYWxsb3dzX2RlbW90aW9uKG5vZGUpKVxuIFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdG10X2NhbGNfYWRpc3RhbmNlKG5vZGUsIFx1MDAyNmFkaXN0KTtcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuaW5kZXggMjI2YWI5Y2IwNzhhZDEuLmU5NTczZjkwZTBkY2QzIDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuY1xuKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuQEAgLTM0LDYgKzM0LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1ibG9jay5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGFjdGlvbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcm1hcC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbm9kZV9wcml2YXRlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L25vZGUuaFx1MDAzZVxuIFxuQEAgLTExNjgsNyArMTE2OSw3IEBAIGludCBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRtb3ZlX3Bmbl9yYW5nZV90b196b25lKHpvbmUsIHBmbiwgbnJfcGFnZXMsIE5VTEwsIE1JR1JBVEVfTU9WQUJMRSxcbiBcdFx0XHQgICAgICAgdHJ1ZSk7XG4gXG4tXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkpIHtcbitcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZKSBcdTAwMjZcdTAwMjYgIW5vZGVfaXNfcHJpdmF0ZShuaWQpKSB7XG4gXHRcdC8qIEFkZGluZyBtZW1vcnkgdG8gdGhlIG5vZGUgZm9yIHRoZSBmaXJzdCB0aW1lICovXG4gXHRcdG5vZGVfYXJnLm5pZCA9IG5pZDtcbiBcdFx0cmV0ID0gbm9kZV9ub3RpZnkoTk9ERV9BRERJTkdfRklSU1RfTUVNT1JZLCBcdTAwMjZub2RlX2FyZyk7XG5AQCAtMTIwMywxMyArMTIwNCwyMCBAQCBpbnQgb25saW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuIFx0b25saW5lX3BhZ2VzX3JhbmdlKHBmbiwgbnJfcGFnZXMpO1xuIFx0YWRqdXN0X3ByZXNlbnRfcGFnZV9jb3VudChwZm5fdG9fcGFnZShwZm4pLCBncm91cCwgbnJfcGFnZXMpO1xuIFxuK1x0LypcbitcdCAqIE5fTUVNT1JZIGFuZCBOX01FTU9SWV9QUklWQVRFIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIGRldGVybWluZVxuK1x0ICogd2hpY2ggaXMgY29ycmVjdCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBwZ2RhdC1cdTAwM2Vwcml2YXRlIGlzIHNldC5cbitcdCAqL1xuIFx0aWYgKG5vZGVfYXJnLm5pZCBcdTAwM2U9IDApXG4tXHRcdG5vZGVfc2V0X3N0YXRlKG5pZCwgTl9NRU1PUlkpO1xuK1x0XHRub2RlX3NldF9zdGF0ZShuaWQsIHBnZGF0X2lzX3ByaXZhdGUoTk9ERV9EQVRBKG5pZCkpID9cbitcdFx0XHRcdCAgICBOX01FTU9SWV9QUklWQVRFIDogTl9NRU1PUlkpO1xuIFx0LypcbiBcdCAqIENoZWNrIHdoZXRoZXIgd2UgYXJlIGFkZGluZyBub3JtYWwgbWVtb3J5IHRvIHRoZSBub2RlIGZvciB0aGUgZmlyc3RcbiBcdCAqIHRpbWUuXG4gXHQgKi9cbi1cdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTk9STUFMX01FTU9SWSkgXHUwMDI2XHUwMDI2IHpvbmVfaWR4KHpvbmUpIFx1MDAzYz0gWk9ORV9OT1JNQUwpXG4rXHRpZiAoIW5vZGVfaXNfcHJpdmF0ZShuaWQpIFx1MDAyNlx1MDAyNlxuK1x0ICAgICFub2RlX3N0YXRlKG5pZCwgTl9OT1JNQUxfTUVNT1JZKSBcdTAwMjZcdTAwMjZcbitcdCAgICB6b25lX2lkeCh6b25lKSBcdTAwM2M9IFpPTkVfTk9STUFMKVxuIFx0XHRub2RlX3NldF9zdGF0ZShuaWQsIE5fTk9STUFMX01FTU9SWSk7XG4gXG4gXHRpZiAobmVlZF96b25lbGlzdHNfcmVidWlsZClcbkBAIC0xMjI5LDggKzEyMzcsMTAgQEAgaW50IG9ubGluZV9wYWdlcyh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdC8qIHJlaW5pdGlhbGlzZSB3YXRlcm1hcmtzIGFuZCB1cGRhdGUgcGNwIGxpbWl0cyAqL1xuIFx0aW5pdF9wZXJfem9uZV93bWFya19taW4oKTtcbiBcbi1cdGtzd2FwZF9ydW4obmlkKTtcbi1cdGtjb21wYWN0ZF9ydW4obmlkKTtcbitcdGlmIChub2RlX2FsbG93c19yZWNsYWltKG5pZCkpIHtcbitcdFx0a3N3YXBkX3J1bihuaWQpO1xuK1x0XHRrY29tcGFjdGRfcnVuKG5pZCk7XG4rXHR9XG4gXG4gXHRpZiAobm9kZV9hcmcubmlkIFx1MDAzZT0gMClcbiBcdFx0LyogRmlyc3QgbWVtb3J5IGFkZGVkIHN1Y2Nlc3NmdWxseS4gTm90aWZ5IGNvbnN1bWVycy4gKi9cbkBAIC0xNjQ4LDYgKzE2NTgsOCBAQCBFWFBPUlRfU1lNQk9MX0dQTChhZGRfbWVtb3J5KTtcbiAgKiBAcmVzb3VyY2VfbmFtZTogUmVzb3VyY2UgbmFtZSBpbiBmb3JtYXQgXCJTeXN0ZW0gUkFNICgkRFJJVkVSKVwiXG4gICogQG1ocF9mbGFnczogTWVtb3J5IGhvdHBsdWcgZmxhZ3NcbiAgKiBAb25saW5lX3R5cGU6IEF1dG8tT25saW5lIGJlaGF2aW9yIChvZmZsaW5lLCBvbmxpbmUsIGtlcm5lbCwgbW92YWJsZSlcbisgKiBAbnA6IGRyaXZlci1vd25lZCBub2RlX3ByaXZhdGUgdG8gb25saW5lIHRoZSBub2RlIGFzIE5fTUVNT1JZX1BSSVZBVEUsIG9yXG4rICpcdE5VTEwgZm9yIG9yZGluYXJ5IHN5c3RlbSBSQU1cbiAgKlxuICAqIEFkZCBzcGVjaWFsLCBkcml2ZXItbWFuYWdlZCBtZW1vcnkgdG8gdGhlIHN5c3RlbSBhcyBzeXN0ZW0gUkFNLiBTdWNoXG4gICogbWVtb3J5IGlzIG5vdCBleHBvc2VkIHZpYSB0aGUgcmF3IGZpcm13YXJlLXByb3ZpZGVkIG1lbW1hcCBhcyBzeXN0ZW1cbkBAIC0xNjc0LDkgKzE2ODYsMTEgQEAgRVhQT1JUX1NZTUJPTF9HUEwoYWRkX21lbW9yeSk7XG4gICovXG4gaW50IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxuIFx0XHRjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lLCBtaHBfdCBtaHBfZmxhZ3MsXG4tXHRcdGVudW0gbW1vcCBvbmxpbmVfdHlwZSlcbitcdFx0ZW51bSBtbW9wIG9ubGluZV90eXBlLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucClcbiB7XG4rXHRpbnQgcmVhbF9uaWQgPSBuaWQ7XG4gXHRzdHJ1Y3QgcmVzb3VyY2UgKnJlcztcbitcdHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwO1xuIFx0aW50IHJjO1xuIFxuIFx0aWYgKCFyZXNvdXJjZV9uYW1lIHx8XG5AQCAtMTY4Nyw2ICsxNzAxLDE5IEBAIGludCBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSxcbiBcdGlmIChvbmxpbmVfdHlwZSBcdTAwM2MgTU1PUF9PRkZMSU5FIHx8IG9ubGluZV90eXBlIFx1MDAzZSBNTU9QX09OTElORV9NT1ZBQkxFKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbitcdC8qIFJlZ2lzdGVyIGEgcHJpdmF0ZS1ub2RlIG93bmVyIGJlZm9yZSBhZGRpbmcgbWVtb3J5LiAqL1xuK1x0aWYgKG5wKSB7XG4rXHRcdGlmIChtaHBfZmxhZ3MgXHUwMDI2IE1IUF9OSURfSVNfTUdJRCkge1xuK1x0XHRcdGdyb3VwID0gbWVtb3J5X2dyb3VwX2ZpbmRfYnlfaWQobmlkKTtcbitcdFx0XHRpZiAoIWdyb3VwKVxuK1x0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdFx0cmVhbF9uaWQgPSBncm91cC1cdTAwM2VuaWQ7XG4rXHRcdH1cbitcdFx0cmMgPSBub2RlX3ByaXZhdGVfcmVnaXN0ZXIocmVhbF9uaWQsIG5wKTtcbitcdFx0aWYgKHJjKVxuK1x0XHRcdHJldHVybiByYztcbitcdH1cbitcbiBcdGxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcbiBcbiBcdHJlcyA9IHJlZ2lzdGVyX21lbW9yeV9yZXNvdXJjZShzdGFydCwgc2l6ZSwgcmVzb3VyY2VfbmFtZSk7XG5AQCAtMTcwMSwxMCArMTcyOCw0MSBAQCBpbnQgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXG4gXG4gb3V0X3VubG9jazpcbiBcdHVubG9ja19kZXZpY2VfaG90cGx1ZygpO1xuK1x0aWYgKHJjIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBucClcbitcdFx0bm9kZV9wcml2YXRlX3VucmVnaXN0ZXIocmVhbF9uaWQpO1xuIFx0cmV0dXJuIHJjO1xuIH1cbiBFWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZCwgXCJrbWVtXCIpO1xuIFxuKy8qKlxuKyAqIGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZCAtIGFkZCBwcml2YXRlIGRyaXZlci1tYW5hZ2VkIG1lbW9yeVxuKyAqIEBuaWQ6IE5VTUEgbm9kZSBJRCB3aGVyZSB0aGUgbWVtb3J5IHdpbGwgYmUgYWRkZWRcbisgKiBAc3RhcnQ6IFN0YXJ0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSByYW5nZVxuKyAqIEBzaXplOiBTaXplIG9mIHRoZSBtZW1vcnkgcmFuZ2UgaW4gYnl0ZXNcbisgKiBAcmVzb3VyY2VfbmFtZTogUmVzb3VyY2UgbmFtZSBpbiBmb3JtYXQgXCJTeXN0ZW0gUkFNICgkRFJJVkVSKVwiXG4rICogQG1ocF9mbGFnczogTWVtb3J5IGhvdHBsdWcgZmxhZ3NcbisgKiBAb25saW5lX3R5cGU6IEF1dG8tT25saW5lIGJlaGF2aW9yIChvZmZsaW5lLCBvbmxpbmUsIGtlcm5lbCwgbW92YWJsZSlcbisgKiBAbnA6IHByaXZhdGUgbm9kZSBjb250ZXh0IGZvciB0aGUgb3duZXIgLSBtYW5kYXRvcnkuXG4rICpcbisgKiBBZGQgcHJpdmF0ZSBkcml2ZXItbWFuYWdlZCBtZW1vcnkuICBQcml2YXRlIG5vZGUgY29udGV4dCBpcyByZXF1aXJlZCB0b1xuKyAqIGF2b2lkIHRoZSBtZW1vcnkgYmVpbmcgYWRkZWQgYXMgYSBub3JtYWwgTl9NRU1PUlkgbm9kZS5cbisgKlxuKyAqIFNlZSBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQgZm9yIG1vcmUgZGV0YWlscy5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuXG4rICovXG4raW50IGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxuK1x0XHRcdFx0ICAgICAgY29uc3QgY2hhciAqcmVzb3VyY2VfbmFtZSwgbWhwX3QgbWhwX2ZsYWdzLFxuK1x0XHRcdFx0ICAgICAgZW51bSBtbW9wIG9ubGluZV90eXBlLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucClcbit7XG4rXHRpZiAoIW5wKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdHJldHVybiBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQobmlkLCBzdGFydCwgc2l6ZSwgcmVzb3VyY2VfbmFtZSxcbitcdFx0XHRcdFx0ICAgbWhwX2ZsYWdzLCBvbmxpbmVfdHlwZSwgbnApO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQpO1xuK1xuIC8qKlxuICAqIGFkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQgLSBhZGQgZHJpdmVyLW1hbmFnZWQgbWVtb3J5XG4gICogQG5pZDogTlVNQSBub2RlIElEIHdoZXJlIHRoZSBtZW1vcnkgd2lsbCBiZSBhZGRlZFxuQEAgLTE3MjUsNyArMTc4Myw3IEBAIGludCBhZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUsXG4ge1xuIFx0cmV0dXJuIF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChuaWQsIHN0YXJ0LCBzaXplLCByZXNvdXJjZV9uYW1lLFxuIFx0XHRcdG1ocF9mbGFncyxcbi1cdFx0XHRtaHBfZ2V0X2RlZmF1bHRfb25saW5lX3R5cGUoKSk7XG4rXHRcdFx0bWhwX2dldF9kZWZhdWx0X29ubGluZV90eXBlKCksIE5VTEwpO1xuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChhZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkKTtcbiBcbkBAIC0xODQzLDExICsxOTAxLDEyIEBAIHN0YXRpYyBpbnQgc2Nhbl9tb3ZhYmxlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbitzdGF0aWMgaW50IGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiB7XG4gXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuIFx0dW5zaWduZWQgbG9uZyBwZm47XG4gXHRMSVNUX0hFQUQoc291cmNlKTtcbitcdGludCBlcnIgPSAwO1xuIFx0c3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUobWlncmF0ZV9ycywgREVGQVVMVF9SQVRFTElNSVRfSU5URVJWQUwsXG4gXHRcdFx0XHQgICAgICBERUZBVUxUX1JBVEVMSU1JVF9CVVJTVCk7XG4gXG5AQCAtMTg4NCw2ICsxOTQzLDE1IEBAIHN0YXRpYyB2b2lkIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbilcbiBcdFx0XHRnb3RvIHB1dF9mb2xpbztcbiBcdFx0fVxuIFxuK1x0XHQvKiBGYWlsIG91dHJpZ2h0IG9uIHByaXZhdGUgbm9kZXMgdy9vIGhvdHVucGx1ZyBzdXBwb3J0ICovXG4rXHRcdGlmICghbm9kZV9hbGxvd3NfaG90dW5wbHVnKGZvbGlvX25pZChmb2xpbykpKSB7XG4rXHRcdFx0cHJfaW5mb19yYXRlbGltaXRlZChcIm1lbW9yeSBvZmZsaW5lIHJlZnVzZWQ6IG5vZGUgJWQgcGZuICVseFxcblwiLFxuK1x0XHRcdFx0XHQgICAgZm9saW9fbmlkKGZvbGlvKSwgcGZuKTtcbitcdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuK1x0XHRcdGVyciA9IC1FQlVTWTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1xuIFx0XHRpZiAoIWlzb2xhdGVfZm9saW9fdG9fbGlzdChmb2xpbywgXHUwMDI2c291cmNlKSkge1xuIFx0XHRcdGlmIChfX3JhdGVsaW1pdChcdTAwMjZtaWdyYXRlX3JzKSkge1xuIFx0XHRcdFx0cHJfd2FybihcImZhaWxlZCB0byBpc29sYXRlIHBmbiAlbHhcXG5cIixcbkBAIC0xOTMxLDYgKzE5OTksNyBAQCBzdGF0aWMgdm9pZCBkb19taWdyYXRlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pXG4gXHRcdFx0cHV0YmFja19tb3ZhYmxlX3BhZ2VzKFx1MDAyNnNvdXJjZSk7XG4gXHRcdH1cbiBcdH1cbitcdHJldHVybiBlcnI7XG4gfVxuIFxuIHN0YXRpYyBpbnQgX19pbml0IGNtZGxpbmVfcGFyc2VfbW92YWJsZV9ub2RlKGNoYXIgKnApXG5AQCAtMjAyOSw3ICsyMDk4LDcgQEAgaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHQvKlxuIFx0ICogQ2hlY2sgd2hldGhlciB0aGUgbm9kZSB3aWxsIGhhdmUgbm8gcHJlc2VudCBwYWdlcyBhZnRlciB3ZSBvZmZsaW5lXG4gXHQgKiAnbnJfcGFnZXMnIG1vcmUuIElmIHNvLCB3ZSBrbm93IHRoYXQgdGhlIG5vZGUgd2lsbCBiZWNvbWUgZW1wdHksIGFuZFxuLVx0ICogc28gd2Ugd2lsbCBjbGVhciBOX01FTU9SWSBmb3IgaXQuXG4rXHQgKiBzbyB3ZSB3aWxsIGNsZWFyIE5fTUVNT1JZKF9QUklWQVRFKSBmb3IgaXQuXG4gXHQgKi9cbiBcdGlmIChucl9wYWdlcyBcdTAwM2U9IHBnZGF0LVx1MDAzZW5vZGVfcHJlc2VudF9wYWdlcykge1xuIFx0XHRub2RlX2FyZy5uaWQgPSBub2RlO1xuQEAgLTIwNjcsMTAgKzIxMzYsMTEgQEAgaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHRcdFx0cmV0ID0gc2Nhbl9tb3ZhYmxlX3BhZ2VzKHBmbiwgZW5kX3BmbiwgXHUwMDI2cGZuKTtcbiBcdFx0XHRpZiAoIXJldCkge1xuIFx0XHRcdFx0Lypcbi1cdFx0XHRcdCAqIFRPRE86IGZhdGFsIG1pZ3JhdGlvbiBmYWlsdXJlcyBzaG91bGQgYmFpbFxuLVx0XHRcdFx0ICogb3V0XG4rXHRcdFx0XHQgKiBBIGZhdGFsIG1pZ3JhdGlvbiBmYWlsdXJlIChlLmcuIGEgZm9saW8gb24gYVxuK1x0XHRcdFx0ICogbm9uLW1pZ3JhdGFibGUgcHJpdmF0ZSBub2RlKSBiYWlscyBvdXQ7IHRyYW5zaWVudFxuK1x0XHRcdFx0ICogZmFpbHVyZXMgbGVhdmUgcmV0IHplcm8gYW5kIGFyZSByZXRyaWVkIGJlbG93LlxuIFx0XHRcdFx0ICovXG4tXHRcdFx0XHRkb19taWdyYXRlX3JhbmdlKHBmbiwgZW5kX3Bmbik7XG4rXHRcdFx0XHRyZXQgPSBkb19taWdyYXRlX3JhbmdlKHBmbiwgZW5kX3Bmbik7XG4gXHRcdFx0fVxuIFx0XHR9IHdoaWxlICghcmV0KTtcbiBcbkBAIC0yMTMzLDggKzIyMDMsMTAgQEAgaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4gXHQgKiBNYWtlIHN1cmUgdG8gbWFyayB0aGUgbm9kZSBhcyBtZW1vcnktbGVzcyBiZWZvcmUgcmVidWlsZGluZyB0aGUgem9uZVxuIFx0ICogbGlzdC4gT3RoZXJ3aXNlIHRoaXMgbm9kZSB3b3VsZCBzdGlsbCBhcHBlYXIgaW4gdGhlIGZhbGxiYWNrIGxpc3RzLlxuIFx0ICovXG4tXHRpZiAobm9kZV9hcmcubmlkIFx1MDAzZT0gMClcbitcdGlmIChub2RlX2FyZy5uaWQgXHUwMDNlPSAwKSB7XG4gXHRcdG5vZGVfY2xlYXJfc3RhdGUobm9kZSwgTl9NRU1PUlkpO1xuK1x0XHRub2RlX2NsZWFyX3N0YXRlKG5vZGUsIE5fTUVNT1JZX1BSSVZBVEUpO1xuK1x0fVxuIFx0aWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkge1xuIFx0XHR6b25lX3BjcF9yZXNldCh6b25lKTtcbiBcdFx0YnVpbGRfYWxsX3pvbmVsaXN0cyhOVUxMKTtcbkBAIC0yMTk4LDYgKzIyNzAsMTUgQEAgc3RhdGljIGludCBjb3VudF9tZW1vcnlfcmFuZ2VfYWx0bWFwc19jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbiBcdHJldHVybiAwO1xuIH1cbiBcbitzdGF0aWMgaW50IGNvbGxlY3RfbWVtYmxvY2tfbm9kZXNfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXG4re1xuK1x0bm9kZW1hc2tfdCAqbm9kZXMgPSBhcmc7XG4rXG4rXHRpZiAobWVtLVx1MDAzZW5pZCAhPSBOVU1BX05PX05PREUpXG4rXHRcdG5vZGVfc2V0KG1lbS1cdTAwM2VuaWQsICpub2Rlcyk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4gc3RhdGljIGludCBjaGVja19jcHVfb25fbm9kZShpbnQgbmlkKVxuIHtcbiBcdGludCBjcHU7XG5AQCAtMjQ2MSwxMCArMjU0MiwxMSBAQCBFWFBPUlRfU1lNQk9MX0dQTChvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5KTtcbiBpbnQgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMoY29uc3Qgc3RydWN0IHJhbmdlICpyYW5nZXMsXG4gXHRcdHVuc2lnbmVkIGludCBucl9yYW5nZXMpXG4ge1xuK1x0bm9kZW1hc2tfdCBub2RlcyA9IE5PREVfTUFTS19OT05FO1xuIFx0dW5zaWduZWQgbG9uZyBtYl9jb3VudCA9IDA7XG4gXHR1aW50OF90ICpvbmxpbmVfdHlwZXMsICp0bXA7XG4gXHR1bnNpZ25lZCBpbnQgaTtcbi1cdGludCByYyA9IDA7XG4rXHRpbnQgbmlkLCByYyA9IDA7XG4gXG4gXHRpZiAoIXJhbmdlcyB8fCAhbnJfcmFuZ2VzKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbkBAIC0yNDkyLDYgKzI1NzQsMTEgQEAgaW50IG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzKGNvbnN0IHN0cnVjdCByYW5nZSAqcmFuZ2VzLFxuIFxuIFx0bG9ja19kZXZpY2VfaG90cGx1ZygpO1xuIFxuK1x0LyogUmVjb3JkIHRoZSBub2RlcyBmb3IgdGhlIGJsb2NrcyB0byBkcm9wIHByaXZhdGUtbm9kZSBkYXRhIGFmdGVyICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9yYW5nZXM7IGkrKylcbitcdFx0d2Fsa19tZW1vcnlfYmxvY2tzKHJhbmdlc1tpXS5zdGFydCwgcmFuZ2VfbGVuKFx1MDAyNnJhbmdlc1tpXSksXG4rXHRcdFx0XHQgICBcdTAwMjZub2RlcywgY29sbGVjdF9tZW1ibG9ja19ub2Rlc19jYik7XG4rXG4gXHQvKlxuIFx0ICogUGhhc2UgMTogb2ZmbGluZSBldmVyeSBibG9jayBpbiBldmVyeSByYW5nZS4gIEFuIGFscmVhZHktb2ZmbGluZVxuIFx0ICogYmxvY2sgZm9sZHMgdG8gc3VjY2Vzcywgc28gb3V0LW9mLWJhbmQgb2ZmbGluaW5nIG5ldmVyIGJsb2NrcyB1bnBsdWcuXG5AQCAtMjUyMiw2ICsyNjA5LDEwIEBAIGludCBvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5X3Jhbmdlcyhjb25zdCBzdHJ1Y3QgcmFuZ2UgKnJhbmdlcyxcbiBvdXRfdW5sb2NrOlxuIFx0dW5sb2NrX2RldmljZV9ob3RwbHVnKCk7XG4gXG4rXHQvKiBEcm9wIHByaXZhdGUgbm9kZSByZWdpc3RyYXRpb24gaWYgdGhleSBhcmUgbm93IG1lbW9yeWxlc3MgKi9cbitcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsIG5vZGVzKVxuK1x0XHRub2RlX3ByaXZhdGVfdW5yZWdpc3RlcihuaWQpO1xuK1xuIFx0a2ZyZWUob25saW5lX3R5cGVzKTtcbiBcdHJldHVybiByYztcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuY1xuaW5kZXggNTcyMGY3ZjU0ZDk0MmYuLjIzYzRjMjUwOTc0NTA0IDEwMDY0NFxuLS0tIGEvbW0vbWVtcG9saWN5LmNcbisrKyBiL21tL21lbXBvbGljeS5jXG5AQCAtMTExLDYgKzExMSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW11X25vdGlmaWVyLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wcmludGsuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2xlYWZvcHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L25vZGVfcHJpdmF0ZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZ2NkLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2Nhc20vdGxiZmx1c2guaFx1MDAzZVxuQEAgLTQwNSw3ICs0MDYsNyBAQCBzdGF0aWMgaW50IG1wb2xfbmV3X3ByZWZlcnJlZChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxuIHN0YXRpYyBpbnQgbXBvbF9zZXRfbm9kZW1hc2soc3RydWN0IG1lbXBvbGljeSAqcG9sLFxuIFx0XHQgICAgIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzLCBzdHJ1Y3Qgbm9kZW1hc2tfc2NyYXRjaCAqbnNjKVxuIHtcbi1cdGludCByZXQ7XG4rXHRpbnQgcmV0LCBuaWQ7XG4gXG4gXHQvKlxuIFx0ICogRGVmYXVsdCAocG9sPT1OVUxMKSByZXNwLiBsb2NhbCBtZW1vcnkgcG9saWNpZXMgYXJlIG5vdCBhXG5AQCAtNDMxLDYgKzQzMiwyMyBAQCBzdGF0aWMgaW50IG1wb2xfc2V0X25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcbiBcdGVsc2VcbiBcdFx0cG9sLVx1MDAzZXcuY3B1c2V0X21lbXNfYWxsb3dlZCA9IGNwdXNldF9jdXJyZW50X21lbXNfYWxsb3dlZDtcbiBcbitcdC8qXG4rXHQgKiBQcml2YXRlIG5vZGVzIGFyZSBub3QgaW4gY3B1c2V0Lm1lbXMsIHNvIHRoZXkncmUgYWx3YXlzIHN0cmlwcGVkLlxuK1x0ICogRHJpdmVyLWFsbG9jYXRlZCBwb2xpY2llcyAoTVBPTF9GX1BSSVZBVEUpIGFuZCBDQVBfVVNFUl9OVU1BIHByaXZhdGVcbitcdCAqIG5vZGVzIHNob3VsZCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIG5vZGVtYXNrLlxuK1x0ICovXG4rXHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCAqbm9kZXMpIHtcbitcdFx0aWYgKCFub2RlX2lzX3ByaXZhdGUobmlkKSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0aWYgKChwb2wtXHUwMDNlZmxhZ3MgXHUwMDI2IE1QT0xfRl9QUklWQVRFKSB8fFxuK1x0XHQgICAgbm9kZV9hbGxvd3NfdXNlcl9udW1hKG5pZCkpXG4rXHRcdFx0bm9kZV9zZXQobmlkLCBuc2MtXHUwMDNlbWFzazIpO1xuK1x0fVxuK1xuK1x0LyogSWYgYW55IHByaXZhdGUgbm9kZXMgbGVmdCBpbiB0aGUgbm9kZW1hc2sgLSBhZGQgdGhlIHByaXZhdGUgZmxhZyAqL1xuK1x0aWYgKG5vZGVzX2ludGVyc2VjdHMobnNjLVx1MDAzZW1hc2syLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSkpXG4rXHRcdHBvbC1cdTAwM2VmbGFncyB8PSBNUE9MX0ZfUFJJVkFURTtcbitcbiBcdHJldCA9IG1wb2xfb3BzW3BvbC1cdTAwM2Vtb2RlXS5jcmVhdGUocG9sLCBcdTAwMjZuc2MtXHUwMDNlbWFzazIpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG5AQCAtNDk2LDcgKzUxNCw3IEBAIHZvaWQgX19tcG9sX3B1dChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4gXHQgKi9cbiBcdGtmcmVlX3JjdShwb2wsIHJjdSk7XG4gfVxuLUVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMoX19tcG9sX3B1dCwgXCJrdm1cIik7XG4rRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhfX21wb2xfcHV0LCBcImt2bSxrbWVtXCIpO1xuIFxuIHN0YXRpYyB2b2lkIG1wb2xfcmViaW5kX2RlZmF1bHQoc3RydWN0IG1lbXBvbGljeSAqcG9sLCBjb25zdCBub2RlbWFza190ICpub2RlcylcbiB7XG5AQCAtNTA0LDIyICs1MjIsMzMgQEAgc3RhdGljIHZvaWQgbXBvbF9yZWJpbmRfZGVmYXVsdChzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxuIFxuIHN0YXRpYyB2b2lkIG1wb2xfcmViaW5kX25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgY29uc3Qgbm9kZW1hc2tfdCAqbm9kZXMpXG4ge1xuLVx0bm9kZW1hc2tfdCB0bXA7XG4rXHRub2RlbWFza190IHRtcCwgcHJpdjtcbitcbitcdC8qIHByZXNlcnZlIG9ubGluZSBwcml2YXRlIG5vZGVzIHRvIHJlLWFkZCBsYXRlciAqL1xuK1x0bm9kZXNfYW5kKHByaXYsIHBvbC1cdTAwM2Vub2Rlcywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xuIFxuIFx0aWYgKHBvbC1cdTAwM2VmbGFncyBcdTAwMjYgTVBPTF9GX1NUQVRJQ19OT0RFUylcbiBcdFx0bm9kZXNfYW5kKHRtcCwgcG9sLVx1MDAzZXcudXNlcl9ub2RlbWFzaywgKm5vZGVzKTtcbi1cdGVsc2UgaWYgKHBvbC1cdTAwM2VmbGFncyBcdTAwMjYgTVBPTF9GX1JFTEFUSVZFX05PREVTKVxuLVx0XHRtcG9sX3JlbGF0aXZlX25vZGVtYXNrKFx1MDAyNnRtcCwgXHUwMDI2cG9sLVx1MDAzZXcudXNlcl9ub2RlbWFzaywgbm9kZXMpO1xuLVx0ZWxzZSB7XG4rXHRlbHNlIGlmIChwb2wtXHUwMDNlZmxhZ3MgXHUwMDI2IE1QT0xfRl9SRUxBVElWRV9OT0RFUykge1xuK1x0XHQvKiBmb2xkIG9ubHkgdGhlIHB1YmxpYyBwYXJ0OiBhIHByaXZhdGUgbm9kZSBtdXN0IG5vdCB0YWtlIGEgc2xvdCAqL1xuK1x0XHRub2Rlc19hbmQodG1wLCBwb2wtXHUwMDNldy51c2VyX25vZGVtYXNrLCBub2RlX3N0YXRlc1tOX01FTU9SWV0pO1xuK1x0XHRtcG9sX3JlbGF0aXZlX25vZGVtYXNrKFx1MDAyNnRtcCwgXHUwMDI2dG1wLCBub2Rlcyk7XG4rXHR9IGVsc2Uge1xuIFx0XHRub2Rlc19yZW1hcCh0bXAsIHBvbC1cdTAwM2Vub2RlcywgcG9sLVx1MDAzZXcuY3B1c2V0X21lbXNfYWxsb3dlZCxcbiBcdFx0XHRcdFx0XHRcdFx0Km5vZGVzKTtcbiBcdFx0cG9sLVx1MDAzZXcuY3B1c2V0X21lbXNfYWxsb3dlZCA9ICpub2RlcztcbiBcdH1cbiBcbi1cdGlmIChub2Rlc19lbXB0eSh0bXApKVxuK1x0LyogcHJpdmF0ZSBub2RlcyBhcmUgaWRlbnRpdHktbWFwcGVkIGR1cmluZyByZW1hcCwgZHJvcCB0aGVtIGhlcmUgKi9cbitcdG5vZGVzX2FuZCh0bXAsIHRtcCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKTtcbitcdGlmIChub2Rlc19lbXB0eSh0bXApIFx1MDAyNlx1MDAyNiBub2Rlc19lbXB0eShwcml2KSlcbiBcdFx0dG1wID0gKm5vZGVzO1xuIFxuLVx0cG9sLVx1MDAzZW5vZGVzID0gdG1wO1xuK1x0LyogSWYgYW55IG9ubGluZSBwcml2YXRlIG5vZGVzIHJlbWFpbiwgYWRkIHRoZW0gYmFjayAqL1xuK1x0bm9kZXNfb3IocG9sLVx1MDAzZW5vZGVzLCB0bXAsIHByaXYpO1xuK1x0LyogSWYgbm8gb25saW5lIHByaXZhdGUgbm9kZXMgcmVtYWluLCBzdHJpcCB0aGUgcHJpdmF0ZSBmbGFnICovXG4rXHRpZiAobm9kZXNfZW1wdHkocHJpdikpXG4rXHRcdHBvbC1cdTAwM2VmbGFncyBcdTAwMjY9IH5NUE9MX0ZfUFJJVkFURTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgbXBvbF9yZWJpbmRfcHJlZmVycmVkKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcbkBAIC02NjgsNiArNjk3LDggQEAgc3RhdGljIHZvaWQgcXVldWVfZm9saW9zX3BtZChwbWRfdCAqcG1kLCBzdHJ1Y3QgbW1fd2FsayAqd2FsaylcbiBcdH1cbiBcdGlmICghcXVldWVfZm9saW9fcmVxdWlyZWQoZm9saW8sIHFwKSlcbiBcdFx0cmV0dXJuO1xuK1x0aWYgKCFub2RlX2FsbG93c191c2VyX251bWEoZm9saW9fbmlkKGZvbGlvKSkpXG4rXHRcdHJldHVybjtcbiBcdGlmICghKHFwLVx1MDAzZWZsYWdzIFx1MDAyNiAoTVBPTF9NRl9NT1ZFIHwgTVBPTF9NRl9NT1ZFX0FMTCkpIHx8XG4gXHQgICAgIXZtYV9taWdyYXRhYmxlKHdhbGstXHUwMDNldm1hKSB8fFxuIFx0ICAgICFtaWdyYXRlX2ZvbGlvX2FkZChmb2xpbywgcXAtXHUwMDNlcGFnZWxpc3QsIHFwLVx1MDAzZWZsYWdzKSlcbkBAIC03MjIsNyArNzUzLDggQEAgc3RhdGljIGludCBxdWV1ZV9mb2xpb3NfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0fVxuIFx0XHRmb2xpbyA9IHZtX25vcm1hbF9mb2xpbyh2bWEsIGFkZHIsIHB0ZW50KTtcbi1cdFx0aWYgKCFmb2xpbyB8fCBmb2xpb19pc196b25lX2RldmljZShmb2xpbykpXG4rXHRcdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8XG4rXHRcdCAgICAhbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykgXHUwMDI2XHUwMDI2IG1heF9uciAhPSAxKVxuIFx0XHRcdG5yID0gZm9saW9fcHRlX2JhdGNoKGZvbGlvLCBwdGUsIHB0ZW50LCBtYXhfbnIpO1xuQEAgLTc5Nyw2ICs4MjksOCBAQCBzdGF0aWMgaW50IHF1ZXVlX2ZvbGlvc19odWdldGxiKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgaG1hc2ssXG4gXHRmb2xpbyA9IHBmbl9mb2xpbyhwdGVfcGZuKHB0ZXApKTtcbiBcdGlmICghcXVldWVfZm9saW9fcmVxdWlyZWQoZm9saW8sIHFwKSlcbiBcdFx0Z290byB1bmxvY2s7XG4rXHRpZiAoIW5vZGVfYWxsb3dzX3VzZXJfbnVtYShmb2xpb19uaWQoZm9saW8pKSlcbitcdFx0Z290byB1bmxvY2s7XG4gXHRpZiAoIShmbGFncyBcdTAwMjYgKE1QT0xfTUZfTU9WRSB8IE1QT0xfTUZfTU9WRV9BTEwpKSB8fFxuIFx0ICAgICF2bWFfbWlncmF0YWJsZSh3YWxrLVx1MDAzZXZtYSkpIHtcbiBcdFx0cXAtXHUwMDNlbnJfZmFpbGVkKys7XG5AQCAtODQwLDcgKzg3NCw3IEBAIGJvb2wgZm9saW9fY2FuX21hcF9wcm90X251bWEoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4ge1xuIFx0aW50IG5pZDtcbiBcbi1cdGlmICghZm9saW8gfHwgZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8IGZvbGlvX3Rlc3Rfa3NtKGZvbGlvKSlcbitcdGlmICghZm9saW8gfHwgIWZvbGlvX2FsbG93c19udW1hX2JhbGFuY2UoZm9saW8pIHx8IGZvbGlvX3Rlc3Rfa3NtKGZvbGlvKSlcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuIFx0LyogQWxzbyBza2lwIHNoYXJlZCBjb3B5LW9uLXdyaXRlIGZvbGlvcyAqL1xuQEAgLTExMDYsNiArMTE0MCw5MiBAQCBzdGF0aWMgbG9uZyBkb19zZXRfbWVtcG9saWN5KHVuc2lnbmVkIHNob3J0IG1vZGUsIHVuc2lnbmVkIHNob3J0IGZsYWdzLFxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4rLypcbisgKiBCdWlsZCBhIHJlZmNvdW50ZWQgTVBPTF9CSU5EIHBvbGljeSB0YXJnZXRpbmcgdGhlIHNpbmdsZSBub2RlIEBuaWQsXG4rICogY29udGV4dHVhbGlzZWQgdG8gdGhlIGNhbGxlcidzIGNwdXNldCBsaWtlIGEgdXNlcnNwYWNlIG1iaW5kKCkuXG4rICpcbisgKiBAZmxhZ3MgaXMgTVBPTF9GX1BSSVZBVEUgZm9yIHRoZSBhbiBleHBsaWNpdCBpbi1rZXJuZWwgdXNlciwgbGV0dGluZ1xuKyAqIGEgcHJpdmF0ZSBub2RlIGJlIGJvdW5kIHdpdGhvdXQgY2hlY2tpbmcgQ0FQX1VTRVJfTlVNQS4gIE90aGVyd2lzZSxcbisgKiBDQVBfVVNFUl9OVU1BIGlzIGVuZm9yY2VkLlxuKyAqXG4rICogVGhlIGNhbGxlciBvd25zIHRoZSByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cbisgKi9cbitzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqX19tcG9sX2JpbmRfbm9kZShpbnQgbmlkLCB1bnNpZ25lZCBzaG9ydCBmbGFncylcbit7XG4rXHRzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7XG4rXHRub2RlbWFza190IG5vZGVzO1xuK1x0aW50IGVycjtcbitcbitcdE5PREVNQVNLX1NDUkFUQ0goc2NyYXRjaCk7XG4rXG4rXHRpZiAoIXNjcmF0Y2gpXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuK1xuK1x0bm9kZXNfY2xlYXIobm9kZXMpO1xuK1x0bm9kZV9zZXQobmlkLCBub2Rlcyk7XG4rXG4rXHRwb2wgPSBtcG9sX25ldyhNUE9MX0JJTkQsIGZsYWdzLCBcdTAwMjZub2Rlcyk7XG4rXHRpZiAoSVNfRVJSKHBvbCkpIHtcbitcdFx0Tk9ERU1BU0tfU0NSQVRDSF9GUkVFKHNjcmF0Y2gpO1xuK1x0XHRyZXR1cm4gcG9sO1xuK1x0fVxuK1xuK1x0ZXJyID0gbXBvbF9zZXRfbm9kZW1hc2socG9sLCBcdTAwMjZub2Rlcywgc2NyYXRjaCk7XG4rXHROT0RFTUFTS19TQ1JBVENIX0ZSRUUoc2NyYXRjaCk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdG1wb2xfcHV0KHBvbCk7XG4rXHRcdHJldHVybiBFUlJfUFRSKGVycik7XG4rXHR9XG4rXHRyZXR1cm4gcG9sO1xuK31cbitcbisvKipcbisgKiBtcG9sX3ByaXZhdGVfYmluZCAtIGJ1aWxkIGFuIE1QT0xfQklORCBwb2xpY3kgcGlubmVkIHRvIGEgcHJpdmF0ZSBub2RlXG4rICogQG5pZDogYW4gTl9NRU1PUllfUFJJVkFURSBub2RlXG4rICpcbisgKiBSZXR1cm5zIGEgcmVmY291bnRlZCBtZW1wb2xpY3kgdGhhdCBiaW5kcyBhbGxvY2F0aW9ucyB0byBAbmlkIHdpdGggdGhlXG4rICogcHJpdmF0ZS1wbGFjZW1lbnQgaW50ZW50IChNUE9MX0ZfUFJJVkFURSkuICBUaGlzIGJpbmRzIHRvIEBuaWQgcmVnYXJkbGVzc1xuKyAqIG9mIHRoZSBub2RlJ3MgQ0FQX1VTRVJfTlVNQSwgcHJvdmlkaW5nIGEgcHJpdmlsZWdlZCB3YXkgZm9yIG5vZGUtb3duZXJzXG4rICogdG8gYmluZCBkcml2ZXIvc2VydmljZSBvd25lZCBWTUFzIHRvIHRoZSBub2RlLlxuKyAqXG4rICogTGlrZSBhbnkgTVBPTF9CSU5EIGl0IGlzIHJlbGF4YWJsZTogYW4gdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IGZhbGxzIGJhY2tcbisgKiByYXRoZXIgdGhhbiBmYWlsaW5nLlxuKyAqXG4rICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgQG5pZCBpcyBOX01FTU9SWV9QUklWQVRFLlxuKyAqXG4rICogVGhlIGNhbGxlciBvd25zIHRoZSByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cbisgKlxuKyAqIFJldHVybjogdGhlIHBvbGljeSwgb3IgYW4gRVJSX1BUUiBvbiBmYWlsdXJlLlxuKyAqL1xuK3N0cnVjdCBtZW1wb2xpY3kgKm1wb2xfcHJpdmF0ZV9iaW5kKGludCBuaWQpXG4re1xuK1x0aWYgKCFub2RlX2lzX3ByaXZhdGUobmlkKSlcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4rXHRyZXR1cm4gX19tcG9sX2JpbmRfbm9kZShuaWQsIE1QT0xfRl9QUklWQVRFKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX3ByaXZhdGVfYmluZCwgXCJrbWVtXCIpO1xuK1xuKy8qKlxuKyAqIG1wb2xfYmluZF9ub2RlIC0gYnVpbGQgYW4gTVBPTF9CSU5EIHBvbGljeSB0YXJnZXRpbmcgQG5pZCBmb3IgaW4ta2VybmVsIHVzZVxuKyAqIEBuaWQ6IHRoZSBub2RlIHRvIGJpbmQgdG9cbisgKlxuKyAqIFJldHVybnMgYSByZWZjb3VudGVkIE1QT0xfQklORCBwb2xpY3kgdGhhdCBwbGFjZXMgYWxsb2NhdGlvbnMgb24gQG5pZCxcbisgKiBjb250ZXh0dWFsaXNlZCB0byB0aGUgY2FsbGVyJ3MgY3B1c2V0IGV4YWN0bHkgbGlrZSBhIHVzZXJzcGFjZSBtYmluZCgpLlxuKyAqXG4rICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIHVzZWQgYnkgc2VydmljZXMgaW1wbGVudGluZyBtZW1wb2xpY3kgc3VwcG9ydCB3aXRoXG4rICogdXNlci1wcm92aWRlZCBub2RlIGJpbmRpbmdzLiBOX01FTU9SWV9QUklWQVRFIG5vZGUgYmluZGluZ3MgYXJlIGhvbm9yZWQgaWZcbisgKiB0aGUgbm9kZSBoYXMgQ0FQX1VTRVJfTlVNQSwgb3RoZXJ3aXNlIHJldHVybiAtRUlOVkFMLlxuKyAqXG4rICogVGhlIGNhbGxlciBvd25zIHRoZSByZWZlcmVuY2UgYW5kIGZyZWVzIGl0IHdpdGggbXBvbF9wdXQoKS5cbisgKlxuKyAqIFJldHVybjogdGhlIHBvbGljeSwgb3IgYW4gRVJSX1BUUiBvbiBmYWlsdXJlLlxuKyAqL1xuK3N0cnVjdCBtZW1wb2xpY3kgKm1wb2xfYmluZF9ub2RlKGludCBuaWQpXG4re1xuK1x0cmV0dXJuIF9fbXBvbF9iaW5kX25vZGUobmlkLCAwKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9GT1JfTU9EVUxFUyhtcG9sX2JpbmRfbm9kZSwgXCJrdm1cIik7XG4rXG4gLypcbiAgKiBSZXR1cm4gbm9kZW1hc2sgZm9yIHBvbGljeSBmb3IgZ2V0X21lbXBvbGljeSgpIHF1ZXJ5XG4gICpcbkBAIC0xMjk0LDYgKzE0MTQsOCBAQCBzdGF0aWMgbG9uZyBtaWdyYXRlX3RvX25vZGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGludCBzb3VyY2UsIGludCBkZXN0LFxuIFx0XHQubmlkID0gZGVzdCxcbiBcdFx0LmdmcF9tYXNrID0gR0ZQX0hJR0hVU0VSX01PVkFCTEUgfCBfX0dGUF9USElTTk9ERSxcbiBcdFx0LnJlYXNvbiA9IE1SX1NZU0NBTEwsXG4rXHRcdC5hbGxvY19mbGFncyA9IG5vZGVfaXNfcHJpdmF0ZShkZXN0KSA/XG4rXHRcdFx0IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOiBBTExPQ19ERUZBVUxULFxuIFx0fTtcbiBcbiBcdG5vZGVzX2NsZWFyKG5tYXNrKTtcbkBAIC0xODY3LDkgKzE5ODksMTAgQEAgc3RhdGljIGludCBrZXJuZWxfbWlncmF0ZV9wYWdlcyhwaWRfdCBwaWQsIHVuc2lnbmVkIGxvbmcgbWF4bm9kZSxcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gTlVMTDtcbiBcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaztcbiBcdG5vZGVtYXNrX3QgdGFza19ub2Rlcztcbi1cdGludCBlcnI7XG4rXHRub2RlbWFza190IHByaXZfb2s7XG4gXHRub2RlbWFza190ICpvbGQ7XG4gXHRub2RlbWFza190ICpuZXc7XG4rXHRpbnQgZXJyLCBuaWQ7XG4gXHROT0RFTUFTS19TQ1JBVENIKHNjcmF0Y2gpO1xuIFxuIFx0aWYgKCFzY3JhdGNoKVxuQEAgLTE5MDksNyArMjAzMiwxNCBAQCBzdGF0aWMgaW50IGtlcm5lbF9taWdyYXRlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBtYXhub2RlLFxuIFx0fVxuIFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXG4rXHQvKiBQcml2YXRlIG5vZGVzIGFyZSBzdHJpcHBlZCBieSBjcHVzZXQgY2hlY2tzLiBBbGxvdyBlbGlnaWJsZSBvbmVzLiAqL1xuK1x0bm9kZXNfY2xlYXIocHJpdl9vayk7XG4rXHRmb3JfZWFjaF9ub2RlX21hc2sobmlkLCAqbmV3KVxuK1x0XHRpZiAobm9kZV9pc19wcml2YXRlKG5pZCkgXHUwMDI2XHUwMDI2IG5vZGVfYWxsb3dzX3VzZXJfbnVtYShuaWQpKVxuK1x0XHRcdG5vZGVfc2V0KG5pZCwgcHJpdl9vayk7XG4rXG4gXHR0YXNrX25vZGVzID0gY3B1c2V0X21lbXNfYWxsb3dlZCh0YXNrKTtcbitcdG5vZGVzX29yKHRhc2tfbm9kZXMsIHRhc2tfbm9kZXMsIHByaXZfb2spO1xuIFx0LyogSXMgdGhlIHVzZXIgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIHRhcmdldCBub2Rlcz8gKi9cbiBcdGlmICghbm9kZXNfc3Vic2V0KCpuZXcsIHRhc2tfbm9kZXMpIFx1MDAyNlx1MDAyNiAhY2FwYWJsZShDQVBfU1lTX05JQ0UpKSB7XG4gXHRcdGVyciA9IC1FUEVSTTtcbkBAIC0xOTE3LDYgKzIwNDcsNyBAQCBzdGF0aWMgaW50IGtlcm5lbF9taWdyYXRlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBtYXhub2RlLFxuIFx0fVxuIFxuIFx0dGFza19ub2RlcyA9IGNwdXNldF9tZW1zX2FsbG93ZWQoY3VycmVudCk7XG4rXHRub2Rlc19vcih0YXNrX25vZGVzLCB0YXNrX25vZGVzLCBwcml2X29rKTtcbiBcdGlmICghbm9kZXNfYW5kKCpuZXcsICpuZXcsIHRhc2tfbm9kZXMpKVxuIFx0XHRnb3RvIG91dF9wdXQ7XG4gXG5AQCAtMjA3MSw2ICsyMjAyLDM0IEBAIGJvb2wgdm1hX3BvbGljeV9tb2Yoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4gXHRyZXR1cm4gbW9mO1xuIH1cbiBcbisvKlxuKyAqIHRydWUgaWYgYW55IHBvbGljeSAqcHJpdmF0ZSogbm9kZSBjYW4gc2F0aXNmeSBhICFfX0dGUF9NT1ZBQkxFIGFsbG9jYXRpb24uXG4rICogUG9saWNpZXMgd2l0aG91dCBwcml2YXRlIG5vZGVzICh+TVBPTF9GX1BSSVZBVEUpIGFsd2F5cyByZXR1cm4gZmFsc2UuXG4rICpcbisgKiBUaGlzIHByb3ZpZGVzIGEgd2F5IGZvciBvdGhlcndpc2UtYm91bmQga2VybmVsIGFsbG9jYXRpb25zIHRvIG1ha2UgdGhlaXJcbisgKiB3YXkgb250byBwcml2YXRlIG5vZGVzIHdpdGggWk9ORV9OT1JNQUwgbWVtb3J5IHdpdGhvdXQgaGF2aW5nIHRvIGF1ZGl0XG4rICogZXZlcnkgY2FsbGVyLiAgVGhlIGNvc3QgaXMgYSB6b25lIHNjYW4gZm9yIHByaXZhdGUgbm9kZXMgaW4gdGhlIG1hc2suXG4rICovXG4rc3RhdGljIGJvb2wgcG9saWN5X3ByaXZhdGVfaGFzX2tlcm5lbF96b25lKGNvbnN0IHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbit7XG4rXHRpbnQgbmlkO1xuK1xuK1x0aWYgKCEocG9sLVx1MDAzZWZsYWdzIFx1MDAyNiBNUE9MX0ZfUFJJVkFURSkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsIHBvbC1cdTAwM2Vub2Rlcykge1xuK1x0XHRwZ19kYXRhX3QgKnBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7XG4rXHRcdGVudW0gem9uZV90eXBlIHp0O1xuK1xuK1x0XHRpZiAoIW5vZGVfaXNfcHJpdmF0ZShuaWQpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRmb3IgKHp0ID0gWk9ORV9OT1JNQUw7IHp0IFx1MDAzYyBaT05FX01PVkFCTEU7IHp0KyspXG4rXHRcdFx0aWYgKG1hbmFnZWRfem9uZShcdTAwMjZwZ2RhdC1cdTAwM2Vub2RlX3pvbmVzW3p0XSkpXG4rXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdH1cbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4gYm9vbCBhcHBseV9wb2xpY3lfem9uZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3ksIGVudW0gem9uZV90eXBlIHpvbmUpXG4ge1xuIFx0ZW51bSB6b25lX3R5cGUgZHluYW1pY19wb2xpY3lfem9uZSA9IHBvbGljeV96b25lO1xuQEAgLTIwNzgsMTQgKzIyMzcsMjIgQEAgYm9vbCBhcHBseV9wb2xpY3lfem9uZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3ksIGVudW0gem9uZV90eXBlIHpvbmUpXG4gXHRCVUdfT04oZHluYW1pY19wb2xpY3lfem9uZSA9PSBaT05FX01PVkFCTEUpO1xuIFxuIFx0Lypcbi1cdCAqIGlmIHBvbGljeS1cdTAwM2Vub2RlcyBoYXMgbW92YWJsZSBtZW1vcnkgb25seSxcbi1cdCAqIHdlIGFwcGx5IHBvbGljeSB3aGVuIGdmcF96b25lKGdmcCkgPSBaT05FX01PVkFCTEUgb25seS5cbitcdCAqIGR5bmFtaWNfcG9saWN5X3pvbmUgaXMgdGhlIGxvd2VzdCB6b25lIHRoaXMgcG9saWN5IGlzIGVuZm9yY2VkIGZvcixcbitcdCAqIGFsbG9jYXRpb25zIGJlbG93IGl0IGlnbm9yZSB0aGUgbm9kZW1hc2sgYW5kIGZhbGwgYmFjayBmcmVlbHkuXG4rXHQgKlxuK1x0ICogSWYgYWxsIHBvbGljeS1ub2RlcyBhcmUgbW92YWJsZS1vbmx5IChhbGwgWk9ORV9NT1ZBQkxFKSwgcmFpc2UgdGhlXG4rXHQgKiBkeW5hbWljX3BvbGljeV96b25lIHRvIFpPTkVfTU9WQUJMRSBzbyB0aGF0IG9ubHkgbW92YWJsZSBhbGxvY2F0aW9uc1xuK1x0ICogc3RheSBib3VuZCAtIG90aGVyd2lzZSB0aGlzIHdvdWxkIGZvcmNlIGtlcm5lbC16b25lIGFsbG9jYXRpb25zXG4rXHQgKiAoZS5nLiBwYWdlIHRhYmxlcykgb250byBhIHpvbmUgdGhhdCBjYW5ub3Qgc2F0aXNmeSB0aGVtLiAgVGhpc1xuK1x0ICogcmVzdWx0cyBpbiBhbGxvY2F0aW9uIGZhaWx1cmUgYW5kIHJldHJ5IGxvb3AgKGxpdmVsb2NrKS5cbiBcdCAqXG4tXHQgKiBwb2xpY3ktXHUwMDNlbm9kZXMgaXMgaW50ZXJzZWN0IHdpdGggbm9kZV9zdGF0ZXNbTl9NRU1PUlldLlxuLVx0ICogc28gaWYgdGhlIGZvbGxvd2luZyB0ZXN0IGZhaWxzLCBpdCBpbXBsaWVzXG4tXHQgKiBwb2xpY3ktXHUwMDNlbm9kZXMgaGFzIG1vdmFibGUgbWVtb3J5IG9ubHkuXG4rXHQgKiBOX0hJR0hfTUVNT1JZIHRlbGxzIHVzIFwiaGFzIGEgbm9uLW1vdmFibGUgem9uZVwiIGZvciBvcmRpbmFyeSBub2Rlcy5cbitcdCAqIFByaXZhdGUgbm9kZXMgYXJlIGRlbGliZXJhdGVseSBleGNsdWRlZCBmcm9tIE5fSElHSF9NRU1PUlksIHNvIHdlXG4rXHQgKiBuZWVkIHRvIGNoZWNrIHRoZWlyIGFjdHVhbCB6b25lcyAtIGEga2VybmVsLXpvbmVkIHByaXZhdGUgbm9kZSBjYW5cbitcdCAqIGhvbGQgdGhlIGFsbG9jYXRpb24gYW5kIG11c3Qga2VlcCB0aGUgcG9saWN5IGFwcGxpZWQuXG4gXHQgKi9cbi1cdGlmICghbm9kZXNfaW50ZXJzZWN0cyhwb2xpY3ktXHUwMDNlbm9kZXMsIG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKSlcbitcdGlmICghbm9kZXNfaW50ZXJzZWN0cyhwb2xpY3ktXHUwMDNlbm9kZXMsIG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKSBcdTAwMjZcdTAwMjZcbitcdCAgICAhcG9saWN5X3ByaXZhdGVfaGFzX2tlcm5lbF96b25lKHBvbGljeSkpXG4gXHRcdGR5bmFtaWNfcG9saWN5X3pvbmUgPSBaT05FX01PVkFCTEU7XG4gXG4gXHRyZXR1cm4gem9uZSBcdTAwM2U9IGR5bmFtaWNfcG9saWN5X3pvbmU7XG5AQCAtMjQwNiw3ICsyNTczLDggQEAgYm9vbCBtZW1wb2xpY3lfaW5fb29tX2RvbWFpbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbiB9XG4gXG4gc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19wcmVmZXJyZWRfbWFueShnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcbi1cdFx0XHRcdFx0XHRpbnQgbmlkLCBub2RlbWFza190ICpub2RlbWFzaylcbitcdFx0XHRcdFx0XHRpbnQgbmlkLCBub2RlbWFza190ICpub2RlbWFzayxcbitcdFx0XHRcdFx0XHR1bnNpZ25lZCBpbnQgYWZsYWdzKVxuIHtcbiBcdHN0cnVjdCBwYWdlICpwYWdlO1xuIFx0Z2ZwX3QgcHJlZmVycmVkX2dmcDtcbkBAIC0yNDIwLDE0ICsyNTg4LDIxIEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfcHJlZmVycmVkX21hbnkoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4gXHRwcmVmZXJyZWRfZ2ZwID0gZ2ZwIHwgX19HRlBfTk9XQVJOO1xuIFx0cHJlZmVycmVkX2dmcCBcdTAwMjY9IH4oX19HRlBfRElSRUNUX1JFQ0xBSU0gfCBfX0dGUF9OT0ZBSUwpO1xuIFx0cGFnZSA9IF9fYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihwcmVmZXJyZWRfZ2ZwLCBvcmRlciwgbmlkLCBub2RlbWFzayxcbi1cdFx0XHRcdFx0ICAgQUxMT0NfREVGQVVMVCk7XG4rXHRcdFx0XHRcdCAgICAgYWZsYWdzKTtcbiBcdGlmICghcGFnZSlcbiBcdFx0cGFnZSA9IF9fYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihnZnAsIG9yZGVyLCBuaWQsIE5VTEwsXG4tXHRcdFx0XHRcdFx0ICAgQUxMT0NfREVGQVVMVCk7XG4rXHRcdFx0XHRcdFx0ICAgICBhZmxhZ3MpO1xuIFxuIFx0cmV0dXJuIHBhZ2U7XG4gfVxuIFxuKy8qIEEgcHJpdmF0ZSBwb2xpY3kgYWxsb2NhdGVzIGZyb20gdGhlIHByaXZhdGUgem9uZWxpc3QuICovXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbXBvbF9hbGxvY19mbGFncyhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4re1xuK1x0cmV0dXJuIChwb2wtXHUwMDNlZmxhZ3MgXHUwMDI2IE1QT0xfRl9QUklWQVRFKSA/IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOlxuK1x0XHRcdFx0XHQgICAgICAgQUxMT0NfREVGQVVMVDtcbit9XG4rXG4gLyoqXG4gICogYWxsb2NfcGFnZXNfbXBvbCAtIEFsbG9jYXRlIHBhZ2VzIGFjY29yZGluZyB0byBOVU1BIG1lbXBvbGljeS5cbiAgKiBAZ2ZwOiBHRlAgZmxhZ3MuXG5AQCAtMjQ0MywxMSArMjYxOCwxMyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmFsbG9jX3BhZ2VzX21wb2woZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4ge1xuIFx0bm9kZW1hc2tfdCAqbm9kZW1hc2s7XG4gXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbitcdHVuc2lnbmVkIGludCBhZmxhZ3MgPSBtcG9sX2FsbG9jX2ZsYWdzKHBvbCk7XG4gXG4gXHRub2RlbWFzayA9IHBvbGljeV9ub2RlbWFzayhnZnAsIHBvbCwgaWx4LCBcdTAwMjZuaWQpO1xuIFxuIFx0aWYgKHBvbC1cdTAwM2Vtb2RlID09IE1QT0xfUFJFRkVSUkVEX01BTlkpXG4tXHRcdHJldHVybiBhbGxvY19wYWdlc19wcmVmZXJyZWRfbWFueShnZnAsIG9yZGVyLCBuaWQsIG5vZGVtYXNrKTtcbitcdFx0cmV0dXJuIGFsbG9jX3BhZ2VzX3ByZWZlcnJlZF9tYW55KGdmcCwgb3JkZXIsIG5pZCwgbm9kZW1hc2ssXG4rXHRcdFx0XHRcdFx0ICBhZmxhZ3MpO1xuIFxuIFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSBcdTAwMjZcdTAwMjZcbiBcdCAgICAvKiBmaWx0ZXIgXCJodWdlcGFnZVwiIGFsbG9jYXRpb24sIHVubGVzcyBmcm9tIGFsbG9jX3BhZ2VzKCkgKi9cbkBAIC0yNDcxLDcgKzI2NDgsNyBAQCBzdGF0aWMgc3RydWN0IHBhZ2UgKmFsbG9jX3BhZ2VzX21wb2woZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4gXHRcdFx0ICovXG4gXHRcdFx0cGFnZSA9IF9fYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihcbiBcdFx0XHRcdGdmcCB8IF9fR0ZQX1RISVNOT0RFIHwgX19HRlBfTk9SRVRSWSwgb3JkZXIsXG4tXHRcdFx0XHRuaWQsIE5VTEwsIEFMTE9DX0RFRkFVTFQpO1xuK1x0XHRcdFx0bmlkLCBOVUxMLCBhZmxhZ3MpO1xuIFx0XHRcdGlmIChwYWdlIHx8ICEoZ2ZwIFx1MDAyNiBfX0dGUF9ESVJFQ1RfUkVDTEFJTSkpXG4gXHRcdFx0XHRyZXR1cm4gcGFnZTtcbiBcdFx0XHQvKlxuQEAgLTI0ODMsNyArMjY2MCw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfbXBvbChnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcbiBcdFx0fVxuIFx0fVxuIFxuLVx0cGFnZSA9IF9fYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihnZnAsIG9yZGVyLCBuaWQsIG5vZGVtYXNrLCBBTExPQ19ERUZBVUxUKTtcbitcdHBhZ2UgPSBfX2FsbG9jX2Zyb3plbl9wYWdlc19ub3Byb2YoZ2ZwLCBvcmRlciwgbmlkLCBub2RlbWFzaywgYWZsYWdzKTtcbiBcbiBcdGlmICh1bmxpa2VseShwb2wtXHUwMDNlbW9kZSA9PSBNUE9MX0lOVEVSTEVBVkUgfHxcbiBcdFx0ICAgICBwb2wtXHUwMDNlbW9kZSA9PSBNUE9MX1dFSUdIVEVEX0lOVEVSTEVBVkUpIFx1MDAyNlx1MDAyNiBwYWdlKSB7XG5AQCAtMjU5Miw2ICsyNzY5LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19pbnRlcmxlYXZlKGdmcF90IGdmcCxcbiBcdFx0c3RydWN0IG1lbXBvbGljeSAqcG9sLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuIFx0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VfYXJyYXkpXG4ge1xuK1x0dW5zaWduZWQgaW50IGFmbGFncyA9IG1wb2xfYWxsb2NfZmxhZ3MocG9sKTtcbiBcdGludCBub2RlcztcbiBcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXNfcGVyX25vZGU7XG4gXHRpbnQgZGVsdGE7XG5AQCAtMjYwNSwxNCArMjc4MywxNCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2Mgbm9kZXM7IGkrKykge1xuIFx0XHRpZiAoZGVsdGEpIHtcbi1cdFx0XHRucl9hbGxvY2F0ZWQgPSBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsXG4tXHRcdFx0XHRcdGludGVybGVhdmVfbm9kZXMocG9sKSwgTlVMTCxcbitcdFx0XHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCxcbitcdFx0XHRcdFx0YWZsYWdzLCBpbnRlcmxlYXZlX25vZGVzKHBvbCksIE5VTEwsXG4gXHRcdFx0XHRcdG5yX3BhZ2VzX3Blcl9ub2RlICsgMSxcbiBcdFx0XHRcdFx0cGFnZV9hcnJheSk7XG4gXHRcdFx0ZGVsdGEtLTtcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRucl9hbGxvY2F0ZWQgPSBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsXG4tXHRcdFx0XHRcdGludGVybGVhdmVfbm9kZXMocG9sKSwgTlVMTCxcbitcdFx0XHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCxcbitcdFx0XHRcdFx0YWZsYWdzLCBpbnRlcmxlYXZlX25vZGVzKHBvbCksIE5VTEwsXG4gXHRcdFx0XHRcdG5yX3BhZ2VzX3Blcl9ub2RlLCBwYWdlX2FycmF5KTtcbiBcdFx0fVxuIFxuQEAgLTI2MjcsNiArMjgwNSw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfd2VpZ2h0ZWRfaW50ZXJsZWF2ZShnZnBfdCBnZnAsXG4gXHRcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdFx0c3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KVxuIHtcbitcdHVuc2lnbmVkIGludCBhZmxhZ3MgPSBtcG9sX2FsbG9jX2ZsYWdzKHBvbCk7XG4gXHRzdHJ1Y3Qgd2VpZ2h0ZWRfaW50ZXJsZWF2ZV9zdGF0ZSAqc3RhdGU7XG4gXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDtcbiBcdHVuc2lnbmVkIGludCBjcHVzZXRfbWVtc19jb29raWU7XG5AQCAtMjY2Miw4ICsyODQxLDggQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa193ZWlnaHRlZF9pbnRlcmxlYXZlKGdmcF90IGdmcCxcbiBcdHdlaWdodCA9IG1lLVx1MDAzZWlsX3dlaWdodDtcbiBcdGlmICh3ZWlnaHQgXHUwMDI2XHUwMDI2IG5vZGVfaXNzZXQobm9kZSwgbm9kZXMpKSB7XG4gXHRcdG5vZGVfcGFnZXMgPSBtaW4ocmVtX3BhZ2VzLCB3ZWlnaHQpO1xuLVx0XHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGsoZ2ZwLCBub2RlLCBOVUxMLCBub2RlX3BhZ2VzLFxuLVx0XHRcdFx0XHRcdCAgcGFnZV9hcnJheSk7XG4rXHRcdG5yX2FsbG9jYXRlZCA9IF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBhZmxhZ3MsIG5vZGUsXG4rXHRcdFx0XHRcdFx0ICBOVUxMLCBub2RlX3BhZ2VzLCBwYWdlX2FycmF5KTtcbiBcdFx0cGFnZV9hcnJheSArPSBucl9hbGxvY2F0ZWQ7XG4gXHRcdHRvdGFsX2FsbG9jYXRlZCArPSBucl9hbGxvY2F0ZWQ7XG4gXHRcdC8qIGlmIHRoYXQncyBhbGwgdGhlIHBhZ2VzLCBubyBuZWVkIHRvIGludGVybGVhdmUgKi9cbkBAIC0yNzI3LDggKzI5MDYsOCBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX3dlaWdodGVkX2ludGVybGVhdmUoZ2ZwX3QgZ2ZwLFxuIFx0XHQvKiBub2RlX3BhZ2VzIGNhbiBiZSAwIGlmIGFuIGFsbG9jYXRpb24gZmFpbHMgYW5kIHJvdW5kcyA9PSAwICovXG4gXHRcdGlmICghbm9kZV9wYWdlcylcbiBcdFx0XHRicmVhaztcbi1cdFx0bnJfYWxsb2NhdGVkID0gX19hbGxvY19wYWdlc19idWxrKGdmcCwgbm9kZSwgTlVMTCwgbm9kZV9wYWdlcyxcbi1cdFx0XHRcdFx0XHQgIHBhZ2VfYXJyYXkpO1xuK1x0XHRucl9hbGxvY2F0ZWQgPSBfX2FsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcCwgYWZsYWdzLCBub2RlLFxuK1x0XHRcdFx0XHRcdCAgTlVMTCwgbm9kZV9wYWdlcywgcGFnZV9hcnJheSk7XG4gXHRcdHBhZ2VfYXJyYXkgKz0gbnJfYWxsb2NhdGVkO1xuIFx0XHR0b3RhbF9hbGxvY2F0ZWQgKz0gbnJfYWxsb2NhdGVkO1xuIFx0XHRpZiAodG90YWxfYWxsb2NhdGVkID09IG5yX3BhZ2VzKVxuQEAgLTI3NDUsMTcgKzI5MjQsMTkgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19wcmVmZXJyZWRfbWFueShnZnBfdCBnZnAsIGludCBuaWQsXG4gXHRcdHN0cnVjdCBtZW1wb2xpY3kgKnBvbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbiBcdFx0c3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KVxuIHtcbitcdHVuc2lnbmVkIGludCBhZmxhZ3MgPSBtcG9sX2FsbG9jX2ZsYWdzKHBvbCk7XG4gXHRnZnBfdCBwcmVmZXJyZWRfZ2ZwO1xuIFx0dW5zaWduZWQgbG9uZyBucl9hbGxvY2F0ZWQgPSAwO1xuIFxuIFx0cHJlZmVycmVkX2dmcCA9IGdmcCB8IF9fR0ZQX05PV0FSTjtcbiBcdHByZWZlcnJlZF9nZnAgXHUwMDI2PSB+KF9fR0ZQX0RJUkVDVF9SRUNMQUlNIHwgX19HRlBfTk9GQUlMKTtcbiBcbi1cdG5yX2FsbG9jYXRlZCAgPSBhbGxvY19wYWdlc19idWxrX25vcHJvZihwcmVmZXJyZWRfZ2ZwLCBuaWQsIFx1MDAyNnBvbC1cdTAwM2Vub2Rlcyxcbi1cdFx0XHRcdFx0ICAgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpO1xuK1x0bnJfYWxsb2NhdGVkICA9IF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YocHJlZmVycmVkX2dmcCwgYWZsYWdzLFxuK1x0XHRcdFx0XHQgICBuaWQsIFx1MDAyNnBvbC1cdTAwM2Vub2RlcywgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpO1xuIFxuIFx0aWYgKG5yX2FsbG9jYXRlZCBcdTAwM2MgbnJfcGFnZXMpXG4tXHRcdG5yX2FsbG9jYXRlZCArPSBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsIG51bWFfbm9kZV9pZCgpLCBOVUxMLFxuK1x0XHRucl9hbGxvY2F0ZWQgKz0gX19hbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsIGFmbGFncyxcbitcdFx0XHRcdG51bWFfbm9kZV9pZCgpLCBOVUxMLFxuIFx0XHRcdFx0bnJfcGFnZXMgLSBucl9hbGxvY2F0ZWQsXG4gXHRcdFx0XHRwYWdlX2FycmF5ICsgbnJfYWxsb2NhdGVkKTtcbiBcdHJldHVybiBucl9hbGxvY2F0ZWQ7XG5AQCAtMjc5MSw4ICsyOTcyLDggQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX21lbXBvbGljeV9ub3Byb2YoZ2ZwX3QgZ2ZwLFxuIFxuIFx0bmlkID0gbnVtYV9ub2RlX2lkKCk7XG4gXHRub2RlbWFzayA9IHBvbGljeV9ub2RlbWFzayhnZnAsIHBvbCwgTk9fSU5URVJMRUFWRV9JTkRFWCwgXHUwMDI2bmlkKTtcbi1cdHJldHVybiBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnAsIG5pZCwgbm9kZW1hc2ssXG4tXHRcdFx0XHQgICAgICAgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpO1xuK1x0cmV0dXJuIF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBtcG9sX2FsbG9jX2ZsYWdzKHBvbCksIG5pZCxcbitcdFx0XHRcdFx0XHRub2RlbWFzaywgbnJfcGFnZXMsIHBhZ2VfYXJyYXkpO1xuIH1cbiBcbiBpbnQgdm1hX2R1cF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICpzcmMsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0KVxuQEAgLTMyNDMsMjQgKzM0MjQsNDcgQEAgdm9pZCBtcG9sX3NoYXJlZF9wb2xpY3lfaW5pdChzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpXG4gfVxuIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zaGFyZWRfcG9saWN5X2luaXQsIFwia3ZtXCIpO1xuIFxuLWludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5KHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCxcbi1cdFx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqcG9sKVxuKy8qKlxuKyAqIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgLSBpbnN0YWxsIEBwb2wgb3ZlciBbQHN0YXJ0LCBAZW5kKSBvZiBAc3BcbisgKiBAc3A6ICAgIHRoZSBzaGFyZWQgcG9saWN5IHRyZWVcbisgKiBAc3RhcnQ6IGZpcnN0IHBhZ2Ugb2Zmc2V0IChpbmNsdXNpdmUpXG4rICogQGVuZDogICBsYXN0IHBhZ2Ugb2Zmc2V0IChleGNsdXNpdmUpXG4rICogQHBvbDogICBhIGZ1bGx5LWJ1aWx0LCB2YWxpZGF0ZWQgcG9saWN5LCBvciBOVUxMIHRvIGNsZWFyIHRoZSByYW5nZVxuKyAqXG4rICogSW5zdGFsbHMgQHBvbCBvdmVyIHRoZSBnaXZlbiByYW5nZSwgcmVwbGFjaW5nIGFueSBvdmVybGFwcGluZyBwb2xpY3kuXG4rICogQHNwIHRha2VzIGl0cyBvd24gcmVmZXJlbmNlLCB0aGUgY2FsbGVyIHJldGFpbnMgaXRzIHJlZmVyZW5jZSBvbiBAcG9sLlxuKyAqXG4rICogVGhlIHBvbGljeSBpcyBub3QgcmVjb25zdHJ1Y3RlZCwgc28gdGhlIHBvbGljeSBpcyBwcmVzZXJ2ZWQgZXhhY3RseS5cbisgKlxuKyAqIFVubGlrZSBtcG9sX3NldF9zaGFyZWRfcG9saWN5KCksIG5vIFZNQSBpcyByZXF1aXJlZCwgc28gYSByYW5nZSB0aGF0XG4rICogaXMgbmV2ZXIgbWFwcGVkIGludG8gYSBWTUEgY2FuIGJlIGNvdmVyZWQsIGluY2x1ZGluZyB0aGUgd2hvbGUgZmlsZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZS5cbisgKi9cbitpbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHBnb2ZmX3Qgc3RhcnQsXG4rXHRcdFx0XHQgcGdvZmZfdCBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKnBvbClcbiB7XG4tXHRjb25zdCBwZ29mZl90IHBnb2ZmID0gdm1hX3N0YXJ0X3Bnb2ZmKHZtYSk7XG4tXHRjb25zdCBwZ29mZl90IHBnb2ZmX2VuZCA9IHZtYV9lbmRfcGdvZmYodm1hKTtcbiBcdHN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMO1xuIFx0aW50IGVycjtcbiBcbiBcdGlmIChwb2wpIHtcbi1cdFx0bmV3ID0gc3BfYWxsb2MocGdvZmYsIHBnb2ZmX2VuZCwgcG9sKTtcbitcdFx0bmV3ID0gc3BfYWxsb2Moc3RhcnQsIGVuZCwgcG9sKTtcbiBcdFx0aWYgKCFuZXcpXG4gXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gXHR9XG4tXHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHBnb2ZmLCBwZ29mZl9lbmQsIG5ldyk7XG4rXHRlcnIgPSBzaGFyZWRfcG9saWN5X3JlcGxhY2Uoc3AsIHN0YXJ0LCBlbmQsIG5ldyk7XG4gXHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBuZXcpXG4gXHRcdHNwX2ZyZWUobmV3KTtcbiBcdHJldHVybiBlcnI7XG4gfVxuK0VYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSwgXCJrdm1cIik7XG4rXG4raW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLFxuK1x0XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXG4re1xuK1x0cmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3AsIHZtYS1cdTAwM2V2bV9wZ29mZixcbitcdFx0XHRcdFx0ICAgdm1hLVx1MDAzZXZtX3Bnb2ZmICsgdm1hX3BhZ2VzKHZtYSksIHBvbCk7XG4rfVxuIEVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeSwgXCJrdm1cIik7XG4gXG4gLyogRnJlZSBhIGJhY2tpbmcgcG9saWN5IHN0b3JlIG9uIGlub2RlIGRlbGV0ZS4gKi9cbmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmNcbmluZGV4IGFiMTVhNGRkZGQwNDcxLi45YzJmNDc0YzY5MjViMyAxMDA2NDRcbi0tLSBhL21tL21pZ3JhdGUuY1xuKysrIGIvbW0vbWlncmF0ZS5jXG5AQCAtMjIzMyw3ICsyMjMzLDggQEAgc3RydWN0IGZvbGlvICphbGxvY19taWdyYXRpb25fdGFyZ2V0KHN0cnVjdCBmb2xpbyAqc3JjLCB1bnNpZ25lZCBsb25nIHByaXZhdGUpXG4gXHRpZiAoaXNfaGlnaG1lbV9pZHgoemlkeCkgfHwgemlkeCA9PSBaT05FX01PVkFCTEUpXG4gXHRcdGdmcF9tYXNrIHw9IF9fR0ZQX0hJR0hNRU07XG4gXG4tXHRyZXR1cm4gX19mb2xpb19hbGxvYyhnZnBfbWFzaywgb3JkZXIsIG5pZCwgbXRjLVx1MDAzZW5tYXNrKTtcbitcdHJldHVybiBfX2ZvbGlvX2FsbG9jKGdmcF9tYXNrLCBvcmRlciwgbmlkLCBtdGMtXHUwMDNlbm1hc2ssXG4rXHRcdFx0ICAgICBtdGMtXHUwMDNlYWxsb2NfZmxhZ3MpO1xuIH1cbiBcbiAjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFUSU9OXG5AQCAtMjI1NSw2ICsyMjU2LDggQEAgc3RhdGljIGludCBkb19tb3ZlX3BhZ2VzX3RvX25vZGUoc3RydWN0IGxpc3RfaGVhZCAqcGFnZWxpc3QsIGludCBub2RlKVxuIFx0XHQubmlkID0gbm9kZSxcbiBcdFx0LmdmcF9tYXNrID0gR0ZQX0hJR0hVU0VSX01PVkFCTEUgfCBfX0dGUF9USElTTk9ERSxcbiBcdFx0LnJlYXNvbiA9IE1SX1NZU0NBTEwsXG4rXHRcdC5hbGxvY19mbGFncyA9IG5vZGVfaXNfcHJpdmF0ZShub2RlKSA/XG4rXHRcdFx0IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgOiBBTExPQ19ERUZBVUxULFxuIFx0fTtcbiBcbiBcdGVyciA9IG1pZ3JhdGVfcGFnZXMocGFnZWxpc3QsIGFsbG9jX21pZ3JhdGlvbl90YXJnZXQsIE5VTEwsXG5AQCAtMjI3MCw3ICsyMjczLDggQEAgc3RhdGljIGludCBfX2FkZF9mb2xpb19mb3JfbWlncmF0aW9uKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCBub2RlLFxuIFx0aWYgKGlzX3plcm9fZm9saW8oZm9saW8pIHx8IGlzX2h1Z2VfemVyb19mb2xpbyhmb2xpbykpXG4gXHRcdHJldHVybiAtRUZBVUxUO1xuIFxuLVx0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSlcbitcdGlmIChmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHxcbitcdCAgICAhbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKVxuIFx0XHRyZXR1cm4gLUVOT0VOVDtcbiBcbiBcdGlmIChmb2xpb19uaWQoZm9saW8pID09IG5vZGUpXG5AQCAtMjM5NCwxMSArMjM5OCwxNCBAQCBzdGF0aWMgaW50IGRvX3BhZ2VzX21vdmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIG5vZGVtYXNrX3QgdGFza19ub2RlcyxcbiBcdFx0ZXJyID0gLUVOT0RFVjtcbiBcdFx0aWYgKG5vZGUgXHUwMDNjIDAgfHwgbm9kZSBcdTAwM2U9IE1BWF9OVU1OT0RFUylcbiBcdFx0XHRnb3RvIG91dF9mbHVzaDtcbi1cdFx0aWYgKCFub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSlcbitcbitcdFx0aWYgKCFub2RlX2FsbG93c191c2VyX251bWEobm9kZSkpXG4gXHRcdFx0Z290byBvdXRfZmx1c2g7XG4gXG4gXHRcdGVyciA9IC1FQUNDRVM7XG4tXHRcdGlmICghbm9kZV9pc3NldChub2RlLCB0YXNrX25vZGVzKSlcbitcdFx0LyogUHJpdmF0ZSBub2RlcyBhcmUgbm90IHBhcnRpdGlvbmVkIGJ5IGNwdXNldC5tZW0gKi9cbitcdFx0aWYgKCFub2RlX2lzX3ByaXZhdGUobm9kZSkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhbm9kZV9pc3NldChub2RlLCB0YXNrX25vZGVzKSlcbiBcdFx0XHRnb3RvIG91dF9mbHVzaDtcbiBcbiBcdFx0aWYgKGN1cnJlbnRfbm9kZSA9PSBOVU1BX05PX05PREUpIHtcbkBAIC0yNDc5LDcgKzI0ODYsOSBAQCBzdGF0aWMgdm9pZCBkb19wYWdlc19zdGF0X2FycmF5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuIFx0XHRpZiAoZm9saW8pIHtcbiBcdFx0XHRpZiAoaXNfemVyb19mb2xpbyhmb2xpbykgfHwgaXNfaHVnZV96ZXJvX2ZvbGlvKGZvbGlvKSlcbiBcdFx0XHRcdGVyciA9IC1FRkFVTFQ7XG4tXHRcdFx0ZWxzZSBpZiAoZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pKVxuK1x0XHRcdGVsc2UgaWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fFxuK1x0XHRcdFx0IChmb2xpb19pc19wcml2YXRlX25vZGUoZm9saW8pIFx1MDAyNlx1MDAyNlxuK1x0XHRcdFx0ICAhbm9kZV9hbGxvd3NfdXNlcl9udW1hKGZvbGlvX25pZChmb2xpbykpKSlcbiBcdFx0XHRcdGVyciA9IC1FTk9FTlQ7XG4gXHRcdFx0ZWxzZVxuIFx0XHRcdFx0ZXJyID0gZm9saW9fbmlkKGZvbGlvKTtcbmRpZmYgLS1naXQgYS9tbS9tbV9pbml0LmMgYi9tbS9tbV9pbml0LmNcbmluZGV4IDcxMWY4MjFmN2IzYzcyLi5hZGI1MDY0N2QyOWNhZiAxMDA2NDRcbi0tLSBhL21tL21tX2luaXQuY1xuKysrIGIvbW0vbW1faW5pdC5jXG5AQCAtMjcwMSw3ICsyNzAxLDcgQEAgdm9pZCBfX2luaXQgbW1fY29yZV9pbml0KHZvaWQpXG4gXHRpbml0X3plcm9fcGFnZV9wZm4oKTtcbiBcbiBcdC8qIEluaXRpYWxpemF0aW9ucyByZWx5aW5nIG9uIFNNUCBzZXR1cCAqL1xuLVx0QlVJTERfQlVHX09OKE1BWF9aT05FTElTVFMgXHUwMDNlIDIpO1xuK1x0QlVJTERfQlVHX09OKE1BWF9aT05FTElTVFMgXHUwMDNlIDQpO1xuIFx0YnVpbGRfYWxsX3pvbmVsaXN0cyhOVUxMKTtcbiBcdHBhZ2VfYWxsb2NfaW5pdF9jcHVocCgpO1xuIFx0YWxsb2NfdGFnX3NlY19pbml0KCk7XG5kaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jXG5pbmRleCAwODE1N2E4Mjc3NjE2YS4uMzllMmQyYTljZDliY2YgMTAwNjQ0XG4tLS0gYS9tbS9wYWdlX2FsbG9jLmNcbisrKyBiL21tL3BhZ2VfYWxsb2MuY1xuQEAgLTUxMDIsNyArNTEwMiw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwcmVwYXJlX2FsbG9jX3BhZ2VzKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4gXHRcdHVuc2lnbmVkIGludCAqYWxsb2NfZmxhZ3MpXG4ge1xuIFx0YWMtXHUwMDNlaGlnaGVzdF96b25laWR4ID0gZ2ZwX3pvbmUoZ2ZwX21hc2spO1xuLVx0YWMtXHUwMDNlem9uZWxpc3QgPSBub2RlX3pvbmVsaXN0KHByZWZlcnJlZF9uaWQsIGdmcF9tYXNrKTtcbitcdGFjLVx1MDAzZXpvbmVsaXN0ID0gc2VsZWN0X3pvbmVsaXN0KHByZWZlcnJlZF9uaWQsIGdmcF9tYXNrLCBhYy1cdTAwM2VhbGxvY19mbGFncyk7XG4gXHRhYy1cdTAwM2Vub2RlbWFzayA9IG5vZGVtYXNrO1xuIFx0YWMtXHUwMDNlbWlncmF0ZXR5cGUgPSBnZnBfbWlncmF0ZXR5cGUoZ2ZwX21hc2spO1xuIFxuQEAgLTUxNjUsOCArNTE2NSw4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwcmVwYXJlX2FsbG9jX3BhZ2VzKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsXG4gICogQHBhZ2VfYXJyYXkgd2VyZSBzZXQgdG8gJU5VTEwgb24gZW50cnksIHRoZSBzbG90cyBmcm9tIDAgdG8gdGhlIHJldHVybiB2YWx1ZVxuICAqIC0gMSB3aWxsIGJlIGZpbGxlZC5cbiAgKi9cbi11bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXG4tXHRcdFx0bm9kZW1hc2tfdCAqbm9kZW1hc2ssIGludCBucl9wYWdlcyxcbit1bnNpZ25lZCBsb25nIF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MsXG4rXHRcdFx0aW50IHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrX3QgKm5vZGVtYXNrLCBpbnQgbnJfcGFnZXMsXG4gXHRcdFx0c3RydWN0IHBhZ2UgKipwYWdlX2FycmF5KVxuIHtcbiBcdHN0cnVjdCBwYWdlICpwYWdlO1xuQEAgLTUxNzQsOCArNTE3NCw4IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCxcbiBcdHN0cnVjdCB6b25lcmVmICp6O1xuIFx0c3RydWN0IHBlcl9jcHVfcGFnZXMgKnBjcDtcbiBcdHN0cnVjdCBsaXN0X2hlYWQgKnBjcF9saXN0O1xuLVx0c3RydWN0IGFsbG9jX2NvbnRleHQgYWM7XG4tXHR1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MgPSBBTExPQ19XTUFSS19MT1c7XG4rXHRzdHJ1Y3QgYWxsb2NfY29udGV4dCBhYyA9IHsgLmFsbG9jX2ZsYWdzID0gYWxsb2NfZmxhZ3MgfTtcbitcdHVuc2lnbmVkIGludCBmYXN0cGF0aF9hbGxvY19mbGFncyA9IGFsbG9jX2ZsYWdzIHwgQUxMT0NfV01BUktfTE9XO1xuIFx0aW50IG5yX3BvcHVsYXRlZCA9IDAsIG5yX2FjY291bnQgPSAwO1xuIFxuIFx0LypcbkBAIC01MjE1LDcgKzUyMTUsNyBAQCB1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXG4gXG4gXHQvKiBNYXkgc2V0IEFMTE9DX05PRlJBR01FTlQsIGZyYWdtZW50YXRpb24gd2lsbCByZXR1cm4gMSBwYWdlLiAqL1xuIFx0Z2ZwIFx1MDAyNj0gZ2ZwX2FsbG93ZWRfbWFzaztcbi1cdGlmICghcHJlcGFyZV9hbGxvY19wYWdlcyhnZnAsIDAsIHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrLCBcdTAwMjZhYywgXHUwMDI2Z2ZwLCBcdTAwMjZhbGxvY19mbGFncykpXG4rXHRpZiAoIXByZXBhcmVfYWxsb2NfcGFnZXMoZ2ZwLCAwLCBwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgXHUwMDI2YWMsIFx1MDAyNmdmcCwgXHUwMDI2ZmFzdHBhdGhfYWxsb2NfZmxhZ3MpKVxuIFx0XHRnb3RvIG91dDtcbiBcbiBcdC8qIEZpbmQgYW4gYWxsb3dlZCBsb2NhbCB6b25lIHRoYXQgbWVldHMgdGhlIGxvdyB3YXRlcm1hcmsuICovXG5AQCAtNTIyMyw3ICs1MjIzLDcgQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxuIFx0Zm9yX25leHRfem9uZV96b25lbGlzdF9ub2RlbWFzayh6b25lLCB6LCBhYy5oaWdoZXN0X3pvbmVpZHgsIGFjLm5vZGVtYXNrKSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgbWFyaztcbiBcbi1cdFx0aWYgKGNwdXNldHNfZW5hYmxlZCgpIFx1MDAyNlx1MDAyNiAoYWxsb2NfZmxhZ3MgXHUwMDI2IEFMTE9DX0NQVVNFVCkgXHUwMDI2XHUwMDI2XG4rXHRcdGlmIChjcHVzZXRzX2VuYWJsZWQoKSBcdTAwMjZcdTAwMjYgKGZhc3RwYXRoX2FsbG9jX2ZsYWdzIFx1MDAyNiBBTExPQ19DUFVTRVQpIFx1MDAyNlx1MDAyNlxuIFx0XHQgICAgIV9fY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lLCBnZnApKSB7XG4gXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbkBAIC01MjMzLDE2ICs1MjMzLDE3IEBAIHVuc2lnbmVkIGxvbmcgYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCBpbnQgcHJlZmVycmVkX25pZCxcbiBcdFx0XHRnb3RvIGZhaWxlZDtcbiBcdFx0fVxuIFxuLVx0XHRjb25kX2FjY2VwdF9tZW1vcnkoem9uZSwgMCwgYWxsb2NfZmxhZ3MpO1xuK1x0XHRjb25kX2FjY2VwdF9tZW1vcnkoem9uZSwgMCwgZmFzdHBhdGhfYWxsb2NfZmxhZ3MpO1xuIHJldHJ5X3RoaXNfem9uZTpcbi1cdFx0bWFyayA9IHdtYXJrX3BhZ2VzKHpvbmUsIGFsbG9jX2ZsYWdzIFx1MDAyNiBBTExPQ19XTUFSS19NQVNLKSArIG5yX3BhZ2VzIC0gbnJfcG9wdWxhdGVkO1xuK1x0XHRtYXJrID0gd21hcmtfcGFnZXMoem9uZSwgZmFzdHBhdGhfYWxsb2NfZmxhZ3MgXHUwMDI2IEFMTE9DX1dNQVJLX01BU0spICtcbitcdFx0ICAgICAgIG5yX3BhZ2VzIC0gbnJfcG9wdWxhdGVkO1xuIFx0XHRpZiAoem9uZV93YXRlcm1hcmtfZmFzdCh6b25lLCAwLCAgbWFyayxcbiBcdFx0XHRcdHpvbmVsaXN0X3pvbmVfaWR4KGFjLnByZWZlcnJlZF96b25lcmVmKSxcbi1cdFx0XHRcdGFsbG9jX2ZsYWdzLCBnZnApKSB7XG4rXHRcdFx0XHRmYXN0cGF0aF9hbGxvY19mbGFncywgZ2ZwKSkge1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXG4tXHRcdGlmIChjb25kX2FjY2VwdF9tZW1vcnkoem9uZSwgMCwgYWxsb2NfZmxhZ3MpKVxuK1x0XHRpZiAoY29uZF9hY2NlcHRfbWVtb3J5KHpvbmUsIDAsIGZhc3RwYXRoX2FsbG9jX2ZsYWdzKSlcbiBcdFx0XHRnb3RvIHJldHJ5X3RoaXNfem9uZTtcbiBcbiBcdFx0LyogVHJ5IGFnYWluIGlmIHpvbmUgaGFzIGRlZmVycmVkIHBhZ2VzICovXG5AQCAtNTI3NCw3ICs1Mjc1LDcgQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHR9XG4gXG4tXHRcdHBhZ2UgPSBfX3JtcXVldWVfcGNwbGlzdCh6b25lLCAwLCBhYy5taWdyYXRldHlwZSwgYWxsb2NfZmxhZ3MsXG4rXHRcdHBhZ2UgPSBfX3JtcXVldWVfcGNwbGlzdCh6b25lLCAwLCBhYy5taWdyYXRldHlwZSwgZmFzdHBhdGhfYWxsb2NfZmxhZ3MsXG4gXHRcdFx0XHRcdFx0XHRcdHBjcCwgcGNwX2xpc3QpO1xuIFx0XHRpZiAodW5saWtlbHkoIXBhZ2UpKSB7XG4gXHRcdFx0LyogVHJ5IGFuZCBhbGxvY2F0ZSBhdCBsZWFzdCBvbmUgcGFnZSAqL1xuQEAgLTUzMDAsMTEgKzUzMDEsMTkgQEAgdW5zaWduZWQgbG9uZyBhbGxvY19wYWdlc19idWxrX25vcHJvZihnZnBfdCBnZnAsIGludCBwcmVmZXJyZWRfbmlkLFxuIFx0cmV0dXJuIG5yX3BvcHVsYXRlZDtcbiBcbiBmYWlsZWQ6XG4tXHRwYWdlID0gX19hbGxvY19wYWdlc19ub3Byb2YoZ2ZwLCAwLCBwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgQUxMT0NfREVGQVVMVCk7XG4rXHRwYWdlID0gX19hbGxvY19wYWdlc19ub3Byb2YoZ2ZwLCAwLCBwcmVmZXJyZWRfbmlkLCBub2RlbWFzaywgYWxsb2NfZmxhZ3MpO1xuIFx0aWYgKHBhZ2UpXG4gXHRcdHBhZ2VfYXJyYXlbbnJfcG9wdWxhdGVkKytdID0gcGFnZTtcbiBcdGdvdG8gb3V0O1xuIH1cbitcbit1bnNpZ25lZCBsb25nIGFsbG9jX3BhZ2VzX2J1bGtfbm9wcm9mKGdmcF90IGdmcCwgaW50IHByZWZlcnJlZF9uaWQsXG4rXHRcdFx0bm9kZW1hc2tfdCAqbm9kZW1hc2ssIGludCBucl9wYWdlcyxcbitcdFx0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VfYXJyYXkpXG4re1xuK1x0cmV0dXJuIF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwLCBBTExPQ19ERUZBVUxULCBwcmVmZXJyZWRfbmlkLFxuK1x0XHRcdFx0XHQgbm9kZW1hc2ssIG5yX3BhZ2VzLCBwYWdlX2FycmF5KTtcbit9XG4gRVhQT1JUX1NZTUJPTF9HUEwoYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YpO1xuIFxuIC8qXG5AQCAtNTM5OSw3ICs1NDA4LDcgQEAgc3RydWN0IHBhZ2UgKl9fYWxsb2NfZnJvemVuX3BhZ2VzX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcbiBcdHVuc2lnbmVkIGludCBmYXN0cGF0aF9hbGxvY19mbGFncyA9IGFsbG9jX2ZsYWdzO1xuIFxuIFx0LyogT3RoZXIgZmxhZ3MgY291bGQgYmUgc3VwcG9ydGVkIGxhdGVyIGlmIG5lZWRlZC4gKi9cbi1cdGlmIChXQVJOX09OKGFsbG9jX2ZsYWdzIFx1MDAyNiB+KEFMTE9DX05PTE9DSyB8IEFMTE9DX05PX0NPREVUQUcpKSlcbitcdGlmIChXQVJOX09OKGFsbG9jX2ZsYWdzIFx1MDAyNiB+KEFMTE9DX05PTE9DSyB8IEFMTE9DX05PX0NPREVUQUcgfCBBTExPQ19aT05FTElTVF9QUklWQVRFKSkpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuIFx0aWYgKCFhbGxvY19vcmRlcl9hbGxvd2VkKGdmcCwgb3JkZXIsIGFsbG9jX2ZsYWdzKSlcbkBAIC01NDk1LDEzICs1NTA0LDM2IEBAIHN0cnVjdCBwYWdlICphbGxvY19wYWdlc19ub2RlX25vcHJvZihpbnQgbmlkLCBnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyXG4gRVhQT1JUX1NZTUJPTChhbGxvY19wYWdlc19ub2RlX25vcHJvZik7XG4gXG4gc3RydWN0IGZvbGlvICpfX2ZvbGlvX2FsbG9jX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IHByZWZlcnJlZF9uaWQsXG4tXHRcdG5vZGVtYXNrX3QgKm5vZGVtYXNrKVxuK1x0XHRub2RlbWFza190ICpub2RlbWFzaywgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzKVxuIHtcbiBcdHN0cnVjdCBwYWdlICpwYWdlID0gX19hbGxvY19wYWdlc19ub3Byb2YoZ2ZwIHwgX19HRlBfQ09NUCwgb3JkZXIsXG4tXHRcdFx0XHRcdHByZWZlcnJlZF9uaWQsIG5vZGVtYXNrLCBBTExPQ19ERUZBVUxUKTtcbitcdFx0XHRcdFx0cHJlZmVycmVkX25pZCwgbm9kZW1hc2ssIGFsbG9jX2ZsYWdzKTtcbiBcdHJldHVybiBwYWdlX3JtYXBwYWJsZV9mb2xpbyhwYWdlKTtcbiB9XG4tRVhQT1JUX1NZTUJPTChfX2ZvbGlvX2FsbG9jX25vcHJvZik7XG4rXG4rc3RydWN0IGZvbGlvICpfX2ZvbGlvX2FsbG9jX25vZGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLCBpbnQgbmlkKVxuK3tcbitcdHdhcm5faWZfbm9kZV9vZmZsaW5lKG5pZCwgZ2ZwKTtcbitcbitcdHJldHVybiBfX2ZvbGlvX2FsbG9jX25vcHJvZihnZnAsIG9yZGVyLCBuaWQsIE5VTEwsIEFMTE9DX0RFRkFVTFQpO1xuK31cbitFWFBPUlRfU1lNQk9MKF9fZm9saW9fYWxsb2Nfbm9kZV9ub3Byb2YpO1xuK1xuK3N0cnVjdCBwYWdlICphbGxvY19wYWdlc19ub2RlX3ByaXZhdGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuK1x0XHRpbnQgbmlkKVxuK3tcbitcdHJldHVybiBfX2FsbG9jX3BhZ2VzX25vcHJvZihnZnAsIG9yZGVyLCBuaWQsIE5VTEwsXG4rXHRcdFx0XHQgICBBTExPQ19aT05FTElTVF9QUklWQVRFKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwoYWxsb2NfcGFnZXNfbm9kZV9wcml2YXRlX25vcHJvZik7XG4rXG4rc3RydWN0IGZvbGlvICpmb2xpb19hbGxvY19ub2RlX3ByaXZhdGVfbm9wcm9mKGdmcF90IGdmcCwgdW5zaWduZWQgaW50IG9yZGVyLFxuK1x0XHRpbnQgbmlkKVxuK3tcbitcdHJldHVybiBfX2ZvbGlvX2FsbG9jX25vcHJvZihnZnAsIG9yZGVyLCBuaWQsIE5VTEwsXG4rXHRcdFx0XHQgICBBTExPQ19aT05FTElTVF9QUklWQVRFKTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwoZm9saW9fYWxsb2Nfbm9kZV9wcml2YXRlX25vcHJvZik7XG4gXG4gLypcbiAgKiBDb21tb24gaGVscGVyIGZ1bmN0aW9ucy4gTmV2ZXIgdXNlIHdpdGggX19HRlBfSElHSE1FTSBiZWNhdXNlIHRoZSByZXR1cm5lZFxuQEAgLTU4MDUsOSArNTgzNywxMCBAQCBzdGF0aWMgaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxuIHN0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107XG4gXG4gLyoqXG4tICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdFxuKyAqIGZpbmRfbmV4dF9iZXN0X25vZGVfaW4gLSBmaW5kIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3RcbiAgKiBAbm9kZTogbm9kZSB3aG9zZSBmYWxsYmFjayBsaXN0IHdlJ3JlIGFwcGVuZGluZ1xuICAqIEB1c2VkX25vZGVfbWFzazogbm9kZW1hc2tfdCBvZiBhbHJlYWR5IHVzZWQgbm9kZXNcbisgKiBAY2FuZGlkYXRlczogbm9kZW1hc2tfdCBvZiBub2RlcyBlbGlnaWJsZSBmb3Igc2VsZWN0aW9uXG4gICpcbiAgKiBXZSB1c2UgYSBudW1iZXIgb2YgZmFjdG9ycyB0byBkZXRlcm1pbmUgd2hpY2ggaXMgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZFxuICAqIGFwcGVhciBvbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0LiAgVGhlIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFwcGVhcmVkXG5AQCAtNTgxOSw3ICs1ODUyLDggQEAgc3RhdGljIGludCBub2RlX2xvYWRbTUFYX05VTU5PREVTXTtcbiAgKlxuICAqIFJldHVybjogbm9kZSBpZCBvZiB0aGUgZm91bmQgbm9kZSBvciAlTlVNQV9OT19OT0RFIGlmIG5vIG5vZGUgaXMgZm91bmQuXG4gICovXG4taW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxuK2ludCBmaW5kX25leHRfYmVzdF9ub2RlX2luKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzayxcbitcdFx0XHQgICBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzKVxuIHtcbiBcdGludCBuLCB2YWw7XG4gXHRpbnQgbWluX3ZhbCA9IElOVF9NQVg7XG5AQCAtNTgyOSwxMiArNTg2MywxMiBAQCBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spXG4gXHQgKiBVc2UgdGhlIGxvY2FsIG5vZGUgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCBidXQgZm9yIG1lbW9yeWxlc3MgbG9jYWxcbiBcdCAqIG5vZGUsIHdlIHNob3VsZCBza2lwIGl0IGFuZCBmYWxsIGJhY2sgdG8gb3RoZXIgbm9kZXMuXG4gXHQgKi9cbi1cdGlmICghbm9kZV9pc3NldChub2RlLCAqdXNlZF9ub2RlX21hc2spIFx1MDAyNlx1MDAyNiBub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZKSkge1xuK1x0aWYgKCFub2RlX2lzc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzaykgXHUwMDI2XHUwMDI2IG5vZGVfaXNzZXQobm9kZSwgKmNhbmRpZGF0ZXMpKSB7XG4gXHRcdG5vZGVfc2V0KG5vZGUsICp1c2VkX25vZGVfbWFzayk7XG4gXHRcdHJldHVybiBub2RlO1xuIFx0fVxuIFxuLVx0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuLCBOX01FTU9SWSkge1xuK1x0Zm9yX2VhY2hfbm9kZV9tYXNrKG4sICpjYW5kaWRhdGVzKSB7XG4gXG4gXHRcdC8qIERvbid0IHdhbnQgYSBub2RlIHRvIGFwcGVhciBtb3JlIHRoYW4gb25jZSAqL1xuIFx0XHRpZiAobm9kZV9pc3NldChuLCAqdXNlZF9ub2RlX21hc2spKVxuQEAgLTU4NzMsMTIgKzU5MDcsMTIgQEAgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKVxuICAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLlxuICAqL1xuIHN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnX2RhdGFfdCAqcGdkYXQsIGludCAqbm9kZV9vcmRlcixcbi1cdFx0dW5zaWduZWQgbnJfbm9kZXMpXG4rXHRcdHVuc2lnbmVkIGludCBucl9ub2RlcywgaW50IHpsaWR4KVxuIHtcbiBcdHN0cnVjdCB6b25lcmVmICp6b25lcmVmcztcbiBcdGludCBpO1xuIFxuLVx0em9uZXJlZnMgPSBwZ2RhdC1cdTAwM2Vub2RlX3pvbmVsaXN0c1taT05FTElTVF9GQUxMQkFDS10uX3pvbmVyZWZzO1xuK1x0em9uZXJlZnMgPSBwZ2RhdC1cdTAwM2Vub2RlX3pvbmVsaXN0c1t6bGlkeF0uX3pvbmVyZWZzO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfbm9kZXM7IGkrKykge1xuIFx0XHRpbnQgbnJfem9uZXM7XG5AQCAtNTg5OCwzNCArNTkzMiw0OSBAQCBzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgKm5vZGVfb3JkZXIsXG4gc3RhdGljIHZvaWQgYnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4ge1xuIFx0c3RydWN0IHpvbmVyZWYgKnpvbmVyZWZzO1xuLVx0aW50IG5yX3pvbmVzO1xuK1x0aW50IG5yX3pvbmVzID0gMDtcbiBcbitcdC8qXG4rXHQgKiBOT0ZBTExCQUNLOiB0aGUgbm9kZSdzIG93biB6b25lcy4gRU1QVFkgZm9yIHByaXZhdGUgbm9kZXMgc28gYVxuK1x0ICogc3RyYXkgX19HRlBfVEhJU05PREUgYWxsb2NhdGlvbiBjYW4ndCB2aW9sYXRlIGlzb2xhdGlvbi5cbitcdCAqL1xuIFx0em9uZXJlZnMgPSBwZ2RhdC1cdTAwM2Vub2RlX3pvbmVsaXN0c1taT05FTElTVF9OT0ZBTExCQUNLXS5fem9uZXJlZnM7XG4rXHRpZiAoIW5vZGVfaXNfcHJpdmF0ZShwZ2RhdC1cdTAwM2Vub2RlX2lkKSlcbitcdFx0bnJfem9uZXMgPSBidWlsZF96b25lcmVmc19ub2RlKHBnZGF0LCB6b25lcmVmcyk7XG4rXHR6b25lcmVmcyArPSBucl96b25lcztcbitcdHpvbmVyZWZzLVx1MDAzZXpvbmUgPSBOVUxMO1xuK1x0em9uZXJlZnMtXHUwMDNlem9uZV9pZHggPSAwO1xuK1xuK1x0LyogUFJJVkFURV9OT0ZBTExCQUNLOiB0aGUgbm9kZSdzIG93biB6b25lcywgcHJpdmF0ZSBub2RlcyBpbmNsdWRlZC4gKi9cbitcdHpvbmVyZWZzID0gcGdkYXQtXHUwMDNlbm9kZV96b25lbGlzdHNbWk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLXS5fem9uZXJlZnM7XG4gXHRucl96b25lcyA9IGJ1aWxkX3pvbmVyZWZzX25vZGUocGdkYXQsIHpvbmVyZWZzKTtcbiBcdHpvbmVyZWZzICs9IG5yX3pvbmVzO1xuIFx0em9uZXJlZnMtXHUwMDNlem9uZSA9IE5VTEw7XG4gXHR6b25lcmVmcy1cdTAwM2V6b25lX2lkeCA9IDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KVxuKy8qXG4rICogQnVpbGQgb25lIG5vZGUtb3JkZXJlZCBmYWxsYmFjayBsaXN0IGZyb20gYSBjYW5kaWRhdGUgbm9kZW1hc2suXG4rICogdXBkYXRlX2xvYWQgcm91bmQtcm9iaW5zIG5vZGVfbG9hZCBhY3Jvc3MgZXF1aWRpc3RhbnQgbm9kZXMuXG4rICovXG4rc3RhdGljIHZvaWQgYnVpbGRfbm9kZV96b25lbGlzdChwZ19kYXRhX3QgKnBnZGF0LCBjb25zdCBub2RlbWFza190ICpjYW5kaWRhdGVzLFxuK1x0XHRcdFx0aW50IHpsaWR4LCBib29sIHVwZGF0ZV9sb2FkLFxuK1x0XHRcdFx0aW50ICpub2RlX29yZGVyLCBpbnQgKm5yKVxuIHtcbi1cdHN0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdO1xuLVx0aW50IG5vZGUsIG5yX25vZGVzID0gMDtcbiBcdG5vZGVtYXNrX3QgdXNlZF9tYXNrID0gTk9ERV9NQVNLX05PTkU7XG4tXHRpbnQgbG9jYWxfbm9kZSwgcHJldl9ub2RlO1xuLVxuLVx0LyogTlVNQS1hd2FyZSBvcmRlcmluZyBvZiBub2RlcyAqL1xuLVx0bG9jYWxfbm9kZSA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG4tXHRwcmV2X25vZGUgPSBsb2NhbF9ub2RlO1xuK1x0aW50IGxvY2FsX25vZGUgPSBwZ2RhdC1cdTAwM2Vub2RlX2lkO1xuK1x0aW50IHByZXZfbm9kZSA9IGxvY2FsX25vZGU7XG4rXHRpbnQgbm9kZSwgbnJfbm9kZXMgPSAwO1xuIFxuLVx0bWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7XG4tXHR3aGlsZSAoKG5vZGUgPSBmaW5kX25leHRfYmVzdF9ub2RlKGxvY2FsX25vZGUsIFx1MDAyNnVzZWRfbWFzaykpIFx1MDAzZT0gMCkge1xuK1x0d2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZV9pbihsb2NhbF9ub2RlLCBcdTAwMjZ1c2VkX21hc2ssXG4rXHRcdFx0XHRcdCAgICAgIGNhbmRpZGF0ZXMpKSBcdTAwM2U9IDApIHtcbiBcdFx0LypcbiBcdFx0ICogV2UgZG9uJ3Qgd2FudCB0byBwcmVzc3VyZSBhIHBhcnRpY3VsYXIgbm9kZS5cbiBcdFx0ICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZVxuIFx0XHQgKiBkaXN0YW5jZSBncm91cCB0byBtYWtlIGl0IHJvdW5kLXJvYmluLlxuIFx0XHQgKi9cbi1cdFx0aWYgKG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgbm9kZSkgIT1cbitcdFx0aWYgKHVwZGF0ZV9sb2FkIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBub2RlKSAhPVxuIFx0XHQgICAgbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBwcmV2X25vZGUpKVxuIFx0XHRcdG5vZGVfbG9hZFtub2RlXSArPSAxO1xuIFxuQEAgLTU5MzMsMTIgKzU5ODIsNDcgQEAgc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4gXHRcdHByZXZfbm9kZSA9IG5vZGU7XG4gXHR9XG4gXG4tXHRidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZV9vcmRlciwgbnJfbm9kZXMpO1xuK1x0YnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdkYXQsIG5vZGVfb3JkZXIsIG5yX25vZGVzLCB6bGlkeCk7XG4rXHQqbnIgPSBucl9ub2Rlcztcbit9XG4rXG4rc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpXG4re1xuK1x0c3RhdGljIGludCBub2RlX29yZGVyW01BWF9OVU1OT0RFU107XG4rXHRub2RlbWFza190IHRpZXJfbm9kZXM7XG4rXHRpbnQgbG9jYWxfbm9kZSA9IHBnZGF0LVx1MDAzZW5vZGVfaWQ7XG4rXHRpbnQgbm9kZSwgbnJfbm9kZXMgPSAwO1xuK1xuK1x0bWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7XG4rXG4rXHQvKlxuK1x0ICogWm9uZWxpc3RzOiBGQUxMQkFDSywgTk9GQUxMQkFDSywgUFJJVkFURVxuK1x0ICpcbitcdCAqIEZBTExCQUNLOiAgIEFsbG9jYXRpb24gb3JkZXIgZm9yIGFsbCBub2Rlcy4gIFByaXZhdGUgbm9kZXMgaGF2ZSBsaXN0c1xuK1x0ICogICAgICAgICAgICAgYnV0IG5ldmVyIGFwcGVhciBhcyBhbiBlbnRyeSBpbiBhbnkgbGlzdC4gQWxsb2NhdGlvbnNcbitcdCAqICAgICAgICAgICAgIHRhcmdldGluZyBhIHByaXZhdGUgbm9kZSB3LyBGQUxMQkFDSyBsYW5kIG9uIE5fTUVNT1JZLlxuK1x0ICpcbitcdCAqIE5PRkFMTEJBQ0s6IEEgbGlzdCBmb3IgZWFjaCBub2RlIGNvbnRhaW5pbmcgb25seSBpdHNlbGYuXG4rXHQgKiAgICAgICAgICAgICBBbGxvY2F0aW9ucyB0YXJnZXRpbmcgYSBwcml2YXRlIG5vZGUgdy8gTk9GQUxMQkFDS1xuK1x0ICogICAgICAgICAgICAgd2lsbCBhbHdheXMgZmFpbCAodGhlaXIgTk9GQUxMQkFDSyBpcyBlbXB0eSlcbitcdCAqXG4rXHQgKiBQUklWQVRFOiAgICAoTl9NRU1PUlkgfCBOX01FTU9SWV9QUklWQVRFKSAtIGFsbG93cyBhY2Nlc3MgdG9cbitcdCAqICAgICAgICAgICAgIHByaXZhdGUgbm9kZXMsIGFuZCBmYWxscyBiYWNrIHRvIG5vcm1hbCBtZW1vcnkgdW5sZXNzXG4rXHQgKiAgICAgICAgICAgICBfX0dGUF9USElTTk9ERSBvdGhlcndpc2UgY29uc3RyYWlucyBpdC5cbitcdCAqL1xuK1xuK1x0YnVpbGRfbm9kZV96b25lbGlzdChwZ2RhdCwgXHUwMDI2bm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBaT05FTElTVF9GQUxMQkFDSyxcbitcdFx0XHQgICAgdHJ1ZSwgbm9kZV9vcmRlciwgXHUwMDI2bnJfbm9kZXMpO1xuIFx0YnVpbGRfdGhpc25vZGVfem9uZWxpc3RzKHBnZGF0KTtcbitcbiBcdHByX2luZm8oXCJGYWxsYmFjayBvcmRlciBmb3IgTm9kZSAlZDogXCIsIGxvY2FsX25vZGUpO1xuIFx0Zm9yIChub2RlID0gMDsgbm9kZSBcdTAwM2MgbnJfbm9kZXM7IG5vZGUrKylcbiBcdFx0cHJfY29udChcIiVkIFwiLCBub2RlX29yZGVyW25vZGVdKTtcbiBcdHByX2NvbnQoXCJcXG5cIik7XG4rXG4rXHRub2Rlc19vcih0aWVyX25vZGVzLCBub2RlX3N0YXRlc1tOX01FTU9SWV0sIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcbitcdGJ1aWxkX25vZGVfem9uZWxpc3QocGdkYXQsIFx1MDAyNnRpZXJfbm9kZXMsIFpPTkVMSVNUX1BSSVZBVEUsIGZhbHNlLFxuK1x0XHRcdCAgICBub2RlX29yZGVyLCBcdTAwMjZucl9ub2Rlcyk7XG4gfVxuIFxuICNpZmRlZiBDT05GSUdfSEFWRV9NRU1PUllMRVNTX05PREVTXG5AQCAtNjUzMyw2ICs2NjE3LDEwIEBAIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZV90b3RhbHJlc2VydmVfcGFnZXModm9pZClcbiBcbiBcdFx0cGdkYXQtXHUwMDNldG90YWxyZXNlcnZlX3BhZ2VzID0gMDtcbiBcbitcdFx0LyogcHJpdmF0ZSBub2RlcyBoYXZlIHplcm8gd2F0ZXJtYXJrcyAqL1xuK1x0XHRpZiAobm9kZV9pc19wcml2YXRlKHBnZGF0LVx1MDAzZW5vZGVfaWQpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBNQVhfTlJfWk9ORVM7IGkrKykge1xuIFx0XHRcdHN0cnVjdCB6b25lICp6b25lID0gcGdkYXQtXHUwMDNlbm9kZV96b25lcyArIGk7XG4gXHRcdFx0bG9uZyBtYXggPSAwO1xuQEAgLTY2MjUsOSArNjcxMywxNSBAQCBzdGF0aWMgdm9pZCBfX3NldHVwX3Blcl96b25lX3dtYXJrcyh2b2lkKVxuIFx0c3RydWN0IHpvbmUgKnpvbmU7XG4gXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuIFxuLVx0LyogQ2FsY3VsYXRlIHRvdGFsIG51bWJlciBvZiAhWk9ORV9ISUdITUVNIGFuZCAhWk9ORV9NT1ZBQkxFIHBhZ2VzICovXG4rXHQvKlxuK1x0ICogQ2FsY3VsYXRlIHRvdGFsIG51bWJlciBvZiAhWk9ORV9ISUdITUVNIGFuZCAhWk9ORV9NT1ZBQkxFIHBhZ2VzXG4rXHQgKlxuK1x0ICogUHJpdmF0ZSBub2RlcyBhcmUgZXhjbHVkZWQgYmVjYXVzZSB0aGV5IGFyZSBub3QgaW4gdGhlIHJlZ3VsYXJcbitcdCAqIGFsbG9jYXRpb24gZmFsbGJhY2sgcGF0aCAtIGluY2x1ZGluZyB0aGVtIGRpbHV0ZXMgRFJBTSB3YXRlcm1hcmtzLlxuK1x0ICovXG4gXHRmb3JfZWFjaF96b25lKHpvbmUpIHtcbi1cdFx0aWYgKCFpc19oaWdobWVtKHpvbmUpIFx1MDAyNlx1MDAyNiB6b25lX2lkeCh6b25lKSAhPSBaT05FX01PVkFCTEUpXG4rXHRcdGlmICghaXNfaGlnaG1lbSh6b25lKSBcdTAwMjZcdTAwMjYgem9uZV9pZHgoem9uZSkgIT0gWk9ORV9NT1ZBQkxFIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgIW5vZGVfaXNfcHJpdmF0ZSh6b25lX3RvX25pZCh6b25lKSkpXG4gXHRcdFx0bG93bWVtX3BhZ2VzICs9IHpvbmVfbWFuYWdlZF9wYWdlcyh6b25lKTtcbiBcdH1cbiBcbkBAIC02NjM1LDYgKzY3MjksMTYgQEAgc3RhdGljIHZvaWQgX19zZXR1cF9wZXJfem9uZV93bWFya3Modm9pZClcbiBcdFx0dTY0IHRtcDtcbiBcbiBcdFx0c3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2em9uZS1cdTAwM2Vsb2NrLCBmbGFncyk7XG4rXHRcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbSh6b25lX3RvX25pZCh6b25lKSkpIHtcbitcdFx0XHR6b25lLVx1MDAzZV93YXRlcm1hcmtbV01BUktfTUlOXSA9IDA7XG4rXHRcdFx0em9uZS1cdTAwM2Vfd2F0ZXJtYXJrW1dNQVJLX0xPV10gPSAwO1xuK1x0XHRcdHpvbmUtXHUwMDNlX3dhdGVybWFya1tXTUFSS19ISUdIXSA9IDA7XG4rXHRcdFx0em9uZS1cdTAwM2Vfd2F0ZXJtYXJrW1dNQVJLX1BST01PXSA9IDA7XG4rXHRcdFx0em9uZS1cdTAwM2V3YXRlcm1hcmtfYm9vc3QgPSAwO1xuK1x0XHRcdHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoXHUwMDI2em9uZS1cdTAwM2Vsb2NrLCBmbGFncyk7XG4rXHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcbiBcdFx0dG1wID0gKHU2NClwYWdlc19taW4gKiB6b25lX21hbmFnZWRfcGFnZXMoem9uZSk7XG4gXHRcdHRtcCA9IGRpdjY0X3VsKHRtcCwgbG93bWVtX3BhZ2VzKTtcbiBcdFx0aWYgKGlzX2hpZ2htZW0oem9uZSkgfHwgem9uZV9pZHgoem9uZSkgPT0gWk9ORV9NT1ZBQkxFKSB7XG5AQCAtNzMwOSw2ICs3NDEzLDE1IEBAIGludCBhbGxvY19jb250aWdfZnJvemVuX3JhbmdlX25vcHJvZih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCxcbiBcdGlmIChfX2FsbG9jX2NvbnRpZ192ZXJpZnlfZ2ZwX21hc2soZ2ZwX21hc2ssIChnZnBfdCAqKVx1MDAyNmNjLmdmcF9tYXNrKSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4rXHQvKlxuK1x0ICogUHJpdmF0ZSBub2RlcyBhcmUga2VwdCB1bnJlYWNoYWJsZSB2aWEgdGhlIHpvbmVsaXN0cywgYnV0XG4rXHQgKiBhbGxvY19jb250aWcgd29ya3MgZGlyZWN0bHkgb24gYSB6b25lIGRlcml2ZWQgZnJvbSB0aGUgY2FsbGVyJ3NcbitcdCAqIHBmbiByYW5nZSwgYnlwYXNzaW5nIHRoYXQuICBSZWplY3QgdGhpcyBvcGVyYXRpb24gZXhwbGljaXRseVxuK1x0ICogcmF0aGVyIHRoYW4gc2lsZW50bHkgY2FydmluZyBtZW1vcnkgb3V0IG9mIGFuIGlzb2xhdGVkIG5vZGUuXG4rXHQgKi9cbitcdGlmICh1bmxpa2VseShub2RlX2lzX3ByaXZhdGUoem9uZV90b19uaWQoY2Muem9uZSkpKSlcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcbiBcdC8qXG4gXHQgKiBXaGF0IHdlIGRvIGhlcmUgaXMgd2UgbWFyayBhbGwgcGFnZWJsb2NrcyBpbiByYW5nZSBhc1xuIFx0ICogTUlHUkFURV9JU09MQVRFLiAgQmVjYXVzZSBwYWdlYmxvY2sgYW5kIG1heCBvcmRlciBwYWdlcyBtYXlcbmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmggYi9tbS9wYWdlX2FsbG9jLmhcbmluZGV4IGI5MjU5ZGVkZGI1OWQ3Li43NDE0NDhkODNjZTc3YyAxMDA2NDRcbi0tLSBhL21tL3BhZ2VfYWxsb2MuaFxuKysrIGIvbW0vcGFnZV9hbGxvYy5oXG5AQCAtNTcsNiArNTcsOSBAQFxuICAqL1xuICNkZWZpbmUgQUxMT0NfTk9fQ09ERVRBRyAgICAgICAweDEwMDBcbiBcbisvKiBTZWxlY3QgdGhlIE5fTUVNT1JZX1BSSVZBVEUgem9uZWxpc3QgZmFtaWx5IChzZWUgc2VsZWN0X3pvbmVsaXN0KCkpLiAqL1xuKyNkZWZpbmUgQUxMT0NfWk9ORUxJU1RfUFJJVkFURSAweDIwMDBcbitcbiAvKiBGbGFncyB0aGF0IGFsbG93IGFsbG9jYXRpb25zIGJlbG93IHRoZSBtaW4gd2F0ZXJtYXJrLiAqL1xuICNkZWZpbmUgQUxMT0NfUkVTRVJWRVMgKEFMTE9DX05PTl9CTE9DS3xBTExPQ19NSU5fUkVTRVJWRXxBTExPQ19ISUdIQVRPTUlDfEFMTE9DX09PTSlcbiBcbkBAIC05NSw2ICs5OCwyOSBAQCBzdHJ1Y3QgYWxsb2NfY29udGV4dCB7XG4gXHR1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3M7XG4gfTtcbiBcbisjaWZkZWYgQ09ORklHX05VTUFcbitzdGF0aWNfYXNzZXJ0KFpPTkVMSVNUX1BSSVZBVEUgKyAxID09IFpPTkVMSVNUX1BSSVZBVEVfTk9GQUxMQkFDSyk7XG4rI2VuZGlmXG4rXG4rLypcbisgKiBzZWxlY3Rfem9uZWxpc3QgLSByZXNvbHZlIHRoZSB6b25lbGlzdCBmb3IgYW4gYWxsb2NhdGlvblxuKyAqXG4rICogVGhlIGRlZmF1bHQgbWF0Y2hlcyBub2RlX3pvbmVsaXN0KCk7IEFMTE9DX1pPTkVMSVNUX1BSSVZBVEUgc2VsZWN0cyB0aGVcbisgKiBwcml2YXRlLW5vZGUgZmFtaWx5IHNvIGFuIGFsbG9jYXRpb24gbWF5IHJlYWNoIGFuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZS5cbisgKi9cbitzdGF0aWMgaW5saW5lIHN0cnVjdCB6b25lbGlzdCAqXG4rc2VsZWN0X3pvbmVsaXN0KGludCBuaWQsIGdmcF90IGdmcCwgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzKVxuK3tcbisjaWZkZWYgQ09ORklHX05VTUFcbitcdGlmIChhbGxvY19mbGFncyBcdTAwMjYgQUxMT0NfWk9ORUxJU1RfUFJJVkFURSkge1xuK1x0XHRpbnQgaWR4ID0gWk9ORUxJU1RfUFJJVkFURSArICEhKGdmcCBcdTAwMjYgX19HRlBfVEhJU05PREUpO1xuK1xuK1x0XHRyZXR1cm4gXHUwMDI2Tk9ERV9EQVRBKG5pZCktXHUwMDNlbm9kZV96b25lbGlzdHNbaWR4XTtcbitcdH1cbisjZW5kaWZcbitcdHJldHVybiBub2RlX3pvbmVsaXN0KG5pZCwgZ2ZwKTtcbit9XG4rXG4gLypcbiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9yZGVyIG9mIGEgZnJlZSBwYWdlIGluIHRoZSBidWRkeSBzeXN0ZW0uIEluXG4gICogZ2VuZXJhbCwgcGFnZV96b25lKHBhZ2UpLVx1MDAzZWxvY2sgbXVzdCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIgdG8gcHJldmVudCB0aGVcbkBAIC0yNTgsNiArMjg0LDE0IEBAIHN0cnVjdCBwYWdlICpfX2FsbG9jX3BhZ2VzX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IHByZWZlcnJlZF9uXG4gXHRcdG5vZGVtYXNrX3QgKm5vZGVtYXNrLCB1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MpO1xuICNkZWZpbmUgX19hbGxvY19wYWdlcyguLi4pXHRcdFx0YWxsb2NfaG9va3MoX19hbGxvY19wYWdlc19ub3Byb2YoX19WQV9BUkdTX18pKVxuIFxuK3N0cnVjdCBmb2xpbyAqX19mb2xpb19hbGxvY19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgb3JkZXIsIGludCBwcmVmZXJyZWRfbmlkLFxuK1x0XHRub2RlbWFza190ICpub2RlbWFzaywgdW5zaWduZWQgaW50IGFsbG9jX2ZsYWdzKTtcbisjZGVmaW5lIF9fZm9saW9fYWxsb2MoLi4uKVx0XHRcdGFsbG9jX2hvb2tzKF9fZm9saW9fYWxsb2Nfbm9wcm9mKF9fVkFfQVJHU19fKSlcbitcbit1bnNpZ25lZCBsb25nIF9fYWxsb2NfcGFnZXNfYnVsa19ub3Byb2YoZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBpbnQgYWxsb2NfZmxhZ3MsXG4rXHRcdGludCBwcmVmZXJyZWRfbmlkLCBub2RlbWFza190ICpub2RlbWFzaywgaW50IG5yX3BhZ2VzLFxuK1x0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VfYXJyYXkpO1xuK1xuIGV4dGVybiB2b2lkIHpvbmVfcGNwX3Jlc2V0KHN0cnVjdCB6b25lICp6b25lKTtcbiBleHRlcm4gdm9pZCB6b25lX3BjcF9kaXNhYmxlKHN0cnVjdCB6b25lICp6b25lKTtcbiBleHRlcm4gdm9pZCB6b25lX3BjcF9lbmFibGUoc3RydWN0IHpvbmUgKnpvbmUpO1xuZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmNcbmluZGV4IDliOGVlOTAyZjk3MjhhLi42ZDgxMGE0MmQ0N2Q2NiAxMDA2NDRcbi0tLSBhL21tL3Ztc2Nhbi5jXG4rKysgYi9tbS92bXNjYW4uY1xuQEAgLTk3NSw2ICs5NzUsMTAgQEAgc3RhdGljIHN0cnVjdCBmb2xpbyAqYWxsb2NfZGVtb3RlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqc3JjLFxuIFxuIFx0bXRjID0gKHN0cnVjdCBtaWdyYXRpb25fdGFyZ2V0X2NvbnRyb2wgKilwcml2YXRlO1xuIFxuK1x0aWYgKG10Yy1cdTAwM2VubWFzayBcdTAwMjZcdTAwMjZcbitcdCAgICBub2Rlc19pbnRlcnNlY3RzKCptdGMtXHUwMDNlbm1hc2ssIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSlcbitcdFx0bXRjLVx1MDAzZWFsbG9jX2ZsYWdzID0gQUxMT0NfWk9ORUxJU1RfUFJJVkFURTtcbitcbiBcdC8qXG4gXHQgKiBtYWtlIHN1cmUgd2UgYWxsb2NhdGUgZnJvbSB0aGUgdGFyZ2V0IG5vZGUgZmlyc3QgYWxzbyB0cnlpbmcgdG9cbiBcdCAqIGRlbW90ZSBvciByZWNsYWltIHBhZ2VzIGZyb20gdGhlIHRhcmdldCBub2RlIHZpYSBrc3dhcGQgaWYgd2UgYXJlXG5AQCAtNTQxNiw2ICs1NDIwLDIxIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxydV9nZW5fYXR0cl9ncm91cCA9IHtcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdmcyBpbnRlcmZhY2VcbiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuIFxuKy8qXG4rICogTm9kZXMgdGhlIGxydV9nZW4gZGVidWdmcyBpbnRlcmZhY2UgbGlzdHM6IG9yZGluYXJ5IG1lbW9yeSBub2RlcyBwbHVzIGFueVxuKyAqIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgb3B0ZWQgaW50byByZWNsYWltLiAgcnVuX2NtZCgpIGFscmVhZHkgYWNjZXB0cyB0aGVcbisgKiBsYXR0ZXIsIHNvIGtlZXAgdGhlIGxpc3RpbmcgaW4gc3luYyB3aXRoIHdoYXQgaXQgYWNjZXB0cy5cbisgKi9cbitzdGF0aWMgdm9pZCBscnVfZ2VuX3NlcV9ub2Rlcyhub2RlbWFza190ICpub2Rlcylcbit7XG4rXHRpbnQgbmlkO1xuK1xuK1x0Km5vZGVzID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldO1xuK1x0Zm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpXG4rXHRcdGlmIChub2RlX2FsbG93c19yZWNsYWltKG5pZCkpXG4rXHRcdFx0bm9kZV9zZXQobmlkLCAqbm9kZXMpO1xuK31cbitcbiBzdGF0aWMgdm9pZCAqbHJ1X2dlbl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcylcbiB7XG4gXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG5AQCAtNTQyNyw5ICs1NDQ2LDExIEBAIHN0YXRpYyB2b2lkICpscnVfZ2VuX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKVxuIFxuIFx0bWVtY2cgPSBtZW1fY2dyb3VwX2l0ZXIoTlVMTCwgTlVMTCwgTlVMTCk7XG4gXHRkbyB7XG4rXHRcdG5vZGVtYXNrX3Qgbm9kZXM7XG4gXHRcdGludCBuaWQ7XG4gXG4tXHRcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkge1xuK1x0XHRscnVfZ2VuX3NlcV9ub2RlcyhcdTAwMjZub2Rlcyk7XG4rXHRcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsIG5vZGVzKSB7XG4gXHRcdFx0aWYgKCFucl90b19za2lwLS0pXG4gXHRcdFx0XHRyZXR1cm4gZ2V0X2xydXZlYyhtZW1jZywgbmlkKTtcbiBcdFx0fVxuQEAgLTU0NTEsMTYgKzU0NzIsMTggQEAgc3RhdGljIHZvaWQgKmxydV9nZW5fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcylcbiB7XG4gXHRpbnQgbmlkID0gbHJ1dmVjX3BnZGF0KHYpLVx1MDAzZW5vZGVfaWQ7XG4gXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBscnV2ZWNfbWVtY2codik7XG4rXHRub2RlbWFza190IG5vZGVzO1xuIFxuIFx0KysqcG9zO1xuIFxuLVx0bmlkID0gbmV4dF9tZW1vcnlfbm9kZShuaWQpO1xuK1x0bHJ1X2dlbl9zZXFfbm9kZXMoXHUwMDI2bm9kZXMpO1xuK1x0bmlkID0gbmV4dF9ub2RlKG5pZCwgbm9kZXMpO1xuIFx0aWYgKG5pZCA9PSBNQVhfTlVNTk9ERVMpIHtcbiBcdFx0bWVtY2cgPSBtZW1fY2dyb3VwX2l0ZXIoTlVMTCwgbWVtY2csIE5VTEwpO1xuIFx0XHRpZiAoIW1lbWNnKVxuIFx0XHRcdHJldHVybiBOVUxMO1xuIFxuLVx0XHRuaWQgPSBmaXJzdF9tZW1vcnlfbm9kZTtcbitcdFx0bmlkID0gZmlyc3Rfbm9kZShub2Rlcyk7XG4gXHR9XG4gXG4gXHRyZXR1cm4gZ2V0X2xydXZlYyhtZW1jZywgbmlkKTtcbkBAIC01NTI5LDEwICs1NTUyLDEyIEBAIHN0YXRpYyBpbnQgbHJ1X2dlbl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXG4gXHRzdHJ1Y3QgbHJ1X2dlbl9mb2xpbyAqbHJ1Z2VuID0gXHUwMDI2bHJ1dmVjLVx1MDAzZWxydWdlbjtcbiBcdGludCBuaWQgPSBscnV2ZWNfcGdkYXQobHJ1dmVjKS1cdTAwM2Vub2RlX2lkO1xuIFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbHJ1dmVjX21lbWNnKGxydXZlYyk7XG4rXHRub2RlbWFza190IG5vZGVzO1xuIFx0REVGSU5FX01BWF9TRVEobHJ1dmVjKTtcbiBcdERFRklORV9NSU5fU0VRKGxydXZlYyk7XG4gXG4tXHRpZiAobmlkID09IGZpcnN0X21lbW9yeV9ub2RlKSB7XG4rXHRscnVfZ2VuX3NlcV9ub2RlcyhcdTAwMjZub2Rlcyk7XG4rXHRpZiAobmlkID09IGZpcnN0X25vZGUobm9kZXMpKSB7XG4gXHRcdGNvbnN0IGNoYXIgKnBhdGggPSBtZW1jZyA/IG0tXHUwMDNlcHJpdmF0ZSA6IFwiXCI7XG4gXG4gI2lmZGVmIENPTkZJR19NRU1DR1xuQEAgLTU2MzIsNyArNTY1Nyw5IEBAIHN0YXRpYyBpbnQgcnVuX2NtZChjaGFyIGNtZCwgdTY0IG1lbWNnX2lkLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHNlcSxcbiBcdGludCBlcnIgPSAtRUlOVkFMO1xuIFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDtcbiBcbi1cdGlmIChuaWQgXHUwMDNjIDAgfHwgbmlkIFx1MDAzZT0gTUFYX05VTU5PREVTIHx8ICFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKVxuK1x0aWYgKG5pZCBcdTAwM2MgMCB8fCBuaWQgXHUwMDNlPSBNQVhfTlVNTk9ERVMgfHxcbitcdCAgICAhKG5vZGVfc3RhdGUobmlkLCBOX01FTU9SWSkgfHxcbitcdCAgICAgIChub2RlX2lzX3ByaXZhdGUobmlkKSBcdTAwMjZcdTAwMjYgbm9kZV9hbGxvd3NfcmVjbGFpbShuaWQpKSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuIFx0aWYgKCFtZW1fY2dyb3VwX2Rpc2FibGVkKCkpIHtcbkBAIC02MTYxLDYgKzYxODgsMTMgQEAgc3RhdGljIHZvaWQgc2hyaW5rX25vZGUocGdfZGF0YV90ICpwZ2RhdCwgc3RydWN0IHNjYW5fY29udHJvbCAqc2MpXG4gXHRzdHJ1Y3QgbHJ1dmVjICp0YXJnZXRfbHJ1dmVjO1xuIFx0Ym9vbCByZWNsYWltYWJsZSA9IGZhbHNlO1xuIFxuK1x0LypcbitcdCAqIFByaXZhdGUgbm9kZXMgZG8gbm90IHN1cHBvcnQgcmVjbGFpbSBieSBkZWZhdWx0LCBmaWx0ZXJpbmcgaGVyZVxuK1x0ICogY2FwdHVyZXMgYWxsIG5vcm1hbCByZWNsYWltIHBhdGhzIHRoYXQgbWF5IGF0dGVtcHQgZXZpY3Rpb24uXG4rXHQgKi9cbitcdGlmICghbm9kZV9hbGxvd3NfcmVjbGFpbShwZ2RhdC1cdTAwM2Vub2RlX2lkKSlcbitcdFx0cmV0dXJuO1xuK1xuIFx0aWYgKChscnVfZ2VuX2VuYWJsZWQoKSB8fCBscnVfZ2VuX3N3aXRjaGluZygpKSBcdTAwMjZcdTAwMjYgcm9vdF9yZWNsYWltKHNjKSkge1xuIFx0XHRtZW1zZXQoXHUwMDI2c2MtXHUwMDNlbnIsIDAsIHNpemVvZihzYy1cdTAwM2VucikpO1xuIFx0XHRscnVfZ2VuX3Nocmlua19ub2RlKHBnZGF0LCBzYyk7XG5AQCAtNjc3MSw2ICs2ODA1LDE2IEBAIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4gXHRyZXR1cm4gc2MubnJfcmVjbGFpbWVkO1xuIH1cbiBcbitzdGF0aWMgc3RydWN0IHpvbmVsaXN0ICptZW1jZ19yZWNsYWltX3pvbmVsaXN0KGludCBuaWQsIGdmcF90IGdmcF9tYXNrKVxuK3tcbitcdHVuc2lnbmVkIGludCBhZmxhZ3MgPSBBTExPQ19ERUZBVUxUO1xuK1xuK1x0aWYgKHVubGlrZWx5KCFub2Rlc19lbXB0eShub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSkpKVxuK1x0XHRhZmxhZ3MgPSBBTExPQ19aT05FTElTVF9QUklWQVRFO1xuK1xuK1x0cmV0dXJuIHNlbGVjdF96b25lbGlzdChuaWQsIGdmcF9tYXNrLCBhZmxhZ3MpO1xuK31cbitcbiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuIFx0XHRcdFx0XHQgICBnZnBfdCBnZnBfbWFzayxcbkBAIC02Nzk3LDcgKzY4NDEsOCBAQCB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIFx0ICogZXF1YWwgcHJlc3N1cmUgb24gYWxsIHRoZSBub2Rlcy4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0XG4gXHQgKiB0aGUgcmVjbGFpbSBkb2VzIG5vdCBiYWlsIG91dCBlYXJseS5cbiBcdCAqL1xuLVx0c3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCA9IG5vZGVfem9uZWxpc3QobnVtYV9ub2RlX2lkKCksIHNjLmdmcF9tYXNrKTtcbitcdHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBtZW1jZ19yZWNsYWltX3pvbmVsaXN0KG51bWFfbm9kZV9pZCgpLFxuK1x0XHRcdFx0XHRcdFx0ICAgc2MuZ2ZwX21hc2spO1xuIFxuIFx0c2V0X3Rhc2tfcmVjbGFpbV9zdGF0ZShjdXJyZW50LCBcdTAwMjZzYy5yZWNsYWltX3N0YXRlKTtcbiBcdHRyYWNlX21tX3Ztc2Nhbl9tZW1jZ19yZWNsYWltX2JlZ2luKHNjLmdmcF9tYXNrLCAwLCBtZW1jZyk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL01ha2VmaWxlLmt2bSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cbmluZGV4IDZmYzM0ZTliZjhlMWI0Li5lMGRkNzdjNjY0YzdlYyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9NYWtlZmlsZS5rdm1cbkBAIC0xNTUsNiArMTU1LDcgQEAgVEVTVF9HRU5fUFJPR1NfeDg2ICs9IGFjY2Vzc190cmFja2luZ19wZXJmX3Rlc3RcbiBURVNUX0dFTl9QUk9HU194ODYgKz0gY29hbGVzY2VkX2lvX3Rlc3RcbiBURVNUX0dFTl9QUk9HU194ODYgKz0gZGlydHlfbG9nX3BlcmZfdGVzdFxuIFRFU1RfR0VOX1BST0dTX3g4NiArPSBndWVzdF9tZW1mZF90ZXN0XG4rVEVTVF9HRU5fUFJPR1NfeDg2ICs9IGd1ZXN0X21lbWZkX2JpbmRfbm9kZV90ZXN0XG4gVEVTVF9HRU5fUFJPR1NfeDg2ICs9IGhhcmR3YXJlX2Rpc2FibGVfdGVzdFxuIFRFU1RfR0VOX1BST0dTX3g4NiArPSBtbXVfc3RyZXNzX3Rlc3RcbiBURVNUX0dFTl9QUk9HU194ODYgKz0gcnNlcV90ZXN0XG5AQCAtMTk1LDYgKzE5Niw3IEBAIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGNvYWxlc2NlZF9pb190ZXN0XG4gVEVTVF9HRU5fUFJPR1NfYXJtNjQgKz0gZGlydHlfbG9nX3BlcmZfdGVzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGdldC1yZWctbGlzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IGd1ZXN0X21lbWZkX3Rlc3RcbitURVNUX0dFTl9QUk9HU19hcm02NCArPSBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IG1tdV9zdHJlc3NfdGVzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IHJzZXFfdGVzdFxuIFRFU1RfR0VOX1BST0dTX2FybTY0ICs9IHN0ZWFsX3RpbWVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS9ndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjZmMzNiMWFlNmM0MmFjXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0vZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3QuY1xuQEAgLTAsMCArMSwyMTMgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogU3RhbmRhbG9uZSB0ZXN0IGZvciBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERS5cbisgKlxuKyAqIFZlcmlmaWVzIHRoYXQgYSBndWVzdF9tZW1mZCBjcmVhdGVkIHdpdGggR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgYWxsb2NhdGVzXG4rICogaXRzIGZvbGlvcyBvbiB0aGUgcmVxdWVzdGVkIE5VTUEgbm9kZSwgd2l0aG91dCBhbnkgdXNlcnNwYWNlIG1iaW5kKCkuXG4rICpcbisgKiBUaGUgZm9saW8gcGxhY2VtZW50IGlzIGNoZWNrZWQgd2l0aCBtb3ZlX3BhZ2VzKDIpIChzdGF0dXMgcXVlcnkgbW9kZSkuXG4rICpcbisgKiBTZWxmLWNvbnRhaW5lZDpcbisgKiAgIC0gaXNzdWVzIHRoZSBLVk0gaW9jdGxzIGRpcmVjdGx5XG4rICpcbisgKiBCdWlsZCBpbnNpZGUgdGhlIGd1ZXN0OlxuKyAqICAgZ2NjIC1PMiAtbyBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdCBndWVzdF9tZW1mZF9iaW5kX25vZGVfdGVzdC5jXG4rICpcbisgKiBVc2FnZTogZ3Vlc3RfbWVtZmRfYmluZF9ub2RlX3Rlc3QgXHUwMDNjdGFyZ2V0X25vZGVcdTAwM2VcbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZXJyLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N5c2NhbGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2t2bS5oXHUwMDNlXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rXG4rLyogTWlycm9yIHRoZSAocHJvcG9zZWQpIHVhcGkgYWRkaXRpb25zIGluIGNhc2UgdGhlIGhvc3QgaGVhZGVycyBsYWcuICovXG4rI2lmbmRlZiBHVUVTVF9NRU1GRF9GTEFHX01NQVBcbisjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfTU1BUFx0XHQoMVVMTCBcdTAwM2NcdTAwM2MgMClcbisjZW5kaWZcbisjaWZuZGVmIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRURcbisjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRURcdCgxVUxMIFx1MDAzY1x1MDAzYyAxKVxuKyNlbmRpZlxuKyNpZm5kZWYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVcbisjZGVmaW5lIEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFXHQoMVVMTCBcdTAwM2NcdTAwM2MgMilcbisjZW5kaWZcbisjaWZuZGVmIEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1NcbisjZGVmaW5lIEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1NcdDI0NFxuKyNlbmRpZlxuK1xuK3N0cnVjdCBnbWVtZmRfYXJncyB7XG4rXHRfX3U2NCBzaXplO1xuK1x0X191NjQgZmxhZ3M7XG4rXHRfX3UzMiBub2RlO1xuK1x0X191MzIgcGFkO1xuK1x0X191NjQgcmVzZXJ2ZWRbNV07XG4rfTtcbitcbisvKiBUcnVlIGlmIHRoZSBub2RlIGhhcyBhbnkgbWVtb3J5IChNZW1Ub3RhbCBcdTAwM2UgMCkuICovXG4rc3RhdGljIGludCBub2RlX2hhc19tZW1vcnkoaW50IG5vZGUpXG4re1xuK1x0Y2hhciBwYXRoWzEyOF07XG4rXHRjaGFyIGxpbmVbMjU2XTtcbitcdEZJTEUgKmY7XG4rXHRsb25nIHRvdGFsID0gLTE7XG4rXG4rXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksXG4rXHRcdCBcIi9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlJWQvbWVtaW5mb1wiLCBub2RlKTtcbitcdGYgPSBmb3BlbihwYXRoLCBcInJcIik7XG4rXHRpZiAoIWYpXG4rXHRcdHJldHVybiAwO1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbitcdFx0aWYgKHN0cnN0cihsaW5lLCBcIk1lbVRvdGFsOlwiKSkge1xuK1x0XHRcdGlmIChzc2NhbmYobGluZSwgXCJOb2RlICUqZCBNZW1Ub3RhbDogJWxkIGtCXCIsIFx1MDAyNnRvdGFsKSA9PSAxKVxuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcdH1cbitcdGZjbG9zZShmKTtcbitcdHJldHVybiB0b3RhbCBcdTAwM2UgMDtcbit9XG4rXG4rc3RhdGljIGxvbmcgbW92ZV9wYWdlc19zdGF0dXModm9pZCAqYWRkcilcbit7XG4rXHR2b2lkICpwYWdlc1sxXSA9IHsgYWRkciB9O1xuK1x0aW50IHN0YXR1c1sxXSA9IHsgLTEgfTtcbitcdGxvbmcgcmV0O1xuK1xuK1x0cmV0ID0gc3lzY2FsbChTWVNfbW92ZV9wYWdlcywgMCwgMSwgcGFnZXMsIE5VTEwsIHN0YXR1cywgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRlcnIoMSwgXCJtb3ZlX3BhZ2VzXCIpO1xuK1x0cmV0dXJuIHN0YXR1c1swXTtcbit9XG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuK3tcbitcdGludCBrdm0sIHZtLCBnbWVtLCByZXQ7XG4rXHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdHNpemVfdCBzaXplID0gcGFnZV9zaXplICogNDtcbitcdGludCB0YXJnZXRfbm9kZTtcbitcdHN0cnVjdCBnbWVtZmRfYXJncyBnYSA9IHt9O1xuK1x0Y2hhciAqbWVtO1xuK1x0c2l6ZV90IGk7XG4rXG4rXHRpZiAoYXJnYyAhPSAyKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcInVzYWdlOiAlcyBcdTAwM2N0YXJnZXRfbm9kZVx1MDAzZVxcblwiLCBhcmd2WzBdKTtcbitcdHRhcmdldF9ub2RlID0gYXRvaShhcmd2WzFdKTtcbitcbitcdGt2bSA9IG9wZW4oXCIvZGV2L2t2bVwiLCBPX1JEV1IpO1xuK1x0aWYgKGt2bSBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCJvcGVuIC9kZXYva3ZtOiAlc1xcblwiLCBzdHJlcnJvcihlcnJubykpO1xuK1xuK1x0LypcbitcdCAqIFVzZSBhIGRlZmF1bHQgKG5vbi1wcm90ZWN0ZWQpIFZNOiBpdCBoYXMgbm8gcHJpdmF0ZSBtZW1vcnksIHNvIGl0XG4rXHQgKiBhZHZlcnRpc2VzIEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQsIHdoaWNoIGxldHMgdGhlIGhvc3QgbW1hcCBhbmRcbitcdCAqIGZhdWx0IHRoZSBnbWVtIChuZWVkZWQgdG8gb2JzZXJ2ZSBwbGFjZW1lbnQgd2l0aCBtb3ZlX3BhZ2VzKCkpLiAgQVxuK1x0ICogU1ctcHJvdGVjdGVkIFZNIHdvdWxkIG5vdCBhZHZlcnRpc2UgSU5JVF9TSEFSRUQgYW5kIHRoZSBob3N0IGZhdWx0XG4rXHQgKiB3b3VsZCBTSUdCVVMuXG4rXHQgKi9cbitcdHZtID0gaW9jdGwoa3ZtLCBLVk1fQ1JFQVRFX1ZNLCAwVUwpO1xuK1x0aWYgKHZtIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIktWTV9DUkVBVEVfVk06ICVzXFxuXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXG4rXHR7XG4rXHRcdGxvbmcgY2FwcyA9IGlvY3RsKHZtLCBLVk1fQ0hFQ0tfRVhURU5TSU9OLFxuK1x0XHRcdFx0ICBLVk1fQ0FQX0dVRVNUX01FTUZEX0ZMQUdTKTtcbitcbitcdFx0cHJpbnRmKFwiS1ZNX0NBUF9HVUVTVF9NRU1GRF9GTEFHUyA9IDB4JWx4XFxuXCIsIGNhcHMpO1xuK1x0XHRpZiAoIShjYXBzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkpXG4rXHRcdFx0a3NmdF9leGl0X3NraXAoXCJCSU5EX05PREUgZmxhZyBub3QgYWR2ZXJ0aXNlZCAobmVlZCBDT05GSUdfTlVNQSlcXG5cIik7XG4rXHRcdGlmICghKGNhcHMgXHUwMDI2IEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQpKVxuK1x0XHRcdGtzZnRfZXhpdF9za2lwKFwiSU5JVF9TSEFSRUQgbm90IGFkdmVydGlzZWQ7IGNhbm5vdCBmYXVsdCBmcm9tIGhvc3RcXG5cIik7XG4rXHR9XG4rXG4rXHQvKiBOZWdhdGl2ZTogcGFkIG11c3QgYmUgemVyby4gKi9cbitcdGdhID0gKHN0cnVjdCBnbWVtZmRfYXJncyl7IC5zaXplID0gc2l6ZSxcbitcdFx0XHRcdCAgIC5mbGFncyA9IEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFLFxuK1x0XHRcdFx0ICAgLm5vZGUgPSB0YXJnZXRfbm9kZSwgLnBhZCA9IDEgfTtcbitcdHJldCA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZnYSk7XG4rXHRpZiAoIShyZXQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCkpXG4rXHRcdGVycngoMSwgXCJub256ZXJvIHBhZCBzaG91bGQgYmUgcmVqZWN0ZWQgKHJldD0lZCBlcnJubz0lZClcIiwgcmV0LCBlcnJubyk7XG4rXHRwcmludGYoXCJPSzogbm9uemVybyBwYWQgcmVqZWN0ZWRcXG5cIik7XG4rXG4rXHQvKiBOZWdhdGl2ZTogb3V0LW9mLXJhbmdlIG5vZGUuICovXG4rXHRnYSA9IChzdHJ1Y3QgZ21lbWZkX2FyZ3MpeyAuc2l6ZSA9IHNpemUsXG4rXHRcdFx0XHQgICAuZmxhZ3MgPSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSxcbitcdFx0XHRcdCAgIC5ub2RlID0gMSBcdTAwM2NcdTAwM2MgMjAgfTtcbitcdHJldCA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZnYSk7XG4rXHRpZiAoIShyZXQgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVJTlZBTCkpXG4rXHRcdGVycngoMSwgXCJib2d1cyBub2RlIHNob3VsZCBiZSByZWplY3RlZCAocmV0PSVkIGVycm5vPSVkKVwiLCByZXQsIGVycm5vKTtcbitcdHByaW50ZihcIk9LOiBvdXQtb2YtcmFuZ2Ugbm9kZSByZWplY3RlZFxcblwiKTtcbitcbitcdC8qXG4rXHQgKiBOZWdhdGl2ZTogbm9kZSBzZXQgd2l0aG91dCB0aGUgZmxhZy4gIE9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBub256ZXJvXG4rXHQgKiBub2RlOiBub2RlIDAgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBcIm5vZGUgZmllbGQgdW5zZXRcIi5cbitcdCAqL1xuK1x0aWYgKHRhcmdldF9ub2RlICE9IDApIHtcbitcdFx0Z2EgPSAoc3RydWN0IGdtZW1mZF9hcmdzKXsgLnNpemUgPSBzaXplLCAuZmxhZ3MgPSAwLFxuK1x0XHRcdFx0XHQgICAubm9kZSA9IHRhcmdldF9ub2RlIH07XG4rXHRcdHJldCA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZnYSk7XG4rXHRcdGlmICghKHJldCBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJybm8gPT0gRUlOVkFMKSlcbitcdFx0XHRlcnJ4KDEsIFwibm9kZSB3aXRob3V0IGZsYWcgc2hvdWxkIGJlIHJlamVjdGVkIChyZXQ9JWQgZXJybm89JWQpXCIsXG4rXHRcdFx0ICAgICByZXQsIGVycm5vKTtcbitcdFx0cHJpbnRmKFwiT0s6IG5vZGUtd2l0aG91dC1mbGFnIHJlamVjdGVkXFxuXCIpO1xuK1x0fVxuK1xuK1x0LyogUG9zaXRpdmU6IGJpbmQgdG8gdGFyZ2V0X25vZGUsIG1tYXAsIGZhdWx0LCB2ZXJpZnkgcGxhY2VtZW50LiAqL1xuK1x0Z2EgPSAoc3RydWN0IGdtZW1mZF9hcmdzKXtcbitcdFx0LnNpemUgPSBzaXplLFxuK1x0XHQuZmxhZ3MgPSBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSB8IEdVRVNUX01FTUZEX0ZMQUdfTU1BUCB8XG4rXHRcdFx0IEdVRVNUX01FTUZEX0ZMQUdfSU5JVF9TSEFSRUQsXG4rXHRcdC5ub2RlID0gdGFyZ2V0X25vZGUsXG4rXHR9O1xuK1x0Z21lbSA9IGlvY3RsKHZtLCBLVk1fQ1JFQVRFX0dVRVNUX01FTUZELCBcdTAwMjZnYSk7XG4rXHRpZiAoZ21lbSBcdTAwM2MgMCkge1xuK1x0XHQvKlxuK1x0XHQgKiBBIG5vZGUgdGhhdCBjYW5ub3QgYmUgYm91bmQgLSBtZW1vcnlsZXNzL29mZmxpbmUsIG9yIGEgcHJpdmF0ZVxuK1x0XHQgKiBub2RlIHRoYXQgZGlkIG5vdCBvcHQgaW50byB1c2Vyc3BhY2UgcGxhY2VtZW50IC0gbXVzdCBiZVxuK1x0XHQgKiByZWplY3RlZCBhdCBjcmVhdGUgd2l0aCBFSU5WQUwgKG1wb2xfYmluZF9ub2RlKCkgZmFpbHMpLCBub3RcbitcdFx0ICogcHJvZHVjZSBhbiBvcGFxdWUgZmFpbHVyZSBsYXRlci5cbitcdFx0ICovXG4rXHRcdGlmICghbm9kZV9oYXNfbWVtb3J5KHRhcmdldF9ub2RlKSBcdTAwMjZcdTAwMjYgZXJybm8gPT0gRUlOVkFMKSB7XG4rXHRcdFx0cHJpbnRmKFwiT0s6IHVuYmluZGFibGUgbm9kZSAlZCByZWplY3RlZCB3aXRoIEVJTlZBTFxcblwiLFxuK1x0XHRcdCAgICAgICB0YXJnZXRfbm9kZSk7XG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdH1cbitcdFx0ZXJyKDEsIFwiS1ZNX0NSRUFURV9HVUVTVF9NRU1GRChiaW5kIG5vZGUgJWQpXCIsIHRhcmdldF9ub2RlKTtcbitcdH1cbitcdGlmICghbm9kZV9oYXNfbWVtb3J5KHRhcmdldF9ub2RlKSlcbitcdFx0ZXJyeCgxLCBcIkZBSUw6IHVuYmluZGFibGUgbm9kZSAlZCBzaG91bGQgaGF2ZSBiZWVuIHJlamVjdGVkXCIsXG4rXHRcdCAgICAgdGFyZ2V0X25vZGUpO1xuK1x0cHJpbnRmKFwiT0s6IGNyZWF0ZWQgZ21lbSBmZD0lZCBib3VuZCB0byBub2RlICVkXFxuXCIsIGdtZW0sIHRhcmdldF9ub2RlKTtcbitcbitcdG1lbSA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZ21lbSwgMCk7XG4rXHRpZiAobWVtID09IE1BUF9GQUlMRUQpXG4rXHRcdGVycigxLCBcIm1tYXAgZ21lbVwiKTtcbitcbitcdC8qIEZhdWx0IGV2ZXJ5IHBhZ2UgaW4gKG5vIG1iaW5kIG9uIHRoaXMgbWFwcGluZykuICovXG4rXHRtZW1zZXQobWVtLCAweGFhLCBzaXplKTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHNpemUgLyBwYWdlX3NpemU7IGkrKykge1xuK1x0XHRsb25nIG5vZGUgPSBtb3ZlX3BhZ2VzX3N0YXR1cyhtZW0gKyBpICogcGFnZV9zaXplKTtcbitcbitcdFx0cHJpbnRmKFwicGFnZSAlenUgLVx1MDAzZSBub2RlICVsZCAod2FudCAlZClcXG5cIiwgaSwgbm9kZSwgdGFyZ2V0X25vZGUpO1xuK1x0XHRpZiAobm9kZSAhPSB0YXJnZXRfbm9kZSlcbitcdFx0XHRlcnJ4KDEsIFwiRkFJTDogcGFnZSAlenUgbGFuZGVkIG9uIG5vZGUgJWxkLCB3YW50ZWQgJWRcIixcbitcdFx0XHQgICAgIGksIG5vZGUsIHRhcmdldF9ub2RlKTtcbitcdH1cbitcbitcdHByaW50ZihcIlBBU1M6IGFsbCAlenUgcGFnZXMgb24gbm9kZSAlZCB2aWEgRkxBR19CSU5EX05PREUgKG5vIG1iaW5kKVxcblwiLFxuK1x0ICAgICAgIHNpemUgLyBwYWdlX3NpemUsIHRhcmdldF9ub2RlKTtcbitcbitcdG11bm1hcChtZW0sIHNpemUpO1xuK1x0Y2xvc2UoZ21lbSk7XG4rXHRjbG9zZSh2bSk7XG4rXHRjbG9zZShrdm0pO1xuK1x0cmV0dXJuIDA7XG4rfVxuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCBmMGU1ZGE0OTA4NjYwNC4uZGUzMjBkZjA4ZTBmZjQgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG4rKysgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5AQCAtNDU2LDYgKzQ1NiwyNiBAQCBzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqa3ZtX2dtZW1fZ2V0X3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdCAqL1xuIFx0cmV0dXJuIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoXHUwMDI2R01FTV9JKGlub2RlKS1cdTAwM2Vwb2xpY3ksIHBnb2ZmKTtcbiB9XG4rXG4rc3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXG4re1xuK1x0c3RydWN0IG1lbXBvbGljeSAqcG9sO1xuK1x0aW50IGVycjtcbitcbitcdHBvbCA9IG1wb2xfYmluZF9ub2RlKG5vZGUpO1xuK1x0aWYgKElTX0VSUihwb2wpKVxuK1x0XHRyZXR1cm4gUFRSX0VSUihwb2wpO1xuK1xuK1x0ZXJyID0gbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZShcdTAwMjZHTUVNX0koaW5vZGUpLVx1MDAzZXBvbGljeSwgMCxcbitcdFx0XHRcdFx0ICBNQVhfTEZTX0ZJTEVTSVpFIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBwb2wpO1xuK1x0bXBvbF9wdXQocG9sKTtcbitcdHJldHVybiBlcnI7XG4rfVxuKyNlbHNlXG4rc3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXG4re1xuK1x0cmV0dXJuIC1FSU5WQUw7XG4rfVxuICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2dtZW1fdm1fb3BzID0ge1xuQEAgLTU1Nyw3ICs1NzcsNyBAQCBib29sIF9fd2VhayBrdm1fYXJjaF9zdXBwb3J0c19nbWVtX2luaXRfc2hhcmVkKHN0cnVjdCBrdm0gKmt2bSlcbiBcdHJldHVybiB0cnVlO1xuIH1cbiBcbi1zdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncylcbitzdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncywgaW50IG5vZGUpXG4ge1xuIFx0c3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSBcIltrdm0tZ21lbV1cIjtcbiBcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XG5AQCAtNTk4LDYgKzYxOCwxMiBAQCBzdGF0aWMgaW50IF9fa3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgbG9mZl90IHNpemUsIHU2NCBmbGFncylcbiBcbiBcdEdNRU1fSShpbm9kZSktXHUwMDNlZmxhZ3MgPSBmbGFncztcbiBcbitcdGlmIChmbGFncyBcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcbitcdFx0ZXJyID0ga3ZtX2dtZW1fYmluZF9ub2RlKGlub2RlLCBub2RlKTtcbitcdFx0aWYgKGVycilcbitcdFx0XHRnb3RvIGVycl9pbm9kZTtcbitcdH1cbitcbiBcdGZpbGUgPSBhbGxvY19maWxlX3BzZXVkbyhpbm9kZSwga3ZtX2dtZW1fbW50LCBuYW1lLCBPX1JEV1IsIFx1MDAyNmt2bV9nbWVtX2ZvcHMpO1xuIFx0aWYgKElTX0VSUihmaWxlKSkge1xuIFx0XHRlcnIgPSBQVFJfRVJSKGZpbGUpO1xuQEAgLTYzMCw2ICs2NTYsNyBAQCBpbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXG4ge1xuIFx0bG9mZl90IHNpemUgPSBhcmdzLVx1MDAzZXNpemU7XG4gXHR1NjQgZmxhZ3MgPSBhcmdzLVx1MDAzZWZsYWdzO1xuK1x0aW50IG5vZGUgPSBOVU1BX05PX05PREU7XG4gXG4gXHRpZiAoZmxhZ3MgXHUwMDI2IH5rdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuQEAgLTYzNyw3ICs2NjQsMTUgQEAgaW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKVxuIFx0aWYgKHNpemUgXHUwMDNjPSAwIHx8ICFQQUdFX0FMSUdORUQoc2l6ZSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFxuLVx0cmV0dXJuIF9fa3ZtX2dtZW1fY3JlYXRlKGt2bSwgc2l6ZSwgZmxhZ3MpO1xuK1x0aWYgKGZsYWdzIFx1MDAyNiBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERSkge1xuK1x0XHRpZiAoYXJncy1cdTAwM2VwYWQgfHwgYXJncy1cdTAwM2Vub2RlIFx1MDAzZT0gTUFYX05VTU5PREVTKVxuK1x0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0XHRub2RlID0gYXJncy1cdTAwM2Vub2RlO1xuK1x0fSBlbHNlIGlmIChhcmdzLVx1MDAzZW5vZGUgfHwgYXJncy1cdTAwM2VwYWQpIHtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXG4rXHRyZXR1cm4gX19rdm1fZ21lbV9jcmVhdGUoa3ZtLCBzaXplLCBmbGFncywgbm9kZSk7XG4gfVxuIFxuIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTIzVDAyOjUyOjU3LjEzMzQyMTk5MloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjY3Mzk4MTQ0NzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQXNzZXNzaW5nIHRoZSBGdXp6aW5nIEltcGFjdCBvZiBUaGlzIFBhdGNoIFNlcmllcyoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggc2VyaWVzIGluIGZyb250IG9mIG1lLCBhbmQgbXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgd2hldGhlciBpdCBpbnRyb2R1Y2VzIGFueSBuZXcsIGZ1enplci13b3J0aHkgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSBrZXJuZWwuIFRoaXMgbG9va3MgbGlrZSBhIHNpZ25pZmljYW50IGNoYW5nZTsgaXQncyBpbnRyb2R1Y2luZyBcIlByaXZhdGUgbWVtb3J5IG5vZGVzXCIg4oCTIGBOX01FTU9SWV9QUklWQVRFYCDigJMgYW5kIGl0J3MgdG91Y2hpbmcgcXVpdGUgYSBmZXcgY3JpdGljYWwgYXJlYXM6IG1lbW9yeSBtYW5hZ2VtZW50LCBob3RwbHVnLCBtZW1wb2xpY3ksIE5VTUEgYmFsYW5jaW5nLCBldmVuIEtWTSdzIGBndWVzdF9tZW1mZGAuIFRoYXQncyBhIHN0cm9uZyBpbmRpY2F0b3Igd2UgbmVlZCB0byBnaXZlIHRoaXMgYSB2ZXJ5IGNsb3NlIGxvb2suXG5cblRoZSBjb3JlIG9mIHRoZSBjaGFuZ2Ugc2VlbXMgdG8gYmUgY2VudGVyZWQgYXJvdW5kIHRoaXMgbmV3IGBOX01FTU9SWV9QUklWQVRFYCBub2RlIHN0YXRlIGFuZCBhIGNvcnJlc3BvbmRpbmcgYHN0cnVjdCBub2RlX3ByaXZhdGVgLiBBbmQsIGhleSwgaXQgbG9va3MgbGlrZSBhIG5ldyBmbGFnLCBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgLCBpcyBiZWluZyBhZGRlZCB0byBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAuIFRoYXQncyBpbXBvcnRhbnQ7IGl0IG1lYW5zIHVzZXJzcGFjZSBpbnRlcmFjdGlvbiBpcyBhbG1vc3QgY2VydGFpbmx5IGludm9sdmVkLlxuXG5Ob3csIGxldCdzIHNlZSBpZiB0aGlzIGNvZGUgcGF0aCBpcyBhY3R1YWxseSByZWFjaGFibGUuICBUaGUgS1ZNIGNoYW5nZXMgYXJlIGVhc3k7IHRoZSBgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRGAgaW9jdGwgcHJvdmlkZXMgYSBjbGVhciBlbnRyeSBwb2ludCBmcm9tIHVzZXJzcGFjZS4gIEFuZCB0aGlzIG5ldyBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UuIEdvb2QuICBJIG5lZWQgdG8gY2hlY2sgaG93IHRoZSBkcml2ZXJzIHdvcmsuIEkgc2VlIHRoZSBgYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkYCBmdW5jdGlvbiwgYW5kIGl0J3MgZXhwb3J0ZWQuIElzIGl0IGJlaW5nIHVzZWQgYnkgYW55dGhpbmcgKmluIHRoaXMgcGF0Y2ggc2VyaWVzKj8gTGV0IG1lIGRvdWJsZS1jaGVjay4gT2theSwgSSdtIGxvb2tpbmcgYXQgYGRyaXZlcnMvZGF4L2ttZW0uY2AsIGFuZCBpdCdzIG1vZGlmeWluZyBpdCB0byBwYXNzIGBOVUxMYCB0byBgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkYCwgc28gaXQgbG9va3MgbGlrZSBpdCBpcywgYnV0IGp1c3QgaW4gdGhhdCBwYXJ0aWN1bGFyIGNhc2UuXG5cbkFscmlnaHQsIGxldCdzIHpvb20gb3V0LiBEb2VzICphbnl0aGluZyogaW4gdGhlIG92ZXJhbGwgY29kZWJhc2UgY3VycmVudGx5IHVzZSBgYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkYCBvciBgbm9kZV9wcml2YXRlX3JlZ2lzdGVyYD8gVGltZSB0byBkbyBhIHF1aWNrIHNlYXJjaC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIG5ldyBmdW5jdGlvbmFsaXR5IGlzIGFjdHVhbGx5IHBhcnQgb2YgYSBjb2RlcGF0aCB0aGF0IGdldHMgZXhlY3V0ZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ3MDQxLCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzI0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjNUMDI6NTM6MDMuODczMjQxNDMyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM0MDI0OTk4MTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdD05MT1BIGRyaXZlciBicmluZ3MgbWVtb3J5IHVwIGFzIHByaXZhdGUgd2l0aDo6XFxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0LTkyLVxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdDo5MzogIGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZChuaWQsIHN0YXJ0LCBzaXplLCByZXNvdXJjZV9uYW1lLFxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC05NC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaHBfZmxhZ3MsIG9ubGluZV90eXBlLCBucClcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaD0zMDY9aW50IF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTMwOC1cXHRcXHRcXHRcXHRlbnVtIG1tb3Agb25saW5lX3R5cGUsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKTtcXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg6MzA5OmludCBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSxcXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgtMzEwLVxcdFxcdFxcdFxcdCAgICAgIGNvbnN0IGNoYXIgKnJlc291cmNlX25hbWUsIG1ocF90IG1ocF9mbGFncyxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTczNT1FWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKF9fYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZCwgXFxcImttZW1cXFwiKTtcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTczNy0vKipcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE3Mzg6ICogYWRkX3ByaXZhdGVfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkIC0gYWRkIHByaXZhdGUgZHJpdmVyLW1hbmFnZWQgbWVtb3J5XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNzM5LSAqIEBuaWQ6IE5VTUEgbm9kZSBJRCB3aGVyZSB0aGUgbWVtb3J5IHdpbGwgYmUgYWRkZWRcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTc1My0gKi9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE3NTQ6aW50IGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZChpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplLFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTc1NS1cXHRcXHRcXHRcXHQgICAgICBjb25zdCBjaGFyICpyZXNvdXJjZV9uYW1lLCBtaHBfdCBtaHBfZmxhZ3MsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE3NjMtfVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTc2NDpFWFBPUlRfU1lNQk9MX0dQTChhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWQpO1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTc2NS1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjNUMDI6NTM6MDcuMjc1NzQ5NTA2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTcwMjQxNDk3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIEZsYWcgaW4gS1ZNKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZGAsIGFuZCBpdCBzZWVtcyBsaWtlICpub2JvZHkqIGluIHRoZSBrZXJuZWwgdHJlZSBpcyBhY3R1YWxseSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gcmlnaHQgbm93LiBJbnRlcmVzdGluZy4gQnV0LCBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIOKAkyB0aGF0J3MgYW5vdGhlciBzdG9yeS4gS1ZNIGFjdHVhbGx5IGV4cG9zZXMgdGhpcyBmbGFnIHRvIHVzZXJzcGFjZSB0aHJvdWdoIGEgS1ZNIGlvY3RsLiBJJ20gd29uZGVyaW5nIGlmIHRoaXMgY291bGQgYmUgYSBwb3RlbnRpYWwgZnV6eiB0YXJnZXQuXG5cbkxldCBtZSBjaGVjay4gWWVwLCBnb29kLCBga3ZtX2dtZW1fY3JlYXRlYCBkb2VzIGluZGVlZCBoYW5kbGUgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYC4gQW5kIHRoZSB0cmFjZSBsb29rcyBnb29kIC0gYGt2bV9nbWVtX2NyZWF0ZWAgaXMgdGhlbiBjYWxsaW5nIGBrdm1fZ21lbV9iaW5kX25vZGVgLCB3aGljaCB0aGVuIGlzIGNhbGxpbmcgYG1wb2xfYmluZF9ub2RlKG5vZGUpYC4gR3JlYXQsIGBtcG9sX2JpbmRfbm9kZWAgaXMgc3RhbmRhcmQsIGxvY2F0ZWQgaW4gYG1tL21lbXBvbGljeS5jYC4gVGltZSB0byBkaXZlIGEgYml0IGRlZXBlciBpbnRvIGBrdm1fZ21lbV9jcmVhdGVgIGFuZCBga3ZtX2dtZW1fYmluZF9ub2RlYCB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ4Mzg3LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTczLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTIzVDAyOjUzOjEyLjk3ODE2Nzc0N1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzM2ODA2NTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImt2bV9nbWVtX2JpbmRfbm9kZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jPTQ0MD1zdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqa3ZtX2dtZW1fZ2V0X3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNDU5LVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NDYwOnN0YXRpYyBpbnQga3ZtX2dtZW1fYmluZF9ub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBub2RlKVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNDYxLXtcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNDc0LSNlbHNlXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYzo0NzU6c3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy00NzYte1xcbi0tXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYz01ODA9c3RhdGljIGludCBfX2t2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIGxvZmZfdCBzaXplLCB1NjQgZmxhZ3MsIGludCBub2RlKVxcbi0tXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy02MjEtXFx0aWYgKGZsYWdzIFxcdTAwMjYgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUpIHtcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jOjYyMjpcXHRcXHRlcnIgPSBrdm1fZ21lbV9iaW5kX25vZGUoaW5vZGUsIG5vZGUpO1xcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjIzLVxcdFxcdGlmIChlcnIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTIzVDAyOjUzOjE1LjMxNDk4NDg0NFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEyMDQyNzQyNzY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgR3Vlc3QgTWVtb3J5IE5vZGUgQmluZGluZyBQYXRjaCoqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBzb21ldGhpbmcgaW50ZXJlc3Rpbmc6IGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAsIGEgbmV3IEtWTSBmZWF0dXJlLiBFc3NlbnRpYWxseSwgaXQgYWxsb3dzIGJpbmRpbmcgYSBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIChndWVzdF9tZW1mZCkgdG8gYSBzcGVjaWZpYyBOVU1BIG5vZGUuIEZ1bmN0aW9uYWxseSwgdGhpcyBpcyBhIGRlZmluaXRlIGNoYW5nZSwgd2hpY2ggbWVhbnMgZnV6emluZyBpcyBjcnVjaWFsLlxuXG5HaXZlbiB0aGUgbmF0dXJlIG9mIHRoZSBjaGFuZ2UsIEknbSBnb2luZyB0byB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgcmVsZXZhbnQgS2NvbmZpZyBvcHRpb25zIGFyZSBlbmFibGVkLiBMb29rcyBsaWtlIGBDT05GSUdfS1ZNYCBhbmQgYENPTkZJR19OVU1BYCBhcmUgdGhlIGtleSBvbmVzIGhlcmUuXG5cbk5vdywgbGV0J3MgZHJpbGwgZG93biBpbnRvIHRoZSBjb3JlIHN5bWJvbHMuIEknbSB0aGlua2luZyBJIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byBga3ZtX2dtZW1fY3JlYXRlYCwgYGt2bV9nbWVtX2JpbmRfbm9kZWAsIGFuZCB0aGVuIGRpdmUgaW50byB0aGUgTlVNQS1zcGVjaWZpYyBjYWxsczogYG1wb2xfYmluZF9ub2RlYCwgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2VgLCBhbmQgdWx0aW1hdGVseSwgdGhlIGxvdy1sZXZlbCBgX19tcG9sX2JpbmRfbm9kZWAuIEknbGwgc3RhcnQgYnkgdGFraW5nIGEgZ29vZCBsb29rIGF0IGBtcG9sX2JpbmRfbm9kZWAgYW5kIGl0cyB1bmRlcmx5aW5nIGZ1bmN0aW9uLCBgX19tcG9sX2JpbmRfbm9kZWAsIG1ha2luZyBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aG9zZSBhbmQgdGhlIG5ldyBLVk0gZnVuY3Rpb25hbGl0eS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDkxNzksIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjNUMDI6NTM6MjcuMzU3NzMwNjE4WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0MTE4NjA5MDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiX19tcG9sX2JpbmRfbm9kZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1wb2xpY3kuYz0xMTA0PXN0YXRpYyBsb25nIGRvX3NldF9tZW1wb2xpY3kodW5zaWduZWQgc2hvcnQgbW9kZSwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMTUyLSAqL1xcbm1tL21lbXBvbGljeS5jOjExNTM6c3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKl9fbXBvbF9iaW5kX25vZGUoaW50IG5pZCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MpXFxubW0vbWVtcG9saWN5LmMtMTE1NC17XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0xMjAwPXN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfcHJpdmF0ZV9iaW5kKGludCBuaWQpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMjAzLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbm1tL21lbXBvbGljeS5jOjEyMDQ6XFx0cmV0dXJuIF9fbXBvbF9iaW5kX25vZGUobmlkLCBNUE9MX0ZfUFJJVkFURSk7XFxubW0vbWVtcG9saWN5LmMtMTIwNS19XFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0xMjIzPXN0cnVjdCBtZW1wb2xpY3kgKm1wb2xfYmluZF9ub2RlKGludCBuaWQpXFxubW0vbWVtcG9saWN5LmMtMTIyNC17XFxubW0vbWVtcG9saWN5LmM6MTIyNTpcXHRyZXR1cm4gX19tcG9sX2JpbmRfbm9kZShuaWQsIDApO1xcbm1tL21lbXBvbGljeS5jLTEyMjYtfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yM1QwMjo1MzoyOS43Njk1OTk0MjNaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNDU4OTAzOTEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcyBvbiBjaGVja2luZyBgbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZWA6XG5cbioqRXhhbWluaW5nIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCoqXG5cblJpZ2h0LCBzbyBJIHNlZSB0aGF0IGZ1bmN0aW9uIG5hbWUg4oCTIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgaXRzIHB1cnBvc2Ugd2l0aGluIHRoaXMgY29udGV4dC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBpdCAqZG9lcyogaW4gcmVsYXRpb24gdG8gdGhlIGJyb2FkZXIgc3lzdGVtLCB3aGF0ZXZlciB0aGF0IG1heSBiZS4gXCJTaGFyZWQgcG9saWN5XCIgc3VnZ2VzdHMgc29tZXRoaW5nIHJlbGF0ZWQgdG8gcmVzb3VyY2UgbWFuYWdlbWVudCwgcGVyaGFwcyBtZW1vcnkgb3IgcHJvY2Vzc29ycywgYmVpbmcgYXBwbGllZCBhY3Jvc3MgYSBzcGVjaWZpZWQgcmFuZ2UuICBJJ20gYWxyZWFkeSBtZW50YWxseSBmb3JtaW5nIHF1ZXN0aW9uczogd2hhdCBjb25zdGl0dXRlcyB0aGUgXCJzaGFyZWQgcG9saWN5XCI/IFdoYXQga2luZCBvZiBcInJhbmdlXCIgYXJlIHdlIHRhbGtpbmcgYWJvdXQ/IERvZXMgdGhpcyBwb2xpY3kgKm92ZXJyaWRlKiBleGlzdGluZyBzZXR0aW5ncywgb3IgKmNvbXBsZW1lbnQqIHRoZW0/IFdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgZm9yIGNvbmN1cnJlbmN5LCBpZiBhbnk/IEFsc28sIGlzIHRoZXJlIGEgcGFydGljdWxhciBtZW1vcnkgbW9kZWwgdG8gYmUgY29uY2VybmVkIGFib3V0PyBJIHNob3VsZCBwcm9iYWJseSBzdGFydCBieSByZWZyZXNoaW5nIG15IG1lbW9yeSBvbiByZWxldmFudCBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBicm9hZGVyIHN5c3RlbSBhbmQgaG93IGl0cyByZXNvdXJjZXMgd29yay4gSSBuZWVkIHRvIGFzc2VzcyBob3cgaXQgZml0cyB3aXRoaW4gdGhlIGxhcmdlciBhcmNoaXRlY3R1cmUuIEknbSBnb2luZyB0byBzdGFydCBieSBnb2luZyBvdmVyIHJlbGV2YW50IGRvY3VtZW50cy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDk4OTMsIk91dHB1dFRva2VucyI6MjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yM1QwMjo1MzozMy4yMjg1MDg3NzVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMjQ1NTYwNjQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oPTEyNj1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaC0xMjctXFx0XFx0XFx0ICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xcbmluY2x1ZGUvbGludXgvbWVtcG9saWN5Lmg6MTI4OmludCBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgcGdvZmZfdCBzdGFydCxcXG5pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oLTEyOS1cXHRcXHRcXHRcXHQgcGdvZmZfdCBlbmQsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpO1xcbi0tXFxubW0vbWVtcG9saWN5LmM9MzQyNT1FWFBPUlRfU1lNQk9MX0ZPUl9NT0RVTEVTKG1wb2xfc2hhcmVkX3BvbGljeV9pbml0LCBcXFwia3ZtXFxcIik7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zNDI3LS8qKlxcbm1tL21lbXBvbGljeS5jOjM0Mjg6ICogbXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSAtIGluc3RhbGwgQHBvbCBvdmVyIFtAc3RhcnQsIEBlbmQpIG9mIEBzcFxcbm1tL21lbXBvbGljeS5jLTM0MjktICogQHNwOiAgICB0aGUgc2hhcmVkIHBvbGljeSB0cmVlXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zNDQzLSAqL1xcbm1tL21lbXBvbGljeS5jOjM0NDQ6aW50IG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2Uoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBwZ29mZl90IHN0YXJ0LFxcbm1tL21lbXBvbGljeS5jLTM0NDUtXFx0XFx0XFx0XFx0IHBnb2ZmX3QgZW5kLCBzdHJ1Y3QgbWVtcG9saWN5ICpwb2wpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zNDU5LX1cXG5tbS9tZW1wb2xpY3kuYzozNDYwOkVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9zZXRfc2hhcmVkX3BvbGljeV9yYW5nZSwgXFxcImt2bVxcXCIpO1xcbm1tL21lbXBvbGljeS5jLTM0NjEtXFxubW0vbWVtcG9saWN5LmM9MzQ2Mj1pbnQgbXBvbF9zZXRfc2hhcmVkX3BvbGljeShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0zNDY0LXtcXG5tbS9tZW1wb2xpY3kuYzozNDY1OlxcdHJldHVybiBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKHNwLCB2bWEtXFx1MDAzZXZtX3Bnb2ZmLFxcbm1tL21lbXBvbGljeS5jLTM0NjYtXFx0XFx0XFx0XFx0XFx0ICAgdm1hLVxcdTAwM2V2bV9wZ29mZiArIHZtYV9wYWdlcyh2bWEpLCBwb2wpO1xcbi0tXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYz00NjA9c3RhdGljIGludCBrdm1fZ21lbV9iaW5kX25vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5vZGUpXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTQ2OC1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jOjQ2OTpcXHRlcnIgPSBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlKFxcdTAwMjZHTUVNX0koaW5vZGUpLVxcdTAwM2Vwb2xpY3ksIDAsXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy00NzAtXFx0XFx0XFx0XFx0XFx0ICBNQVhfTEZTX0ZJTEVTSVpFIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQsIHBvbCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTIzVDAyOjUzOjM1LjM1MzA3NjYwOVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NDkwNDAxNzgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUHJpdmF0ZSBOb2RlIEltcGxlbWVudGF0aW9uKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyB0b3VjaGluZyBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgYW5kIGBkcml2ZXJzL2Jhc2Uvbm9kZS5jYCwgd2hpY2ggaW1tZWRpYXRlbHkgZmxhZ3MgbXkgaW50ZXJlc3QgYmVjYXVzZSB3ZSdyZSBkaXZpbmcgaW50byBwcml2YXRlIG5vZGUgc3VwcG9ydC4gVGhlIGltbWVkaWF0ZSBjb25jZXJuIGlzIHRoYXQgYGFkZF9wcml2YXRlX21lbW9yeV9kcml2ZXJfbWFuYWdlZGAgaXNuJ3QgYWN0dWFsbHkgKnVzZWQqIGJ5IGFueSBleGlzdGluZyBkcml2ZXIgY29kZS4gVGhhdCBzdWdnZXN0cyB0aGUgcHJpdmF0ZSBub2RlIGZ1bmN0aW9uYWxpdHksIGFzIGEgd2hvbGUsIG1pZ2h0IGJlIGVmZmVjdGl2ZWx5IGluYWNjZXNzaWJsZSB1bmxlc3MgeW91IGNhbiBhY3R1YWxseSBob3RwbHVnIGEgcHJpdmF0ZSBub2RlLiBXaGljaCBmZWVscy4uLmxpbWl0aW5nLiBUaGlzIHJhaXNlcyBhIHJlZCBmbGFnIGluIG15IG1pbmQ7IHRoYXQncyBub3QgaWRlYWwgZGVzaWduIGZyb20gYSByb2J1c3RuZXNzIHBlcnNwZWN0aXZlLlxuXG5Ib3dldmVyLCBob2xkIG9uIGEgc2Vjb25kLi4uIGBub2RlX3ByaXZhdGVfcmVnaXN0ZXJgIGlzICpleHBvcnRlZCouIFRoYXQgaW1wbGllcyBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbGV2ZXJhZ2UgdGhpcyBmdW5jdGlvbi4gSSBuZWVkIHRvIGludmVzdGlnYXRlIGlmIHRoaXMgaXMgYWN0dWFsbHkgdXNlZCBhbnl3aGVyZS4gVGhhdCdzIGEgY3J1Y2lhbCBwb2ludCwgYW5kIEkgbmVlZCB0byBjaGVjayB0aGUgY2FsbCBzaXRlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcGF0aCBpcyB0cnVseSByZWFjaGFibGUuIEkgbmVlZCB0byBmb2xsb3cgdGhlIGJyZWFkY3J1bWJzIGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUwODI0LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjNUMDI6NTM6MzkuODQzNDgyNzc4WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTEwMzU1MTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5vZGVfcHJpdmF0ZV9yZWdpc3RlclwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJEb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3Q9MTAyPVRoZSBub2RlIGxlYXZlcyBgYE5fTUVNT1JZX1BSSVZBVEVgYCBvbmx5IHdoZW4gdGhlIGxhc3QgcmFuZ2UgaXMgb2ZmbGluZWQuXFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QtMTA3LS4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2Uvbm9kZS5jXFxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0OjEwODogICA6aWRlbnRpZmllcnM6IG5vZGVfcHJpdmF0ZV9yZWdpc3RlciBub2RlX3ByaXZhdGVfdW5yZWdpc3RlclxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC0xMDktXFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3Q9MTQ0PURlcGVuZGVuY2llcyBiZXR3ZWVuIGNhcGFiaWxpdGllcyBhcmUgZW5mb3JjZWQgKipvbmNlKiosIGJ5XFxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0OjE0NTpgYG5vZGVfcHJpdmF0ZV9yZWdpc3RlcigpYGAgYXQgaG90cGx1ZywgcmF0aGVyIHRoYW4gYnkgd2hhdGV2ZXIgc2V0cyB0aGUgYml0czpcXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QtMTQ2LVxcbi0tXFxuZHJpdmVycy9iYXNlL25vZGUuYz04NzM9c3RhdGljIERFRklORV9NVVRFWChub2RlX3ByaXZhdGVfbG9jayk7XFxuLS1cXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTg3NS0vKipcXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjg3NjogKiBub2RlX3ByaXZhdGVfcmVnaXN0ZXIgLSBSZWdpc3RlciBhIHByaXZhdGUgbm9kZVxcbmRyaXZlcnMvYmFzZS9ub2RlLmMtODc3LSAqIEBuaWQ6IE5vZGUgaWRlbnRpZmllclxcbi0tXFxuZHJpdmVycy9iYXNlL25vZGUuYy04ODktICovXFxuZHJpdmVycy9iYXNlL25vZGUuYzo4OTA6aW50IG5vZGVfcHJpdmF0ZV9yZWdpc3RlcihpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9wcml2YXRlICpucClcXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTg5MS17XFxuLS1cXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTkyOS19XFxuZHJpdmVycy9iYXNlL25vZGUuYzo5MzA6RVhQT1JUX1NZTUJPTF9HUEwobm9kZV9wcml2YXRlX3JlZ2lzdGVyKTtcXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTkzMS1cXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9OD1zdHJ1Y3QgcGFnZTtcXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMjQtICpcXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oOjI1OiAqIEFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIGFuZCBwYXNzZWQgdG8gbm9kZV9wcml2YXRlX3JlZ2lzdGVyKCkuXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0yNi0gKiBUaGUgZHJpdmVyIG93bnMgdGhlIG1lbW9yeSBhbmQgbXVzdCBlbnN1cmUgaXQgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlclxcbi0tXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaD0yMzY9c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2x0cGluKGludCBuaWQpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTI0NC1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oOjI0NTppbnQgbm9kZV9wcml2YXRlX3JlZ2lzdGVyKGludCBuaWQsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKTtcXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTI0Ni1pbnQgbm9kZV9wcml2YXRlX3VucmVnaXN0ZXIoaW50IG5pZCk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTI0OS1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oOjI1MDpzdGF0aWMgaW5saW5lIGludCBub2RlX3ByaXZhdGVfcmVnaXN0ZXIoaW50IG5pZCwgc3RydWN0IG5vZGVfcHJpdmF0ZSAqbnApXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0yNTEte1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xNjg3PWludCBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWQoaW50IG5pZCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTcxMS1cXHRcXHR9XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxNzEyOlxcdFxcdHJjID0gbm9kZV9wcml2YXRlX3JlZ2lzdGVyKHJlYWxfbmlkLCBucCk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNzEzLVxcdFxcdGlmIChyYylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjNUMDI6NTM6NDEuNzUzODQ2NDA5WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYwMjMyMTE5OTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIGBub2RlX3ByaXZhdGVfcmVnaXN0ZXJgIEZ1bmN0aW9uIGFuZCBLVk0gR3Vlc3QgTWVtb3J5KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGcm9tIHdoYXQgSSBzZWUsIGBub2RlX3ByaXZhdGVfcmVnaXN0ZXJgIHNlZW1zIHRvIGJlIGNhbGxlZCAqb25seSogZnJvbSBgX19hZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkYC4gQW5kIGxvb2tpbmcgYXQgdGhlIGNhbGwgZ3JhcGgsIGBfX2FkZF9tZW1vcnlfZHJpdmVyX21hbmFnZWRgIGlzIGV4Y2x1c2l2ZWx5IHJlYWNoZWQgdmlhIGBhZGRfcHJpdmF0ZV9tZW1vcnlfZHJpdmVyX21hbmFnZWRgIGFuZCBgYWRkX21lbW9yeV9kcml2ZXJfbWFuYWdlZGAuIEJ1dCBob2xkIG9uLCB3aGVuIGBhZGRfbWVtb3J5X2RyaXZlcl9tYW5hZ2VkYCBpcyBjYWxsZWQsIGl0IHBhc3NlcyBgTlVMTGAgZm9yIGBucGAuIE1lYW5pbmcgYG5vZGVfcHJpdmF0ZV9yZWdpc3RlcmAgaXNuJ3QgcmVnaXN0ZXJpbmcgYW55IHByaXZhdGUgbm9kZXMgaW4gdGhhdCBwYXJ0aWN1bGFyIHBhdGguIEluIGZhY3QsIGlmIG15IHJlYWRpbmcgaXMgY29ycmVjdCwgYG5vZGVfcHJpdmF0ZV9yZWdpc3RlcmAgaXMgKnVucmVhY2hhYmxlKiBmcm9tIGFueSBleGlzdGluZyBkcml2ZXIgd2l0aGluIHRoZSB0cmVlLCBhdCBsZWFzdCBpbiBpdHMgY3VycmVudCBzdGF0ZS5cblxuSG93ZXZlciwgaGVyZSdzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3Rpbmc6IHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcuLi4gdGhhdCdzICpleHRlcm5hbGx5KiBhY2Nlc3NpYmxlLiBMZXQgbWUgY29uZmlybSB0aGF0IHRoZXJlIGFyZW4ndCBhbnkgc25lYWt5IGJhY2tkb29ycyBJIGFtIG1pc3NpbmcuIE9rYXksIHRoZSBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIGZsYWcgKmlzKiBhZGRlZCB0byB0aGUgc3VwcG9ydGVkIGZsYWdzIGJ5IGBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzYC4gQWgsIGFuZCAqdGhhdCogaXMgcmVhY2hlZCBieSB0aGUgYEtWTV9DUkVBVEVfR1VFU1RfTUVNRkRgIGlvY3RsLiBSaWdodCwgc28gdGhlc2UgcmVjZW50IEtWTSBndWVzdF9tZW1mZCBtb2RpZmljYXRpb25zICphcmUqIHJlYWNoYWJsZS4gVGhleSdyZSBkZWZpbml0ZWx5IGluIHRoZSBjcm9zc2hhaXJzIGZvciBwb3RlbnRpYWwgZnV6emluZy5cblxuQmVmb3JlIEkgZ28gZnVydGhlciwgSSBzaG91bGQgY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb25zLiBgQ09ORklHX0tWTWAgaXMgb2J2aW91c2x5IGEgcHJlcmVxdWlzaXRlLiBBbmQsIHllcCwgYENPTkZJR19OVU1BYCAqaXMqIHJlcXVpcmVkIGZvciBgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREVgIHRvIGJlIHN1cHBvcnRlZCwgYXMgSSBzdXNwZWN0ZWQuIE5vdyBJIHNob3VsZCByZXZpZXcgYGt2bV9nbWVtX2dldF9zdXBwb3J0ZWRfZmxhZ3NgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MTkxNywiT3V0cHV0VG9rZW5zIjoyNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yM1QwMjo1Mzo0Ny43NzcwNjIyMDFaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5OTA0NDkyODgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFnc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2t2bV9ob3N0Lmg9NzMzPWJvb2wga3ZtX2FyY2hfc3VwcG9ydHNfZ21lbV9pbml0X3NoYXJlZChzdHJ1Y3Qga3ZtICprdm0pO1xcbmluY2x1ZGUvbGludXgva3ZtX2hvc3QuaC03MzQtXFxuaW5jbHVkZS9saW51eC9rdm1faG9zdC5oOjczNTpzdGF0aWMgaW5saW5lIHU2NCBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSlcXG5pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgtNzM2LXtcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NjU1PWludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjYwLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjYxOlxcdGlmIChmbGFncyBcXHUwMDI2IH5rdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSkpXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy02NjItXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTQ4NjQ9c3RhdGljIGludCBrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uX2dlbmVyaWMoc3RydWN0IGt2bSAqa3ZtLCBsb25nIGFyZylcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtNDkzMi1cXHRjYXNlIEtWTV9DQVBfR1VFU1RfTUVNRkRfRkxBR1M6XFxudmlydC9rdm0va3ZtX21haW4uYzo0OTMzOlxcdFxcdHJldHVybiBrdm1fZ21lbV9nZXRfc3VwcG9ydGVkX2ZsYWdzKGt2bSk7XFxudmlydC9rdm0va3ZtX21haW4uYy00OTM0LSNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yM1QwMjo1Mzo0OS43Njc1MTcwNDlaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzM2ODU2Mjk3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgS1ZNIEd1ZXN0IE1lbW9yeSBhbmQgTlVNQSBOb2RlIEJpbmRpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZyb20gbG9va2luZyBhdCBga3ZtX2dtZW1fZ2V0X3N1cHBvcnRlZF9mbGFnc2AgaW4gYGluY2x1ZGUvbGludXgva3ZtX2hvc3QuaGAsIGl0J3MgY2xlYXIgdGhhdCBOVU1BIHN1cHBvcnQgaXMgYSBwcmVyZXF1aXNpdGUsIGluZGljYXRlZCBieSB0aGUgdXNlIG9mIGBDT05GSUdfTlVNQWAuIFRoYXQncyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLlxuXG5Ob3csIHRoZSBjb25uZWN0aW9uIGlzIHRocm91Z2ggYG1wb2xfYmluZF9ub2RlYCwgd2hpY2ggZXNzZW50aWFsbHkgY2FsbHMgYF9fbXBvbF9iaW5kX25vZGVgIHRvIGNyZWF0ZSBhIG1lbW9yeSBwb2xpY3kuIFRoaXMgcGF0aCBpcyBvYnZpb3VzbHkgYWNjZXNzaWJsZSBmcm9tIGBrdm1fZ21lbV9iaW5kX25vZGVgLCBhbmQgbXkgY29uY2VybiBpcyBhYm91dCBvdGhlciBwb3RlbnRpYWwgcGF0aHMuXG5cbkkndmUgYmVlbiBzY2FubmluZyBmb3IgdGhlIHZhcmlvdXMgY2FsbHMgYWZmZWN0ZWQsIHNwZWNpZmljYWxseSBpbiB0aGUgcGF0Y2gsIGFuZCBJIHNlZSBtb2RpZmljYXRpb25zIGFjcm9zcyB0aGUgYm9hcmQuIFRoZSBjYWxscyByZWFjaCBgY3B1c2V0X2hhbmRsZV9ob3RwbHVnYCwgYGNvbXBhY3Rpb25fem9uZWxpc3Rfc3VpdGFibGVgLCBgdHJ5X3RvX2NvbXBhY3RfcGFnZXNgLCBldGMuXG5cblRoZSBjcml0aWNhbCB0aGluZyBJJ20gc2VlaW5nIGlzIHRoYXQgYWxtb3N0IGFsbCBvZiB0aGVzZSBtb2RpZmljYXRpb25zIGFyZSBnYXRlZCBieSBjaGVja3MgbGlrZSBgbm9kZV9pc19wcml2YXRlKG5pZClgIG9yIGBmb2xpb19pc19wcml2YXRlX25vZGUoZm9saW8pYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgc2luY2UgdGhlcmUgaXNuJ3QgYSBkcml2ZXIgdG8gcmVnaXN0ZXIgYSBcInByaXZhdGVcIiBub2RlLCB0aGVzZSBjb25kaXRpb25zIHdpbGwgKmFsd2F5cyogYmUgZmFsc2UuIFRoYXQgd291bGQgc2VlbSB0byBsaW1pdCB0aGUgaW1wYWN0IGhlcmUuXG5cbkJ1dCBob2xkIG9uLCBsZXQgbWUgZG91YmxlLWNoZWNrIGhvdyBgbm9kZV9pc19wcml2YXRlYCBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZC4gSSBzZWUgdGhhdCBpdCB1c2VzIGBub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSlgLiBUaGUgcXVlc3Rpb24gaXMsIGNhbiBgTl9NRU1PUllfUFJJVkFURWAgYmUgc2V0ICp3aXRob3V0KiBhIGRlZGljYXRlZCBkcml2ZXI/IEkgbmVlZCB0byBjaGVjayBob3cgdGhlIHN5c3RlbSBzZXRzIHRoaXMgc3RhdGUsIHNwZWNpZmljYWxseSB0aGUgYG9ubGluZV9wYWdlc2AgZnVuY3Rpb24gaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBvdGhlciBwb3RlbnRpYWwgbWVjaGFuaXNtcy4gSSdsbCBuZWVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgbWVtb3J5IGhvdHBsdWcgY29kZSBhbmQgc2VlIGlmIHRoZXJlJ3MgYW55IHNjZW5hcmlvIHdoZXJlIHRoYXQgc3RhdGUgKmNvdWxkKiBiZSBzZXQgaW4gYSB3YXkgdGhhdCBpcyByZWxldmFudCB0byBLVk0gZ3Vlc3QgbWVtb3J5IG1hbmFnZW1lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzMDAxLCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTEwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTIzVDAyOjUzOjU3LjEzNjA4NDEwOVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjk0MjQ3ODQyOCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibm9kZV9zZXRfc3RhdGUuKk5fTUVNT1JZX1BSSVZBVEVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTIzVDAyOjU0OjAwLjA3ODU3NDY4N1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzEwNzMxMTU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggdGhpcywgYXMgYW4gZXhwZXJ0IGluIHRoZSBmaWVsZDpcblxuKipBbmFseXppbmcgdGhlIE1lbW9yeSBIb3RwbHVnIFBhdGNoOiBGb2N1cyBvbiBgb25saW5lX3BhZ2VzYCoqXG5cblJpZ2h0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIHBhdGNoIGluIHRoZSBjb250ZXh0IG9mIG1lbW9yeSBob3RwbHVnZ2luZywgYW5kIHRoZSBmaXJzdCB0aGluZyB0aGF0IGp1bXBzIG91dCBpcyB0aGUgbWVudGlvbiBvZiBgb25saW5lX3BhZ2VzYCB3aXRoaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLiBUaGF0J3MgdGhlIGNvcmUgb2YgdGhlIG1hdHRlciwgbGlrZWx5IHRoZSBjZW50cmFsIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIGJlaW5nIG1vZGlmaWVkLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgXCJPa2F5LCB3aGF0J3MgY2hhbmdlZCBhYm91dCBob3cgd2UncmUgYnJpbmdpbmcgcGFnZXMgb25saW5lP1wiIElzIHRoZSBsb2dpYyBmb3IgZGV0ZWN0aW5nLCBhbGxvY2F0aW5nLCBvciBtYXBwaW5nIHRoZW0gYmVpbmcgYWx0ZXJlZD8gQXJlIHRoZXJlIG5ldyBlcnJvciBwYXRocywgb3IgcGVyaGFwcyBvcHRpbWl6YXRpb25zPyBBcmUgd2UgdGFsa2luZyBhYm91dCBhIG5ldyBhbGdvcml0aG0gdG8gZGV0ZXJtaW5lIHdoaWNoIHBhZ2VzIHRvIGJyaW5nIG9ubGluZT8gSSBuZWVkIHRvIGxvb2sgY2xvc2VseSBhdCBob3cgdGhpcyB2YXJpYWJsZSBvciBmdW5jdGlvbiBpcyAqdXNlZCogd2l0aGluIHRoZSBsYXJnZXIgbWVtb3J5IGhvdHBsdWcgcHJvY2Vzcy4gSSBuZWVkIHRvIHRyYWNlIHRoZSBpbXBsaWNhdGlvbnMgb2YgY2hhbmdlcyB0byBgb25saW5lX3BhZ2VzYCB0aHJvdWdob3V0IHRoZSBjb2RlIHRvIHVuZGVyc3RhbmQgdGhlIGZ1bmN0aW9uYWwgaW1wYWN0IGFuZCBhbnkgYXNzb2NpYXRlZCBwZXJmb3JtYW5jZSBvciBzdGFiaWxpdHkgaW1wbGljYXRpb25zLiBJcyB0aGVyZSBhIHJhY2UgY29uZGl0aW9uIGJlaW5nIGFkZHJlc3NlZD8gT3IgYSBuZXcgZmVhdHVyZSBiZWluZyBpbXBsZW1lbnRlZCB0byBpbXByb3ZlIG9ubGluZSBwYWdlIGhhbmRsaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1Mzk2NiwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTIzVDAyOjU0OjAzLjc4OTMwOTg1MVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk2OTk3OTQzOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJOX01FTU9SWV9QUklWQVRFXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzLW5vZGU9MzQ9RGVzY3JpcHRpb246XFxuRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMtbm9kZTozNTpcXHRcXHROb2RlcyB0aGF0IGhhdmUgcHJpdmF0ZSAoTl9NRU1PUllfUFJJVkFURSkgbWVtb3J5OiBtZW1vcnlcXG5Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZGV2aWNlcy1ub2RlLTM2LVxcdFxcdGhvdHBsdWdnZWQgYnkgYSBkcml2ZXIgb250byBhIENQVS1sZXNzIG5vZGUgYW5kIGlzb2xhdGVkIGZyb21cXG4tLVxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdD04PWFuZCBkZWxpYmVyYXRlbHkgaGlkZGVuIGZyb20gdGhlIGtlcm5lbCdzIG5vcm1hbCBtZW1vcnkgbWFuYWdlbWVudC4gIFN1Y2ggYVxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdDo5Om5vZGUgaXMgbWFya2VkIGBgTl9NRU1PUllfUFJJVkFURWBgIGluc3RlYWQgb2YgYGBOX01FTU9SWWBgOyB0aGUgdHdvIHN0YXRlc1xcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC0xMC1hcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCBzbyBhIHByaXZhdGUgbm9kZSBpcyBuZXZlciBjb25zaWRlcmVkIGJ5IHRoZSBwYWdlXFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3Q9MTg9UHJlY29uZGl0aW9uc1xcbi0tXFxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0LTIwLVxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdDoyMTpgYE5fTUVNT1JZX1BSSVZBVEVgYCBhbmQgYGBOX01FTU9SWWBgIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIHNvIHRoZSBiYWNraW5nXFxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0LTIyLW1lbW9yeSBtdXN0IGNvbWUgdXAgb24gYSBub2RlIHRoYXQgaGFzIG5vIERSQU0gb2YgaXRzIG93biAob3RoZXJ3aXNlIHRoZSBub2RlXFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3Q9MzU9Wm9uZWxpc3QgZXhjbHVzaW9uXFxuLS1cXG5Eb2N1bWVudGF0aW9uL21tL251bWFfcHJpdmF0ZV9ub2Rlcy5yc3QtNDQtXFxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0OjQ1OiAgICBgYE5fTUVNT1JZX1BSSVZBVEVgYCBub2RlcyBhcmUgKipleGNsdWRlZCoqIGZyb20gYm90aCBgYEZBTExCQUNLYGAgYW5kXFxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0LTQ2LSAgICBgYE5PRkFMTEJBQ0tgYCB6b25lbGlzdHMuICBJbnN0ZWFkIHRoZXkgYXJlIGFkZGVkIHRvIGBgWk9ORUxJU1RfUFJJVkFURWBgLFxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdDo0NzogICAgd2hpY2ggaW5jbHVkZXMgYm90aCBgYE5fTUVNT1JZYGAgYW5kIGBgTl9NRU1PUllfUFJJVkFURWBgIG5vZGVzLiAgVGhpcyBpc1xcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC00OC0gICAgdGhlIG9ubHkgem9uZWxpc3QgdGhhdCBjb250YWlucyBwcml2YXRlLW5vZGUgem9uZXMsIGFuZCBzbyB0aGUgb25seSB3YXlcXG4tLVxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdD0xMDA9aGVhdmlseSBpbXBsaWVzIGEgXFxcIm9uZS1ub2RlLXBlci1kZXZpY2VcXFwiIGRlc2lnbiBvZiB0aGUgc3lzdGVtLlxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC0xMDEtXFxuRG9jdW1lbnRhdGlvbi9tbS9udW1hX3ByaXZhdGVfbm9kZXMucnN0OjEwMjpUaGUgbm9kZSBsZWF2ZXMgYGBOX01FTU9SWV9QUklWQVRFYGAgb25seSB3aGVuIHRoZSBsYXN0IHJhbmdlIGlzIG9mZmxpbmVkLlxcbkRvY3VtZW50YXRpb24vbW0vbnVtYV9wcml2YXRlX25vZGVzLnJzdC0xMDMtXFxuLS1cXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jPTg5MD1pbnQgbm9kZV9wcml2YXRlX3JlZ2lzdGVyKGludCBuaWQsIHN0cnVjdCBub2RlX3ByaXZhdGUgKm5wKVxcbi0tXFxuZHJpdmVycy9iYXNlL25vZGUuYy05MDYtXFxuZHJpdmVycy9iYXNlL25vZGUuYzo5MDc6XFx0LyogTl9NRU1PUllfUFJJVkFURSBhbmQgTl9NRU1PUlkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqL1xcbmRyaXZlcnMvYmFzZS9ub2RlLmMtOTA4LVxcdGlmIChub2RlX3N0YXRlKG5pZCwgTl9NRU1PUlkpKSB7XFxuLS1cXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jPTkzMD1FWFBPUlRfU1lNQk9MX0dQTChub2RlX3ByaXZhdGVfcmVnaXN0ZXIpO1xcbi0tXFxuZHJpdmVycy9iYXNlL25vZGUuYy05MzctICpcXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjkzODogKiBPbmx5IHN1Y2NlZWRzIGlmIGFsbCBtZW1vcnkgaGFzIGJlZW4gb2ZmbGluZWQgKE5fTUVNT1JZX1BSSVZBVEUgY2xlYXJlZCkuXFxuZHJpdmVycy9iYXNlL25vZGUuYy05MzktICpcXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjk0MDogKiBOX01FTU9SWV9QUklWQVRFIHN0YXRlIGlzIGNsZWFyZWQgYnkgb2ZmbGluZV9wYWdlcygpIHdoZW4gdGhlIGxhc3RcXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTk0MS0gKiBtZW1vcnkgaXMgb2ZmbGluZWQsIG5vdCBieSB0aGlzIGZ1bmN0aW9uLlxcbi0tXFxuZHJpdmVycy9iYXNlL25vZGUuYy05NDUtICpcXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjk0NjogKiBSZXR1cm46IDAgaWYgdW5yZWdpc3RlcmVkLCAtRUJVU1kgaWYgTl9NRU1PUllfUFJJVkFURSBpcyBzdGlsbCBzZXQuXFxuZHJpdmVycy9iYXNlL25vZGUuYy05NDctICovXFxuZHJpdmVycy9iYXNlL25vZGUuYz05NDg9aW50IG5vZGVfcHJpdmF0ZV91bnJlZ2lzdGVyKGludCBuaWQpXFxuLS1cXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTk2OC1cXHQvKlxcbmRyaXZlcnMvYmFzZS9ub2RlLmM6OTY5OlxcdCAqIE9ubHkgdW5yZWdpc3RlciBpZiBOX01FTU9SWV9QUklWQVRFIGlzIGNsZWFyZWQgKG9ubHkgb2NjdXJzIHdoZW5cXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jLTk3MC1cXHQgKiB0aGUgbGFzdCBtZW1vcnkgYmxvY2sgaXMgb2ZmbGluZWQgaW4gb2ZmbGluZV9wYWdlcygpKVxcbi0tXFxuZHJpdmVycy9iYXNlL25vZGUuYz0xMDc3PXN0YXRpYyBzdHJ1Y3Qgbm9kZV9hdHRyIG5vZGVfc3RhdGVfYXR0cltdID0ge1xcbi0tXFxuZHJpdmVycy9iYXNlL25vZGUuYy0xMDg0LVxcdFtOX01FTU9SWV0gPSBfTk9ERV9BVFRSKGhhc19tZW1vcnksIE5fTUVNT1JZKSxcXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jOjEwODU6XFx0W05fTUVNT1JZX1BSSVZBVEVdID0gX05PREVfQVRUUihoYXNfcHJpdmF0ZV9tZW1vcnksIE5fTUVNT1JZX1BSSVZBVEUpLFxcbmRyaXZlcnMvYmFzZS9ub2RlLmMtMTA4Ni1cXHRbTl9DUFVdID0gX05PREVfQVRUUihoYXNfY3B1LCBOX0NQVSksXFxuLS1cXG5kcml2ZXJzL2Jhc2Uvbm9kZS5jPTEwOTE9c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm5vZGVfc3RhdGVfYXR0cnNbXSA9IHtcXG4tLVxcbmRyaXZlcnMvYmFzZS9ub2RlLmMtMTA5OC1cXHRcXHUwMDI2bm9kZV9zdGF0ZV9hdHRyW05fTUVNT1JZXS5hdHRyLmF0dHIsXFxuZHJpdmVycy9iYXNlL25vZGUuYzoxMDk5OlxcdFxcdTAwMjZub2RlX3N0YXRlX2F0dHJbTl9NRU1PUllfUFJJVkFURV0uYXR0ci5hdHRyLFxcbmRyaXZlcnMvYmFzZS9ub2RlLmMtMTEwMC1cXHRcXHUwMDI2bm9kZV9zdGF0ZV9hdHRyW05fQ1BVXS5hdHRyLmF0dHIsXFxuLS1cXG5mcy9wcm9jL2tjb3JlLmM9MjUwPXN0YXRpYyBpbnQga2NvcmVfcmFtX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdClcXG4tLVxcbmZzL3Byb2Mva2NvcmUuYy0yNTktXFx0LyogSW5jbHVkZSBwcml2YXRlIG5vZGUgbWVtb3J5IGluIHRoZSBzY2FuICovXFxuZnMvcHJvYy9rY29yZS5jOjI2MDpcXHRub2Rlc19vcihtZW0sIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xcbmZzL3Byb2Mva2NvcmUuYy0yNjEtXFx0Zm9yX2VhY2hfbm9kZV9tYXNrKG5pZCwgbWVtKSB7XFxuLS1cXG5mcy9wcm9jL3Rhc2tfbW11LmM9MzM3NT1zdGF0aWMgc3RydWN0IHBhZ2UgKmNhbl9nYXRoZXJfbnVtYV9zdGF0cyhwdGVfdCBwdGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jLTMzOTItXFx0aWYgKCFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldKSBcXHUwMDI2XFx1MDAyNlxcbmZzL3Byb2MvdGFza19tbXUuYzozMzkzOlxcdCAgICAhbm9kZV9pc3NldChuaWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSlcXG5mcy9wcm9jL3Rhc2tfbW11LmMtMzM5NC1cXHRcXHRyZXR1cm4gTlVMTDtcXG4tLVxcbmZzL3Byb2MvdGFza19tbXUuYz0zNDAwPXN0YXRpYyBzdHJ1Y3QgcGFnZSAqY2FuX2dhdGhlcl9udW1hX3N0YXRzX3BtZChwbWRfdCBwbWQsXFxuLS1cXG5mcy9wcm9jL3Rhc2tfbW11LmMtMzQxOC1cXHRpZiAoIW5vZGVfaXNzZXQobmlkLCBub2RlX3N0YXRlc1tOX01FTU9SWV0pIFxcdTAwMjZcXHUwMDI2XFxuZnMvcHJvYy90YXNrX21tdS5jOjM0MTk6XFx0ICAgICFub2RlX2lzc2V0KG5pZCwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pKVxcbmZzL3Byb2MvdGFza19tbXUuYy0zNDIwLVxcdFxcdHJldHVybiBOVUxMO1xcbi0tXFxuZnMvcHJvYy90YXNrX21tdS5jPTM1MzA9c3RhdGljIGludCBzaG93X251bWFfbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcXG4tLVxcbmZzL3Byb2MvdGFza19tbXUuYy0zNjA2LVxcbmZzL3Byb2MvdGFza19tbXUuYzozNjA3OlxcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKVxcbmZzL3Byb2MvdGFza19tbXUuYy0zNjA4LVxcdFxcdGlmIChtZC1cXHUwMDNlbm9kZVtuaWRdKVxcbi0tXFxuaW5jbHVkZS9saW51eC9nZnAuaD0yMDQ9c3RhdGljIGlubGluZSB2b2lkIGFyY2hfYWxsb2NfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKSB7IH1cXG4tLVxcbmluY2x1ZGUvbGludXgvZ2ZwLmgtMjA2LVxcbmluY2x1ZGUvbGludXgvZ2ZwLmg6MjA3Oi8qIEFsbG9jYXRlIGZyb20gYW4gTl9NRU1PUllfUFJJVkFURSBub2RlIChzZWxlY3RzIHRoZSBwcml2YXRlIHpvbmVsaXN0KS4gKi9cXG5pbmNsdWRlL2xpbnV4L2dmcC5oLTIwOC1zdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfbm9kZV9wcml2YXRlX25vcHJvZihnZnBfdCBnZnAsIHVuc2lnbmVkIGludCBvcmRlcixcXG4tLVxcbmluY2x1ZGUvbGludXgvbW16b25lLmg9MTM5MT1lbnVtIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTM5Ni1cXHQgKiByZXN0cmljdCB0aGUgYWxsb2NhdGlvbnMgdG8gYSBzaW5nbGUgbm9kZSBmb3IgX19HRlBfVEhJU05PREVcXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjEzOTc6XFx0ICogYW5kIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgKGlzb2xhdGVkIGZyb20gZGVmYXVsdCBsaXN0cykuXFxuaW5jbHVkZS9saW51eC9tbXpvbmUuaC0xMzk4LVxcdCAqL1xcbmluY2x1ZGUvbGludXgvbW16b25lLmgtMTM5OS1cXHRaT05FTElTVF9OT0ZBTExCQUNLLFxcdC8qIHpvbmVsaXN0IHdpdGhvdXQgZmFsbGJhY2sgKF9fR0ZQX1RISVNOT0RFKSAqL1xcbmluY2x1ZGUvbGludXgvbW16b25lLmg6MTQwMDpcXHRaT05FTElTVF9QUklWQVRFLFxcdC8qIE5fTUVNT1JZX1BSSVZBVEUgYWNjZXNzLCBmYWxscyBiYWNrIHRvIERSQU0gKi9cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oOjE0MDE6XFx0Wk9ORUxJU1RfUFJJVkFURV9OT0ZBTExCQUNLLCAvKiBOX01FTU9SWV9QUklWQVRFIGFjY2VzcywgX19HRlBfVEhJU05PREUgKi9cXG5pbmNsdWRlL2xpbnV4L21tem9uZS5oLTE0MDItI2VuZGlmXFxuLS1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oPTg9c3RydWN0IHBhZ2U7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTIyLS8qKlxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6MjM6ICogc3RydWN0IG5vZGVfcHJpdmF0ZSAtIFBlci1ub2RlIGNvbnRhaW5lciBmb3IgTl9NRU1PUllfUFJJVkFURSBub2Rlc1xcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMjQtICpcXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9NDE9c3RhdGljIGlubGluZSBib29sIGZvbGlvX2lzX3ByaXZhdGVfbm9kZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtNDIte1xcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6NDM6XFx0cmV0dXJuIG5vZGVfc3RhdGUoZm9saW9fbmlkKGZvbGlvKSwgTl9NRU1PUllfUFJJVkFURSk7XFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC00NC19XFxuLS1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oPTQ2PXN0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2lzX3ByaXZhdGVfbm9kZShzdHJ1Y3QgcGFnZSAqcGFnZSlcXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTQ3LXtcXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oOjQ4OlxcdHJldHVybiBub2RlX3N0YXRlKHBhZ2VfdG9fbmlkKHBhZ2UpLCBOX01FTU9SWV9QUklWQVRFKTtcXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTQ5LX1cXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9NTE9c3RhdGljIGlubGluZSBib29sIG5vZGVfaXNfcHJpdmF0ZShpbnQgbmlkKVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtNTIte1xcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6NTM6XFx0cmV0dXJuIG5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKTtcXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTU0LX1cXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9NjM9c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX3JlY2xhaW0oaW50IG5pZClcXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtNjctXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaDo2ODpcXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTY5LVxcdFxcdHJldHVybiB0cnVlO1xcbi0tXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC04NC0gKlxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6ODU6ICogcmV0dXJuOiB0cnVlIGZvciBOX01FTU9SWSBhbmQgTl9NRU1PUllfUFJJVkFURSB3aXRoIENBUF9VU0VSX05VTUEuXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC04Ni0gKiAgICAgICAgIGZhbHNlIGZvciBtZW1vcnlsZXNzIG9yIG9wdGVkLW91dCBwcml2YXRlIG5vZGUuXFxuLS1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oPTg4PXN0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c191c2VyX251bWEoaW50IG5pZClcXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtOTQtXFx0XFx0cmV0dXJuIHRydWU7XFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaDo5NTpcXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTk2LVxcdFxcdHJldHVybiBmYWxzZTtcXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9MTEwPXN0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19ob3R1bnBsdWcoaW50IG5pZClcXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMTE0LVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6MTE1OlxcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMTE2LVxcdFxcdHJldHVybiB0cnVlO1xcbi0tXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaD0xMzQ9c3RhdGljIGlubGluZSBib29sIG5vZGVfYWxsb3dzX2RlbW90aW9uKGludCBuaWQpXFxuLS1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTEzOC1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oOjEzOTpcXHRpZiAoIW5vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKSlcXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oLTE0MC1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg9MTU3PXN0YXRpYyBpbmxpbmUgYm9vbCBub2RlX2FsbG93c19udW1hX2JhbGFuY2luZyhpbnQgbmlkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0xNjEtXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaDoxNjI6XFx0aWYgKCFub2RlX3N0YXRlKG5pZCwgTl9NRU1PUllfUFJJVkFURSkpXFxuaW5jbHVkZS9saW51eC9ub2RlX3ByaXZhdGUuaC0xNjMtXFx0XFx0cmV0dXJuIHRydWU7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L25vZGVfcHJpdmF0ZS5oPTE4MD1zdGF0aWMgaW5saW5lIGJvb2wgbm9kZV9hbGxvd3NfbHRwaW4oaW50IG5pZClcXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMTg0LVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmg6MTg1OlxcdGlmICghbm9kZV9zdGF0ZShuaWQsIE5fTUVNT1JZX1BSSVZBVEUpKVxcbmluY2x1ZGUvbGludXgvbm9kZV9wcml2YXRlLmgtMTg2LVxcdFxcdHJldHVybiB0cnVlO1xcbi0tXFxuaW5jbHVkZS9saW51eC9ub2RlbWFzay5oPTM4ND1lbnVtIG5vZGVfc3RhdGVzIHtcXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaC0zOTMtXFx0Tl9NRU1PUlksXFx0XFx0LyogVGhlIG5vZGUgaGFzIG1lbW9yeShyZWd1bGFyLCBoaWdoLCBtb3ZhYmxlKSAqL1xcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaDozOTQ6XFx0Tl9NRU1PUllfUFJJVkFURSxcXHQvKiBUaGUgbm9kZSdzIG1lbW9yeSBpcyBwcml2YXRlICovXFxuaW5jbHVkZS9saW51eC9ub2RlbWFzay5oLTM5NS1cXHROX0NQVSxcXHRcXHQvKiBUaGUgbm9kZSBoYXMgb25lIG9yIG1vcmUgY3B1cyAqL1xcbi0tXFxuaW5jbHVkZS9saW51eC9ub2RlbWFzay5oPTQ1OT1zdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBub2RlX3N0YXRlKGludCBub2RlLCBlbnVtIG5vZGVfc3RhdGVzIHN0YXRlKVxcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaC00NjAte1xcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaDo0NjE6XFx0cmV0dXJuIG5vZGUgPT0gMCBcXHUwMDI2XFx1MDAyNiBzdGF0ZSAhPSBOX01FTU9SWV9QUklWQVRFO1xcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaC00NjItfVxcbi0tXFxuaW5jbHVkZS9saW51eC9ub2RlbWFzay5oPTQ3Mj1zdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBudW1fbm9kZV9zdGF0ZShlbnVtIG5vZGVfc3RhdGVzIHN0YXRlKVxcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaC00NzMte1xcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaDo0NzQ6XFx0cmV0dXJuIHN0YXRlID09IE5fTUVNT1JZX1BSSVZBVEUgPyAwIDogMTtcXG5pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmgtNDc1LX1cXG4tLVxcbmluY2x1ZGUvbGludXgvbm9kZW1hc2suaC00NzctI2RlZmluZSBmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIF9fc3RhdGUpIFxcXFxcXG5pbmNsdWRlL2xpbnV4L25vZGVtYXNrLmg6NDc4OlxcdGZvciAoKG5vZGUpID0gMDsgKG5vZGUpID09IDAgXFx1MDAyNlxcdTAwMjYgKF9fc3RhdGUpICE9IE5fTUVNT1JZX1BSSVZBVEU7IChub2RlKSA9IDEpXFxuaW5jbHVkZS9saW51eC9ub2RlbWFzay5oLTQ3OS1cXG4tLVxcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmM9Mzg3MT1zdGF0aWMgdm9pZCBjcHVzZXRfaGFuZGxlX2hvdHBsdWcodm9pZClcXG4tLVxcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmMtMzkwMS1cXHQgKiBQcml2YXRlIG5vZGVzIGFyZSBub3QgcGFydGl0aW9uZWQgYnkgY3B1c2V0LCBidXQgaWYgb25lIGxlYXZlc1xcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmM6MzkwMjpcXHQgKiBOX01FTU9SWV9QUklWQVRFIHdlIHN0aWxsIG5lZWQgdG8gcnVuIG1wb2xfcmViaW5kXyogdG8gY2xlYW4gdXBcXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jLTM5MDMtXFx0ICogbWVtcG9saWNpZXMgdGhhdCBhcmUgYmluZGluZyB0aGVtLlxcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmMtMzkwNC1cXHQgKi9cXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jOjM5MDU6XFx0cHJpdl9zaHJhbmsgPSAhbm9kZXNfc3Vic2V0KHByZXZfcHJpdl9tZW1zLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XFxua2VybmVsL2Nncm91cC9jcHVzZXQuYzozOTA2OlxcdHByZXZfcHJpdl9tZW1zID0gbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV07XFxua2VybmVsL2Nncm91cC9jcHVzZXQuYy0zOTA3LVxcbi0tXFxua2VybmVsL2Nncm91cC9jcHVzZXQuYz00MTYwPW5vZGVtYXNrX3QgY3B1c2V0X21lbXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG4tLVxcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmMtNDE3Ni0gKiBBcmUgYW55IG9mIHRoZSBub2RlcyBpbiB0aGUgbm9kZW1hc2sgdXNhYmxlPyAgTl9NRU1PUlkgbm9kZXMgbXVzdCBiZSBpblxcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmM6NDE3NzogKiBjdXJyZW50LVxcdTAwM2VtZW1zX2FsbG93ZWQsIHdoaWxlIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgYXJlIGFsd2F5cyB2YWxpZC5cXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jLTQxNzgtICovXFxua2VybmVsL2Nncm91cC9jcHVzZXQuYz00MTc5PWludCBjcHVzZXRfbm9kZW1hc2tfdmFsaWRfbWVtc19hbGxvd2VkKGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVtYXNrKVxcbi0tXFxua2VybmVsL2Nncm91cC9jcHVzZXQuYy00MTgxLVxcdHJldHVybiBub2Rlc19pbnRlcnNlY3RzKCpub2RlbWFzaywgY3VycmVudC1cXHUwMDNlbWVtc19hbGxvd2VkKSB8fFxcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmM6NDE4MjpcXHQgICAgICAgbm9kZXNfaW50ZXJzZWN0cygqbm9kZW1hc2ssIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jLTQxODMtfVxcbi0tXFxua2VybmVsL2Nncm91cC9jcHVzZXQuYz00MjM4PWJvb2wgY3B1c2V0X2N1cnJlbnRfbm9kZV9hbGxvd2VkKGludCBub2RlLCBnZnBfdCBnZnBfbWFzaylcXG4tLVxcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmMtNDI0NS1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG5rZXJuZWwvY2dyb3VwL2NwdXNldC5jOjQyNDY6XFx0LyogTl9NRU1PUllfUFJJVkFURSBub2RlcyBhcmUgbm90IHBhcnRpdGlvbmVkIGJ5IGNwdXNldHMubWVtcyAqL1xcbmtlcm5lbC9jZ3JvdXAvY3B1c2V0LmMtNDI0Ny1cXHRpZiAobm9kZV9pc19wcml2YXRlKG5vZGUpKVxcbi0tXFxubW0vaW50ZXJuYWwuaD0xMDg9c3RhdGljIGlubGluZSBib29sIHBhZ2VfaXNfcHJpdmF0ZV9tYW5hZ2VkKHN0cnVjdCBwYWdlICpwYWdlKVxcbi0tXFxubW0vaW50ZXJuYWwuaC0xMTYtICogbWFkdmlzZSByZWNsYWltIGhpbnRzIChDT0xEL1BBR0VPVVQvRlJFRSkgYXJlIHVzZXJsYW5kLWRyaXZlbiByZWNsYWltLCBzb1xcbm1tL2ludGVybmFsLmg6MTE3OiAqIHRoZXkgZm9sbG93IHJlY2xhaW0gb3B0LWluOiBmYWxzZSBmb3IgWk9ORV9ERVZJQ0UgYW5kIGZvciBOX01FTU9SWV9QUklWQVRFXFxubW0vaW50ZXJuYWwuaC0xMTgtICogbm9kZXMgd2l0aG91dCBDQVBfUkVDTEFJTSwgdHJ1ZSBmb3IgYWxsIG90aGVyIG5vcm1hbCBmb2xpb3MuXFxuLS1cXG5tbS9pbnRlcm5hbC5oPTEyMD1zdGF0aWMgaW5saW5lIGJvb2wgZm9saW9fYWxsb3dzX21hZHZpc2Uoc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL2ludGVybmFsLmgtMTI5LSAqIE5VTUEgYmFsYW5jaW5nIGlzIGFjY2Vzcy1hd2FyZSB0aWVyaW5nIG1pZ3JhdGlvbiwgc28gaXQgZm9sbG93cyB0aGUgdGllcmluZ1xcbm1tL2ludGVybmFsLmg6MTMwOiAqIG9wdC1pbjogZmFsc2UgZm9yIFpPTkVfREVWSUNFIGFuZCBmb3IgTl9NRU1PUllfUFJJVkFURSBub2RlcyB3aXRob3V0XFxubW0vaW50ZXJuYWwuaC0xMzEtICogQ0FQX05VTUFfQkFMQU5DSU5HLCB0cnVlIGZvciBhbGwgb3RoZXIgZm9saW9zLlxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTIxMTk9c3RhdGljIGludCBtZW1jZ19udW1hX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmMtMjEzOS1cXHQvKiBQcml2YXRlIG5vZGVzIGhvbGQgY2dyb3VwIG1lbW9yeSB0b28sIHJlcG9ydCB0aGVtLiAqL1xcbm1tL21lbWNvbnRyb2wtdjEuYzoyMTQwOlxcdG5vZGVzX29yKHJlcG9ydGFibGUsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xcbm1tL21lbWNvbnRyb2wtdjEuYy0yMTQxLVxcbi0tXFxubW0vbWVtY29udHJvbC5jPTQ0OTM9c3RhdGljIHZvaWQgbWVtX2Nncm91cF9jc3NfcnN0YXRfZmx1c2goc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcywgaW50IGNwdSlcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00NTI4LVxcdC8qIFByaXZhdGUgbm9kZXMgbXVzdCBhbHNvIGJlIGFjY291bnRlZCBvciBudW1hX3N0YXQgaXMgbWlzbGVhZGluZyAqL1xcbm1tL21lbWNvbnRyb2wuYzo0NTI5OlxcdG5vZGVzX29yKHJlcG9ydGFibGUsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xcbm1tL21lbWNvbnRyb2wuYy00NTMwLVxcdGZvcl9lYWNoX25vZGVfbWFzayhuaWQsIHJlcG9ydGFibGUpIHtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00OTQ5PXN0YXRpYyBpbnQgbWVtb3J5X251bWFfc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdilcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00OTU3LVxcdC8qIFByaXZhdGUgbm9kZXMgaG9sZCBjZ3JvdXAgbWVtb3J5IHRvbywgcmVwb3J0IHRoZW0uICovXFxubW0vbWVtY29udHJvbC5jOjQ5NTg6XFx0bm9kZXNfb3IocmVwb3J0YWJsZSwgbm9kZV9zdGF0ZXNbTl9NRU1PUlldLCBub2RlX3N0YXRlc1tOX01FTU9SWV9QUklWQVRFXSk7XFxubW0vbWVtY29udHJvbC5jLTQ5NTktXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NjA2NT12b2lkIG1lbV9jZ3JvdXBfbm9kZV9maWx0ZXJfYWxsb3dlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIG5vZGVtYXNrX3QgKm1hc2spXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNjA3OC1cXHRjcHVzZXRfbm9kZXNfYWxsb3dlZChtZW1jZy1cXHUwMDNlY3NzLmNncm91cCwgXFx1MDAyNmFsbG93ZWQpO1xcbm1tL21lbWNvbnRyb2wuYzo2MDc5OlxcdC8qIE5fTUVNT1JZX1BSSVZBVEUgbm9kZXMgYXJlIG5vdCBwYXJ0aXRpb25lZCBieSBjcHVzZXQsIGluY2x1ZGUgdGhlbSAqL1xcbm1tL21lbWNvbnRyb2wuYzo2MDgwOlxcdG5vZGVzX29yKGFsbG93ZWQsIGFsbG93ZWQsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKTtcXG5tbS9tZW1jb250cm9sLmMtNjA4MS1cXHRub2Rlc19hbmQoKm1hc2ssICptYXNrLCBhbGxvd2VkKTtcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTMwMz12b2lkIG5vZGVfZ2V0X2FsbG93ZWRfdGFyZ2V0cyhwZ19kYXRhX3QgKnBnZGF0LCBub2RlbWFza190ICp0YXJnZXRzKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtMzIwLVxcbm1tL21lbW9yeS10aWVycy5jOjMyMTovKiBUaWVyaW5nIHNldDogTl9NRU1PUlkgfCAoTl9NRU1PUllfUFJJVkFURSB3LyBDQVBfREVNT1RJT04pICovXFxubW0vbWVtb3J5LXRpZXJzLmMtMzIyLXN0YXRpYyBub2RlbWFza190IHRpZXJhYmxlX25vZGVzO1xcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmM9MzI0PXN0YXRpYyB2b2lkIHVwZGF0ZV90aWVyYWJsZV9ub2Rlcyh2b2lkKVxcbi0tXFxubW0vbWVtb3J5LXRpZXJzLmMtMzMwLVxcdHRpZXJhYmxlX25vZGVzID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldO1xcbm1tL21lbW9yeS10aWVycy5jOjMzMTpcXHRmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fTUVNT1JZX1BSSVZBVEUpXFxubW0vbWVtb3J5LXRpZXJzLmMtMzMyLVxcdFxcdGlmIChub2RlX2FsbG93c19kZW1vdGlvbihub2RlKSlcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jPTU2MT1zdGF0aWMgc3RydWN0IG1lbW9yeV90aWVyICpzZXRfbm9kZV9tZW1vcnlfdGllcihpbnQgbm9kZSlcXG4tLVxcbm1tL21lbW9yeS10aWVycy5jLTU3MC1cXG5tbS9tZW1vcnktdGllcnMuYzo1NzE6XFx0LyogSW5jbHVkZSBOX01FTU9SWSBhbmQgTl9NRU1PUllfUFJJVkFURSB3aXRoIENBUF9ERU1PVElPTiAqL1xcbm1tL21lbW9yeS10aWVycy5jLTU3Mi1cXHRpZiAoIW5vZGVfc3RhdGUobm9kZSwgTl9NRU1PUlkpIFxcdTAwMjZcXHUwMDI2ICFub2RlX2FsbG93c19kZW1vdGlvbihub2RlKSlcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MTE0MT1pbnQgb25saW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjA3LVxcdC8qXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMjA4OlxcdCAqIE5fTUVNT1JZIGFuZCBOX01FTU9SWV9QUklWQVRFIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIGRldGVybWluZVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTIwOS1cXHQgKiB3aGljaCBpcyBjb3JyZWN0IGJhc2VkIG9uIHdoZXRoZXIgdGhlIHBnZGF0LVxcdTAwM2Vwcml2YXRlIGlzIHNldC5cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTIxMi1cXHRcXHRub2RlX3NldF9zdGF0ZShuaWQsIHBnZGF0X2lzX3ByaXZhdGUoTk9ERV9EQVRBKG5pZCkpID9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEyMTM6XFx0XFx0XFx0XFx0ICAgIE5fTUVNT1JZX1BSSVZBVEUgOiBOX01FTU9SWSk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMjE0LVxcdC8qXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE2NTE9RVhQT1JUX1NZTUJPTF9HUEwoYWRkX21lbW9yeSk7XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE2NjAtICogQG9ubGluZV90eXBlOiBBdXRvLU9ubGluZSBiZWhhdmlvciAob2ZmbGluZSwgb25saW5lLCBrZXJuZWwsIG1vdmFibGUpXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxNjYxOiAqIEBucDogZHJpdmVyLW93bmVkIG5vZGVfcHJpdmF0ZSB0byBvbmxpbmUgdGhlIG5vZGUgYXMgTl9NRU1PUllfUFJJVkFURSwgb3JcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE2NjItICpcXHROVUxMIGZvciBvcmRpbmFyeSBzeXN0ZW0gUkFNXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIwMjQ9aW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyMDctXFx0XFx0bm9kZV9jbGVhcl9zdGF0ZShub2RlLCBOX01FTU9SWSk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMjA4OlxcdFxcdG5vZGVfY2xlYXJfc3RhdGUobm9kZSwgTl9NRU1PUllfUFJJVkFURSk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjA5LVxcdH1cXG4tLVxcbm1tL21lbXBvbGljeS5jPTQwNj1zdGF0aWMgaW50IG1wb2xfc2V0X25vZGVtYXNrKHN0cnVjdCBtZW1wb2xpY3kgKnBvbCxcXG4tLVxcbm1tL21lbXBvbGljeS5jLTQ0OC1cXHQvKiBJZiBhbnkgcHJpdmF0ZSBub2RlcyBsZWZ0IGluIHRoZSBub2RlbWFzayAtIGFkZCB0aGUgcHJpdmF0ZSBmbGFnICovXFxubW0vbWVtcG9saWN5LmM6NDQ5OlxcdGlmIChub2Rlc19pbnRlcnNlY3RzKG5zYy1cXHUwMDNlbWFzazIsIG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSlcXG5tbS9tZW1wb2xpY3kuYy00NTAtXFx0XFx0cG9sLVxcdTAwM2VmbGFncyB8PSBNUE9MX0ZfUFJJVkFURTtcXG4tLVxcbm1tL21lbXBvbGljeS5jPTUyMz1zdGF0aWMgdm9pZCBtcG9sX3JlYmluZF9ub2RlbWFzayhzdHJ1Y3QgbWVtcG9saWN5ICpwb2wsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVzKVxcbi0tXFxubW0vbWVtcG9saWN5LmMtNTI3LVxcdC8qIHByZXNlcnZlIG9ubGluZSBwcml2YXRlIG5vZGVzIHRvIHJlLWFkZCBsYXRlciAqL1xcbm1tL21lbXBvbGljeS5jOjUyODpcXHRub2Rlc19hbmQocHJpdiwgcG9sLVxcdTAwM2Vub2Rlcywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xcbm1tL21lbXBvbGljeS5jLTUyOS1cXG4tLVxcbm1tL21lbXBvbGljeS5jPTExNTM9c3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKl9fbXBvbF9iaW5kX25vZGUoaW50IG5pZCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MpXFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMTgzLSAqIG1wb2xfcHJpdmF0ZV9iaW5kIC0gYnVpbGQgYW4gTVBPTF9CSU5EIHBvbGljeSBwaW5uZWQgdG8gYSBwcml2YXRlIG5vZGVcXG5tbS9tZW1wb2xpY3kuYzoxMTg0OiAqIEBuaWQ6IGFuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZVxcbm1tL21lbXBvbGljeS5jLTExODUtICpcXG4tLVxcbm1tL21lbXBvbGljeS5jLTExOTMtICpcXG5tbS9tZW1wb2xpY3kuYzoxMTk0OiAqIE11c3QgYmUgY2FsbGVkIHdoaWxlIEBuaWQgaXMgTl9NRU1PUllfUFJJVkFURS5cXG5tbS9tZW1wb2xpY3kuYy0xMTk1LSAqXFxuLS1cXG5tbS9tZW1wb2xpY3kuYz0xMjA2PUVYUE9SVF9TWU1CT0xfRk9SX01PRFVMRVMobXBvbF9wcml2YXRlX2JpbmQsIFxcXCJrbWVtXFxcIik7XFxuLS1cXG5tbS9tZW1wb2xpY3kuYy0xMjE1LSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSB1c2VkIGJ5IHNlcnZpY2VzIGltcGxlbnRpbmcgbWVtcG9saWN5IHN1cHBvcnQgd2l0aFxcbm1tL21lbXBvbGljeS5jOjEyMTY6ICogdXNlci1wcm92aWRlZCBub2RlIGJpbmRpbmdzLiBOX01FTU9SWV9QUklWQVRFIG5vZGUgYmluZGluZ3MgYXJlIGhvbm9yZWQgaWZcXG5tbS9tZW1wb2xpY3kuYy0xMjE3LSAqIHRoZSBub2RlIGhhcyBDQVBfVVNFUl9OVU1BLCBvdGhlcndpc2UgcmV0dXJuIC1FSU5WQUwuXFxuLS1cXG5tbS9wYWdlX2FsbG9jLmM9NTk4OT1zdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdClcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02MDA4LVxcdCAqXFxubW0vcGFnZV9hbGxvYy5jOjYwMDk6XFx0ICogUFJJVkFURTogICAgKE5fTUVNT1JZIHwgTl9NRU1PUllfUFJJVkFURSkgLSBhbGxvd3MgYWNjZXNzIHRvXFxubW0vcGFnZV9hbGxvYy5jLTYwMTAtXFx0ICogICAgICAgICAgICAgcHJpdmF0ZSBub2RlcywgYW5kIGZhbGxzIGJhY2sgdG8gbm9ybWFsIG1lbW9yeSB1bmxlc3NcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuYy02MDIyLVxcbm1tL3BhZ2VfYWxsb2MuYzo2MDIzOlxcdG5vZGVzX29yKHRpZXJfbm9kZXMsIG5vZGVfc3RhdGVzW05fTUVNT1JZXSwgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pO1xcbm1tL3BhZ2VfYWxsb2MuYy02MDI0LVxcdGJ1aWxkX25vZGVfem9uZWxpc3QocGdkYXQsIFxcdTAwMjZ0aWVyX25vZGVzLCBaT05FTElTVF9QUklWQVRFLCBmYWxzZSxcXG4tLVxcbm1tL3BhZ2VfYWxsb2MuaC01OS1cXG5tbS9wYWdlX2FsbG9jLmg6NjA6LyogU2VsZWN0IHRoZSBOX01FTU9SWV9QUklWQVRFIHpvbmVsaXN0IGZhbWlseSAoc2VlIHNlbGVjdF96b25lbGlzdCgpKS4gKi9cXG5tbS9wYWdlX2FsbG9jLmgtNjEtI2RlZmluZSBBTExPQ19aT05FTElTVF9QUklWQVRFIDB4MjAwMFxcbi0tXFxubW0vcGFnZV9hbGxvYy5oPTEwMj1zdGF0aWNfYXNzZXJ0KFpPTkVMSVNUX1BSSVZBVEUgKyAxID09IFpPTkVMSVNUX1BSSVZBVEVfTk9GQUxMQkFDSyk7XFxuLS1cXG5tbS9wYWdlX2FsbG9jLmgtMTA4LSAqIFRoZSBkZWZhdWx0IG1hdGNoZXMgbm9kZV96b25lbGlzdCgpOyBBTExPQ19aT05FTElTVF9QUklWQVRFIHNlbGVjdHMgdGhlXFxubW0vcGFnZV9hbGxvYy5oOjEwOTogKiBwcml2YXRlLW5vZGUgZmFtaWx5IHNvIGFuIGFsbG9jYXRpb24gbWF5IHJlYWNoIGFuIE5fTUVNT1JZX1BSSVZBVEUgbm9kZS5cXG5tbS9wYWdlX2FsbG9jLmgtMTEwLSAqL1xcbi0tXFxubW0vdm1zY2FuLmM9OTcwPXN0YXRpYyBzdHJ1Y3QgZm9saW8gKmFsbG9jX2RlbW90ZV9mb2xpbyhzdHJ1Y3QgZm9saW8gKnNyYyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTk3OC1cXHRpZiAobXRjLVxcdTAwM2VubWFzayBcXHUwMDI2XFx1MDAyNlxcbm1tL3Ztc2Nhbi5jOjk3OTpcXHQgICAgbm9kZXNfaW50ZXJzZWN0cygqbXRjLVxcdTAwM2VubWFzaywgbm9kZV9zdGF0ZXNbTl9NRU1PUllfUFJJVkFURV0pKVxcbm1tL3Ztc2Nhbi5jLTk4MC1cXHRcXHRtdGMtXFx1MDAzZWFsbG9jX2ZsYWdzID0gQUxMT0NfWk9ORUxJU1RfUFJJVkFURTtcXG4tLVxcbm1tL3Ztc2Nhbi5jPTU0MTQ9c3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbHJ1X2dlbl9hdHRyX2dyb3VwID0ge1xcbi0tXFxubW0vdm1zY2FuLmMtNTQyNC0gKiBOb2RlcyB0aGUgbHJ1X2dlbiBkZWJ1Z2ZzIGludGVyZmFjZSBsaXN0czogb3JkaW5hcnkgbWVtb3J5IG5vZGVzIHBsdXMgYW55XFxubW0vdm1zY2FuLmM6NTQyNTogKiBOX01FTU9SWV9QUklWQVRFIG5vZGVzIG9wdGVkIGludG8gcmVjbGFpbS4gIHJ1bl9jbWQoKSBhbHJlYWR5IGFjY2VwdHMgdGhlXFxubW0vdm1zY2FuLmMtNTQyNi0gKiBsYXR0ZXIsIHNvIGtlZXAgdGhlIGxpc3RpbmcgaW4gc3luYyB3aXRoIHdoYXQgaXQgYWNjZXB0cy5cXG4tLVxcbm1tL3Ztc2Nhbi5jPTU0Mjg9c3RhdGljIHZvaWQgbHJ1X2dlbl9zZXFfbm9kZXMobm9kZW1hc2tfdCAqbm9kZXMpXFxuLS1cXG5tbS92bXNjYW4uYy01NDMyLVxcdCpub2RlcyA9IG5vZGVfc3RhdGVzW05fTUVNT1JZXTtcXG5tbS92bXNjYW4uYzo1NDMzOlxcdGZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX01FTU9SWV9QUklWQVRFKVxcbm1tL3Ztc2Nhbi5jLTU0MzQtXFx0XFx0aWYgKG5vZGVfYWxsb3dzX3JlY2xhaW0obmlkKSlcXG4tLVxcbm1tL3Ztc2Nhbi5jPTY4MDg9c3RhdGljIHN0cnVjdCB6b25lbGlzdCAqbWVtY2dfcmVjbGFpbV96b25lbGlzdChpbnQgbmlkLCBnZnBfdCBnZnBfbWFzaylcXG4tLVxcbm1tL3Ztc2Nhbi5jLTY4MTEtXFxubW0vdm1zY2FuLmM6NjgxMjpcXHRpZiAodW5saWtlbHkoIW5vZGVzX2VtcHR5KG5vZGVfc3RhdGVzW05fTUVNT1JZX1BSSVZBVEVdKSkpXFxubW0vdm1zY2FuLmMtNjgxMy1cXHRcXHRhZmxhZ3MgPSBBTExPQ19aT05FTElTVF9QUklWQVRFO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yM1QwMjo1NDowNS43NTkyOTcyNDlaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjg2OTI4MzEzNDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgS1ZNIEd1ZXN0IE1lbWZkIE5VTUEgTm9kZSBCaW5kaW5nIFBhdGNoKipcblxuT2theSwgc28gSSd2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzIHBhdGNoLiBUaGUga2V5IHRoaW5nIEknbSBzZWVpbmcgaXMgYSBuZXcgS1ZNIGZlYXR1cmU6IHRoZSBhYmlsaXR5IHRvIGJpbmQgYSBndWVzdCBtZW1mZCB0byBhIHNwZWNpZmljIE5VTUEgbm9kZS4gSW5pdGlhbGx5LCB0aGUgcGF0Y2ggdG91Y2hlcyBga3ZtX2dtZW1fY3JlYXRlYCB0byBhY2NlcHQgYEdVRVNUX01FTUZEX0ZMQUdfQklORF9OT0RFYCBhbmQgdGhlbiBjYWxscyBga3ZtX2dtZW1fYmluZF9ub2RlYC4gVGhpcywgaW4gdHVybiwgY2FsbHMgYG1wb2xfYmluZF9ub2RlYCwgYW5kIHRoYXQgY2FzY2FkZXMgZG93biB0aHJvdWdoIGBfX21wb2xfYmluZF9ub2RlYC4gSSdtIHZlcmlmeWluZyB0aGUgZXhlY3V0aW9uIHBhdGhzIHRvIGJlIHN1cmUuIEl0IGxvb2tzIGxpa2UgYF9fbXBvbF9iaW5kX25vZGVgIGNyZWF0ZXMgYSBtZW1wb2xpY3kgd2l0aCBgTVBPTF9CSU5EYCBhbmQgYE1QT0xfRl9QUklWQVRFYC4gSG93ZXZlciwgdGhlcmUncyBzb21lIGludGVyZXN0aW5nIGxvZ2ljIGFyb3VuZCBwcml2YXRlIG5vZGVzIGFuZCBgQ0FQX1VTRVJfTlVNQWAgdGhhdCBJIG5lZWQgdG8ga2VlcCBzdHJhaWdodC4gSSd2ZSB0cmFja2VkIHRoYXQgZG93biB0b28uXG5cblRoZSBmbG93IGluIGBtcG9sX3NldF9ub2RlbWFza2AgaXMgdGhlIGNydWNpYWwgcGFydDsgaXQgZmlyc3QgY2hlY2tzIHRoZSBgY3B1c2V0X21lbXNfYWxsb3dlZGAsIGFuZCAqdGhlbiogYWRkcyBiYWNrIHByaXZhdGUgbm9kZXMgaWYgYWxsb3dlZCBieSBgbm9kZV9hbGxvd3NfdXNlcl9udW1hYCBhbmQgdGhlIGBNUE9MX0ZfUFJJVkFURWAgZmxhZy4gSSdtIGNvbmZpcm1pbmcgdGhhdCB0aGUgYG5zYy1cdTAwM2VtYXNrMmAgaXMgYmVpbmcgcG9wdWxhdGVkIGNvcnJlY3RseSwgc3BlY2lmaWNhbGx5IGl0IHNlZW1zIGxpa2UgdGhlIGludGVyc2VjdGlvbiBvZiBgKm5vZGVzYCBhbmQgYGNwdXNldF9tZW1zX2FsbG93ZWRgLCB3aXRoIHRoZSBwb3RlbnRpYWwgYWRkaXRpb24gb2YgcHJpdmF0ZSBub2Rlcy4gVGhlIGZpbmFsIHN0ZXAgaXMgd2hlcmUgdGhpcyBtZW1wb2xpY3kgaXMgc2V0IHZpYSBgbXBvbF9vcHNbcG9sLVx1MDAzZW1vZGVdLmNyZWF0ZWAuXG5cbkZyb20gd2hhdCBJIGNhbiB0ZWxsLCBga3ZtX2dtZW1fYmluZF9ub2RlYCBpcyBmdWxseSByZWFjaGFibGUgYW5kIGZ1bmN0aW9uYWwsIGFsbG93aW5nIGJpbmRpbmcgYSBndWVzdCBtZW1mZCB0byBhIHNwZWNpZmljIE5VTUEgbm9kZS4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBhIHVzZWZ1bCBuZXcgZmVhdHVyZSBmb3IgS1ZNLCBhbmQgaXQncyBjZXJ0YWlubHkgc29tZXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgZnV6emVkLiBJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IGBndWVzdF9tZW1mZGAgZG9lc24ndCBoYXZlIGEgVk1BLCBzbyB0cmFkaXRpb25hbCBgbWJpbmQoKWAgZG9lc24ndCBhcHBseTsgdGhpcyBpcyBhIGJyYW5kLW5ldyBhcHByb2FjaC5cblxuTm93LCBsZXQncyBpZGVudGlmeSB3aGF0IGNvbmZpZ3VyYXRpb25zIGFyZSBuZWNlc3NhcnkgdG8gbWFrZSBpdCB3b3JrLiBJJ20gc2VlaW5nIHRoYXQgd2Ugd2lsbCByZXF1aXJlIGBDT05GSUdfS1ZNYCBhbmQgYENPTkZJR19OVU1BYCwgb2YgY291cnNlLiBMZXQncyBtYWtlIHN1cmUgdGhhdCBpcyBzZXQuXG5cblRoZSBjcml0aWNhbCBzeW1ib2xzIGZvciB0ZXN0aW5nIGFyZSBga3ZtX2dtZW1fY3JlYXRlYCwgYF9fa3ZtX2dtZW1fY3JlYXRlYCwgYGt2bV9nbWVtX2JpbmRfbm9kZWAsIGBtcG9sX2JpbmRfbm9kZWAsIGBfX21wb2xfYmluZF9ub2RlYCwgYW5kIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYC4gTGV0J3MgY29uZmlybSB0aGVzZSBhcmUgdGhlIHJpZ2h0IGVudHJ5IHBvaW50cy4gT2theSwgYGt2bV9nbWVtX2NyZWF0ZWAgaXMgdGhlIGVudHJ5IHBvaW50LCBhbmQgdGhhdCBjYWxscyBgX19rdm1fZ21lbV9jcmVhdGVgIHdoaWNoIHRoZW4gY2FsbHMgYGt2bV9nbWVtX2JpbmRfbm9kZWAuIGBtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlYCBzZWVtcyBpbXBvcnRhbnQgZm9yIG1ha2luZyB0aGUgcG9saWN5IGVmZmVjdGl2ZS5cblxuSSdtIHNlZWluZyBhIGxvdCBvZiBjaGFuZ2VzIHJlbGF0ZWQgdG8gcHJpdmF0ZSBtZW1vcnkgbm9kZXMuIFRoZSBwYXRjaCBpcyBzZXR0aW5nIHVwIHRoZSBpbmZyYXN0cnVjdHVyZSBmb3IgcHJpdmF0ZSBub2RlcyB3aXRoIGBOX01FTU9SWV9QUklWQVRFYCBidXQgaXQncyBub3QgYmVpbmcgKnVzZWQqIGJ5IGFueSBkcml2ZXJzIHJpZ2h0IG5vdy4gYGRyaXZlcnMvZGF4L2ttZW0uY2AgaGFzIGJlZW4gdG91Y2hlZCB0b28uIEl0J3MgcGFzc2luZyBhIGBOVUxMYCBmb3IgdGhlIG5vZGUgcG9pbnRlci4gU28gcmVhbGx5LCB0aGUgb25seSB1c2VyLXJlYWNoYWJsZSBuZXcgZnVuY3Rpb25hbGl0eSBmcm9tIHRoaXMgcGF0Y2ggaXMgdGhlIGBHVUVTVF9NRU1GRF9GTEFHX0JJTkRfTk9ERWAgZmxhZy4gV2UgKmRvKiBuZWVkIGBDT05GSUdfTUVNT1JZX0hPVFBMVUdgLCBgQ09ORklHX01FTUNHYCwgYENPTkZJR19OVU1BX0JBTEFOQ0lOR2AsIGBDT05GSUdfTUlHUkFUSU9OYCwgYENPTkZJR19DT01QQUNUSU9OYCwgYENPTkZJR19LU01gLCBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCwgYW5kIGBDT05GSUdfREFNT05fUEFERFJgLCBmb3IgYWxsIHRoZSBjaGFuZ2VzIGluIHRob3NlIGFyZWFzLlxuXG5MZXQncyBhbHNvIG1ha2Ugc3VyZSBga3ZtX2dtZW1fYmluZF9ub2RlYCBhbmQgYG1wb2xfYmluZF9ub2RlYCBhbmQgYG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2VgIGFyZSBjb21waWxlZCBvbmx5IHdoZW4gYENPTkZJR19OVU1BYCBpcyBlbmFibGVkLiBPa2F5LCB5ZXMsIGV2ZXJ5dGhpbmcgY2hlY2tzIG91dCB0aGVyZSB0b28uXG5cbkluIHNob3J0LCB0aGlzIHBhdGNoIGlzIGEgc2lnbmlmaWNhbnQgYW5kICpmdW5jdGlvbmFsKiBhZGRpdGlvbiBmb3IgS1ZNLiBUaGUgcHJpdmF0ZSBub2RlIGFzcGVjdHMgYXJlIGEgZnV0dXJlIGV4cGFuc2lvbiwgYnV0IHRoZSBndWVzdF9tZW1mZCBub2RlIGJpbmRpbmcgaXMgcmVhZHkgdG8gZ28gbm93LiBUaGlzIGRlZmluaXRlbHkgd2FycmFudHMgZm9jdXNlZCBmdXp6aW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MTM5OSwiT3V0cHV0VG9rZW5zIjoyMzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMDU5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTIzVDAyOjU0OjM0LjQ1MjEzMzA1M1oiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg0MzMyMzE3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLVk1cIixcbiAgICBcIk5VTUFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9jcmVhdGVcIixcbiAgICBcIl9fa3ZtX2dtZW1fY3JlYXRlXCIsXG4gICAgXCJrdm1fZ21lbV9iaW5kX25vZGVcIixcbiAgICBcIm1wb2xfYmluZF9ub2RlXCIsXG4gICAgXCJfX21wb2xfYmluZF9ub2RlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgcHJpdmF0ZSBtZW1vcnkgbm9kZXMgYW5kIGFkZHMgc3VwcG9ydCBmb3IgdGhlbSBhY3Jvc3MgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gV2hpbGUgdGhlIGRyaXZlci1mYWNpbmcgQVBJIGlzIG5vdCB5ZXQgdXNlZCBieSBhbnkgaW4tdHJlZSBkcml2ZXIsIHRoZSBwYXRjaCBhbHNvIGludHJvZHVjZXMgYSBuZXcgS1ZNIGZlYXR1cmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgd2hpY2ggYWxsb3dzIGJpbmRpbmcgYSBndWVzdF9tZW1mZCB0byBhIHNwZWNpZmljIE5VTUEgbm9kZS4gVGhpcyBmZWF0dXJlIGlzIGZ1bGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgaW9jdGwgYW5kIHJlbGllcyBvbiB0aGUgbmV3bHkgYWRkZWQgbXBvbF9iaW5kX25vZGUgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgZnVuY3Rpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gS1ZNIGFuZCBjb3JlIG1tIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLVk1cIixcbiAgICBcIk5VTUFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9jcmVhdGVcIixcbiAgICBcIl9fa3ZtX2dtZW1fY3JlYXRlXCIsXG4gICAgXCJrdm1fZ21lbV9iaW5kX25vZGVcIixcbiAgICBcIm1wb2xfYmluZF9ub2RlXCIsXG4gICAgXCJfX21wb2xfYmluZF9ub2RlXCIsXG4gICAgXCJtcG9sX3NldF9zaGFyZWRfcG9saWN5X3JhbmdlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgcHJpdmF0ZSBtZW1vcnkgbm9kZXMgYW5kIGFkZHMgc3VwcG9ydCBmb3IgdGhlbSBhY3Jvc3MgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gV2hpbGUgdGhlIGRyaXZlci1mYWNpbmcgQVBJIGlzIG5vdCB5ZXQgdXNlZCBieSBhbnkgaW4tdHJlZSBkcml2ZXIsIHRoZSBwYXRjaCBhbHNvIGludHJvZHVjZXMgYSBuZXcgS1ZNIGZlYXR1cmUgR1VFU1RfTUVNRkRfRkxBR19CSU5EX05PREUgd2hpY2ggYWxsb3dzIGJpbmRpbmcgYSBndWVzdF9tZW1mZCB0byBhIHNwZWNpZmljIE5VTUEgbm9kZS4gVGhpcyBmZWF0dXJlIGlzIGZ1bGx5IHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIEtWTV9DUkVBVEVfR1VFU1RfTUVNRkQgaW9jdGwgYW5kIHJlbGllcyBvbiB0aGUgbmV3bHkgYWRkZWQgbXBvbF9iaW5kX25vZGUgYW5kIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3lfcmFuZ2UgZnVuY3Rpb25zLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gS1ZNIGFuZCBjb3JlIG1tIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:nil,}