Name: series-workflowqt74q Phase: Succeeded StartedAt: 2026-08-18 08:47:53 +0000 UTC FinishedAt: 2026-08-18 13:02:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[0] Phase: Succeeded StartedAt: 2026-08-18 08:47:53 +0000 UTC FinishedAt: 2026-08-18 09:19:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[0].run-triage Phase: Succeeded StartedAt: 2026-08-18 08:47:53 +0000 UTC FinishedAt: 2026-08-18 09:19:23 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "f79066c784022fda83f5936559a1af414e41b603", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "f79066c784022fda83f5936559a1af414e41b603", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG" ], "series_id": "4fee2344-54c0-46f8-8312-e6b13f7554d1" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim", "bpf_proactive_reclaim_swappiness" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDssCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IGFjdCBhcyB3cmFwcGVycyBhcm91bmQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIGEgcG9pbnRlciB0byBhIGBtZW1fY2dyb3VwYCBzdHJ1Y3R1cmUsIGFsbCBvZiB3aGljaCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIEJQRiBzdWJzeXN0ZW0gYmVmb3JlIHRoZSBrZnVuY3MgYXJlIGludm9rZWQuIFRoZSBsb2NhbCB2YXJpYWJsZSBgc3dhcHBpbmVzc2AgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGJ1dCBpdCBpcyBmdWxseSBpbml0aWFsaXplZCBmcm9tIHRoZSBmdW5jdGlvbiBhcmd1bWVudC4gTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB3aWxsIGJlIGNhdWdodCBieSBLQVNBTi4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgKG1lbW9yeSByZWNsYWltKS4gVGhleSBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSB0aGV5IGRvIG5vdCBpbnRyb2R1Y2UgYnVncyBvciB2dWxuZXJhYmlsaXRpZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBmMGMwYjJlM2E1YWM5OTcwODk0OWFjZTU2MmI4YzMzMDgyNDVmNzMyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTggMDk6MTg6NDAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyMjcyZjlhNTgyNTEgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtNiw2ICYjNDM7Niw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICYjNDM7MTYwLDk3IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcbiYjNDM7ICogb3ZlcndyaXRlcyBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXG4mIzQzOyAqIFNvIGludm9raW5nIGl0IGZyb20gYW4gaW4tZmxpZ2h0IHJlY2xhaW0gd291bGQgY2xvYmJlciB0aGUgb3V0ZXIgcmVjbGFpbVxuJiM0MzsgKiBzdGF0ZSBhbmQgY29ycnVwdCBpdHMgYWNjb3VudGluZy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGd1YXJkIGlzIFBGX01FTUFMTE9DLiBFdmVyeSByZWNsYWltIGVudHJ5IHBvaW50IG1hcmtzIHRoZSBjdXJyZW50XG4mIzQzOyAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcbiYjNDM7ICoga2VlcHMgaXQgc2V0IGZvciBpdHMgZW50aXJlIGxpZmV0aW1lLiBBIGhvb2sgaW5zaWRlIHRoZSByZWNsYWltIHBhdGhcbiYjNDM7ICogKHNocmlua19ub2RlLCBzaHJpbmtfc2xhYiwgLi4uKSBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGVcbiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LVx1MDAzZWZsYWdzIGFscmVhZHkgY2FycmllcyB0aGUgZmxhZy4gVGhlIHBhZ2VcbiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZVxuJiM0MzsgKiBmbGFnIHRvIGF2b2lkIHJlY2xhaW0gcmVjdXJzaW9uLlxuJiM0MzsgKlxuJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZVxuJiM0MzsgKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbiYjNDM7ICogcHJvZ3JhbSBjYW5ub3QgYXR0YWNoIHRvLlxuJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvblxuJiM0MzsgKiBhbmQgdm1hbGxvYyksIHdoZXJlIHRoZSBrZnVuYyBjb25zZXJ2YXRpdmVseSByZWZ1c2VzIHRvIHJlY2xhaW0gYXMgd2VsbC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4mIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4mIzQzOyAqXG4mIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiYjNDM7ICogdGhlIG1lbW9yeS5yZWNsYWltIGNncm91cCBmaWxlOiBwYWdlcyBhcmUgcmVjbGFpbWVkIGFjY29yZGluZyB0byB0aGVcbiYjNDM7ICogY2dyb3VwJiMzOTtzIG93biBzd2FwcGluZXNzIHNldHRpbmcgYW5kIHN3YXAgaXMgYWxsb3dlZC4gTm90ZSB0aGF0LFxuJiM0MzsgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDtcbiYjNDM7ICogY2FsbGVycyBjYW4gaW52b2tlIGl0IGFnYWluIGlmIG5lZWRlZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOlxuJiM0MzsgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXJcbiYjNDM7ICogICB0aGFuIGEgcGFnZSBvciB0aGUgY2FsbGluZyB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmdcbiYjNDM7ICogICBjb250ZXh0IChQRl9NRU1BTExPQykuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFO1xuJiM0MztcbiYjNDM7XHRpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxuJiM0MztcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuJiM0MztcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGNncm91cCB3aXRoIGFuIGV4cGxpY2l0XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzc1xuJiM0MzsgKiBAbWVtY2c6ICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAc2l6ZTogICAgICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcbiYjNDM7ICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzXG4mIzQzOyAqXG4mIzQzOyAqIFNhbWUgYXMgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGV4Y2VwdCB0aGF0IHRoZSBhbm9uL2ZpbGUgcmVjbGFpbVxuJiM0MzsgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJiMzOTtzXG4mIzQzOyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXVxuJiM0MzsgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46XG4mIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuJiM0MzsgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXNcbiYjNDM7ICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcbiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHRcdFx0IGludCBzd2FwcGluZXNzKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7XG4mIzQzO1xuJiM0MztcdGlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyBcdTAwM2MgTUlOX1NXQVBQSU5FU1MgfHxcbiYjNDM7XHQgICAgc3dhcHBpbmVzcyBcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkgfHxcbiYjNDM7XHQgICAgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4mIzQzO1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4mIzQzO1x0XHRcdFx0XHQgICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4mIzQzO31cbiYjNDM7XG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzIsNiAmIzQzOzI2NCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MsIEtGX1NMRUVQQUJMRSlcbiYjNDM7XG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNmZhYjg4MjAzZTdkM1xuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICYjNDM7MSwzODIgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3RcbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy90aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9oZWxwZXJzLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfYXJnc19zIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbiYjNDM7I2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NilcbiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTBcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0dfRElSIFwmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltXCYjMzQ7XG4mIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwmIzM0Oy9oaWdoXCYjMzQ7XG4mIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCYjMzQ7L2xvd1wmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbiYjNDM7I2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwmIzM0O21lbW9yeVwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtlbmFibGVfY29udHJvbGxlcnNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcJiMzNDslbHVcJiMzNDssIENHX0xJTUlUKTtcbiYjNDM7XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5tYXhcJiMzNDssIGxpbWl0X2J1Zik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkuc3dhcC5tYXhcJiMzNDssIFwmIzM0OzBcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfSElHSF9ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfTE9XX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuJiM0MztcdGNoYXIgKmJ1ZmZlcjtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCYjMzQ7d2JcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbiYjNDM7XHRpZiAoIWJ1ZmZlcilcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mcDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuJiM0MztcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuJiM0MztcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuJiM0MztcbiYjNDM7XHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHR3cml0dGVuICYjNDM7PSB0b193cml0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZnJlZShidWZmZXIpO1xuJiM0MztjbGVhbnVwX2ZwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0Y2hhciAqbWFwO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzYjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkID09IC0xKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4mIzQzO1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7XG4mIzQzO1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4mIzQzO1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbiYjNDM7XHRcdFx0KHZvaWQpdjtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cF9mZDpcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDtcbiYjNDM7XHRkb3VibGUgZWxhcHNlZDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSwgXCYjMzQ7am9pbl9wYXJlbnRfY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNnN0YXJ0LCBOVUxMKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0sod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSwgXCYjMzQ7d3JpdGVfZmlsZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSwgXCYjMzQ7cmVhZF9maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNmVuZCwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGltZV9maWxlbmFtZSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7XG4mIzQzO1x0XHQgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wO1xuJiM0MztcdHByaW50ZihcJiMzNDslLjZmXFxuXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDt3XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRmcHJpbnRmKGZwLCBcJiMzNDslLjZmXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1x0Y2hhciBidWZbNjRdO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3JcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCYjMzQ7Zm9wZW5cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwmIzM0O2ZnZXRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0aWYgKHNzY2FuZihidWYsIFwmIzM0OyVsZlwmIzM0OywgdGltZSkgIT0gMSkge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtzc2NhbmYgJXNcJiMzNDssIGJ1Zik7XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGhpZ2hfZGF0YV9maWxlW10gPSBcJiMzNDsvdG1wL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcJiMzNDs7XG4mIzQzO1x0Y2hhciBsb3dfZGF0YV9maWxlW10gPSBcJiMzNDsvdG1wL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OztcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW10gPSBcJiMzNDsvdG1wL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcJiMzNDs7XG4mIzQzO1x0Y2hhciBsb3dfdGltZV9maWxlW10gPSBcJiMzNDsvdG1wL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwmIzM0OztcbiYjNDM7XHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4mIzQzO1x0aW50IGZkLCBzdGF0dXM7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRsb3dfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwmIzM0O2ZvcmsgbG93XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAobG93X3BpZCA9PSAwKVxuJiM0MztcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4mIzQzO1xuJiM0MztcdGhpZ2hfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcJiMzNDtmb3JrIGhpZ2hcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChoaWdoX3BpZCA9PSAwKVxuJiM0MztcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4mIzQzO1x0XHRcdFx0XHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKSwgMCwgXCYjMzQ7bG93IHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2xvdyBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwmIzM0O2xvdyBleGl0IHN0YXR1c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCksIDAsIFwmIzM0O2hpZ2ggd2FpdHBpZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7aGlnaCBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwmIzM0O2hpZ2ggZXhpdCBzdGF0dXNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRpZiAoaGlnaF9waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbiYjNDM7XHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHtcbiYjNDM7XHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuJiM0MztcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuJiM0MztcdFx0LmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCxcbiYjNDM7XHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbiYjNDM7XHR9O1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcbiYjNDM7XHRcdC5jdHhfaW4gPSBcdTAwMjZicGZfYXJncyxcbiYjNDM7XHRcdC5jdHhfc2l6ZV9pbiA9IHNpemVvZihicGZfYXJncykpO1xuJiM0MztcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyb3Jfb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCYjMzQ7cHJvZ19pbml0IHJldHZhbFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XG4mIzQzO1x0KnNrZWxfcHRyID0gc2tlbDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2Vycm9yX291dDpcbiYjNDM7XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfYnBmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWZcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChza2VsKVxuJiM0MztcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MmMyYmI3ZTAzN2I2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICYjNDM7MSwxNjcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfZXhwZXJpbWVudGFsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXHQxXG4mIzQzOyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRVx0XHQoMzIgKiBQQUdFX1NJWkUpXG4mIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlx0MzJcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfYXJnc19zIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuJiM0Mzt7XG4mIzQzO1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuJiM0MztcdGlmICghY20tXHUwMDNlY2dycClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbiYjNDM7XHRpZiAoIWNtLVx1MDAzZW1lbWNnKSB7XG4mIzQzO1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbiYjNDM7e1xuJiM0MztcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4mIzQzO1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbiYjNDM7XHQqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpO1xuJiM0MztcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2xcbiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbiYjNDM7e1xuJiM0MztcdHU2NCBjdXIsIGRlbHRhO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsIFx1MDAyNmN1cikpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7XG4mIzQzO1x0KnByZXZfZXZlbnQgPSBjdXI7XG4mIzQzO1xuJiM0MztcdHJldHVybiBkZWx0YSBcdTAwM2U9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKCFicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSkpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7XG4mIzQzO1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4mIzQzO1x0dTY0IHByZXZfZXZlbnQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO1x0X190eXBlKGtleSwgX191MzIpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuJiM0Mzt9IHdxX21hcCBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuJiM0MztcdFx0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XG4mIzQzO1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbiYjNDM7XHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4mIzQzO3tcbiYjNDM7XHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7XHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4mIzQzO1x0aWYgKCFlbGVtKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0ZWxlbS1cdTAwM2VwcmV2X2V2ZW50ID0gMDtcbiYjNDM7XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbiYjNDM7XG4mIzQzO1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIExJQ0VOU0VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDssCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgd2hpY2ggYWxsb3cgQlBGIHByb2dyYW1zIHRvIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnkgY2dyb3VwLiBUaGVzZSBmdW5jdGlvbnMgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgbW9kaWZ5IGNvcmUga2VybmVsIGxvZ2ljIChtZW1vcnkgcmVjbGFpbSkuIFRoZXkgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBkbyBub3QgaW50cm9kdWNlIGJ1Z3Mgb3IgdnVsbmVyYWJpbGl0aWVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZjBjMGIyZTNhNWFjOTk3MDg5NDlhY2U1NjJiOGMzMzA4MjQ1ZjczMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgQXVnIDE4IDA5OjE4OjQwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uOTIyNzJmOWE1ODI1MSAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDk3IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHkKJiM0MzsgKiBvdmVyd3JpdGVzIGN1cnJlbnQtJmd0O3JlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuCiYjNDM7ICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltCiYjNDM7ICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuCiYjNDM7ICoKJiM0MzsgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnQKJiM0MzsgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpCiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGQKJiM0MzsgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlCiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LSZndDtmbGFncyBhbHJlYWR5IGNhcnJpZXMgdGhlIGZsYWcuIFRoZSBwYWdlCiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZQomIzQzOyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uCiYjNDM7ICoKJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZQomIzQzOyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRgomIzQzOyAqIHByb2dyYW0gY2Fubm90IGF0dGFjaCB0by4KJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvbgomIzQzOyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZQomIzQzOyAqIGNncm91cCYjMzk7cyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCwKJiM0MzsgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDsKJiM0MzsgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlcgomIzQzOyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nCiYjNDM7ICogICBjb250ZXh0IChQRl9NRU1BTExPQykuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFOwomIzQzOwomIzQzOwlpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLCBOVUxMKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzcwomIzQzOyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzCiYjNDM7ICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzCiYjNDM7ICoKJiM0MzsgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW0KJiM0MzsgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJiMzOTtzCiYjNDM7ICogc3dhcHBpbmVzcyBzZXR0aW5nLiBWYWxpZCB2YWx1ZXMgYXJlIFtNSU5fU1dBUFBJTkVTUywgTUFYX1NXQVBQSU5FU1NdCiYjNDM7ICogYW5kIFNXQVBQSU5FU1NfQU5PTl9PTkxZLCB3aGljaCByZXN0cmljdHMgcmVjbGFpbSB0byBhbm9uIGZvbGlvcy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXIKJiM0MzsgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXMKJiM0MzsgKiAgIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmcgY29udGV4dCAoUEZfTUVNQUxMT0MpLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcKJiM0MzticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgc2l6ZSwKJiM0MzsJCQkJIGludCBzd2FwcGluZXNzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7CiYjNDM7CiYjNDM7CWlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyAmbHQ7IE1JTl9TV0FQUElORVNTIHx8CiYjNDM7CSAgICBzd2FwcGluZXNzICZndDsgU1dBUFBJTkVTU19BTk9OX09OTFkgfHwKJiM0MzsJICAgIHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJICAgICZhbXA7c3dhcHBpbmVzcyk7CiYjNDM7fQomIzQzOwogX19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKIAogQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpCkBAIC0xNzIsNiAmIzQzOzI2NCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiAKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpCiYjNDM7CiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNmZhYjg4MjAzZTdkMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwzODIgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3QKJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTAKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlzaXplX3Qgd3JpdHRlbiA9IDA7CiYjNDM7CWNoYXIgKmJ1ZmZlcjsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4oZmlsZW5hbWUsICYjMzQ7d2ImIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTsKJiM0MzsJaWYgKCFidWZmZXIpCiYjNDM7CQlnb3RvIGNsZWFudXBfZnA7CiYjNDM7CiYjNDM7CW1lbXNldChidWZmZXIsICYjMzk7QSYjMzk7LCBCVUZGRVJfU0laRSk7CiYjNDM7CiYjNDM7CXdoaWxlICh3cml0dGVuICZsdDsgRklMRV9TSVpFKSB7CiYjNDM7CQlzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuICZsdDsgQlVGRkVSX1NJWkUgPwomIzQzOwkJCQkgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTsKJiM0MzsKJiM0MzsJCWlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCXdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZnJlZShidWZmZXIpOwomIzQzO2NsZWFudXBfZnA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CWxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwljaGFyICptYXA7CiYjNDM7CXNpemVfdCBpOwomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBzdGF0IHNiOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkID09IC0xKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChmc3RhdChmZCwgJmFtcDtzYikgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcbiYjMzQ7LAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7CiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKJiM0MzsJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlmb3IgKGludCBpdGVyID0gMDsgaXRlciAmbHQ7IGl0ZXJhdGlvbnM7IGl0ZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHsKJiM0MzsJCQkvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqLwomIzQzOwkJCXZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTsKJiM0MzsJCQkodm9pZCl2OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXBfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsCiYjNDM7CQkJCWNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCAmIzM0O2pvaW5fcGFyZW50X2Nncm91cCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7c3RhcnQsIE5VTEwpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpLCAmIzM0O3dyaXRlX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSwgJiMzNDtyZWFkX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWdldHRpbWVvZmRheSgmYW1wO2VuZCwgTlVMTCk7CiYjNDM7CiYjNDM7CWlmICghdGltZV9maWxlbmFtZSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwllbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7CiYjNDM7CQkgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wOwomIzQzOwlwcmludGYoJiMzNDslLjZmXG4mIzM0OywgZWxhcHNlZCk7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDt3JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW10gPSAmIzM0Oy90bXAvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWCYjMzQ7OwomIzQzOwljaGFyIGxvd19kYXRhX2ZpbGVbXSA9ICYjMzQ7L3RtcC9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtdID0gJiMzNDsvdG1wL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBsb3dfdGltZV9maWxlW10gPSAmIzM0Oy90bXAvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYJiMzNDs7CiYjNDM7CXBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTsKJiM0MzsJaW50IGZkLCBzdGF0dXM7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwloaWdoX3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsICYjMzQ7Zm9yayBoaWdoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoaGlnaF9waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLAomIzQzOwkJCQkJICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9HVCh3YWl0cGlkKGxvd19waWQsICZhbXA7c3RhdHVzLCAwKSwgMCwgJiMzNDtsb3cgd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCAmIzM0O2xvdyBleGl0IHN0YXR1cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApLCAwLCAmIzM0O2hpZ2ggd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgJiMzNDtoaWdoIGV4aXQgc3RhdHVzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJLyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi8KJiM0MzsJaWYgKHJldCkgewomIzQzOwkJaWYgKGhpZ2hfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwoaGlnaF9waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwkJaWYgKGxvd19waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChsb3dfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXVubGluayhsb3dfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsOwomIzQzOwlzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHsKJiM0MzsJCS5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLAomIzQzOwkJLmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLAomIzQzOwkJLmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCwKJiM0MzsJCS5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLAomIzQzOwkJLmN0eF9pbiA9ICZhbXA7YnBmX2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTsKJiM0MzsJaW50IHByb2dfaW5pdF9mZCwgZXJyOwomIzQzOwomIzQzOwlza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsICZhbXA7cnVuX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsICYjMzQ7cHJvZ19pbml0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwkqc2tlbF9wdHIgPSBza2VsOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJvcl9vdXQ6CiYjNDM7CW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDsKJiM0MzsJaW50IGVycjsKJiM0MzsJZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygmYW1wO2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2xvd19jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsICZhbXA7c2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7aGlnaF90aW1lLCAmYW1wO2xvd190aW1lLCBSRUFEX1RJTUVTKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChoaWdoX3RpbWUgJmd0Oz0gbG93X3RpbWUpCiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7aGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmJiMzNDssCiYjNDM7CQkJICAgaGlnaF90aW1lLCBsb3dfdGltZSk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAoc2tlbCkKJiM0MzsJCW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjJjMmJiN2UwMzdiNgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsMTY3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSUQJMQomIzQzOyNkZWZpbmUgUEFHRV9TSVpFCQk0MDk2VUwKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnA7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoIWJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKSkKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwomIzQzOwlpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2VsZW0tJmd0O3ByZXZfZXZlbnQsCiYjNDM7CQllbGVtLSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7CiYjNDM7CQlyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTsKJiM0MzsJCWJwZl93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgYXN5bmNfZnJlZSwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5Mjg1CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMzA4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIE5ldyBCUEYgTWVtb3J5IFJlY2xhbWF0aW9uIEtmdW5jcyoqCgpPa2F5LCBzbyB3ZSBoYXZlIGEgcGF0Y2ggaW50cm9kdWNpbmcgdHdvIG5ldyBCUEYga2Z1bmNzOiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gVGhleSYjMzk7dmUgYmVlbiBhZGRlZCB0byBgbW0vYnBmX21lbWNvbnRyb2wuY2AsIHdoaWNoIHRlbGxzIG1lIHRoaXMgaXMgZGlyZWN0bHkgaW50ZXJhY3Rpbmcgd2l0aCBtZW1vcnkgY2dyb3VwIG1hbmFnZW1lbnQg4oCTIHRoYXQmIzM5O3MgZGVmaW5pdGVseSBpbnRlcmVzdGluZy4gVGhlc2UgZnVuY3Rpb25zIGVzc2VudGlhbGx5IGFsbG93IEJQRiBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFtYXRpb24gd2l0aGluIGEgbWVtb3J5IGNncm91cC4gR2l2ZW4gdGhlaXIgbmFtZXMsIGBzd2FwcGluZXNzYCBzdWdnZXN0cyB0aGV5IG9mZmVyIHNvbWUgY29udHJvbCBvdmVyIHN3YXAgYmVoYXZpb3IsIHdoaWNoIGlzIGEgbnVhbmNlZCBhZGRpdGlvbi4KClRoZSBmYWN0IHRoYXQgdGhleSYjMzk7cmUgbGV2ZXJhZ2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgdW5kZXIgdGhlIGhvb2QgZ2l2ZXMgbWUgYSBnb29kIGlkZWEgb2YgdGhlaXIgZnVuZGFtZW50YWwgb3BlcmF0aW9uLiBOb3csIGFzIGZvciB0aGVpciBleHBvc3VyZS4uLiB0aGV5JiMzOTtyZSBleHBvcnRlZCB1c2luZyBgQlRGX0lEX0ZMQUdTYCwgd2hpY2ggdGVsbHMgbWUgdGhleSBhcmUgaW5kZWVkIHNsZWVwYWJsZSBCUEYga2Z1bmNzLiBFeGNlbGxlbnQg4oCTIHNsZWVwYWJsZSBrZnVuY3Mgb3BlbiB1cCBhIGxvdCBvZiBwb3RlbnRpYWwgdXNlIGNhc2VzLCBpbmNsdWRpbmcgaW50ZWdyYXRpb24gd2l0aCBjb21wbGV4IG1vbml0b3Jpbmcgb3IgY29udHJvbCBsb2dpYyB3aXRoaW4gdGhlIG1lbW9yeSBjZ3JvdXAuCgpUaGlzIGlzIGEgY2xlYXIsIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBrZXJuZWwsIHByb3ZpZGluZyBhIG5ldyBpbnRlcmZhY2UgZm9yIEJQRiBwcm9ncmFtcyB0byBpbnRlcmFjdCB3aXRoIG1lbW9yeSByZWNsYW1hdGlvbi4gSXQmIzM5O3MgYSBzaWduaWZpY2FudCBlbm91Z2ggYWRkaXRpb24gdGhhdCBmdXp6aW5nIHRoZXNlIGZ1bmN0aW9ucyBpcyBhYnNvbHV0ZWx5IGVzc2VudGlhbC4gTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBTaW5jZSB0aGUgY29kZSByZXNpZGVzIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgbXkgbmV4dCBzdGVwIGlzIHRvIGV4YW1pbmUgYG1tL01ha2VmaWxlYCBhbmQgYG1tL0tjb25maWdgIHRvIGlkZW50aWZ5IHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9ucyB0byBlbmFibGUgYGJwZl9tZW1jb250cm9sLmNgLCBhbmQgY29uc2VxdWVudGx5LCB0aGVzZSBuZXcga2Z1bmNzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl9tZW1jb250cm9sLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMDM4CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQ29uZmlndXJpbmcgdGhlIEJQRiBNZW1jZyBJbnRlZ3JhdGlvbioqCgpSaWdodCwgc28gd2UmIzM5O3JlIGRpdmluZyBpbnRvIEJQRiBhbmQgbWVtb3J5IGNvbnRyb2wuIFRoZSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCB3ZSYjMzk7bGwgbmVlZCBib3RoIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX01FTUNHYCBlbmFibGVkIOKAkyBvYnZpb3VzbHksIGdpdmVuIHRoZSBjb250ZXh0LiBMZXQmIzM5O3Mgc2VlIGlmIHdlIG1pc3NlZCBhbnl0aGluZyBvYnZpb3VzIGluIHRoZSBjb25maWcsIGFuZCB3aGlsZSB3ZSYjMzk7cmUgYXQgaXQsIEkgc2hvdWxkIHBva2UgYXJvdW5kIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gSG9wZWZ1bGx5LCBhbnkgcmVsYXRlZCBjb25maWdzIGFyZSBlYXNpbHkgaWRlbnRpZmllZCB0aGVyZS4gV2UgZG9uJiMzOTt0IHdhbnQgYW55IHN1cnByaXNlcyBsYXRlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR18mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9icGZfbWVtY29udHJvbC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDI1OAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkNoZWNraW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBBdmFpbGFiaWxpdHkqKgoKUmlnaHQsIGxldCYjMzk7cyBqdXN0IGNvbmZpcm0gc29tZXRoaW5nIGJlZm9yZSBJIGdvIGZ1cnRoZXIgZG93biB0aGlzIHJhYmJpdCBob2xlLiBJIG5lZWQgdG8gbWFrZSBzdXJlIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBpcyBhY3R1YWxseSBhY2Nlc3NpYmxlLiBJJiMzOTttIHByZXR0eSBzdXJlIGl0JiMzOTtzICp0aGVyZSosIGJ1dCBJJiMzOTttIGJlaW5nIG1ldGljdWxvdXMuIFF1aWNrIGNoZWNrLi4uIHllcCwgYWNjb3JkaW5nIHRvIG15IG1lbnRhbCBtYXAgb2YgdGhlIGtlcm5lbCBzb3VyY2UsIHRoYXQmIzM5O3MgZGVmaW5lZCBpbiBgbW0vdm1zY2FuLmNgLiBHb29kLCB0aGF0IGNvbmZpcm1zIGl0LiBOb3cgSSBjYW4gcHJvY2VlZCB3aXRoIHRoZSBhc3N1bXB0aW9ucyBJIHdhcyBwbGFubmluZyBvbiBtYWtpbmcgYWJvdXQgaXRzIGZ1bmN0aW9uYWxpdHkgd2l0aGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBmcmFtZXdvcmsuIFRoYXQgYWxzbyBtZWFucyB0aGUgcmVsZXZhbnQgaW5jbHVkZXMgYXJlIHByb2JhYmx5IGFscmVhZHkgaGFuZGxlZCBoaWdoZXIgdXAgaW4gdGhlIGNhbGwgc3RhY2suIExldCYjMzk7cyBzZWUgaG93IGl0JiMzOTtzIGJlaW5nIHVzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9icGZfbWVtY29udHJvbC5jPTE1OD1fX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE2My0vKlxubW0vYnBmX21lbWNvbnRyb2wuYzoxNjQ6ICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5XG5tbS9icGZfbWVtY29udHJvbC5jLTE2NS0gKiBvdmVyd3JpdGVzIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSBvbiBlbnRyeSBhbmQgcmVzZXRzIGl0IHRvIE5VTEwgb24gZXhpdC5cbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE2OS0gKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcbm1tL2JwZl9tZW1jb250cm9sLmM6MTcwOiAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbm1tL2JwZl9tZW1jb250cm9sLmMtMTcxLSAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0xNzctICpcbm1tL2JwZl9tZW1jb250cm9sLmM6MTc4OiAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXG5tbS9icGZfbWVtY29udHJvbC5jLTE3OS0gKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jPTIwNj1fX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yMTMtXG5tbS9icGZfbWVtY29udHJvbC5jOjIxNDpcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjE1LVx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYz0yMzg9YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNDctXG5tbS9icGZfbWVtY29udHJvbC5jOjI0ODpcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ5LVx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE0ODE9c3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9tYXgoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIxLVxubW0vbWVtY29udHJvbC12MS5jOjE1MjI6XHRcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIzLVx0XHRcdFx0bWVtc3cgPyAwIDogTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpIHtcbi0tXG5tbS9tZW1jb250cm9sLXYxLmM9MTU0MD1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYy0xNTUzLVxubW0vbWVtY29udHJvbC12MS5jOjE1NTQ6XHRcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTU1LVx0XHRcdFx0XHRcdCAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXG4tLVxubW0vbWVtY29udHJvbC5jPTIzMjg9c3RhdGljIHVuc2lnbmVkIGxvbmcgcmVjbGFpbV9oaWdoKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLmMtMjM0My1cdFx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjM0NDpcdFx0bnJfcmVjbGFpbWVkICYjNDM7PSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcbm1tL21lbWNvbnRyb2wuYy0yMzQ1LVx0XHRcdFx0XHRcdFx0Z2ZwX21hc2ssXG4tLVxubW0vbWVtY29udHJvbC5jPTI1OTU9c3RhdGljIGludCB0cnlfY2hhcmdlX21lbWNnKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgZ2ZwX3QgZ2ZwX21hc2ssXG4tLVxubW0vbWVtY29udHJvbC5jLTI2NTQtXHRwc2lfbWVtc3RhbGxfZW50ZXIoXHUwMDI2cGZsYWdzKTtcbm1tL21lbWNvbnRyb2wuYzoyNjU1Olx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1fb3Zlcl9saW1pdCwgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjY1Ni1cdFx0XHRcdFx0XHQgICAgZ2ZwX21hc2ssIHJlY2xhaW1fb3B0aW9ucywgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ3Njg9c3RhdGljIHNzaXplX3QgbWVtb3J5X2hpZ2hfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxuLS1cbm1tL21lbWNvbnRyb2wuYy00ODAyLVxubW0vbWVtY29udHJvbC5jOjQ4MDM6XHRcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gaGlnaCxcbm1tL21lbWNvbnRyb2wuYy00ODA0LVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKTtcbi0tXG5tbS9tZW1jb250cm9sLmM9NDgyMD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfbWF4X3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDg1NC1cdFx0aWYgKG5yX3JlY2xhaW1zKSB7XG5tbS9tZW1jb250cm9sLmM6NDg1NTpcdFx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gbWF4LFxubW0vbWVtY29udHJvbC5jLTQ4NTYtXHRcdFx0XHRcdEdGUF9LRVJORUwsIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL3Ztc2Nhbi5jPTY3MjI9dW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS92bXNjYW4uYy02NzYxLVxubW0vdm1zY2FuLmM6Njc2Mjp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjc2My1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYy02ODAyLSNlbHNlXG5tbS92bXNjYW4uYzo2ODAzOnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG5tbS92bXNjYW4uYy02ODA0LVx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL3Ztc2Nhbi5jPTc4NjY9aW50IHVzZXJfcHJvYWN0aXZlX3JlY2xhaW0oY2hhciAqYnVmLFxuLS1cbm1tL3Ztc2Nhbi5jLTc5MzMtXHRcdFx0XHRcdCAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkU7XG5tbS92bXNjYW4uYzo3OTM0Olx0XHRcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csXG5tbS92bXNjYW4uYy03OTM1LVx0XHRcdFx0XHRcdCBiYXRjaF9zaXplLCBnZnBfbWFzayxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjE2MQoJCQkJCQkJb3V0cHV0OiAxNTIKCQkJCQkJCXRob3VnaHRzOiAyMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7dmUgaWRlbnRpZmllZCBzb21lIHByb21pc2luZyB0YXJnZXRzIGZvciBmdXp6aW5nIHdpdGhpbiB0aGUgQlBGIHN1YnN5c3RlbS4gVGhlIGtleSBoZXJlIGlzIHRob3NlIG5ldyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCBmdW5jdGlvbnMuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoZXNlIGFyZSAqcmVhY2hhYmxlKiDigJMgbWVhbmluZyB0aGV5JiMzOTtyZSBleHBvc2VkIGFuZCBjYWxsYWJsZSBmcm9tIHdpdGhpbiBCUEYgcHJvZ3JhbXMsIHdoaWNoIGltbWVkaWF0ZWx5IHJhaXNlcyBhIGZsYWcuCgpHaXZlbiB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgdG91Y2hpbmcgbWVtb3J5IHJlY2xhaW0sIHdoaWNoIGlzIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBhbHdheXMgYSBzb3VyY2Ugb2YgY29tcGxleCBpbnRlcmFjdGlvbnMsIGZ1enppbmcgaXMgZGVmaW5pdGVseSB3YXJyYW50ZWQuIFRoZXkmIzM5O3JlIHByaW1lIGNhbmRpZGF0ZXMgZm9yIHBvdGVudGlhbCBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy4KCkkmIzM5O3ZlIGNvbmZpcm1lZCB0aGUgcmVsZXZhbnQgY29uZmlncyBhcmUgZW5hYmxlZDogYEJQRl9TWVNDQUxMYCBhbmQgYE1FTUNHYC4gVGhvc2UgYXJlIHByZXR0eSBzdGFuZGFyZCwgdGhhbmtmdWxseSwgc28gbm8gc3VycHJpc2VzIHRoZXJlLiBMZXQgbWUganVzdCBkb3VibGUtY2hlY2sgdGhhdCB0aGVyZSBhcmVuJiMzOTt0IGFueSBvdGhlciwgbGVzcyBvYnZpb3VzLCBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGFjY291bnQgZm9yLi4uIE5vcGUsIHRob3NlIHR3byBhcmUgdGhlIG9ubHkgb25lcy4KCkJhc2VkIG9uIGFsbCBvZiB0aGF0LCBJIGNhbiBjb25maWRlbnRseSByZXR1cm4gYFdvcnRoRnV6emluZz10cnVlYC4gTXkgZm9jdXMgd2lsbCBiZSBvbiB0aG9zZSB0d28gZnVuY3Rpb25zLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgYW5kIEkmIzM5O2xsIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBmdXp6ZXIgaXMgcHJvcGVybHkgY29uZmlndXJlZCB3aXRoIGJvdGggYEJQRl9TWVNDQUxMYCBhbmQgYE1FTUNHYCBlbmFibGVkLiBJJiMzOTtsbCBuZWVkIHRvIGRldmVsb3AgYXBwcm9wcmlhdGUgZnV6emluZyBoYXJuZXNzZXMgdG8gcmVhbGx5IHB1dCB0aGVzZSBuZXcgZnVuY3Rpb25zIHRocm91Z2ggdGhlaXIgcGFjZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtNRU1DRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7LAogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIG1vZGlmeSBjb3JlIGtlcm5lbCBsb2dpYyAobWVtb3J5IHJlY2xhaW0pLiBUaGV5IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgZG8gbm90IGludHJvZHVjZSBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7TUVNQ0cmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OywKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgKG1lbW9yeSByZWNsYWltKS4gVGhleSBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSB0aGV5IGRvIG5vdCBpbnRyb2R1Y2UgYnVncyBvciB2dWxuZXJhYmlsaXRpZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IGFjdCBhcyB3cmFwcGVycyBhcm91bmQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIGEgcG9pbnRlciB0byBhIGBtZW1fY2dyb3VwYCBzdHJ1Y3R1cmUsIGFsbCBvZiB3aGljaCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIEJQRiBzdWJzeXN0ZW0gYmVmb3JlIHRoZSBrZnVuY3MgYXJlIGludm9rZWQuIFRoZSBsb2NhbCB2YXJpYWJsZSBgc3dhcHBpbmVzc2AgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGJ1dCBpdCBpcyBmdWxseSBpbml0aWFsaXplZCBmcm9tIHRoZSBmdW5jdGlvbiBhcmd1bWVudC4gTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB3aWxsIGJlIGNhdWdodCBieSBLQVNBTi4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZjBjMGIyZTNhNWFjOTk3MDg5NDlhY2U1NjJiOGMzMzA4MjQ1ZjczMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgQXVnIDE4IDA5OjE4OjQwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uOTIyNzJmOWE1ODI1MSAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDk3IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHkKJiM0MzsgKiBvdmVyd3JpdGVzIGN1cnJlbnQtJmd0O3JlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuCiYjNDM7ICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltCiYjNDM7ICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuCiYjNDM7ICoKJiM0MzsgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnQKJiM0MzsgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpCiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGQKJiM0MzsgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlCiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LSZndDtmbGFncyBhbHJlYWR5IGNhcnJpZXMgdGhlIGZsYWcuIFRoZSBwYWdlCiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZQomIzQzOyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uCiYjNDM7ICoKJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZQomIzQzOyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRgomIzQzOyAqIHByb2dyYW0gY2Fubm90IGF0dGFjaCB0by4KJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvbgomIzQzOyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZQomIzQzOyAqIGNncm91cCYjMzk7cyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCwKJiM0MzsgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDsKJiM0MzsgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlcgomIzQzOyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nCiYjNDM7ICogICBjb250ZXh0IChQRl9NRU1BTExPQykuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFOwomIzQzOwomIzQzOwlpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLCBOVUxMKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzcwomIzQzOyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzCiYjNDM7ICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzCiYjNDM7ICoKJiM0MzsgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW0KJiM0MzsgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJiMzOTtzCiYjNDM7ICogc3dhcHBpbmVzcyBzZXR0aW5nLiBWYWxpZCB2YWx1ZXMgYXJlIFtNSU5fU1dBUFBJTkVTUywgTUFYX1NXQVBQSU5FU1NdCiYjNDM7ICogYW5kIFNXQVBQSU5FU1NfQU5PTl9PTkxZLCB3aGljaCByZXN0cmljdHMgcmVjbGFpbSB0byBhbm9uIGZvbGlvcy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXIKJiM0MzsgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXMKJiM0MzsgKiAgIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmcgY29udGV4dCAoUEZfTUVNQUxMT0MpLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcKJiM0MzticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgc2l6ZSwKJiM0MzsJCQkJIGludCBzd2FwcGluZXNzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7CiYjNDM7CiYjNDM7CWlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyAmbHQ7IE1JTl9TV0FQUElORVNTIHx8CiYjNDM7CSAgICBzd2FwcGluZXNzICZndDsgU1dBUFBJTkVTU19BTk9OX09OTFkgfHwKJiM0MzsJICAgIHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJICAgICZhbXA7c3dhcHBpbmVzcyk7CiYjNDM7fQomIzQzOwogX19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKIAogQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpCkBAIC0xNzIsNiAmIzQzOzI2NCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiAKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpCiYjNDM7CiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNmZhYjg4MjAzZTdkMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwzODIgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3QKJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTAKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlzaXplX3Qgd3JpdHRlbiA9IDA7CiYjNDM7CWNoYXIgKmJ1ZmZlcjsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4oZmlsZW5hbWUsICYjMzQ7d2ImIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTsKJiM0MzsJaWYgKCFidWZmZXIpCiYjNDM7CQlnb3RvIGNsZWFudXBfZnA7CiYjNDM7CiYjNDM7CW1lbXNldChidWZmZXIsICYjMzk7QSYjMzk7LCBCVUZGRVJfU0laRSk7CiYjNDM7CiYjNDM7CXdoaWxlICh3cml0dGVuICZsdDsgRklMRV9TSVpFKSB7CiYjNDM7CQlzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuICZsdDsgQlVGRkVSX1NJWkUgPwomIzQzOwkJCQkgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTsKJiM0MzsKJiM0MzsJCWlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCXdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZnJlZShidWZmZXIpOwomIzQzO2NsZWFudXBfZnA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CWxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwljaGFyICptYXA7CiYjNDM7CXNpemVfdCBpOwomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBzdGF0IHNiOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkID09IC0xKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChmc3RhdChmZCwgJmFtcDtzYikgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcbiYjMzQ7LAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7CiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKJiM0MzsJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlmb3IgKGludCBpdGVyID0gMDsgaXRlciAmbHQ7IGl0ZXJhdGlvbnM7IGl0ZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHsKJiM0MzsJCQkvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqLwomIzQzOwkJCXZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTsKJiM0MzsJCQkodm9pZCl2OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXBfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsCiYjNDM7CQkJCWNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCAmIzM0O2pvaW5fcGFyZW50X2Nncm91cCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7c3RhcnQsIE5VTEwpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpLCAmIzM0O3dyaXRlX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSwgJiMzNDtyZWFkX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWdldHRpbWVvZmRheSgmYW1wO2VuZCwgTlVMTCk7CiYjNDM7CiYjNDM7CWlmICghdGltZV9maWxlbmFtZSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwllbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7CiYjNDM7CQkgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wOwomIzQzOwlwcmludGYoJiMzNDslLjZmXG4mIzM0OywgZWxhcHNlZCk7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDt3JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW10gPSAmIzM0Oy90bXAvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWCYjMzQ7OwomIzQzOwljaGFyIGxvd19kYXRhX2ZpbGVbXSA9ICYjMzQ7L3RtcC9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtdID0gJiMzNDsvdG1wL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBsb3dfdGltZV9maWxlW10gPSAmIzM0Oy90bXAvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYJiMzNDs7CiYjNDM7CXBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTsKJiM0MzsJaW50IGZkLCBzdGF0dXM7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwloaWdoX3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsICYjMzQ7Zm9yayBoaWdoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoaGlnaF9waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLAomIzQzOwkJCQkJICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9HVCh3YWl0cGlkKGxvd19waWQsICZhbXA7c3RhdHVzLCAwKSwgMCwgJiMzNDtsb3cgd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCAmIzM0O2xvdyBleGl0IHN0YXR1cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApLCAwLCAmIzM0O2hpZ2ggd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgJiMzNDtoaWdoIGV4aXQgc3RhdHVzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJLyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi8KJiM0MzsJaWYgKHJldCkgewomIzQzOwkJaWYgKGhpZ2hfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwoaGlnaF9waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwkJaWYgKGxvd19waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChsb3dfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXVubGluayhsb3dfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsOwomIzQzOwlzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHsKJiM0MzsJCS5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLAomIzQzOwkJLmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLAomIzQzOwkJLmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCwKJiM0MzsJCS5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLAomIzQzOwkJLmN0eF9pbiA9ICZhbXA7YnBmX2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTsKJiM0MzsJaW50IHByb2dfaW5pdF9mZCwgZXJyOwomIzQzOwomIzQzOwlza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsICZhbXA7cnVuX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsICYjMzQ7cHJvZ19pbml0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwkqc2tlbF9wdHIgPSBza2VsOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJvcl9vdXQ6CiYjNDM7CW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDsKJiM0MzsJaW50IGVycjsKJiM0MzsJZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygmYW1wO2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2xvd19jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsICZhbXA7c2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7aGlnaF90aW1lLCAmYW1wO2xvd190aW1lLCBSRUFEX1RJTUVTKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChoaWdoX3RpbWUgJmd0Oz0gbG93X3RpbWUpCiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7aGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmJiMzNDssCiYjNDM7CQkJICAgaGlnaF90aW1lLCBsb3dfdGltZSk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAoc2tlbCkKJiM0MzsJCW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjJjMmJiN2UwMzdiNgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsMTY3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSUQJMQomIzQzOyNkZWZpbmUgUEFHRV9TSVpFCQk0MDk2VUwKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnA7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoIWJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKSkKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwomIzQzOwlpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2VsZW0tJmd0O3ByZXZfZXZlbnQsCiYjNDM7CQllbGVtLSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7CiYjNDM7CQlyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTsKJiM0MzsJCWJwZl93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgYXN5bmNfZnJlZSwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTI4MgoJCQkJCQkJb3V0cHV0OiAyMjEKCQkJCQkJCXRob3VnaHRzOiA2NTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQb3RlbnRpYWwgZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IEV4cG9zdXJlIGluIE5ldyBCUEYga2Z1bmNzKioKCk9rYXksIHNvIHdlJiMzOTt2ZSBnb3QgdGhlc2UgbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCBkZXNpZ25lZCB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSB3aXRoaW4gYSBtZW1jZy4gVGhleSB0YWtlIGEgYHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZ2AsIGFuIGB1bnNpZ25lZCBsb25nIHNpemVgLCBhbmQsIG9wdGlvbmFsbHksIGFuIGBpbnQgc3dhcHBpbmVzc2AgdmFsdWUuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzLCBhcyBhbHdheXMsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IOKAkyB0aGF0JiMzOTtzIGEgY2xhc3NpYyBzZWN1cml0eSB2ZWN0b3IuCgpMb29raW5nIGF0IHRoZSBjb2RlLCBgbWVtY2dgIGNvbWVzIGZyb20gYSBgYnBmX2dldF9tZW1fY2dyb3VwYCBjYWxsIChvciBzaW1pbGFyKSwgc28gaXQmIzM5O3MgYSB2YWxpZCBwb2ludGVyLiBUaGUgYHNpemVgIGFuZCBgc3dhcHBpbmVzc2AgYXJndW1lbnRzIGFyZSBzY2FsYXIgdmFsdWVzIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgZnVuY3Rpb24uIEluc2lkZSB0aGUga2Z1bmMsIHRoZSBgc2l6ZWAgaXMgY29udmVydGVkIGludG8gcGFnZSBjb3VudHMgKGBucl9wYWdlc2ApLCBhbmQgdGhlIGNvZGUgY2hlY2tzIGZvciB6ZXJvIHBhZ2UgY291bnRzIG9yIGlmIHdlIGFyZSBpbiB0aGUgcmVjbGFpbSBjb250ZXh0LiBUaGUgaW1wb3J0YW50IHBhcnRzIGFyZSB0aGUgY2FsbHMgdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLgoKVGhlIGltcG9ydGFudCBwYXJ0cyBhcmU6CgpgYGBjCgl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSAvIFBBR0VfU0laRTsKCglpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCgkJcmV0dXJuIDA7CgoJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAoJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsIE5VTEwpOwpgYGAKCmFuZAoKYGBgYwoJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7CgoJaWYgKCFucl9wYWdlcyB8fCBzd2FwcGluZXNzICZsdDsgTUlOX1NXQVBQSU5FU1MgfHwKCSAgICBzd2FwcGluZXNzICZndDsgU1dBUFBJTkVTU19BTk9OX09OTFkgfHwKCSAgICB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKQoJCXJldHVybiAwOwoKCXJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCwKCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8CgkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAoJCQkJCSAgICAmYW1wO3N3YXBwaW5lc3MpOwpgYGAKClRoZXJlJiMzOTtzIG5vdGhpbmcgaGVyZSB0aGF0IGxvb2tzIGxpa2Ugd2UmIzM5O3JlIGxlYWtpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlcnNwYWNlLiBObyBuZXcgc3RydWN0cyBhcmUgYmVpbmcgYWxsb2NhdGVkIG9yIGNvcGllZC4gVGhlIGBzd2FwcGluZXNzYCBhcmd1bWVudCwgYWx0aG91Z2ggcGFzc2VkIGFzIGEgcG9pbnRlciB0byB0aGUgY2FsbGVkIGZ1bmN0aW9uLCBpcyAqaW5pdGlhbGl6ZWQqIGxvY2FsbHkgd2l0aGluIHRoZSBCUEYga2Z1bmMuIEl0JiMzOTtzIGEgbG9jYWwgdmFyaWFibGUuIFNvIHRoZXJlIGlzIG5vIHJpc2sgb2YgZXhwb3NpbmcgdW5pdGlhbGl6ZWQgbWVtb3J5IGluIHRoZSAqY2FsbCogdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLgoKVG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluLCBJJiMzOTttIG5vdyBkb3VibGUtY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBpdHNlbGYuIFdlJiMzOTtyZSBwYXNzaW5nIGEgdmFsaWQsIGluaXRpYWxpemVkIHBvaW50ZXIgYW5kIHZhbHVlcy4gSSBjYW4gY29uZmlybSB0aGlzIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgbmV3IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2sgZWl0aGVyLiBTdGFuZGFyZCB0b29scyBsaWtlIEtBU0FOLCBldGMsIGFyZSBnb29kIGVub3VnaCBoZXJlLgoKVGhlcmVmb3JlLCBnaXZlbiBteSBhbmFseXNpcywgSSYjMzk7bSBjb25maWRlbnQgdGhhdCB0aGVzZSBjaGFuZ2VzIGRvbiYjMzk7dCBpbnRyb2R1Y2UgYSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlLiBJJiMzOTtsbCBzZXQgYE5lZWRzS01TQU49ZmFsc2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgYWN0IGFzIHdyYXBwZXJzIGFyb3VuZCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZXNlIGtmdW5jcyBhcmUgc2NhbGFyIHZhbHVlcyBhbmQgYSBwb2ludGVyIHRvIGEgYG1lbV9jZ3JvdXBgIHN0cnVjdHVyZSwgYWxsIG9mIHdoaWNoIGFyZSBmdWxseSBpbml0aWFsaXplZCBieSB0aGUgQlBGIHN1YnN5c3RlbSBiZWZvcmUgdGhlIGtmdW5jcyBhcmUgaW52b2tlZC4gVGhlIGxvY2FsIHZhcmlhYmxlIGBzd2FwcGluZXNzYCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYnV0IGl0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50LiBObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gbWVtb3J5IGNncm91cCByZWNsYWltIHdpbGwgYmUgY2F1Z2h0IGJ5IEtBU0FOLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IGFjdCBhcyB3cmFwcGVycyBhcm91bmQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIGEgcG9pbnRlciB0byBhIGBtZW1fY2dyb3VwYCBzdHJ1Y3R1cmUsIGFsbCBvZiB3aGljaCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIEJQRiBzdWJzeXN0ZW0gYmVmb3JlIHRoZSBrZnVuY3MgYXJlIGludm9rZWQuIFRoZSBsb2NhbCB2YXJpYWJsZSBgc3dhcHBpbmVzc2AgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGJ1dCBpdCBpcyBmdWxseSBpbml0aWFsaXplZCBmcm9tIHRoZSBmdW5jdGlvbiBhcmd1bWVudC4gTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB3aWxsIGJlIGNhdWdodCBieSBLQVNBTi4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTg6NDEuODY3NzgzNjdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMDcxNTE4Njg3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1cIixcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgYWN0IGFzIHdyYXBwZXJzIGFyb3VuZCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZXNlIGtmdW5jcyBhcmUgc2NhbGFyIHZhbHVlcyBhbmQgYSBwb2ludGVyIHRvIGEgYG1lbV9jZ3JvdXBgIHN0cnVjdHVyZSwgYWxsIG9mIHdoaWNoIGFyZSBmdWxseSBpbml0aWFsaXplZCBieSB0aGUgQlBGIHN1YnN5c3RlbSBiZWZvcmUgdGhlIGtmdW5jcyBhcmUgaW52b2tlZC4gVGhlIGxvY2FsIHZhcmlhYmxlIGBzd2FwcGluZXNzYCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYnV0IGl0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50LiBObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gbWVtb3J5IGNncm91cCByZWNsYWltIHdpbGwgYmUgY2F1Z2h0IGJ5IEtBU0FOLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgd2hpY2ggYWxsb3cgQlBGIHByb2dyYW1zIHRvIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnkgY2dyb3VwLiBUaGVzZSBmdW5jdGlvbnMgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgbW9kaWZ5IGNvcmUga2VybmVsIGxvZ2ljIChtZW1vcnkgcmVjbGFpbSkuIFRoZXkgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBkbyBub3QgaW50cm9kdWNlIGJ1Z3Mgb3IgdnVsbmVyYWJpbGl0aWVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxODo0MS44Njc3ODk1MVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTUyNDY4MTIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZjBjMGIyZTNhNWFjOTk3MDg5NDlhY2U1NjJiOGMzMzA4MjQ1ZjczMlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwOToxODo0MCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyMjcyZjlhNTgyNTEgMTAwNjQ0XFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcXG5AQCAtNiw2ICs2LDcgQEBcXG4gICovXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtY29udHJvbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3dhcC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuIFxcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XFxuQEAgLTE1OSw2ICsxNjAsOTcgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuIFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiB9XFxuIFxcbisvKlxcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcXG4rICogb3ZlcndyaXRlcyBjdXJyZW50LVxcdTAwM2VyZWNsYWltX3N0YXRlIG9uIGVudHJ5IGFuZCByZXNldHMgaXQgdG8gTlVMTCBvbiBleGl0LlxcbisgKiBTbyBpbnZva2luZyBpdCBmcm9tIGFuIGluLWZsaWdodCByZWNsYWltIHdvdWxkIGNsb2JiZXIgdGhlIG91dGVyIHJlY2xhaW1cXG4rICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuXFxuKyAqXFxuKyAqIFRoZSBndWFyZCBpcyBQRl9NRU1BTExPQy4gRXZlcnkgcmVjbGFpbSBlbnRyeSBwb2ludCBtYXJrcyB0aGUgY3VycmVudFxcbisgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXFxuKyAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXFxuKyAqIGtlZXBzIGl0IHNldCBmb3IgaXRzIGVudGlyZSBsaWZldGltZS4gQSBob29rIGluc2lkZSB0aGUgcmVjbGFpbSBwYXRoXFxuKyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlXFxuKyAqIHJlY2xhaW1pbmcgdGFzaywgd2hlcmUgY3VycmVudC1cXHUwMDNlZmxhZ3MgYWxyZWFkeSBjYXJyaWVzIHRoZSBmbGFnLiBUaGUgcGFnZVxcbisgKiBhbGxvY2F0b3IsIHRoZSBtZW1jZyBjaGFyZ2luZyBwYXRoIGFuZCBub2RlX3JlY2xhaW0oKSByZWx5IG9uIHRoZSBzYW1lXFxuKyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uXFxuKyAqXFxuKyAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXFxuKyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRlxcbisgKiBwcm9ncmFtIGNhbm5vdCBhdHRhY2ggdG8uXFxuKyAqIEFsc28sIFBGX01FTUFMTE9DIGlzIHNldCBpbiBzb21lIG5vbi1yZWNsYWltIGNvbnRleHRzIChlLmcuIGRpcmVjdCBjb21wYWN0aW9uXFxuKyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLlxcbisgKi9cXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBjdXJyZW50LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBGX01FTUFMTE9DO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeVxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXBcXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXFxuKyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcXG4rICpcXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xcbisgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZVxcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCxcXG4rICogdW5saWtlIG1lbW9yeS5yZWNsYWltLCB0aGlzIGRvZXMgbm90IHJldHJ5IHVudGlsIEBzaXplIGlzIHJlYWNoZWQ7XFxuKyAqIGNhbGxlcnMgY2FuIGludm9rZSBpdCBhZ2FpbiBpZiBuZWVkZWQuXFxuKyAqXFxuKyAqIFJldHVybjpcXG4rICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyXFxuKyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nXFxuKyAqICAgY29udGV4dCAoUEZfTUVNQUxMT0MpLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbitcXHRcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHNpemUpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7XFxuK1xcbitcXHRpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XFxuK1xcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSwgTlVMTCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYVxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdFxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBwaW5lc3NcXG4rICogQG1lbWNnOiAgICAgIHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cXG4rICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXFxuKyAqIEBzd2FwcGluZXNzOiBzd2FwcGluZXNzIG92ZXJyaWRlIGZvciB0aGlzIHJlY2xhaW0gcGFzc1xcbisgKlxcbisgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW1cXG4rICogYmFsYW5jZSBpcyBjb250cm9sbGVkIGJ5IEBzd2FwcGluZXNzIGluc3RlYWQgb2YgdGhlIGNncm91cCdzXFxuKyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXVxcbisgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxcbisgKlxcbisgKiBSZXR1cm46XFxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxcbisgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXNcXG4rICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcXG4rYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXFxuK1xcdFxcdFxcdFxcdCBpbnQgc3dhcHBpbmVzcylcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSAvIFBBR0VfU0laRTtcXG4rXFxuK1xcdGlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyBcXHUwMDNjIE1JTl9TV0FQUElORVNTIHx8XFxuK1xcdCAgICBzd2FwcGluZXNzIFxcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkgfHxcXG4rXFx0ICAgIHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XFxuK1xcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIFxcdTAwMjZzd2FwcGluZXNzKTtcXG4rfVxcbitcXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcXG4gXFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbkBAIC0xNzIsNiArMjY0LDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxuIFxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcywgS0ZfU0xFRVBBQkxFKVxcbitcXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbiBcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi42ZmFiODgyMDNlN2QzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbkBAIC0wLDAgKzEsMzgyIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XFxuKyAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvc3RhdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3RpbWUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc2lnbmFsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNncm91cF9oZWxwZXJzLmhcXFwiXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuKyNpbmNsdWRlIFxcXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXFxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXFxuK1xcbisjZGVmaW5lIENHX0RJUiBcXFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cXFwiXFxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFxcXCIvaGlnaFxcXCJcXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcXFwiL2xvd1xcXCJcXG4rXFxuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXFxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcXG4rXFxuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFx0Y2hhciBsaW1pdF9idWZbMjBdO1xcbitcXG4rXFx0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXFxcIm1lbW9yeVxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJlbmFibGVfY29udHJvbGxlcnNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXFxcIiVsdVxcXCIsIENHX0xJTUlUKTtcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5Lm1heFxcXCIsIGxpbWl0X2J1Zik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5LnN3YXAubWF4XFxcIiwgXFxcIjBcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdHNpemVfdCB3cml0dGVuID0gMDtcXG4rXFx0Y2hhciAqYnVmZmVyO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFxcXCJ3YlxcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XFxuK1xcdGlmICghYnVmZmVyKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZnA7XFxuK1xcbitcXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcXG4rXFxuK1xcdHdoaWxlICh3cml0dGVuIFxcdTAwM2MgRklMRV9TSVpFKSB7XFxuK1xcdFxcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXFx1MDAzYyBCVUZGRVJfU0laRSA/XFxuK1xcdFxcdFxcdFxcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xcbitcXG4rXFx0XFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0XFx0d3JpdHRlbiArPSB0b193cml0ZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZnJlZShidWZmZXIpO1xcbitjbGVhbnVwX2ZwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRjaGFyICptYXA7XFxuK1xcdHNpemVfdCBpO1xcbitcXHRpbnQgZmQ7XFxuK1xcdHN0cnVjdCBzdGF0IHNiO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCA9PSAtMSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoZnN0YXQoZmQsIFxcdTAwMjZzYikgPT0gLTEpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XFxuK1xcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcXG4rXFx0XFx0XFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cXG4rXFx0XFx0XFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xcbitcXHRcXHRcXHQodm9pZCl2O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9mZDpcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXFxuK1xcdFxcdFxcdFxcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHN0YXJ0LCBlbmQ7XFxuK1xcdGRvdWJsZSBlbGFwc2VkO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCksIFxcXCJqb2luX3BhcmVudF9jZ3JvdXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0Z2V0dGltZW9mZGF5KFxcdTAwMjZzdGFydCwgTlVMTCk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpLCBcXFwid3JpdGVfZmlsZVxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcyksIFxcXCJyZWFkX2ZpbGVcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0Z2V0dGltZW9mZGF5KFxcdTAwMjZlbmQsIE5VTEwpO1xcbitcXG4rXFx0aWYgKCF0aW1lX2ZpbGVuYW1lKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xcbitcXHRcXHQgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wO1xcbitcXHRwcmludGYoXFxcIiUuNmZcXFxcblxcXCIsIGVsYXBzZWQpO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGZwcmludGYoZnAsIFxcXCIlLjZmXFxcIiwgZWxhcHNlZCk7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0Y2hhciBidWZbNjRdO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwiclxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFxcXCJmZ2V0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRpZiAoc3NjYW5mKGJ1ZiwgXFxcIiVsZlxcXCIsIHRpbWUpICE9IDEpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwic3NjYW5mICVzXFxcIiwgYnVmKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSAwO1xcbitjbGVhbnVwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRjaGFyIGhpZ2hfZGF0YV9maWxlW10gPSBcXFwiL3RtcC9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXFxcIjtcXG4rXFx0Y2hhciBsb3dfZGF0YV9maWxlW10gPSBcXFwiL3RtcC9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcXFwiO1xcbitcXHRjaGFyIGhpZ2hfdGltZV9maWxlW10gPSBcXFwiL3RtcC9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXFxcIjtcXG4rXFx0Y2hhciBsb3dfdGltZV9maWxlW10gPSBcXFwiL3RtcC9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcXFwiO1xcbitcXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XFxuK1xcdGludCBmZCwgc3RhdHVzO1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0bG93X3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXFxcImZvcmsgbG93XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGxvd19waWQgPT0gMClcXG4rXFx0XFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcXG4rXFxuK1xcdGhpZ2hfcGlkID0gZm9yaygpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXFxcImZvcmsgaGlnaFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChoaWdoX3BpZCA9PSAwKVxcbitcXHRcXHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfR1Qod2FpdHBpZChsb3dfcGlkLCBcXHUwMDI2c3RhdHVzLCAwKSwgMCwgXFxcImxvdyB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXFxcImxvdyBleGl0ZWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcXFwibG93IGV4aXQgc3RhdHVzXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRwaWQoaGlnaF9waWQsIFxcdTAwMjZzdGF0dXMsIDApLCAwLCBcXFwiaGlnaCB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXFxcImhpZ2ggZXhpdGVkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXFxcImhpZ2ggZXhpdCBzdGF0dXNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdGlmIChoaWdoX3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdFxcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChsb3dfcGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XFxuK1xcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rc2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXFxuK1xcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcXG4rXFx0c3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7XFxuK1xcdFxcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxcbitcXHRcXHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXFxuK1xcdFxcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXFxuK1xcdFxcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcXG4rXFx0fTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxcbitcXHRcXHQuY3R4X2luID0gXFx1MDAyNmJwZl9hcmdzLFxcbitcXHRcXHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTtcXG4rXFx0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xcbitcXG4rXFx0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVxcdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xcbitcXG4rXFx0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsIFxcdTAwMjZydW5fb3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJvcl9vdXQ7XFxuK1xcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXFxcInByb2dfaW5pdCByZXR2YWxcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJvcl9vdXQ7XFxuK1xcbitcXHQqc2tlbF9wdHIgPSBza2VsO1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2Vycm9yX291dDpcXG4rXFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbit2b2lkIHRlc3RfbWVtY2dfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKVxcbit7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcXG4rXFx0aW50IGVycjtcXG4rXFx0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XFxuK1xcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcXHUwMDI2bG93X2Nncm91cF9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFxcdTAwMjZza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfYnBmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFxcdTAwMjZoaWdoX3RpbWUsIFxcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGhpZ2hfdGltZSBcXHUwMDNlPSBsb3dfdGltZSlcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXFxcIixcXG4rXFx0XFx0XFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XFxuK1xcbitvdXQ6XFxuK1xcdGlmIChza2VsKVxcbitcXHRcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MmMyYmI3ZTAzN2I2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDE2NyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJwZl9leHBlcmltZW50YWwuaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFxcdDFcXG4rI2RlZmluZSBQQUdFX1NJWkVcXHRcXHQ0MDk2VUxcXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcXHRcXHQoMzIgKiBQQUdFX1NJWkUpXFxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlxcdDMyXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xcbitcXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xcbitcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XFxuK307XFxuK1xcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xcbitzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcXG4re1xcbitcXHRjbS1cXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VjZ3JwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRjbS1cXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXFx1MDAyNmNtLVxcdTAwM2VjZ3JwLVxcdTAwM2VzZWxmKTtcXG4rXFx0aWYgKCFjbS1cXHUwMDNlbWVtY2cpIHtcXG4rXFx0XFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVxcdTAwM2VjZ3JwKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcXG4re1xcbitcXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXFx1MDAzZW1lbWNnKTtcXG4rXFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVxcdTAwM2VjZ3JwKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxcbit7XFxuK1xcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XFxuK1xcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLCBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUkVDTEFJTV9NQVhfSVRFUjsgaSsrKSB7XFxuK1xcdFxcdGlmICghYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0cHV0X2Nncm91cF9tZW1jZyhcXHUwMDI2Y20pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0cnVjdCB3cV9lbGVtIHtcXG4rXFx0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcXG4rXFx0c3RydWN0IGJwZl93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTMyKTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XFxuK30gd3FfbWFwIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xcbitcXG4rXFx0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXFx1MDAyNmVsZW0tXFx1MDAzZXByZXZfZXZlbnQsXFxuK1xcdFxcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcXG4rXFx0XFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XFxuK1xcdFxcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxcbit7XFxuK1xcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcdGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW07XFxuK1xcdF9fdTMyIGtleSA9IDA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2d3FfbWFwLCBcXHUwMDI2a2V5KTtcXG4rXFx0aWYgKCFlbGVtKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRyZXQgPSBicGZfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNndxX21hcCwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9pbml0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgXFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRlbGVtLVxcdTAwM2VwcmV2X2V2ZW50ID0gMDtcXG4rXFx0ZWxlbS1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdGVsZW0tXFx1MDAzZWNoZWNrX25zID0gY3R4LVxcdTAwM2VjaGVja19ucztcXG4rXFxuK1xcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2VoaWdoX2Nncm91cF9pZDtcXG4rXFx0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cXHUwMDNlbG93X2Nncm91cF9pZDtcXG4rXFxuK1xcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBlbGVtLVxcdTAwM2VjaGVja19ucywgMCk7XFxuK31cXG4rXFxuK2NoYXIgTElDRU5TRVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE4OjQyLjQyMTM0NTY3MloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE4OTY0OTc5OTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiLFxuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIG1vZGlmeSBjb3JlIGtlcm5lbCBsb2dpYyAobWVtb3J5IHJlY2xhaW0pLiBUaGV5IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgZG8gbm90IGludHJvZHVjZSBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZjBjMGIyZTNhNWFjOTk3MDg5NDlhY2U1NjJiOGMzMzA4MjQ1ZjczMlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDE4IDA5OjE4OjQwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyMjcyZjlhNTgyNTEgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4rKysgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtNiw2ICs2LDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcbkBAIC0xNTksNiArMTYwLDk3IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuKy8qXG4rICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5XG4rICogb3ZlcndyaXRlcyBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXG4rICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltXG4rICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuXG4rICpcbisgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcbisgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXG4rICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcbisgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aFxuKyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlXG4rICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LVx1MDAzZWZsYWdzIGFscmVhZHkgY2FycmllcyB0aGUgZmxhZy4gVGhlIHBhZ2VcbisgKiBhbGxvY2F0b3IsIHRoZSBtZW1jZyBjaGFyZ2luZyBwYXRoIGFuZCBub2RlX3JlY2xhaW0oKSByZWx5IG9uIHRoZSBzYW1lXG4rICogZmxhZyB0byBhdm9pZCByZWNsYWltIHJlY3Vyc2lvbi5cbisgKlxuKyAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXG4rICogUEZfTUVNQUxMT0MsIHdpdGggb25seSBhIHRyYWNlcG9pbnQgaW4gYmV0d2Vlbiwgd2hpY2ggYSBzbGVlcGFibGUgQlBGXG4rICogcHJvZ3JhbSBjYW5ub3QgYXR0YWNoIHRvLlxuKyAqIEFsc28sIFBGX01FTUFMTE9DIGlzIHNldCBpbiBzb21lIG5vbi1yZWNsYWltIGNvbnRleHRzIChlLmcuIGRpcmVjdCBjb21wYWN0aW9uXG4rICogYW5kIHZtYWxsb2MpLCB3aGVyZSB0aGUga2Z1bmMgY29uc2VydmF0aXZlbHkgcmVmdXNlcyB0byByZWNsYWltIGFzIHdlbGwuXG4rICovXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxuK3tcbitcdHJldHVybiBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQztcbit9XG4rXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcbisgKlxuKyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbisgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZVxuKyAqIGNncm91cCdzIG93biBzd2FwcGluZXNzIHNldHRpbmcgYW5kIHN3YXAgaXMgYWxsb3dlZC4gTm90ZSB0aGF0LFxuKyAqIHVubGlrZSBtZW1vcnkucmVjbGFpbSwgdGhpcyBkb2VzIG5vdCByZXRyeSB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkO1xuKyAqIGNhbGxlcnMgY2FuIGludm9rZSBpdCBhZ2FpbiBpZiBuZWVkZWQuXG4rICpcbisgKiBSZXR1cm46XG4rICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyXG4rICogICB0aGFuIGEgcGFnZSBvciB0aGUgY2FsbGluZyB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmdcbisgKiAgIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cbisgKi9cbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBzaXplKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFO1xuK1xuK1x0aWYgKCFucl9wYWdlcyB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuK1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsIE5VTEwpO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGNncm91cCB3aXRoIGFuIGV4cGxpY2l0XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwcGluZXNzXG4rICogQG1lbWNnOiAgICAgIHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbisgKiBAc2l6ZTogICAgICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcbisgKiBAc3dhcHBpbmVzczogc3dhcHBpbmVzcyBvdmVycmlkZSBmb3IgdGhpcyByZWNsYWltIHBhc3NcbisgKlxuKyAqIFNhbWUgYXMgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGV4Y2VwdCB0aGF0IHRoZSBhbm9uL2ZpbGUgcmVjbGFpbVxuKyAqIGJhbGFuY2UgaXMgY29udHJvbGxlZCBieSBAc3dhcHBpbmVzcyBpbnN0ZWFkIG9mIHRoZSBjZ3JvdXAnc1xuKyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXVxuKyAqIGFuZCBTV0FQUElORVNTX0FOT05fT05MWSwgd2hpY2ggcmVzdHJpY3RzIHJlY2xhaW0gdG8gYW5vbiBmb2xpb3MuXG4rICpcbisgKiBSZXR1cm46XG4rICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyXG4rICogICB0aGFuIGEgcGFnZSwgQHN3YXBwaW5lc3MgaXMgb3V0IG9mIHJhbmdlLCBvciB0aGUgY2FsbGluZyB0YXNrIGlzXG4rICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cbisgKi9cbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nXG4rYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXG4rXHRcdFx0XHQgaW50IHN3YXBwaW5lc3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7XG4rXG4rXHRpZiAoIW5yX3BhZ2VzIHx8IHN3YXBwaW5lc3MgXHUwMDNjIE1JTl9TV0FQUElORVNTIHx8XG4rXHQgICAgc3dhcHBpbmVzcyBcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkgfHxcbitcdCAgICB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuK1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4rXHRcdFx0XHRcdCAgICBcdTAwMjZzd2FwcGluZXNzKTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzIsNiArMjY0LDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MsIEtGX1NMRUVQQUJMRSlcbitcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42ZmFiODgyMDNlN2QzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMzgyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdGltZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJnc19zIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuKyNpbmNsdWRlIFwibWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcIlxuK1xuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4rI2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NilcbisjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXG4rXG4rI2RlZmluZSBDR19ESVIgXCIvbWVtY2dfYXN5bmNfcmVjbGFpbVwiXG4rI2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgXCIvaGlnaFwiXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcIi9sb3dcIlxuK1xuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuK1xuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5zd2FwLm1heFwiLCBcIjBcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ISUdIX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0xPV19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kO1xuK1x0ZG91YmxlIGVsYXBzZWQ7XG4rXHRGSUxFICpmcDtcbitcbitcdGlmICghQVNTRVJUX09LKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCksIFwiam9pbl9wYXJlbnRfY2dyb3VwXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRnZXR0aW1lb2ZkYXkoXHUwMDI2c3RhcnQsIE5VTEwpO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0sod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSwgXCJ3cml0ZV9maWxlXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcyksIFwicmVhZF9maWxlXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRnZXR0aW1lb2ZkYXkoXHUwMDI2ZW5kLCBOVUxMKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X3VzZWMgLSBzdGFydC50dl91c2VjKSAvIDEwMDAwMDAuMDtcbitcdHByaW50ZihcIiUuNmZcXG5cIiwgZWxhcHNlZCk7XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwid1wiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW10gPSBcIi90bXAvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiO1xuK1x0Y2hhciBsb3dfZGF0YV9maWxlW10gPSBcIi90bXAvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCI7XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW10gPSBcIi90bXAvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwiO1xuK1x0Y2hhciBsb3dfdGltZV9maWxlW10gPSBcIi90bXAvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYXCI7XG4rXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4rXHRpbnQgZmQsIHN0YXR1cztcbitcdGludCByZXQgPSAtMTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxuK1x0XHRcdFx0XHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCksIDAsIFwibG93IHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXCJsb3cgZXhpdCBzdGF0dXNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmICghQVNTRVJUX0dUKHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCksIDAsIFwiaGlnaCB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImhpZ2ggZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcImhpZ2ggZXhpdCBzdGF0dXNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZicGZfYXJncyxcbitcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XG4rXHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XG4rXG4rXHRza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcbitcbitcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwicHJvZ19pbml0IHJldHZhbFwiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXG4rXHQqc2tlbF9wdHIgPSBza2VsO1xuK1x0cmV0dXJuIDA7XG4rXG4rZXJyb3Jfb3V0OlxuK1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rdm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbit7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4rXHRpbnQgZXJyO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpXG4rXHRcdFBSSU5UX0ZBSUwoXCJoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWZcIixcbitcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbitcbitvdXQ6XG4rXHRpZiAoc2tlbClcbitcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjJjMmJiN2UwMzdiNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSwxNjcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuK1xuKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXHQxXG4rI2RlZmluZSBQQUdFX1NJWkVcdFx0NDA5NlVMXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcdFx0KDMyICogUEFHRV9TSVpFKVxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlx0MzJcbitcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbitcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4rfTtcbitcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xuK3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4rXHRpZiAoIWNtLVx1MDAzZWNncnApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4rXHRpZiAoIWNtLVx1MDAzZW1lbWNnKSB7XG4rXHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbitcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuK3tcbitcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4rXHQqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkrKykge1xuK1x0XHRpZiAoIWJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKSlcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0cnVjdCB3cV9lbGVtIHtcbitcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4rXHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4rXHR1NjQgcHJldl9ldmVudDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xuK1x0X191MzIga2V5ID0gMDtcbitcdGludCByZXQ7XG4rXG4rXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4rXHRpZiAoIWVsZW0pXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHJldCA9IGJwZl93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2d3FfbWFwLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitjaGFyIExJQ0VOU0VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE4OjQyLjQyMTM1OTk0MloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYyNzg0OTIwMDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgTmV3IEJQRiBNZW1vcnkgUmVjbGFtYXRpb24gS2Z1bmNzKipcblxuT2theSwgc28gd2UgaGF2ZSBhIHBhdGNoIGludHJvZHVjaW5nIHR3byBuZXcgQlBGIGtmdW5jczogYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AuIFRoZXkndmUgYmVlbiBhZGRlZCB0byBgbW0vYnBmX21lbWNvbnRyb2wuY2AsIHdoaWNoIHRlbGxzIG1lIHRoaXMgaXMgZGlyZWN0bHkgaW50ZXJhY3Rpbmcgd2l0aCBtZW1vcnkgY2dyb3VwIG1hbmFnZW1lbnQg4oCTIHRoYXQncyBkZWZpbml0ZWx5IGludGVyZXN0aW5nLiBUaGVzZSBmdW5jdGlvbnMgZXNzZW50aWFsbHkgYWxsb3cgQlBGIHByb2dyYW1zIHRvIHRyaWdnZXIgcHJvYWN0aXZlIG1lbW9yeSByZWNsYW1hdGlvbiB3aXRoaW4gYSBtZW1vcnkgY2dyb3VwLiBHaXZlbiB0aGVpciBuYW1lcywgYHN3YXBwaW5lc3NgIHN1Z2dlc3RzIHRoZXkgb2ZmZXIgc29tZSBjb250cm9sIG92ZXIgc3dhcCBiZWhhdmlvciwgd2hpY2ggaXMgYSBudWFuY2VkIGFkZGl0aW9uLlxuXG5UaGUgZmFjdCB0aGF0IHRoZXkncmUgbGV2ZXJhZ2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgdW5kZXIgdGhlIGhvb2QgZ2l2ZXMgbWUgYSBnb29kIGlkZWEgb2YgdGhlaXIgZnVuZGFtZW50YWwgb3BlcmF0aW9uLiBOb3csIGFzIGZvciB0aGVpciBleHBvc3VyZS4uLiB0aGV5J3JlIGV4cG9ydGVkIHVzaW5nIGBCVEZfSURfRkxBR1NgLCB3aGljaCB0ZWxscyBtZSB0aGV5IGFyZSBpbmRlZWQgc2xlZXBhYmxlIEJQRiBrZnVuY3MuIEV4Y2VsbGVudCDigJMgc2xlZXBhYmxlIGtmdW5jcyBvcGVuIHVwIGEgbG90IG9mIHBvdGVudGlhbCB1c2UgY2FzZXMsIGluY2x1ZGluZyBpbnRlZ3JhdGlvbiB3aXRoIGNvbXBsZXggbW9uaXRvcmluZyBvciBjb250cm9sIGxvZ2ljIHdpdGhpbiB0aGUgbWVtb3J5IGNncm91cC5cblxuVGhpcyBpcyBhIGNsZWFyLCBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUga2VybmVsLCBwcm92aWRpbmcgYSBuZXcgaW50ZXJmYWNlIGZvciBCUEYgcHJvZ3JhbXMgdG8gaW50ZXJhY3Qgd2l0aCBtZW1vcnkgcmVjbGFtYXRpb24uIEl0J3MgYSBzaWduaWZpY2FudCBlbm91Z2ggYWRkaXRpb24gdGhhdCBmdXp6aW5nIHRoZXNlIGZ1bmN0aW9ucyBpcyBhYnNvbHV0ZWx5IGVzc2VudGlhbC4gTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBTaW5jZSB0aGUgY29kZSByZXNpZGVzIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgbXkgbmV4dCBzdGVwIGlzIHRvIGV4YW1pbmUgYG1tL01ha2VmaWxlYCBhbmQgYG1tL0tjb25maWdgIHRvIGlkZW50aWZ5IHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9ucyB0byBlbmFibGUgYGJwZl9tZW1jb250cm9sLmNgLCBhbmQgY29uc2VxdWVudGx5LCB0aGVzZSBuZXcga2Z1bmNzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5Mjg1LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzA4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTg6NDguNjk5ODU1MTMzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI4NDQ5NjA5MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicGZfbWVtY29udHJvbC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDY9aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xcbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxODo0OC45ODQzNTYyOTRaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMTY3NTIxNzI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipDb25maWd1cmluZyB0aGUgQlBGIE1lbWNnIEludGVncmF0aW9uKipcblxuUmlnaHQsIHNvIHdlJ3JlIGRpdmluZyBpbnRvIEJQRiBhbmQgbWVtb3J5IGNvbnRyb2wuIFRoZSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCB3ZSdsbCBuZWVkIGJvdGggYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kIGBDT05GSUdfTUVNQ0dgIGVuYWJsZWQg4oCTIG9idmlvdXNseSwgZ2l2ZW4gdGhlIGNvbnRleHQuIExldCdzIHNlZSBpZiB3ZSBtaXNzZWQgYW55dGhpbmcgb2J2aW91cyBpbiB0aGUgY29uZmlnLCBhbmQgd2hpbGUgd2UncmUgYXQgaXQsIEkgc2hvdWxkIHBva2UgYXJvdW5kIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gSG9wZWZ1bGx5LCBhbnkgcmVsYXRlZCBjb25maWdzIGFyZSBlYXNpbHkgaWRlbnRpZmllZCB0aGVyZS4gV2UgZG9uJ3Qgd2FudCBhbnkgc3VycHJpc2VzIGxhdGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDAzOCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE4OjUyLjE1MTg4MDg3M1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTI5MDk1NzYsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vYnBmX21lbWNvbnRyb2wuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTg6NTIuMjY0ODE1NjZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjc1OTE3NjQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipDaGVja2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgQXZhaWxhYmlsaXR5KipcblxuUmlnaHQsIGxldCdzIGp1c3QgY29uZmlybSBzb21ldGhpbmcgYmVmb3JlIEkgZ28gZnVydGhlciBkb3duIHRoaXMgcmFiYml0IGhvbGUuIEkgbmVlZCB0byBtYWtlIHN1cmUgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGlzIGFjdHVhbGx5IGFjY2Vzc2libGUuIEknbSBwcmV0dHkgc3VyZSBpdCdzICp0aGVyZSosIGJ1dCBJJ20gYmVpbmcgbWV0aWN1bG91cy4gUXVpY2sgY2hlY2suLi4geWVwLCBhY2NvcmRpbmcgdG8gbXkgbWVudGFsIG1hcCBvZiB0aGUga2VybmVsIHNvdXJjZSwgdGhhdCdzIGRlZmluZWQgaW4gYG1tL3Ztc2Nhbi5jYC4gR29vZCwgdGhhdCBjb25maXJtcyBpdC4gTm93IEkgY2FuIHByb2NlZWQgd2l0aCB0aGUgYXNzdW1wdGlvbnMgSSB3YXMgcGxhbm5pbmcgb24gbWFraW5nIGFib3V0IGl0cyBmdW5jdGlvbmFsaXR5IHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgZnJhbWV3b3JrLiBUaGF0IGFsc28gbWVhbnMgdGhlIHJlbGV2YW50IGluY2x1ZGVzIGFyZSBwcm9iYWJseSBhbHJlYWR5IGhhbmRsZWQgaGlnaGVyIHVwIGluIHRoZSBjYWxsIHN0YWNrLiBMZXQncyBzZWUgaG93IGl0J3MgYmVpbmcgdXNlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAyNTgsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxODo1NS41NDA3MzYyMzZaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTUyMzkwNjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vYnBmX21lbWNvbnRyb2wuYz0xNTg9X19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTE2My0vKlxcbm1tL2JwZl9tZW1jb250cm9sLmM6MTY0OiAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZS4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIHVuY29uZGl0aW9uYWxseVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTY1LSAqIG92ZXJ3cml0ZXMgY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZSBvbiBlbnRyeSBhbmQgcmVzZXRzIGl0IHRvIE5VTEwgb24gZXhpdC5cXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTY5LSAqIFRoZSBndWFyZCBpcyBQRl9NRU1BTExPQy4gRXZlcnkgcmVjbGFpbSBlbnRyeSBwb2ludCBtYXJrcyB0aGUgY3VycmVudFxcbm1tL2JwZl9tZW1jb250cm9sLmM6MTcwOiAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcXG5tbS9icGZfbWVtY29udHJvbC5jLTE3MS0gKiBhbmQgX19wZXJmb3JtX3JlY2xhaW0oKSBkbyBzbyB2aWEgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSwgYW5kIGtzd2FwZFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNzctICpcXG5tbS9icGZfbWVtY29udHJvbC5jOjE3ODogKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTc5LSAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRlxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYz0yMDY9X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yMTMtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyMTQ6XFx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjE1LVxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmM9MjM4PWJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNDctXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNDg6XFx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ5LVxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0xNDgxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIxLVxcbm1tL21lbWNvbnRyb2wtdjEuYzoxNTIyOlxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMy1cXHRcXHRcXHRcXHRtZW1zdyA/IDAgOiBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSkge1xcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTE1NDA9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTUzLVxcbm1tL21lbWNvbnRyb2wtdjEuYzoxNTU0OlxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1NS1cXHRcXHRcXHRcXHRcXHRcXHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxcbi0tXFxubW0vbWVtY29udHJvbC5jPTIzMjg9c3RhdGljIHVuc2lnbmVkIGxvbmcgcmVjbGFpbV9oaWdoKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0yMzQzLVxcdFxcdHBzaV9tZW1zdGFsbF9lbnRlcihcXHUwMDI2cGZsYWdzKTtcXG5tbS9tZW1jb250cm9sLmM6MjM0NDpcXHRcXHRucl9yZWNsYWltZWQgKz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxubW0vbWVtY29udHJvbC5jLTIzNDUtXFx0XFx0XFx0XFx0XFx0XFx0XFx0Z2ZwX21hc2ssXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9MjU5NT1zdGF0aWMgaW50IHRyeV9jaGFyZ2VfbWVtY2coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBnZnBfdCBnZnBfbWFzayxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0yNjU0LVxcdHBzaV9tZW1zdGFsbF9lbnRlcihcXHUwMDI2cGZsYWdzKTtcXG5tbS9tZW1jb250cm9sLmM6MjY1NTpcXHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbV9vdmVyX2xpbWl0LCBucl9wYWdlcyxcXG5tbS9tZW1jb250cm9sLmMtMjY1Ni1cXHRcXHRcXHRcXHRcXHRcXHQgICAgZ2ZwX21hc2ssIHJlY2xhaW1fb3B0aW9ucywgTlVMTCk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDc2OD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfaGlnaF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNDgwMi1cXG5tbS9tZW1jb250cm9sLmM6NDgwMzpcXHRcXHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXFxubW0vbWVtY29udHJvbC5jLTQ4MDQtXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDgyMD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfbWF4X3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00ODU0LVxcdFxcdGlmIChucl9yZWNsYWltcykge1xcbm1tL21lbWNvbnRyb2wuYzo0ODU1OlxcdFxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMgLSBtYXgsXFxubW0vbWVtY29udHJvbC5jLTQ4NTYtXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXFxuLS1cXG5tbS92bXNjYW4uYz02NzIyPXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS92bXNjYW4uYy02NzYxLVxcbm1tL3Ztc2Nhbi5jOjY3NjI6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5tbS92bXNjYW4uYy02NzYzLVxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS92bXNjYW4uYy02ODAyLSNlbHNlXFxubW0vdm1zY2FuLmM6NjgwMzp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTY4MDQtXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jPTc4NjY9aW50IHVzZXJfcHJvYWN0aXZlX3JlY2xhaW0oY2hhciAqYnVmLFxcbi0tXFxubW0vdm1zY2FuLmMtNzkzMy1cXHRcXHRcXHRcXHRcXHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xcbm1tL3Ztc2Nhbi5jOjc5MzQ6XFx0XFx0XFx0cmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZyxcXG5tbS92bXNjYW4uYy03OTM1LVxcdFxcdFxcdFxcdFxcdFxcdCBiYXRjaF9zaXplLCBnZnBfbWFzayxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTg6NTUuNjM1OTgwNjQzWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTYyODkwNTE2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbioqXG5cbk9rYXksIHNvIEkndmUgaWRlbnRpZmllZCBzb21lIHByb21pc2luZyB0YXJnZXRzIGZvciBmdXp6aW5nIHdpdGhpbiB0aGUgQlBGIHN1YnN5c3RlbS4gVGhlIGtleSBoZXJlIGlzIHRob3NlIG5ldyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCBmdW5jdGlvbnMuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoZXNlIGFyZSAqcmVhY2hhYmxlKiDigJMgbWVhbmluZyB0aGV5J3JlIGV4cG9zZWQgYW5kIGNhbGxhYmxlIGZyb20gd2l0aGluIEJQRiBwcm9ncmFtcywgd2hpY2ggaW1tZWRpYXRlbHkgcmFpc2VzIGEgZmxhZy5cblxuR2l2ZW4gdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIHRvdWNoaW5nIG1lbW9yeSByZWNsYWltLCB3aGljaCBpcyBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgYWx3YXlzIGEgc291cmNlIG9mIGNvbXBsZXggaW50ZXJhY3Rpb25zLCBmdXp6aW5nIGlzIGRlZmluaXRlbHkgd2FycmFudGVkLiBUaGV5J3JlIHByaW1lIGNhbmRpZGF0ZXMgZm9yIHBvdGVudGlhbCBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy5cblxuSSd2ZSBjb25maXJtZWQgdGhlIHJlbGV2YW50IGNvbmZpZ3MgYXJlIGVuYWJsZWQ6IGBCUEZfU1lTQ0FMTGAgYW5kIGBNRU1DR2AuIFRob3NlIGFyZSBwcmV0dHkgc3RhbmRhcmQsIHRoYW5rZnVsbHksIHNvIG5vIHN1cnByaXNlcyB0aGVyZS4gTGV0IG1lIGp1c3QgZG91YmxlLWNoZWNrIHRoYXQgdGhlcmUgYXJlbid0IGFueSBvdGhlciwgbGVzcyBvYnZpb3VzLCBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGFjY291bnQgZm9yLi4uIE5vcGUsIHRob3NlIHR3byBhcmUgdGhlIG9ubHkgb25lcy5cblxuQmFzZWQgb24gYWxsIG9mIHRoYXQsIEkgY2FuIGNvbmZpZGVudGx5IHJldHVybiBgV29ydGhGdXp6aW5nPXRydWVgLiBNeSBmb2N1cyB3aWxsIGJlIG9uIHRob3NlIHR3byBmdW5jdGlvbnMsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCBhbmQgSSdsbCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZnV6emVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQgd2l0aCBib3RoIGBCUEZfU1lTQ0FMTGAgYW5kIGBNRU1DR2AgZW5hYmxlZC4gSSdsbCBuZWVkIHRvIGRldmVsb3AgYXBwcm9wcmlhdGUgZnV6emluZyBoYXJuZXNzZXMgdG8gcmVhbGx5IHB1dCB0aGVzZSBuZXcgZnVuY3Rpb25zIHRocm91Z2ggdGhlaXIgcGFjZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMTYxLCJPdXRwdXRUb2tlbnMiOjE1MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxOTowMS4yNjQ4ODg1NTRaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjE0MzMxOTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiLFxuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIG1vZGlmeSBjb3JlIGtlcm5lbCBsb2dpYyAobWVtb3J5IHJlY2xhaW0pLiBUaGV5IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgZG8gbm90IGludHJvZHVjZSBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1cIixcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgKG1lbW9yeSByZWNsYWltKS4gVGhleSBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSB0aGV5IGRvIG5vdCBpbnRyb2R1Y2UgYnVncyBvciB2dWxuZXJhYmlsaXRpZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE5OjAxLjM4NjMyOTY1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTE5NjYyODIyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE5OjAxLjM4NjkyMjI1WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjExMTk2MDMwMzY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgYWN0IGFzIHdyYXBwZXJzIGFyb3VuZCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZXNlIGtmdW5jcyBhcmUgc2NhbGFyIHZhbHVlcyBhbmQgYSBwb2ludGVyIHRvIGEgYG1lbV9jZ3JvdXBgIHN0cnVjdHVyZSwgYWxsIG9mIHdoaWNoIGFyZSBmdWxseSBpbml0aWFsaXplZCBieSB0aGUgQlBGIHN1YnN5c3RlbSBiZWZvcmUgdGhlIGtmdW5jcyBhcmUgaW52b2tlZC4gVGhlIGxvY2FsIHZhcmlhYmxlIGBzd2FwcGluZXNzYCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYnV0IGl0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50LiBObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gbWVtb3J5IGNncm91cCByZWNsYWltIHdpbGwgYmUgY2F1Z2h0IGJ5IEtBU0FOLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGYwYzBiMmUzYTVhYzk5NzA4OTQ5YWNlNTYyYjhjMzMwODI0NWY3MzJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwOToxODo0MCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXG5pbmRleCA3MTZkZjQ5ZDc2NDc3Li45MjI3MmY5YTU4MjUxIDEwMDY0NFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xuKysrIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuQEAgLTYsNiArNiw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG5AQCAtMTU5LDYgKzE2MCw5NyBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbiBcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xuIH1cbiBcbisvKlxuKyAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZS4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIHVuY29uZGl0aW9uYWxseVxuKyAqIG92ZXJ3cml0ZXMgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlIG9uIGVudHJ5IGFuZCByZXNldHMgaXQgdG8gTlVMTCBvbiBleGl0LlxuKyAqIFNvIGludm9raW5nIGl0IGZyb20gYW4gaW4tZmxpZ2h0IHJlY2xhaW0gd291bGQgY2xvYmJlciB0aGUgb3V0ZXIgcmVjbGFpbVxuKyAqIHN0YXRlIGFuZCBjb3JydXB0IGl0cyBhY2NvdW50aW5nLlxuKyAqXG4rICogVGhlIGd1YXJkIGlzIFBGX01FTUFMTE9DLiBFdmVyeSByZWNsYWltIGVudHJ5IHBvaW50IG1hcmtzIHRoZSBjdXJyZW50XG4rICogdGFzayB3aXRoIGl0IGZvciB0aGUgd2hvbGUgcmVjbGFpbSB3aW5kb3c6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKVxuKyAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXG4rICoga2VlcHMgaXQgc2V0IGZvciBpdHMgZW50aXJlIGxpZmV0aW1lLiBBIGhvb2sgaW5zaWRlIHRoZSByZWNsYWltIHBhdGhcbisgKiAoc2hyaW5rX25vZGUsIHNocmlua19zbGFiLCAuLi4pIGV4ZWN1dGVzIGluIHRoZSBjb250ZXh0IG9mIHRoZVxuKyAqIHJlY2xhaW1pbmcgdGFzaywgd2hlcmUgY3VycmVudC1cdTAwM2VmbGFncyBhbHJlYWR5IGNhcnJpZXMgdGhlIGZsYWcuIFRoZSBwYWdlXG4rICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZVxuKyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uXG4rICpcbisgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZVxuKyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRlxuKyAqIHByb2dyYW0gY2Fubm90IGF0dGFjaCB0by5cbisgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvblxuKyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLlxuKyAqL1xuK3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcbit7XG4rXHRyZXR1cm4gY3VycmVudC1cdTAwM2VmbGFncyBcdTAwMjYgUEZfTUVNQUxMT0M7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXBcbisgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbisgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4rICpcbisgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvXG4rICogdGhlIG1lbW9yeS5yZWNsYWltIGNncm91cCBmaWxlOiBwYWdlcyBhcmUgcmVjbGFpbWVkIGFjY29yZGluZyB0byB0aGVcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCxcbisgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDtcbisgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuKyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nXG4rICogICBjb250ZXh0IChQRl9NRU1BTExPQykuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSAvIFBBR0VfU0laRTtcbitcbitcdGlmICghbnJfcGFnZXMgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLCBOVUxMKTtcbit9XG4rXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGFcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzc1xuKyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4rICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzXG4rICpcbisgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW1cbisgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJ3NcbisgKiBzd2FwcGluZXNzIHNldHRpbmcuIFZhbGlkIHZhbHVlcyBhcmUgW01JTl9TV0FQUElORVNTLCBNQVhfU1dBUFBJTkVTU11cbisgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuKyAqICAgdGhhbiBhIHBhZ2UsIEBzd2FwcGluZXNzIGlzIG91dCBvZiByYW5nZSwgb3IgdGhlIGNhbGxpbmcgdGFzayBpc1xuKyAqICAgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZyBjb250ZXh0IChQRl9NRU1BTExPQykuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZ1xuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHRcdFx0IGludCBzd2FwcGluZXNzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFO1xuK1xuK1x0aWYgKCFucl9wYWdlcyB8fCBzd2FwcGluZXNzIFx1MDAzYyBNSU5fU1dBUFBJTkVTUyB8fFxuK1x0ICAgIHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZIHx8XG4rXHQgICAgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuK1x0XHRcdFx0XHQgICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4rfVxuK1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgKzI2NCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpXG4rXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNmZhYjg4MjAzZTdkM1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDM4MiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaGVscGVycy5oXCJcbitcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbitcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfSElHSF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19MT1dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFudXA6XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbitzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuK1x0Y2hhciAqYnVmZmVyO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcIndiXCIpO1xuK1x0aWYgKCFmcClcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xuK1x0aWYgKCFidWZmZXIpXG4rXHRcdGdvdG8gY2xlYW51cF9mcDtcbitcbitcdG1lbXNldChidWZmZXIsICdBJywgQlVGRkVSX1NJWkUpO1xuK1xuK1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuK1x0XHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFx1MDAzYyBCVUZGRVJfU0laRSA/XG4rXHRcdFx0XHQgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTtcbitcbitcdFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0XHR3cml0dGVuICs9IHRvX3dyaXRlO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZnJlZShidWZmZXIpO1xuK2NsZWFudXBfZnA6XG4rXHRmY2xvc2UoZnApO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdGNoYXIgKm1hcDtcbitcdHNpemVfdCBpO1xuK1x0aW50IGZkO1xuK1x0c3RydWN0IHN0YXQgc2I7XG4rXG4rXHRmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTtcbitcdGlmIChmZCA9PSAtMSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoZnN0YXQoZmQsIFx1MDAyNnNiKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0aWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxuXCIsXG4rXHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1x0fVxuK1xuK1x0bWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTtcbitcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXHUwMDNjIGl0ZXJhdGlvbnM7IGl0ZXIrKykge1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBGSUxFX1NJWkU7IGkgKz0gcGFnZV9zaXplKSB7XG4rXHRcdFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cbitcdFx0XHR2b2xhdGlsZSBjaGFyIHYgPSBtYXBbaV07XG4rXHRcdFx0KHZvaWQpdjtcbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cF9mZDpcbitcdGNsb3NlKGZkKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuK1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0c3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCBcImpvaW5fcGFyZW50X2Nncm91cFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNnN0YXJ0LCBOVUxMKTtcbitcbitcdGlmICghQVNTRVJUX09LKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSksIFwid3JpdGVfZmlsZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0socmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpLCBcInJlYWRfZmlsZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNmVuZCwgTlVMTCk7XG4rXG4rXHRpZiAoIXRpbWVfZmlsZW5hbWUpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0ZWxhcHNlZCA9IChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSArXG4rXHRcdCAgKGVuZC50dl91c2VjIC0gc3RhcnQudHZfdXNlYykgLyAxMDAwMDAwLjA7XG4rXHRwcmludGYoXCIlLjZmXFxuXCIsIGVsYXBzZWQpO1xuK1xuK1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcIndcIik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwiZm9wZW5cIikpXG4rXHRcdHJldHVybiAtMTtcbitcdGZwcmludGYoZnAsIFwiJS42ZlwiLCBlbGFwc2VkKTtcbitcdGZjbG9zZShmcCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0RklMRSAqZnA7XG4rXHRjaGFyIGJ1Zls2NF07XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwiclwiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcImZnZXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoc3NjYW5mKGJ1ZiwgXCIlbGZcIiwgdGltZSkgIT0gMSkge1xuK1x0XHRQUklOVF9GQUlMKFwic3NjYW5mICVzXCIsIGJ1Zik7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtdID0gXCIvdG1wL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIjtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtdID0gXCIvdG1wL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwiO1xuK1x0Y2hhciBoaWdoX3RpbWVfZmlsZVtdID0gXCIvdG1wL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcIjtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtdID0gXCIvdG1wL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiO1xuK1x0cGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xO1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGxvd19waWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCBcImZvcmsgbG93XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAobG93X3BpZCA9PSAwKVxuK1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0aGlnaF9waWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCJmb3JrIGhpZ2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChoaWdoX3BpZCA9PSAwKVxuK1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApLCAwLCBcImxvdyB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImxvdyBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwibG93IGV4aXQgc3RhdHVzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApLCAwLCBcImhpZ2ggd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJoaWdoIGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXCJoaWdoIGV4aXQgc3RhdHVzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cDpcbitcdC8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovXG4rXHRpZiAocmV0KSB7XG4rXHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuK1x0XHRcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHRcdGlmIChsb3dfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbitcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHR9XG4rXHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuK1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuK1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnRcbitzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbitcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbit7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbitcdHN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0ge1xuK1x0XHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcbitcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuK1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuK1x0XHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXG4rXHR9O1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuK1x0XHQuY3R4X2luID0gXHUwMDI2YnBmX2FyZ3MsXG4rXHRcdC5jdHhfc2l6ZV9pbiA9IHNpemVvZihicGZfYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0aW50IGVycjtcbitcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xuK1xuK1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2JwZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXCIsXG4rXHRcdFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4rXG4rb3V0OlxuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjYyYzJiYjdlMDM3YjZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMTY3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbitcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuKyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuK1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rc3RydWN0IGNncm91cF9tZW1jZyB7XG4rXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuK307XG4rXG4rc3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcbitzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuK1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuK1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4rXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuK1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdGludCBpO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcbitcdFx0aWYgKCFicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSkpXG4rXHRcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbitcdF9fdHlwZShrZXksIF9fdTMyKTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuK30gd3FfbWFwIFNFQyhcIi5tYXBzXCIpO1xuK1xuK3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbit7XG4rXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xuK1xuK1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuK1x0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcbitcdFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzX3MgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcbitcdF9fdTMyIGtleSA9IDA7XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2d3FfbWFwLCBcdTAwMjZrZXkpO1xuK1x0aWYgKCFlbGVtKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIGFzeW5jX2ZyZWUsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxOTowMS4zODY5MjMwNloiLCJTZXEiOjEzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTE5NTk5Nzc2NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBvdGVudGlhbCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgRXhwb3N1cmUgaW4gTmV3IEJQRiBrZnVuY3MqKlxuXG5Pa2F5LCBzbyB3ZSd2ZSBnb3QgdGhlc2UgbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCBkZXNpZ25lZCB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSB3aXRoaW4gYSBtZW1jZy4gVGhleSB0YWtlIGEgYHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZ2AsIGFuIGB1bnNpZ25lZCBsb25nIHNpemVgLCBhbmQsIG9wdGlvbmFsbHksIGFuIGBpbnQgc3dhcHBpbmVzc2AgdmFsdWUuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzLCBhcyBhbHdheXMsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IOKAkyB0aGF0J3MgYSBjbGFzc2ljIHNlY3VyaXR5IHZlY3Rvci5cblxuTG9va2luZyBhdCB0aGUgY29kZSwgYG1lbWNnYCBjb21lcyBmcm9tIGEgYGJwZl9nZXRfbWVtX2Nncm91cGAgY2FsbCAob3Igc2ltaWxhciksIHNvIGl0J3MgYSB2YWxpZCBwb2ludGVyLiBUaGUgYHNpemVgIGFuZCBgc3dhcHBpbmVzc2AgYXJndW1lbnRzIGFyZSBzY2FsYXIgdmFsdWVzIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgZnVuY3Rpb24uIEluc2lkZSB0aGUga2Z1bmMsIHRoZSBgc2l6ZWAgaXMgY29udmVydGVkIGludG8gcGFnZSBjb3VudHMgKGBucl9wYWdlc2ApLCBhbmQgdGhlIGNvZGUgY2hlY2tzIGZvciB6ZXJvIHBhZ2UgY291bnRzIG9yIGlmIHdlIGFyZSBpbiB0aGUgcmVjbGFpbSBjb250ZXh0LiBUaGUgaW1wb3J0YW50IHBhcnRzIGFyZSB0aGUgY2FsbHMgdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLlxuXG5UaGUgaW1wb3J0YW50IHBhcnRzIGFyZTpcblxuYGBgY1xuXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSAvIFBBR0VfU0laRTtcblxuXHRpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG5cdFx0cmV0dXJuIDA7XG5cblx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxuXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcblx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsIE5VTEwpO1xuYGBgXG5cbmFuZFxuXG5gYGBjXG5cdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFO1xuXG5cdGlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyBcdTAwM2MgTUlOX1NXQVBQSU5FU1MgfHxcblx0ICAgIHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZIHx8XG5cdCAgICB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKVxuXHRcdHJldHVybiAwO1xuXG5cdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcblx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG5cdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuXHRcdFx0XHRcdCAgICBcdTAwMjZzd2FwcGluZXNzKTtcbmBgYFxuXG5UaGVyZSdzIG5vdGhpbmcgaGVyZSB0aGF0IGxvb2tzIGxpa2Ugd2UncmUgbGVha2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB1c2Vyc3BhY2UuIE5vIG5ldyBzdHJ1Y3RzIGFyZSBiZWluZyBhbGxvY2F0ZWQgb3IgY29waWVkLiBUaGUgYHN3YXBwaW5lc3NgIGFyZ3VtZW50LCBhbHRob3VnaCBwYXNzZWQgYXMgYSBwb2ludGVyIHRvIHRoZSBjYWxsZWQgZnVuY3Rpb24sIGlzICppbml0aWFsaXplZCogbG9jYWxseSB3aXRoaW4gdGhlIEJQRiBrZnVuYy4gSXQncyBhIGxvY2FsIHZhcmlhYmxlLiBTbyB0aGVyZSBpcyBubyByaXNrIG9mIGV4cG9zaW5nIHVuaXRpYWxpemVkIG1lbW9yeSBpbiB0aGUgKmNhbGwqIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC5cblxuVG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluLCBJJ20gbm93IGRvdWJsZS1jaGVja2luZyB0aGUgZnVuY3Rpb24gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGl0c2VsZi4gV2UncmUgcGFzc2luZyBhIHZhbGlkLCBpbml0aWFsaXplZCBwb2ludGVyIGFuZCB2YWx1ZXMuIEkgY2FuIGNvbmZpcm0gdGhpcyBkb2Vzbid0IGludHJvZHVjZSBhbnkgbmV3IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2sgZWl0aGVyLiBTdGFuZGFyZCB0b29scyBsaWtlIEtBU0FOLCBldGMsIGFyZSBnb29kIGVub3VnaCBoZXJlLlxuXG5UaGVyZWZvcmUsIGdpdmVuIG15IGFuYWx5c2lzLCBJJ20gY29uZmlkZW50IHRoYXQgdGhlc2UgY2hhbmdlcyBkb24ndCBpbnRyb2R1Y2UgYSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlLiBJJ2xsIHNldCBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjkyODIsIk91dHB1dFRva2VucyI6MjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjU1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTk6MTIuNTgyOTI0NzI0WiIsIlNlcSI6MTQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjU5NDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgYWN0IGFzIHdyYXBwZXJzIGFyb3VuZCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZXNlIGtmdW5jcyBhcmUgc2NhbGFyIHZhbHVlcyBhbmQgYSBwb2ludGVyIHRvIGEgYG1lbV9jZ3JvdXBgIHN0cnVjdHVyZSwgYWxsIG9mIHdoaWNoIGFyZSBmdWxseSBpbml0aWFsaXplZCBieSB0aGUgQlBGIHN1YnN5c3RlbSBiZWZvcmUgdGhlIGtmdW5jcyBhcmUgaW52b2tlZC4gVGhlIGxvY2FsIHZhcmlhYmxlIGBzd2FwcGluZXNzYCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYnV0IGl0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50LiBObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gbWVtb3J5IGNncm91cCByZWNsYWltIHdpbGwgYmUgY2F1Z2h0IGJ5IEtBU0FOLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzIChgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCkgdGhhdCBhY3QgYXMgd3JhcHBlcnMgYXJvdW5kIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBhIHBvaW50ZXIgdG8gYSBgbWVtX2Nncm91cGAgc3RydWN0dXJlLCBhbGwgb2Ygd2hpY2ggYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJ5IHRoZSBCUEYgc3Vic3lzdGVtIGJlZm9yZSB0aGUga2Z1bmNzIGFyZSBpbnZva2VkLiBUaGUgbG9jYWwgdmFyaWFibGUgYHN3YXBwaW5lc3NgIGlzIHBhc3NlZCBieSByZWZlcmVuY2UgdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLCBidXQgaXQgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgZnVuY3Rpb24gYXJndW1lbnQuIE5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgcmVsYXRlZCB0byBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gd2lsbCBiZSBjYXVnaHQgYnkgS0FTQU4uIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-18 08:47:53 +0000 UTC FinishedAt: 2026-08-18 09:19:13 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "f79066c784022fda83f5936559a1af414e41b603", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "f79066c784022fda83f5936559a1af414e41b603", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG" ], "series_id": "4fee2344-54c0-46f8-8312-e6b13f7554d1" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim", "bpf_proactive_reclaim_swappiness" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDssCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IGFjdCBhcyB3cmFwcGVycyBhcm91bmQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIGEgcG9pbnRlciB0byBhIGBtZW1fY2dyb3VwYCBzdHJ1Y3R1cmUsIGFsbCBvZiB3aGljaCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIEJQRiBzdWJzeXN0ZW0gYmVmb3JlIHRoZSBrZnVuY3MgYXJlIGludm9rZWQuIFRoZSBsb2NhbCB2YXJpYWJsZSBgc3dhcHBpbmVzc2AgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGJ1dCBpdCBpcyBmdWxseSBpbml0aWFsaXplZCBmcm9tIHRoZSBmdW5jdGlvbiBhcmd1bWVudC4gTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB3aWxsIGJlIGNhdWdodCBieSBLQVNBTi4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgKG1lbW9yeSByZWNsYWltKS4gVGhleSBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSB0aGV5IGRvIG5vdCBpbnRyb2R1Y2UgYnVncyBvciB2dWxuZXJhYmlsaXRpZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBmMGMwYjJlM2E1YWM5OTcwODk0OWFjZTU2MmI4YzMzMDgyNDVmNzMyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMTggMDk6MTg6NDAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyMjcyZjlhNTgyNTEgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtNiw2ICYjNDM7Niw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICYjNDM7MTYwLDk3IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcbiYjNDM7ICogb3ZlcndyaXRlcyBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXG4mIzQzOyAqIFNvIGludm9raW5nIGl0IGZyb20gYW4gaW4tZmxpZ2h0IHJlY2xhaW0gd291bGQgY2xvYmJlciB0aGUgb3V0ZXIgcmVjbGFpbVxuJiM0MzsgKiBzdGF0ZSBhbmQgY29ycnVwdCBpdHMgYWNjb3VudGluZy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGd1YXJkIGlzIFBGX01FTUFMTE9DLiBFdmVyeSByZWNsYWltIGVudHJ5IHBvaW50IG1hcmtzIHRoZSBjdXJyZW50XG4mIzQzOyAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcbiYjNDM7ICoga2VlcHMgaXQgc2V0IGZvciBpdHMgZW50aXJlIGxpZmV0aW1lLiBBIGhvb2sgaW5zaWRlIHRoZSByZWNsYWltIHBhdGhcbiYjNDM7ICogKHNocmlua19ub2RlLCBzaHJpbmtfc2xhYiwgLi4uKSBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGVcbiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LVx1MDAzZWZsYWdzIGFscmVhZHkgY2FycmllcyB0aGUgZmxhZy4gVGhlIHBhZ2VcbiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZVxuJiM0MzsgKiBmbGFnIHRvIGF2b2lkIHJlY2xhaW0gcmVjdXJzaW9uLlxuJiM0MzsgKlxuJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZVxuJiM0MzsgKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbiYjNDM7ICogcHJvZ3JhbSBjYW5ub3QgYXR0YWNoIHRvLlxuJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvblxuJiM0MzsgKiBhbmQgdm1hbGxvYyksIHdoZXJlIHRoZSBrZnVuYyBjb25zZXJ2YXRpdmVseSByZWZ1c2VzIHRvIHJlY2xhaW0gYXMgd2VsbC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4mIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4mIzQzOyAqXG4mIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiYjNDM7ICogdGhlIG1lbW9yeS5yZWNsYWltIGNncm91cCBmaWxlOiBwYWdlcyBhcmUgcmVjbGFpbWVkIGFjY29yZGluZyB0byB0aGVcbiYjNDM7ICogY2dyb3VwJiMzOTtzIG93biBzd2FwcGluZXNzIHNldHRpbmcgYW5kIHN3YXAgaXMgYWxsb3dlZC4gTm90ZSB0aGF0LFxuJiM0MzsgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDtcbiYjNDM7ICogY2FsbGVycyBjYW4gaW52b2tlIGl0IGFnYWluIGlmIG5lZWRlZC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOlxuJiM0MzsgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXJcbiYjNDM7ICogICB0aGFuIGEgcGFnZSBvciB0aGUgY2FsbGluZyB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmdcbiYjNDM7ICogICBjb250ZXh0IChQRl9NRU1BTExPQykuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFO1xuJiM0MztcbiYjNDM7XHRpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxuJiM0MztcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuJiM0MztcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGNncm91cCB3aXRoIGFuIGV4cGxpY2l0XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzc1xuJiM0MzsgKiBAbWVtY2c6ICAgICAgdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuJiM0MzsgKiBAc2l6ZTogICAgICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcbiYjNDM7ICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzXG4mIzQzOyAqXG4mIzQzOyAqIFNhbWUgYXMgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGV4Y2VwdCB0aGF0IHRoZSBhbm9uL2ZpbGUgcmVjbGFpbVxuJiM0MzsgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJiMzOTtzXG4mIzQzOyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXVxuJiM0MzsgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46XG4mIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuJiM0MzsgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXNcbiYjNDM7ICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcbiYjNDM7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHRcdFx0IGludCBzd2FwcGluZXNzKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7XG4mIzQzO1xuJiM0MztcdGlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyBcdTAwM2MgTUlOX1NXQVBQSU5FU1MgfHxcbiYjNDM7XHQgICAgc3dhcHBpbmVzcyBcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkgfHxcbiYjNDM7XHQgICAgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4mIzQzO1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4mIzQzO1x0XHRcdFx0XHQgICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4mIzQzO31cbiYjNDM7XG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzIsNiAmIzQzOzI2NCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MsIEtGX1NMRUVQQUJMRSlcbiYjNDM7XG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNmZhYjg4MjAzZTdkM1xuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICYjNDM7MSwzODIgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3RcbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy90aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2Nncm91cF9oZWxwZXJzLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfYXJnc19zIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbiYjNDM7I2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NilcbiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTBcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0dfRElSIFwmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltXCYjMzQ7XG4mIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwmIzM0Oy9oaWdoXCYjMzQ7XG4mIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCYjMzQ7L2xvd1wmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbiYjNDM7I2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwmIzM0O21lbW9yeVwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtlbmFibGVfY29udHJvbGxlcnNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcJiMzNDslbHVcJiMzNDssIENHX0xJTUlUKTtcbiYjNDM7XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5tYXhcJiMzNDssIGxpbWl0X2J1Zik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcJiMzNDttZW1vcnkuc3dhcC5tYXhcJiMzNDssIFwmIzM0OzBcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfSElHSF9ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfTE9XX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuJiM0MztcdGNoYXIgKmJ1ZmZlcjtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCYjMzQ7d2JcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbiYjNDM7XHRpZiAoIWJ1ZmZlcilcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mcDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuJiM0MztcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuJiM0MztcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuJiM0MztcbiYjNDM7XHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHR3cml0dGVuICYjNDM7PSB0b193cml0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZnJlZShidWZmZXIpO1xuJiM0MztjbGVhbnVwX2ZwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0Y2hhciAqbWFwO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzYjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkID09IC0xKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4mIzQzO1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7XG4mIzQzO1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4mIzQzO1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbiYjNDM7XHRcdFx0KHZvaWQpdjtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cF9mZDpcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDtcbiYjNDM7XHRkb3VibGUgZWxhcHNlZDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSwgXCYjMzQ7am9pbl9wYXJlbnRfY2dyb3VwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNnN0YXJ0LCBOVUxMKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0sod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSwgXCYjMzQ7d3JpdGVfZmlsZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSwgXCYjMzQ7cmVhZF9maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNmVuZCwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGltZV9maWxlbmFtZSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7XG4mIzQzO1x0XHQgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wO1xuJiM0MztcdHByaW50ZihcJiMzNDslLjZmXFxuXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDt3XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRmcHJpbnRmKGZwLCBcJiMzNDslLjZmXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1x0Y2hhciBidWZbNjRdO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3JcJiMzNDspO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCYjMzQ7Zm9wZW5cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwmIzM0O2ZnZXRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0aWYgKHNzY2FuZihidWYsIFwmIzM0OyVsZlwmIzM0OywgdGltZSkgIT0gMSkge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtzc2NhbmYgJXNcJiMzNDssIGJ1Zik7XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGhpZ2hfZGF0YV9maWxlW10gPSBcJiMzNDsvdG1wL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcJiMzNDs7XG4mIzQzO1x0Y2hhciBsb3dfZGF0YV9maWxlW10gPSBcJiMzNDsvdG1wL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OztcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW10gPSBcJiMzNDsvdG1wL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcJiMzNDs7XG4mIzQzO1x0Y2hhciBsb3dfdGltZV9maWxlW10gPSBcJiMzNDsvdG1wL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwmIzM0OztcbiYjNDM7XHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4mIzQzO1x0aW50IGZkLCBzdGF0dXM7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRsb3dfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwmIzM0O2ZvcmsgbG93XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAobG93X3BpZCA9PSAwKVxuJiM0MztcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4mIzQzO1xuJiM0MztcdGhpZ2hfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcJiMzNDtmb3JrIGhpZ2hcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChoaWdoX3BpZCA9PSAwKVxuJiM0MztcdFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsXG4mIzQzO1x0XHRcdFx0XHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKSwgMCwgXCYjMzQ7bG93IHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2xvdyBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwmIzM0O2xvdyBleGl0IHN0YXR1c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCksIDAsIFwmIzM0O2hpZ2ggd2FpdHBpZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7aGlnaCBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwmIzM0O2hpZ2ggZXhpdCBzdGF0dXNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRpZiAoaGlnaF9waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbiYjNDM7XHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHtcbiYjNDM7XHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuJiM0MztcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuJiM0MztcdFx0LmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCxcbiYjNDM7XHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbiYjNDM7XHR9O1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcbiYjNDM7XHRcdC5jdHhfaW4gPSBcdTAwMjZicGZfYXJncyxcbiYjNDM7XHRcdC5jdHhfc2l6ZV9pbiA9IHNpemVvZihicGZfYXJncykpO1xuJiM0MztcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyb3Jfb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCYjMzQ7cHJvZ19pbml0IHJldHZhbFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XG4mIzQzO1x0KnNrZWxfcHRyID0gc2tlbDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2Vycm9yX291dDpcbiYjNDM7XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfYnBmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWZcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChza2VsKVxuJiM0MztcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MmMyYmI3ZTAzN2I2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICYjNDM7MSwxNjcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfZXhwZXJpbWVudGFsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXHQxXG4mIzQzOyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRVx0XHQoMzIgKiBQQUdFX1NJWkUpXG4mIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlx0MzJcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfYXJnc19zIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuJiM0Mzt7XG4mIzQzO1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuJiM0MztcdGlmICghY20tXHUwMDNlY2dycClcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbiYjNDM7XHRpZiAoIWNtLVx1MDAzZW1lbWNnKSB7XG4mIzQzO1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbiYjNDM7e1xuJiM0MztcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4mIzQzO1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbiYjNDM7XHQqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpO1xuJiM0MztcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2xcbiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbiYjNDM7e1xuJiM0MztcdHU2NCBjdXIsIGRlbHRhO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsIFx1MDAyNmN1cikpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7XG4mIzQzO1x0KnByZXZfZXZlbnQgPSBjdXI7XG4mIzQzO1xuJiM0MztcdHJldHVybiBkZWx0YSBcdTAwM2U9IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKCFicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSkpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7XG4mIzQzO1x0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4mIzQzO1x0dTY0IHByZXZfZXZlbnQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qge1xuJiM0MztcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSk7XG4mIzQzO1x0X190eXBlKGtleSwgX191MzIpO1xuJiM0MztcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuJiM0Mzt9IHdxX21hcCBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuJiM0MztcdFx0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7XG4mIzQzO1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbiYjNDM7XHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4mIzQzO3tcbiYjNDM7XHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbiYjNDM7XHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4mIzQzO1x0aWYgKCFlbGVtKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0ZWxlbS1cdTAwM2VwcmV2X2V2ZW50ID0gMDtcbiYjNDM7XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbiYjNDM7XG4mIzQzO1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIExJQ0VOU0VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTg8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDssCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgd2hpY2ggYWxsb3cgQlBGIHByb2dyYW1zIHRvIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnkgY2dyb3VwLiBUaGVzZSBmdW5jdGlvbnMgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgbW9kaWZ5IGNvcmUga2VybmVsIGxvZ2ljIChtZW1vcnkgcmVjbGFpbSkuIFRoZXkgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBkbyBub3QgaW50cm9kdWNlIGJ1Z3Mgb3IgdnVsbmVyYWJpbGl0aWVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZjBjMGIyZTNhNWFjOTk3MDg5NDlhY2U1NjJiOGMzMzA4MjQ1ZjczMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgQXVnIDE4IDA5OjE4OjQwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uOTIyNzJmOWE1ODI1MSAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDk3IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHkKJiM0MzsgKiBvdmVyd3JpdGVzIGN1cnJlbnQtJmd0O3JlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuCiYjNDM7ICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltCiYjNDM7ICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuCiYjNDM7ICoKJiM0MzsgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnQKJiM0MzsgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpCiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGQKJiM0MzsgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlCiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LSZndDtmbGFncyBhbHJlYWR5IGNhcnJpZXMgdGhlIGZsYWcuIFRoZSBwYWdlCiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZQomIzQzOyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uCiYjNDM7ICoKJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZQomIzQzOyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRgomIzQzOyAqIHByb2dyYW0gY2Fubm90IGF0dGFjaCB0by4KJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvbgomIzQzOyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZQomIzQzOyAqIGNncm91cCYjMzk7cyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCwKJiM0MzsgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDsKJiM0MzsgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlcgomIzQzOyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nCiYjNDM7ICogICBjb250ZXh0IChQRl9NRU1BTExPQykuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFOwomIzQzOwomIzQzOwlpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLCBOVUxMKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzcwomIzQzOyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzCiYjNDM7ICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzCiYjNDM7ICoKJiM0MzsgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW0KJiM0MzsgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJiMzOTtzCiYjNDM7ICogc3dhcHBpbmVzcyBzZXR0aW5nLiBWYWxpZCB2YWx1ZXMgYXJlIFtNSU5fU1dBUFBJTkVTUywgTUFYX1NXQVBQSU5FU1NdCiYjNDM7ICogYW5kIFNXQVBQSU5FU1NfQU5PTl9PTkxZLCB3aGljaCByZXN0cmljdHMgcmVjbGFpbSB0byBhbm9uIGZvbGlvcy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXIKJiM0MzsgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXMKJiM0MzsgKiAgIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmcgY29udGV4dCAoUEZfTUVNQUxMT0MpLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcKJiM0MzticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgc2l6ZSwKJiM0MzsJCQkJIGludCBzd2FwcGluZXNzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7CiYjNDM7CiYjNDM7CWlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyAmbHQ7IE1JTl9TV0FQUElORVNTIHx8CiYjNDM7CSAgICBzd2FwcGluZXNzICZndDsgU1dBUFBJTkVTU19BTk9OX09OTFkgfHwKJiM0MzsJICAgIHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJICAgICZhbXA7c3dhcHBpbmVzcyk7CiYjNDM7fQomIzQzOwogX19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKIAogQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpCkBAIC0xNzIsNiAmIzQzOzI2NCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiAKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpCiYjNDM7CiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNmZhYjg4MjAzZTdkMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwzODIgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3QKJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTAKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlzaXplX3Qgd3JpdHRlbiA9IDA7CiYjNDM7CWNoYXIgKmJ1ZmZlcjsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4oZmlsZW5hbWUsICYjMzQ7d2ImIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTsKJiM0MzsJaWYgKCFidWZmZXIpCiYjNDM7CQlnb3RvIGNsZWFudXBfZnA7CiYjNDM7CiYjNDM7CW1lbXNldChidWZmZXIsICYjMzk7QSYjMzk7LCBCVUZGRVJfU0laRSk7CiYjNDM7CiYjNDM7CXdoaWxlICh3cml0dGVuICZsdDsgRklMRV9TSVpFKSB7CiYjNDM7CQlzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuICZsdDsgQlVGRkVSX1NJWkUgPwomIzQzOwkJCQkgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTsKJiM0MzsKJiM0MzsJCWlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCXdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZnJlZShidWZmZXIpOwomIzQzO2NsZWFudXBfZnA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CWxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwljaGFyICptYXA7CiYjNDM7CXNpemVfdCBpOwomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBzdGF0IHNiOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkID09IC0xKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChmc3RhdChmZCwgJmFtcDtzYikgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcbiYjMzQ7LAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7CiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKJiM0MzsJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlmb3IgKGludCBpdGVyID0gMDsgaXRlciAmbHQ7IGl0ZXJhdGlvbnM7IGl0ZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHsKJiM0MzsJCQkvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqLwomIzQzOwkJCXZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTsKJiM0MzsJCQkodm9pZCl2OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXBfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsCiYjNDM7CQkJCWNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCAmIzM0O2pvaW5fcGFyZW50X2Nncm91cCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7c3RhcnQsIE5VTEwpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpLCAmIzM0O3dyaXRlX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSwgJiMzNDtyZWFkX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWdldHRpbWVvZmRheSgmYW1wO2VuZCwgTlVMTCk7CiYjNDM7CiYjNDM7CWlmICghdGltZV9maWxlbmFtZSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwllbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7CiYjNDM7CQkgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wOwomIzQzOwlwcmludGYoJiMzNDslLjZmXG4mIzM0OywgZWxhcHNlZCk7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDt3JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW10gPSAmIzM0Oy90bXAvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWCYjMzQ7OwomIzQzOwljaGFyIGxvd19kYXRhX2ZpbGVbXSA9ICYjMzQ7L3RtcC9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtdID0gJiMzNDsvdG1wL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBsb3dfdGltZV9maWxlW10gPSAmIzM0Oy90bXAvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYJiMzNDs7CiYjNDM7CXBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTsKJiM0MzsJaW50IGZkLCBzdGF0dXM7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwloaWdoX3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsICYjMzQ7Zm9yayBoaWdoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoaGlnaF9waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLAomIzQzOwkJCQkJICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9HVCh3YWl0cGlkKGxvd19waWQsICZhbXA7c3RhdHVzLCAwKSwgMCwgJiMzNDtsb3cgd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCAmIzM0O2xvdyBleGl0IHN0YXR1cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApLCAwLCAmIzM0O2hpZ2ggd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgJiMzNDtoaWdoIGV4aXQgc3RhdHVzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJLyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi8KJiM0MzsJaWYgKHJldCkgewomIzQzOwkJaWYgKGhpZ2hfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwoaGlnaF9waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwkJaWYgKGxvd19waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChsb3dfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXVubGluayhsb3dfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsOwomIzQzOwlzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHsKJiM0MzsJCS5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLAomIzQzOwkJLmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLAomIzQzOwkJLmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCwKJiM0MzsJCS5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLAomIzQzOwkJLmN0eF9pbiA9ICZhbXA7YnBmX2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTsKJiM0MzsJaW50IHByb2dfaW5pdF9mZCwgZXJyOwomIzQzOwomIzQzOwlza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsICZhbXA7cnVuX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsICYjMzQ7cHJvZ19pbml0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwkqc2tlbF9wdHIgPSBza2VsOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJvcl9vdXQ6CiYjNDM7CW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDsKJiM0MzsJaW50IGVycjsKJiM0MzsJZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygmYW1wO2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2xvd19jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsICZhbXA7c2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7aGlnaF90aW1lLCAmYW1wO2xvd190aW1lLCBSRUFEX1RJTUVTKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChoaWdoX3RpbWUgJmd0Oz0gbG93X3RpbWUpCiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7aGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmJiMzNDssCiYjNDM7CQkJICAgaGlnaF90aW1lLCBsb3dfdGltZSk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAoc2tlbCkKJiM0MzsJCW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjJjMmJiN2UwMzdiNgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsMTY3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSUQJMQomIzQzOyNkZWZpbmUgUEFHRV9TSVpFCQk0MDk2VUwKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnA7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoIWJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKSkKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwomIzQzOwlpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2VsZW0tJmd0O3ByZXZfZXZlbnQsCiYjNDM7CQllbGVtLSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7CiYjNDM7CQlyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTsKJiM0MzsJCWJwZl93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgYXN5bmNfZnJlZSwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5Mjg1CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMzA4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIE5ldyBCUEYgTWVtb3J5IFJlY2xhbWF0aW9uIEtmdW5jcyoqCgpPa2F5LCBzbyB3ZSBoYXZlIGEgcGF0Y2ggaW50cm9kdWNpbmcgdHdvIG5ldyBCUEYga2Z1bmNzOiBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYC4gVGhleSYjMzk7dmUgYmVlbiBhZGRlZCB0byBgbW0vYnBmX21lbWNvbnRyb2wuY2AsIHdoaWNoIHRlbGxzIG1lIHRoaXMgaXMgZGlyZWN0bHkgaW50ZXJhY3Rpbmcgd2l0aCBtZW1vcnkgY2dyb3VwIG1hbmFnZW1lbnQg4oCTIHRoYXQmIzM5O3MgZGVmaW5pdGVseSBpbnRlcmVzdGluZy4gVGhlc2UgZnVuY3Rpb25zIGVzc2VudGlhbGx5IGFsbG93IEJQRiBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFtYXRpb24gd2l0aGluIGEgbWVtb3J5IGNncm91cC4gR2l2ZW4gdGhlaXIgbmFtZXMsIGBzd2FwcGluZXNzYCBzdWdnZXN0cyB0aGV5IG9mZmVyIHNvbWUgY29udHJvbCBvdmVyIHN3YXAgYmVoYXZpb3IsIHdoaWNoIGlzIGEgbnVhbmNlZCBhZGRpdGlvbi4KClRoZSBmYWN0IHRoYXQgdGhleSYjMzk7cmUgbGV2ZXJhZ2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgdW5kZXIgdGhlIGhvb2QgZ2l2ZXMgbWUgYSBnb29kIGlkZWEgb2YgdGhlaXIgZnVuZGFtZW50YWwgb3BlcmF0aW9uLiBOb3csIGFzIGZvciB0aGVpciBleHBvc3VyZS4uLiB0aGV5JiMzOTtyZSBleHBvcnRlZCB1c2luZyBgQlRGX0lEX0ZMQUdTYCwgd2hpY2ggdGVsbHMgbWUgdGhleSBhcmUgaW5kZWVkIHNsZWVwYWJsZSBCUEYga2Z1bmNzLiBFeGNlbGxlbnQg4oCTIHNsZWVwYWJsZSBrZnVuY3Mgb3BlbiB1cCBhIGxvdCBvZiBwb3RlbnRpYWwgdXNlIGNhc2VzLCBpbmNsdWRpbmcgaW50ZWdyYXRpb24gd2l0aCBjb21wbGV4IG1vbml0b3Jpbmcgb3IgY29udHJvbCBsb2dpYyB3aXRoaW4gdGhlIG1lbW9yeSBjZ3JvdXAuCgpUaGlzIGlzIGEgY2xlYXIsIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBrZXJuZWwsIHByb3ZpZGluZyBhIG5ldyBpbnRlcmZhY2UgZm9yIEJQRiBwcm9ncmFtcyB0byBpbnRlcmFjdCB3aXRoIG1lbW9yeSByZWNsYW1hdGlvbi4gSXQmIzM5O3MgYSBzaWduaWZpY2FudCBlbm91Z2ggYWRkaXRpb24gdGhhdCBmdXp6aW5nIHRoZXNlIGZ1bmN0aW9ucyBpcyBhYnNvbHV0ZWx5IGVzc2VudGlhbC4gTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBTaW5jZSB0aGUgY29kZSByZXNpZGVzIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgbXkgbmV4dCBzdGVwIGlzIHRvIGV4YW1pbmUgYG1tL01ha2VmaWxlYCBhbmQgYG1tL0tjb25maWdgIHRvIGlkZW50aWZ5IHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9ucyB0byBlbmFibGUgYGJwZl9tZW1jb250cm9sLmNgLCBhbmQgY29uc2VxdWVudGx5LCB0aGVzZSBuZXcga2Z1bmNzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl9tZW1jb250cm9sLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMDM4CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQ29uZmlndXJpbmcgdGhlIEJQRiBNZW1jZyBJbnRlZ3JhdGlvbioqCgpSaWdodCwgc28gd2UmIzM5O3JlIGRpdmluZyBpbnRvIEJQRiBhbmQgbWVtb3J5IGNvbnRyb2wuIFRoZSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCB3ZSYjMzk7bGwgbmVlZCBib3RoIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX01FTUNHYCBlbmFibGVkIOKAkyBvYnZpb3VzbHksIGdpdmVuIHRoZSBjb250ZXh0LiBMZXQmIzM5O3Mgc2VlIGlmIHdlIG1pc3NlZCBhbnl0aGluZyBvYnZpb3VzIGluIHRoZSBjb25maWcsIGFuZCB3aGlsZSB3ZSYjMzk7cmUgYXQgaXQsIEkgc2hvdWxkIHBva2UgYXJvdW5kIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gSG9wZWZ1bGx5LCBhbnkgcmVsYXRlZCBjb25maWdzIGFyZSBlYXNpbHkgaWRlbnRpZmllZCB0aGVyZS4gV2UgZG9uJiMzOTt0IHdhbnQgYW55IHN1cnByaXNlcyBsYXRlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR18mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9icGZfbWVtY29udHJvbC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDI1OAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkNoZWNraW5nIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBBdmFpbGFiaWxpdHkqKgoKUmlnaHQsIGxldCYjMzk7cyBqdXN0IGNvbmZpcm0gc29tZXRoaW5nIGJlZm9yZSBJIGdvIGZ1cnRoZXIgZG93biB0aGlzIHJhYmJpdCBob2xlLiBJIG5lZWQgdG8gbWFrZSBzdXJlIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBpcyBhY3R1YWxseSBhY2Nlc3NpYmxlLiBJJiMzOTttIHByZXR0eSBzdXJlIGl0JiMzOTtzICp0aGVyZSosIGJ1dCBJJiMzOTttIGJlaW5nIG1ldGljdWxvdXMuIFF1aWNrIGNoZWNrLi4uIHllcCwgYWNjb3JkaW5nIHRvIG15IG1lbnRhbCBtYXAgb2YgdGhlIGtlcm5lbCBzb3VyY2UsIHRoYXQmIzM5O3MgZGVmaW5lZCBpbiBgbW0vdm1zY2FuLmNgLiBHb29kLCB0aGF0IGNvbmZpcm1zIGl0LiBOb3cgSSBjYW4gcHJvY2VlZCB3aXRoIHRoZSBhc3N1bXB0aW9ucyBJIHdhcyBwbGFubmluZyBvbiBtYWtpbmcgYWJvdXQgaXRzIGZ1bmN0aW9uYWxpdHkgd2l0aGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBmcmFtZXdvcmsuIFRoYXQgYWxzbyBtZWFucyB0aGUgcmVsZXZhbnQgaW5jbHVkZXMgYXJlIHByb2JhYmx5IGFscmVhZHkgaGFuZGxlZCBoaWdoZXIgdXAgaW4gdGhlIGNhbGwgc3RhY2suIExldCYjMzk7cyBzZWUgaG93IGl0JiMzOTtzIGJlaW5nIHVzZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9icGZfbWVtY29udHJvbC5jPTE1OD1fX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE2My0vKlxubW0vYnBmX21lbWNvbnRyb2wuYzoxNjQ6ICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5XG5tbS9icGZfbWVtY29udHJvbC5jLTE2NS0gKiBvdmVyd3JpdGVzIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSBvbiBlbnRyeSBhbmQgcmVzZXRzIGl0IHRvIE5VTEwgb24gZXhpdC5cbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTE2OS0gKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcbm1tL2JwZl9tZW1jb250cm9sLmM6MTcwOiAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcbm1tL2JwZl9tZW1jb250cm9sLmMtMTcxLSAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0xNzctICpcbm1tL2JwZl9tZW1jb250cm9sLmM6MTc4OiAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXG5tbS9icGZfbWVtY29udHJvbC5jLTE3OS0gKiBQRl9NRU1BTExPQywgd2l0aCBvbmx5IGEgdHJhY2Vwb2ludCBpbiBiZXR3ZWVuLCB3aGljaCBhIHNsZWVwYWJsZSBCUEZcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jPTIwNj1fX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yMTMtXG5tbS9icGZfbWVtY29udHJvbC5jOjIxNDpcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjE1LVx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYz0yMzg9YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNDctXG5tbS9icGZfbWVtY29udHJvbC5jOjI0ODpcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ5LVx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE0ODE9c3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9tYXgoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIxLVxubW0vbWVtY29udHJvbC12MS5jOjE1MjI6XHRcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIzLVx0XHRcdFx0bWVtc3cgPyAwIDogTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpIHtcbi0tXG5tbS9tZW1jb250cm9sLXYxLmM9MTU0MD1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYy0xNTUzLVxubW0vbWVtY29udHJvbC12MS5jOjE1NTQ6XHRcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTU1LVx0XHRcdFx0XHRcdCAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXG4tLVxubW0vbWVtY29udHJvbC5jPTIzMjg9c3RhdGljIHVuc2lnbmVkIGxvbmcgcmVjbGFpbV9oaWdoKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLmMtMjM0My1cdFx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjM0NDpcdFx0bnJfcmVjbGFpbWVkICYjNDM7PSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcbm1tL21lbWNvbnRyb2wuYy0yMzQ1LVx0XHRcdFx0XHRcdFx0Z2ZwX21hc2ssXG4tLVxubW0vbWVtY29udHJvbC5jPTI1OTU9c3RhdGljIGludCB0cnlfY2hhcmdlX21lbWNnKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgZ2ZwX3QgZ2ZwX21hc2ssXG4tLVxubW0vbWVtY29udHJvbC5jLTI2NTQtXHRwc2lfbWVtc3RhbGxfZW50ZXIoXHUwMDI2cGZsYWdzKTtcbm1tL21lbWNvbnRyb2wuYzoyNjU1Olx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1fb3Zlcl9saW1pdCwgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjY1Ni1cdFx0XHRcdFx0XHQgICAgZ2ZwX21hc2ssIHJlY2xhaW1fb3B0aW9ucywgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ3Njg9c3RhdGljIHNzaXplX3QgbWVtb3J5X2hpZ2hfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxuLS1cbm1tL21lbWNvbnRyb2wuYy00ODAyLVxubW0vbWVtY29udHJvbC5jOjQ4MDM6XHRcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gaGlnaCxcbm1tL21lbWNvbnRyb2wuYy00ODA0LVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKTtcbi0tXG5tbS9tZW1jb250cm9sLmM9NDgyMD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfbWF4X3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDg1NC1cdFx0aWYgKG5yX3JlY2xhaW1zKSB7XG5tbS9tZW1jb250cm9sLmM6NDg1NTpcdFx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gbWF4LFxubW0vbWVtY29udHJvbC5jLTQ4NTYtXHRcdFx0XHRcdEdGUF9LRVJORUwsIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL3Ztc2Nhbi5jPTY3MjI9dW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS92bXNjYW4uYy02NzYxLVxubW0vdm1zY2FuLmM6Njc2Mjp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjc2My1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYy02ODAyLSNlbHNlXG5tbS92bXNjYW4uYzo2ODAzOnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG5tbS92bXNjYW4uYy02ODA0LVx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL3Ztc2Nhbi5jPTc4NjY9aW50IHVzZXJfcHJvYWN0aXZlX3JlY2xhaW0oY2hhciAqYnVmLFxuLS1cbm1tL3Ztc2Nhbi5jLTc5MzMtXHRcdFx0XHRcdCAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkU7XG5tbS92bXNjYW4uYzo3OTM0Olx0XHRcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csXG5tbS92bXNjYW4uYy03OTM1LVx0XHRcdFx0XHRcdCBiYXRjaF9zaXplLCBnZnBfbWFzayxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjE2MQoJCQkJCQkJb3V0cHV0OiAxNTIKCQkJCQkJCXRob3VnaHRzOiAyMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7dmUgaWRlbnRpZmllZCBzb21lIHByb21pc2luZyB0YXJnZXRzIGZvciBmdXp6aW5nIHdpdGhpbiB0aGUgQlBGIHN1YnN5c3RlbS4gVGhlIGtleSBoZXJlIGlzIHRob3NlIG5ldyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCBmdW5jdGlvbnMuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoZXNlIGFyZSAqcmVhY2hhYmxlKiDigJMgbWVhbmluZyB0aGV5JiMzOTtyZSBleHBvc2VkIGFuZCBjYWxsYWJsZSBmcm9tIHdpdGhpbiBCUEYgcHJvZ3JhbXMsIHdoaWNoIGltbWVkaWF0ZWx5IHJhaXNlcyBhIGZsYWcuCgpHaXZlbiB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgdG91Y2hpbmcgbWVtb3J5IHJlY2xhaW0sIHdoaWNoIGlzIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBhbHdheXMgYSBzb3VyY2Ugb2YgY29tcGxleCBpbnRlcmFjdGlvbnMsIGZ1enppbmcgaXMgZGVmaW5pdGVseSB3YXJyYW50ZWQuIFRoZXkmIzM5O3JlIHByaW1lIGNhbmRpZGF0ZXMgZm9yIHBvdGVudGlhbCBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy4KCkkmIzM5O3ZlIGNvbmZpcm1lZCB0aGUgcmVsZXZhbnQgY29uZmlncyBhcmUgZW5hYmxlZDogYEJQRl9TWVNDQUxMYCBhbmQgYE1FTUNHYC4gVGhvc2UgYXJlIHByZXR0eSBzdGFuZGFyZCwgdGhhbmtmdWxseSwgc28gbm8gc3VycHJpc2VzIHRoZXJlLiBMZXQgbWUganVzdCBkb3VibGUtY2hlY2sgdGhhdCB0aGVyZSBhcmVuJiMzOTt0IGFueSBvdGhlciwgbGVzcyBvYnZpb3VzLCBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGFjY291bnQgZm9yLi4uIE5vcGUsIHRob3NlIHR3byBhcmUgdGhlIG9ubHkgb25lcy4KCkJhc2VkIG9uIGFsbCBvZiB0aGF0LCBJIGNhbiBjb25maWRlbnRseSByZXR1cm4gYFdvcnRoRnV6emluZz10cnVlYC4gTXkgZm9jdXMgd2lsbCBiZSBvbiB0aG9zZSB0d28gZnVuY3Rpb25zLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgYW5kIEkmIzM5O2xsIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBmdXp6ZXIgaXMgcHJvcGVybHkgY29uZmlndXJlZCB3aXRoIGJvdGggYEJQRl9TWVNDQUxMYCBhbmQgYE1FTUNHYCBlbmFibGVkLiBJJiMzOTtsbCBuZWVkIHRvIGRldmVsb3AgYXBwcm9wcmlhdGUgZnV6emluZyBoYXJuZXNzZXMgdG8gcmVhbGx5IHB1dCB0aGVzZSBuZXcgZnVuY3Rpb25zIHRocm91Z2ggdGhlaXIgcGFjZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtNRU1DRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7LAogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIG1vZGlmeSBjb3JlIGtlcm5lbCBsb2dpYyAobWVtb3J5IHJlY2xhaW0pLiBUaGV5IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgZG8gbm90IGludHJvZHVjZSBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7TUVNQ0cmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OywKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgKG1lbW9yeSByZWNsYWltKS4gVGhleSBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSB0aGV5IGRvIG5vdCBpbnRyb2R1Y2UgYnVncyBvciB2dWxuZXJhYmlsaXRpZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE4IDA5OjE5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IGFjdCBhcyB3cmFwcGVycyBhcm91bmQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIGEgcG9pbnRlciB0byBhIGBtZW1fY2dyb3VwYCBzdHJ1Y3R1cmUsIGFsbCBvZiB3aGljaCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIEJQRiBzdWJzeXN0ZW0gYmVmb3JlIHRoZSBrZnVuY3MgYXJlIGludm9rZWQuIFRoZSBsb2NhbCB2YXJpYWJsZSBgc3dhcHBpbmVzc2AgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGJ1dCBpdCBpcyBmdWxseSBpbml0aWFsaXplZCBmcm9tIHRoZSBmdW5jdGlvbiBhcmd1bWVudC4gTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB3aWxsIGJlIGNhdWdodCBieSBLQVNBTi4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZjBjMGIyZTNhNWFjOTk3MDg5NDlhY2U1NjJiOGMzMzA4MjQ1ZjczMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgQXVnIDE4IDA5OjE4OjQwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uOTIyNzJmOWE1ODI1MSAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC02LDYgJiM0Mzs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zd2FwLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKQEAgLTE1OSw2ICYjNDM7MTYwLDk3IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHkKJiM0MzsgKiBvdmVyd3JpdGVzIGN1cnJlbnQtJmd0O3JlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuCiYjNDM7ICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltCiYjNDM7ICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuCiYjNDM7ICoKJiM0MzsgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnQKJiM0MzsgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpCiYjNDM7ICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGQKJiM0MzsgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlCiYjNDM7ICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LSZndDtmbGFncyBhbHJlYWR5IGNhcnJpZXMgdGhlIGZsYWcuIFRoZSBwYWdlCiYjNDM7ICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZQomIzQzOyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uCiYjNDM7ICoKJiM0MzsgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZQomIzQzOyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRgomIzQzOyAqIHByb2dyYW0gY2Fubm90IGF0dGFjaCB0by4KJiM0MzsgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvbgomIzQzOyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9NRU1BTExPQzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZQomIzQzOyAqIGNncm91cCYjMzk7cyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCwKJiM0MzsgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDsKJiM0MzsgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOgomIzQzOyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlcgomIzQzOyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nCiYjNDM7ICogICBjb250ZXh0IChQRl9NRU1BTExPQykuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFOwomIzQzOwomIzQzOwlpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLCBOVUxMKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzcwomIzQzOyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzCiYjNDM7ICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzCiYjNDM7ICoKJiM0MzsgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW0KJiM0MzsgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJiMzOTtzCiYjNDM7ICogc3dhcHBpbmVzcyBzZXR0aW5nLiBWYWxpZCB2YWx1ZXMgYXJlIFtNSU5fU1dBUFBJTkVTUywgTUFYX1NXQVBQSU5FU1NdCiYjNDM7ICogYW5kIFNXQVBQSU5FU1NfQU5PTl9PTkxZLCB3aGljaCByZXN0cmljdHMgcmVjbGFpbSB0byBhbm9uIGZvbGlvcy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjoKJiM0MzsgKiAgIFRoZSBudW1iZXIgb2YgcGFnZXMgYWN0dWFsbHkgcmVjbGFpbWVkLCBvciAwIGlmIEBzaXplIGlzIHNtYWxsZXIKJiM0MzsgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXMKJiM0MzsgKiAgIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmcgY29udGV4dCAoUEZfTUVNQUxMT0MpLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcKJiM0MzticGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgc2l6ZSwKJiM0MzsJCQkJIGludCBzd2FwcGluZXNzKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7CiYjNDM7CiYjNDM7CWlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyAmbHQ7IE1JTl9TV0FQUElORVNTIHx8CiYjNDM7CSAgICBzd2FwcGluZXNzICZndDsgU1dBUFBJTkVTU19BTk9OX09OTFkgfHwKJiM0MzsJICAgIHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAomIzQzOwkJCQkJICAgICZhbXA7c3dhcHBpbmVzcyk7CiYjNDM7fQomIzQzOwogX19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKIAogQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpCkBAIC0xNzIsNiAmIzQzOzI2NCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSkKIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiAKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpCiYjNDM7CiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNmZhYjg4MjAzZTdkMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwzODIgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3QKJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2Nncm91cF9oZWxwZXJzLmgmIzM0OwomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTAKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlzaXplX3Qgd3JpdHRlbiA9IDA7CiYjNDM7CWNoYXIgKmJ1ZmZlcjsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4oZmlsZW5hbWUsICYjMzQ7d2ImIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTsKJiM0MzsJaWYgKCFidWZmZXIpCiYjNDM7CQlnb3RvIGNsZWFudXBfZnA7CiYjNDM7CiYjNDM7CW1lbXNldChidWZmZXIsICYjMzk7QSYjMzk7LCBCVUZGRVJfU0laRSk7CiYjNDM7CiYjNDM7CXdoaWxlICh3cml0dGVuICZsdDsgRklMRV9TSVpFKSB7CiYjNDM7CQlzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuICZsdDsgQlVGRkVSX1NJWkUgPwomIzQzOwkJCQkgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTsKJiM0MzsKJiM0MzsJCWlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCXdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZnJlZShidWZmZXIpOwomIzQzO2NsZWFudXBfZnA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CWxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwljaGFyICptYXA7CiYjNDM7CXNpemVfdCBpOwomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBzdGF0IHNiOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkID09IC0xKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChmc3RhdChmZCwgJmFtcDtzYikgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcbiYjMzQ7LAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7CiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKJiM0MzsJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlmb3IgKGludCBpdGVyID0gMDsgaXRlciAmbHQ7IGl0ZXJhdGlvbnM7IGl0ZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHsKJiM0MzsJCQkvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqLwomIzQzOwkJCXZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTsKJiM0MzsJCQkodm9pZCl2OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXBfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsCiYjNDM7CQkJCWNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCAmIzM0O2pvaW5fcGFyZW50X2Nncm91cCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7c3RhcnQsIE5VTEwpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpLCAmIzM0O3dyaXRlX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSwgJiMzNDtyZWFkX2ZpbGUmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWdldHRpbWVvZmRheSgmYW1wO2VuZCwgTlVMTCk7CiYjNDM7CiYjNDM7CWlmICghdGltZV9maWxlbmFtZSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwllbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7CiYjNDM7CQkgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wOwomIzQzOwlwcmludGYoJiMzNDslLjZmXG4mIzM0OywgZWxhcHNlZCk7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDt3JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW10gPSAmIzM0Oy90bXAvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWCYjMzQ7OwomIzQzOwljaGFyIGxvd19kYXRhX2ZpbGVbXSA9ICYjMzQ7L3RtcC9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtdID0gJiMzNDsvdG1wL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBsb3dfdGltZV9maWxlW10gPSAmIzM0Oy90bXAvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYJiMzNDs7CiYjNDM7CXBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTsKJiM0MzsJaW50IGZkLCBzdGF0dXM7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwloaWdoX3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsICYjMzQ7Zm9yayBoaWdoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoaGlnaF9waWQgPT0gMCkKJiM0MzsJCWV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLAomIzQzOwkJCQkJICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9HVCh3YWl0cGlkKGxvd19waWQsICZhbXA7c3RhdHVzLCAwKSwgMCwgJiMzNDtsb3cgd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCAmIzM0O2xvdyBleGl0IHN0YXR1cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApLCAwLCAmIzM0O2hpZ2ggd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgJiMzNDtoaWdoIGV4aXQgc3RhdHVzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJLyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi8KJiM0MzsJaWYgKHJldCkgewomIzQzOwkJaWYgKGhpZ2hfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwoaGlnaF9waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwkJaWYgKGxvd19waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChsb3dfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXVubGluayhsb3dfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsOwomIzQzOwlzdHJ1Y3QgYnBmX2FyZ3NfcyBicGZfYXJncyA9IHsKJiM0MzsJCS5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLAomIzQzOwkJLmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLAomIzQzOwkJLmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCwKJiM0MzsJCS5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLAomIzQzOwkJLmN0eF9pbiA9ICZhbXA7YnBmX2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTsKJiM0MzsJaW50IHByb2dfaW5pdF9mZCwgZXJyOwomIzQzOwomIzQzOwlza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsICZhbXA7cnVuX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsICYjMzQ7cHJvZ19pbml0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwkqc2tlbF9wdHIgPSBza2VsOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJvcl9vdXQ6CiYjNDM7CW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDsKJiM0MzsJaW50IGVycjsKJiM0MzsJZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygmYW1wO2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2xvd19jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsICZhbXA7c2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7aGlnaF90aW1lLCAmYW1wO2xvd190aW1lLCBSRUFEX1RJTUVTKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChoaWdoX3RpbWUgJmd0Oz0gbG93X3RpbWUpCiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7aGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmJiMzNDssCiYjNDM7CQkJICAgaGlnaF90aW1lLCBsb3dfdGltZSk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAoc2tlbCkKJiM0MzsJCW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjJjMmJiN2UwMzdiNgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsMTY3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2hlbHBlcnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl90cmFjaW5nLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSUQJMQomIzQzOyNkZWZpbmUgUEFHRV9TSVpFCQk0MDk2VUwKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJnc19zIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGNncm91cF9tZW1jZyB7CiYjNDM7CXN0cnVjdCBjZ3JvdXAgKmNncnA7CiYjNDM7CXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJY20tJmd0O2NncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7Y2dycCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJY20tJmd0O21lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKCZhbXA7Y20tJmd0O2NncnAtJmd0O3NlbGYpOwomIzQzOwlpZiAoIWNtLSZndDttZW1jZykgewomIzQzOwkJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWJwZl9wdXRfbWVtX2Nncm91cChjbS0mZ3Q7bWVtY2cpOwomIzQzOwlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTsKJiM0MzsJKnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgJmFtcDtjbSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFQ0xBSU1fTUFYX0lURVI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoIWJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKSkKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGFzeW5jX2ZyZWUodm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwomIzQzOwlpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2VsZW0tJmd0O3ByZXZfZXZlbnQsCiYjNDM7CQllbGVtLSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQpKSB7CiYjNDM7CQlyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTsKJiM0MzsJCWJwZl93cV9zdGFydCgmYW1wO2VsZW0tJmd0O3dvcmssIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgYXN5bmNfZnJlZSwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgTElDRU5TRVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTggMDk6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTI4MgoJCQkJCQkJb3V0cHV0OiAyMjEKCQkJCQkJCXRob3VnaHRzOiA2NTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQb3RlbnRpYWwgZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IEV4cG9zdXJlIGluIE5ldyBCUEYga2Z1bmNzKioKCk9rYXksIHNvIHdlJiMzOTt2ZSBnb3QgdGhlc2UgbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCBkZXNpZ25lZCB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSB3aXRoaW4gYSBtZW1jZy4gVGhleSB0YWtlIGEgYHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZ2AsIGFuIGB1bnNpZ25lZCBsb25nIHNpemVgLCBhbmQsIG9wdGlvbmFsbHksIGFuIGBpbnQgc3dhcHBpbmVzc2AgdmFsdWUuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzLCBhcyBhbHdheXMsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IOKAkyB0aGF0JiMzOTtzIGEgY2xhc3NpYyBzZWN1cml0eSB2ZWN0b3IuCgpMb29raW5nIGF0IHRoZSBjb2RlLCBgbWVtY2dgIGNvbWVzIGZyb20gYSBgYnBmX2dldF9tZW1fY2dyb3VwYCBjYWxsIChvciBzaW1pbGFyKSwgc28gaXQmIzM5O3MgYSB2YWxpZCBwb2ludGVyLiBUaGUgYHNpemVgIGFuZCBgc3dhcHBpbmVzc2AgYXJndW1lbnRzIGFyZSBzY2FsYXIgdmFsdWVzIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgZnVuY3Rpb24uIEluc2lkZSB0aGUga2Z1bmMsIHRoZSBgc2l6ZWAgaXMgY29udmVydGVkIGludG8gcGFnZSBjb3VudHMgKGBucl9wYWdlc2ApLCBhbmQgdGhlIGNvZGUgY2hlY2tzIGZvciB6ZXJvIHBhZ2UgY291bnRzIG9yIGlmIHdlIGFyZSBpbiB0aGUgcmVjbGFpbSBjb250ZXh0LiBUaGUgaW1wb3J0YW50IHBhcnRzIGFyZSB0aGUgY2FsbHMgdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLgoKVGhlIGltcG9ydGFudCBwYXJ0cyBhcmU6CgpgYGBjCgl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSAvIFBBR0VfU0laRTsKCglpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpCgkJcmV0dXJuIDA7CgoJcmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLAoJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsIE5VTEwpOwpgYGAKCmFuZAoKYGBgYwoJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7CgoJaWYgKCFucl9wYWdlcyB8fCBzd2FwcGluZXNzICZsdDsgTUlOX1NXQVBQSU5FU1MgfHwKCSAgICBzd2FwcGluZXNzICZndDsgU1dBUFBJTkVTU19BTk9OX09OTFkgfHwKCSAgICB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKQoJCXJldHVybiAwOwoKCXJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCwKCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8CgkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLAoJCQkJCSAgICAmYW1wO3N3YXBwaW5lc3MpOwpgYGAKClRoZXJlJiMzOTtzIG5vdGhpbmcgaGVyZSB0aGF0IGxvb2tzIGxpa2Ugd2UmIzM5O3JlIGxlYWtpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gdXNlcnNwYWNlLiBObyBuZXcgc3RydWN0cyBhcmUgYmVpbmcgYWxsb2NhdGVkIG9yIGNvcGllZC4gVGhlIGBzd2FwcGluZXNzYCBhcmd1bWVudCwgYWx0aG91Z2ggcGFzc2VkIGFzIGEgcG9pbnRlciB0byB0aGUgY2FsbGVkIGZ1bmN0aW9uLCBpcyAqaW5pdGlhbGl6ZWQqIGxvY2FsbHkgd2l0aGluIHRoZSBCUEYga2Z1bmMuIEl0JiMzOTtzIGEgbG9jYWwgdmFyaWFibGUuIFNvIHRoZXJlIGlzIG5vIHJpc2sgb2YgZXhwb3NpbmcgdW5pdGlhbGl6ZWQgbWVtb3J5IGluIHRoZSAqY2FsbCogdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLgoKVG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluLCBJJiMzOTttIG5vdyBkb3VibGUtY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBpdHNlbGYuIFdlJiMzOTtyZSBwYXNzaW5nIGEgdmFsaWQsIGluaXRpYWxpemVkIHBvaW50ZXIgYW5kIHZhbHVlcy4gSSBjYW4gY29uZmlybSB0aGlzIGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgbmV3IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2sgZWl0aGVyLiBTdGFuZGFyZCB0b29scyBsaWtlIEtBU0FOLCBldGMsIGFyZSBnb29kIGVub3VnaCBoZXJlLgoKVGhlcmVmb3JlLCBnaXZlbiBteSBhbmFseXNpcywgSSYjMzk7bSBjb25maWRlbnQgdGhhdCB0aGVzZSBjaGFuZ2VzIGRvbiYjMzk7dCBpbnRyb2R1Y2UgYSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlLiBJJiMzOTtsbCBzZXQgYE5lZWRzS01TQU49ZmFsc2VgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xOCAwOToxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgYWN0IGFzIHdyYXBwZXJzIGFyb3VuZCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZXNlIGtmdW5jcyBhcmUgc2NhbGFyIHZhbHVlcyBhbmQgYSBwb2ludGVyIHRvIGEgYG1lbV9jZ3JvdXBgIHN0cnVjdHVyZSwgYWxsIG9mIHdoaWNoIGFyZSBmdWxseSBpbml0aWFsaXplZCBieSB0aGUgQlBGIHN1YnN5c3RlbSBiZWZvcmUgdGhlIGtmdW5jcyBhcmUgaW52b2tlZC4gVGhlIGxvY2FsIHZhcmlhYmxlIGBzd2FwcGluZXNzYCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYnV0IGl0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50LiBObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gbWVtb3J5IGNncm91cCByZWNsYWltIHdpbGwgYmUgY2F1Z2h0IGJ5IEtBU0FOLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MgKGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgKSB0aGF0IGFjdCBhcyB3cmFwcGVycyBhcm91bmQgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVzZSBrZnVuY3MgYXJlIHNjYWxhciB2YWx1ZXMgYW5kIGEgcG9pbnRlciB0byBhIGBtZW1fY2dyb3VwYCBzdHJ1Y3R1cmUsIGFsbCBvZiB3aGljaCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIEJQRiBzdWJzeXN0ZW0gYmVmb3JlIHRoZSBrZnVuY3MgYXJlIGludm9rZWQuIFRoZSBsb2NhbCB2YXJpYWJsZSBgc3dhcHBpbmVzc2AgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGJ1dCBpdCBpcyBmdWxseSBpbml0aWFsaXplZCBmcm9tIHRoZSBmdW5jdGlvbiBhcmd1bWVudC4gTm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQsIGFuZCBubyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlLiBBbnkgcG90ZW50aWFsIG1lbW9yeSBjb3JydXB0aW9uLCBvdXQtb2YtYm91bmRzIGFjY2Vzcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyByZWxhdGVkIHRvIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB3aWxsIGJlIGNhdWdodCBieSBLQVNBTi4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTg6NDEuODY3NzgzNjdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMDcxNTE4Njg3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1cIixcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgYWN0IGFzIHdyYXBwZXJzIGFyb3VuZCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZXNlIGtmdW5jcyBhcmUgc2NhbGFyIHZhbHVlcyBhbmQgYSBwb2ludGVyIHRvIGEgYG1lbV9jZ3JvdXBgIHN0cnVjdHVyZSwgYWxsIG9mIHdoaWNoIGFyZSBmdWxseSBpbml0aWFsaXplZCBieSB0aGUgQlBGIHN1YnN5c3RlbSBiZWZvcmUgdGhlIGtmdW5jcyBhcmUgaW52b2tlZC4gVGhlIGxvY2FsIHZhcmlhYmxlIGBzd2FwcGluZXNzYCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYnV0IGl0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50LiBObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gbWVtb3J5IGNncm91cCByZWNsYWltIHdpbGwgYmUgY2F1Z2h0IGJ5IEtBU0FOLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCwgd2hpY2ggYWxsb3cgQlBGIHByb2dyYW1zIHRvIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnkgY2dyb3VwLiBUaGVzZSBmdW5jdGlvbnMgYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgbW9kaWZ5IGNvcmUga2VybmVsIGxvZ2ljIChtZW1vcnkgcmVjbGFpbSkuIFRoZXkgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgdGhleSBkbyBub3QgaW50cm9kdWNlIGJ1Z3Mgb3IgdnVsbmVyYWJpbGl0aWVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxODo0MS44Njc3ODk1MVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTUyNDY4MTIyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZjBjMGIyZTNhNWFjOTk3MDg5NDlhY2U1NjJiOGMzMzA4MjQ1ZjczMlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwOToxODo0MCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyMjcyZjlhNTgyNTEgMTAwNjQ0XFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcXG5AQCAtNiw2ICs2LDcgQEBcXG4gICovXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtY29udHJvbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3dhcC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuIFxcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XFxuQEAgLTE1OSw2ICsxNjAsOTcgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuIFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiB9XFxuIFxcbisvKlxcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2UuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSB1bmNvbmRpdGlvbmFsbHlcXG4rICogb3ZlcndyaXRlcyBjdXJyZW50LVxcdTAwM2VyZWNsYWltX3N0YXRlIG9uIGVudHJ5IGFuZCByZXNldHMgaXQgdG8gTlVMTCBvbiBleGl0LlxcbisgKiBTbyBpbnZva2luZyBpdCBmcm9tIGFuIGluLWZsaWdodCByZWNsYWltIHdvdWxkIGNsb2JiZXIgdGhlIG91dGVyIHJlY2xhaW1cXG4rICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuXFxuKyAqXFxuKyAqIFRoZSBndWFyZCBpcyBQRl9NRU1BTExPQy4gRXZlcnkgcmVjbGFpbSBlbnRyeSBwb2ludCBtYXJrcyB0aGUgY3VycmVudFxcbisgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXFxuKyAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXFxuKyAqIGtlZXBzIGl0IHNldCBmb3IgaXRzIGVudGlyZSBsaWZldGltZS4gQSBob29rIGluc2lkZSB0aGUgcmVjbGFpbSBwYXRoXFxuKyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlXFxuKyAqIHJlY2xhaW1pbmcgdGFzaywgd2hlcmUgY3VycmVudC1cXHUwMDNlZmxhZ3MgYWxyZWFkeSBjYXJyaWVzIHRoZSBmbGFnLiBUaGUgcGFnZVxcbisgKiBhbGxvY2F0b3IsIHRoZSBtZW1jZyBjaGFyZ2luZyBwYXRoIGFuZCBub2RlX3JlY2xhaW0oKSByZWx5IG9uIHRoZSBzYW1lXFxuKyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uXFxuKyAqXFxuKyAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXFxuKyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRlxcbisgKiBwcm9ncmFtIGNhbm5vdCBhdHRhY2ggdG8uXFxuKyAqIEFsc28sIFBGX01FTUFMTE9DIGlzIHNldCBpbiBzb21lIG5vbi1yZWNsYWltIGNvbnRleHRzIChlLmcuIGRpcmVjdCBjb21wYWN0aW9uXFxuKyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLlxcbisgKi9cXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBjdXJyZW50LVxcdTAwM2VmbGFncyBcXHUwMDI2IFBGX01FTUFMTE9DO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeVxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXBcXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXFxuKyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcXG4rICpcXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xcbisgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZVxcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCxcXG4rICogdW5saWtlIG1lbW9yeS5yZWNsYWltLCB0aGlzIGRvZXMgbm90IHJldHJ5IHVudGlsIEBzaXplIGlzIHJlYWNoZWQ7XFxuKyAqIGNhbGxlcnMgY2FuIGludm9rZSBpdCBhZ2FpbiBpZiBuZWVkZWQuXFxuKyAqXFxuKyAqIFJldHVybjpcXG4rICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyXFxuKyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nXFxuKyAqICAgY29udGV4dCAoUEZfTUVNQUxMT0MpLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbitcXHRcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nIHNpemUpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7XFxuK1xcbitcXHRpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XFxuK1xcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSwgTlVMTCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYVxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdFxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBwaW5lc3NcXG4rICogQG1lbWNnOiAgICAgIHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cXG4rICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXFxuKyAqIEBzd2FwcGluZXNzOiBzd2FwcGluZXNzIG92ZXJyaWRlIGZvciB0aGlzIHJlY2xhaW0gcGFzc1xcbisgKlxcbisgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW1cXG4rICogYmFsYW5jZSBpcyBjb250cm9sbGVkIGJ5IEBzd2FwcGluZXNzIGluc3RlYWQgb2YgdGhlIGNncm91cCdzXFxuKyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXVxcbisgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxcbisgKlxcbisgKiBSZXR1cm46XFxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxcbisgKiAgIHRoYW4gYSBwYWdlLCBAc3dhcHBpbmVzcyBpcyBvdXQgb2YgcmFuZ2UsIG9yIHRoZSBjYWxsaW5nIHRhc2sgaXNcXG4rICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmdcXG4rYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXFxuK1xcdFxcdFxcdFxcdCBpbnQgc3dhcHBpbmVzcylcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSAvIFBBR0VfU0laRTtcXG4rXFxuK1xcdGlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyBcXHUwMDNjIE1JTl9TV0FQUElORVNTIHx8XFxuK1xcdCAgICBzd2FwcGluZXNzIFxcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkgfHxcXG4rXFx0ICAgIHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XFxuK1xcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIFxcdTAwMjZzd2FwcGluZXNzKTtcXG4rfVxcbitcXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcXG4gXFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbkBAIC0xNzIsNiArMjY0LDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxuIFxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcywgS0ZfU0xFRVBBQkxFKVxcbitcXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbiBcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi42ZmFiODgyMDNlN2QzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbkBAIC0wLDAgKzEsMzgyIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XFxuKyAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvc3RhdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3RpbWUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc2lnbmFsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNncm91cF9oZWxwZXJzLmhcXFwiXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuKyNpbmNsdWRlIFxcXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXFxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXFxuK1xcbisjZGVmaW5lIENHX0RJUiBcXFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cXFwiXFxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFxcXCIvaGlnaFxcXCJcXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcXFwiL2xvd1xcXCJcXG4rXFxuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXFxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcXG4rXFxuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFx0Y2hhciBsaW1pdF9idWZbMjBdO1xcbitcXG4rXFx0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXFxcIm1lbW9yeVxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJlbmFibGVfY29udHJvbGxlcnNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXFxcIiVsdVxcXCIsIENHX0xJTUlUKTtcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5Lm1heFxcXCIsIGxpbWl0X2J1Zik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5LnN3YXAubWF4XFxcIiwgXFxcIjBcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdHNpemVfdCB3cml0dGVuID0gMDtcXG4rXFx0Y2hhciAqYnVmZmVyO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFxcXCJ3YlxcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XFxuK1xcdGlmICghYnVmZmVyKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZnA7XFxuK1xcbitcXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcXG4rXFxuK1xcdHdoaWxlICh3cml0dGVuIFxcdTAwM2MgRklMRV9TSVpFKSB7XFxuK1xcdFxcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXFx1MDAzYyBCVUZGRVJfU0laRSA/XFxuK1xcdFxcdFxcdFxcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xcbitcXG4rXFx0XFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0XFx0d3JpdHRlbiArPSB0b193cml0ZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZnJlZShidWZmZXIpO1xcbitjbGVhbnVwX2ZwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRjaGFyICptYXA7XFxuK1xcdHNpemVfdCBpO1xcbitcXHRpbnQgZmQ7XFxuK1xcdHN0cnVjdCBzdGF0IHNiO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCA9PSAtMSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoZnN0YXQoZmQsIFxcdTAwMjZzYikgPT0gLTEpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XFxuK1xcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcXG4rXFx0XFx0XFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cXG4rXFx0XFx0XFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xcbitcXHRcXHRcXHQodm9pZCl2O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9mZDpcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXFxuK1xcdFxcdFxcdFxcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHN0YXJ0LCBlbmQ7XFxuK1xcdGRvdWJsZSBlbGFwc2VkO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCksIFxcXCJqb2luX3BhcmVudF9jZ3JvdXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0Z2V0dGltZW9mZGF5KFxcdTAwMjZzdGFydCwgTlVMTCk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpLCBcXFwid3JpdGVfZmlsZVxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcyksIFxcXCJyZWFkX2ZpbGVcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0Z2V0dGltZW9mZGF5KFxcdTAwMjZlbmQsIE5VTEwpO1xcbitcXG4rXFx0aWYgKCF0aW1lX2ZpbGVuYW1lKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xcbitcXHRcXHQgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDAwMC4wO1xcbitcXHRwcmludGYoXFxcIiUuNmZcXFxcblxcXCIsIGVsYXBzZWQpO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGZwcmludGYoZnAsIFxcXCIlLjZmXFxcIiwgZWxhcHNlZCk7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0Y2hhciBidWZbNjRdO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwiclxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFxcXCJmZ2V0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRpZiAoc3NjYW5mKGJ1ZiwgXFxcIiVsZlxcXCIsIHRpbWUpICE9IDEpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwic3NjYW5mICVzXFxcIiwgYnVmKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSAwO1xcbitjbGVhbnVwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRjaGFyIGhpZ2hfZGF0YV9maWxlW10gPSBcXFwiL3RtcC9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXFxcIjtcXG4rXFx0Y2hhciBsb3dfZGF0YV9maWxlW10gPSBcXFwiL3RtcC9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcXFwiO1xcbitcXHRjaGFyIGhpZ2hfdGltZV9maWxlW10gPSBcXFwiL3RtcC9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXFxcIjtcXG4rXFx0Y2hhciBsb3dfdGltZV9maWxlW10gPSBcXFwiL3RtcC9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcXFwiO1xcbitcXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XFxuK1xcdGludCBmZCwgc3RhdHVzO1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0bG93X3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXFxcImZvcmsgbG93XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGxvd19waWQgPT0gMClcXG4rXFx0XFx0ZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcXG4rXFxuK1xcdGhpZ2hfcGlkID0gZm9yaygpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXFxcImZvcmsgaGlnaFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChoaWdoX3BpZCA9PSAwKVxcbitcXHRcXHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0aWYgKCFBU1NFUlRfR1Qod2FpdHBpZChsb3dfcGlkLCBcXHUwMDI2c3RhdHVzLCAwKSwgMCwgXFxcImxvdyB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXFxcImxvdyBleGl0ZWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcXFwibG93IGV4aXQgc3RhdHVzXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRwaWQoaGlnaF9waWQsIFxcdTAwMjZzdGF0dXMsIDApLCAwLCBcXFwiaGlnaCB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXFxcImhpZ2ggZXhpdGVkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXFxcImhpZ2ggZXhpdCBzdGF0dXNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdGlmIChoaWdoX3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdFxcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChsb3dfcGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XFxuK1xcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rc2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXFxuK1xcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcXG4rXFx0c3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7XFxuK1xcdFxcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxcbitcXHRcXHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXFxuK1xcdFxcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXFxuK1xcdFxcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcXG4rXFx0fTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxcbitcXHRcXHQuY3R4X2luID0gXFx1MDAyNmJwZl9hcmdzLFxcbitcXHRcXHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYnBmX2FyZ3MpKTtcXG4rXFx0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xcbitcXG4rXFx0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFxcXCJtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkXFxcIikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVxcdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xcbitcXG4rXFx0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsIFxcdTAwMjZydW5fb3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJvcl9vdXQ7XFxuK1xcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXFxcInByb2dfaW5pdCByZXR2YWxcXFwiKSlcXG4rXFx0XFx0Z290byBlcnJvcl9vdXQ7XFxuK1xcbitcXHQqc2tlbF9wdHIgPSBza2VsO1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2Vycm9yX291dDpcXG4rXFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbit2b2lkIHRlc3RfbWVtY2dfd3FfYXN5bmNfcmVjbGFpbSh2b2lkKVxcbit7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDtcXG4rXFx0aW50IGVycjtcXG4rXFx0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XFxuK1xcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcXHUwMDI2bG93X2Nncm91cF9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFxcdTAwMjZza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfYnBmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFxcdTAwMjZoaWdoX3RpbWUsIFxcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGhpZ2hfdGltZSBcXHUwMDNlPSBsb3dfdGltZSlcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXFxcIixcXG4rXFx0XFx0XFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XFxuK1xcbitvdXQ6XFxuK1xcdGlmIChza2VsKVxcbitcXHRcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MmMyYmI3ZTAzN2I2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDE2NyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJwZl9leHBlcmltZW50YWwuaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFxcdDFcXG4rI2RlZmluZSBQQUdFX1NJWkVcXHRcXHQ0MDk2VUxcXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcXHRcXHQoMzIgKiBQQUdFX1NJWkUpXFxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlxcdDMyXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xcbitcXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xcbitcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XFxuK307XFxuK1xcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xcbitzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcXG4re1xcbitcXHRjbS1cXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VjZ3JwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRjbS1cXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXFx1MDAyNmNtLVxcdTAwM2VjZ3JwLVxcdTAwM2VzZWxmKTtcXG4rXFx0aWYgKCFjbS1cXHUwMDNlbWVtY2cpIHtcXG4rXFx0XFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVxcdTAwM2VjZ3JwKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcXG4re1xcbitcXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXFx1MDAzZW1lbWNnKTtcXG4rXFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVxcdTAwM2VjZ3JwKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxcbit7XFxuK1xcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XFxuK1xcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLCBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXFx1MDAyNmNtKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUkVDTEFJTV9NQVhfSVRFUjsgaSsrKSB7XFxuK1xcdFxcdGlmICghYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBSRUNMQUlNX1NJWkUpKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0cHV0X2Nncm91cF9tZW1jZyhcXHUwMDI2Y20pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0cnVjdCB3cV9lbGVtIHtcXG4rXFx0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcXG4rXFx0c3RydWN0IGJwZl93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IHtcXG4rXFx0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XFxuK1xcdF9fdWludChtYXhfZW50cmllcywgMSk7XFxuK1xcdF9fdHlwZShrZXksIF9fdTMyKTtcXG4rXFx0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XFxuK30gd3FfbWFwIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuK3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xcbitcXG4rXFx0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXFx1MDAyNmVsZW0tXFx1MDAzZXByZXZfZXZlbnQsXFxuK1xcdFxcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcXG4rXFx0XFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XFxuK1xcdFxcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxcbit7XFxuK1xcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcdGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcInN5c2NhbGxcXFwiKVxcbitpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJnc19zICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW07XFxuK1xcdF9fdTMyIGtleSA9IDA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2d3FfbWFwLCBcXHUwMDI2a2V5KTtcXG4rXFx0aWYgKCFlbGVtKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRyZXQgPSBicGZfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNndxX21hcCwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCBhc3luY19mcmVlLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9pbml0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgXFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRlbGVtLVxcdTAwM2VwcmV2X2V2ZW50ID0gMDtcXG4rXFx0ZWxlbS1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdGVsZW0tXFx1MDAzZWNoZWNrX25zID0gY3R4LVxcdTAwM2VjaGVja19ucztcXG4rXFxuK1xcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2VoaWdoX2Nncm91cF9pZDtcXG4rXFx0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cXHUwMDNlbG93X2Nncm91cF9pZDtcXG4rXFxuK1xcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBlbGVtLVxcdTAwM2VjaGVja19ucywgMCk7XFxuK31cXG4rXFxuK2NoYXIgTElDRU5TRVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE4OjQyLjQyMTM0NTY3MloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE4OTY0OTc5OTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiLFxuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIG1vZGlmeSBjb3JlIGtlcm5lbCBsb2dpYyAobWVtb3J5IHJlY2xhaW0pLiBUaGV5IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgZG8gbm90IGludHJvZHVjZSBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZjBjMGIyZTNhNWFjOTk3MDg5NDlhY2U1NjJiOGMzMzA4MjQ1ZjczMlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDE4IDA5OjE4OjQwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyMjcyZjlhNTgyNTEgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4rKysgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtNiw2ICs2LDcgQEBcbiAgKi9cbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zd2FwLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTtcbkBAIC0xNTksNiArMTYwLDk3IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuKy8qXG4rICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlLiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgdW5jb25kaXRpb25hbGx5XG4rICogb3ZlcndyaXRlcyBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGUgb24gZW50cnkgYW5kIHJlc2V0cyBpdCB0byBOVUxMIG9uIGV4aXQuXG4rICogU28gaW52b2tpbmcgaXQgZnJvbSBhbiBpbi1mbGlnaHQgcmVjbGFpbSB3b3VsZCBjbG9iYmVyIHRoZSBvdXRlciByZWNsYWltXG4rICogc3RhdGUgYW5kIGNvcnJ1cHQgaXRzIGFjY291bnRpbmcuXG4rICpcbisgKiBUaGUgZ3VhcmQgaXMgUEZfTUVNQUxMT0MuIEV2ZXJ5IHJlY2xhaW0gZW50cnkgcG9pbnQgbWFya3MgdGhlIGN1cnJlbnRcbisgKiB0YXNrIHdpdGggaXQgZm9yIHRoZSB3aG9sZSByZWNsYWltIHdpbmRvdzogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpXG4rICogYW5kIF9fcGVyZm9ybV9yZWNsYWltKCkgZG8gc28gdmlhIG1lbWFsbG9jX25vcmVjbGFpbV9zYXZlKCksIGFuZCBrc3dhcGRcbisgKiBrZWVwcyBpdCBzZXQgZm9yIGl0cyBlbnRpcmUgbGlmZXRpbWUuIEEgaG9vayBpbnNpZGUgdGhlIHJlY2xhaW0gcGF0aFxuKyAqIChzaHJpbmtfbm9kZSwgc2hyaW5rX3NsYWIsIC4uLikgZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlXG4rICogcmVjbGFpbWluZyB0YXNrLCB3aGVyZSBjdXJyZW50LVx1MDAzZWZsYWdzIGFscmVhZHkgY2FycmllcyB0aGUgZmxhZy4gVGhlIHBhZ2VcbisgKiBhbGxvY2F0b3IsIHRoZSBtZW1jZyBjaGFyZ2luZyBwYXRoIGFuZCBub2RlX3JlY2xhaW0oKSByZWx5IG9uIHRoZSBzYW1lXG4rICogZmxhZyB0byBhdm9pZCByZWNsYWltIHJlY3Vyc2lvbi5cbisgKlxuKyAqIEluIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSwgcmVjbGFpbV9zdGF0ZSBpcyBzZXQgc2xpZ2h0bHkgYmVmb3JlXG4rICogUEZfTUVNQUxMT0MsIHdpdGggb25seSBhIHRyYWNlcG9pbnQgaW4gYmV0d2Vlbiwgd2hpY2ggYSBzbGVlcGFibGUgQlBGXG4rICogcHJvZ3JhbSBjYW5ub3QgYXR0YWNoIHRvLlxuKyAqIEFsc28sIFBGX01FTUFMTE9DIGlzIHNldCBpbiBzb21lIG5vbi1yZWNsYWltIGNvbnRleHRzIChlLmcuIGRpcmVjdCBjb21wYWN0aW9uXG4rICogYW5kIHZtYWxsb2MpLCB3aGVyZSB0aGUga2Z1bmMgY29uc2VydmF0aXZlbHkgcmVmdXNlcyB0byByZWNsYWltIGFzIHdlbGwuXG4rICovXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxuK3tcbitcdHJldHVybiBjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQztcbit9XG4rXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcbisgKlxuKyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbisgKiB0aGUgbWVtb3J5LnJlY2xhaW0gY2dyb3VwIGZpbGU6IHBhZ2VzIGFyZSByZWNsYWltZWQgYWNjb3JkaW5nIHRvIHRoZVxuKyAqIGNncm91cCdzIG93biBzd2FwcGluZXNzIHNldHRpbmcgYW5kIHN3YXAgaXMgYWxsb3dlZC4gTm90ZSB0aGF0LFxuKyAqIHVubGlrZSBtZW1vcnkucmVjbGFpbSwgdGhpcyBkb2VzIG5vdCByZXRyeSB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkO1xuKyAqIGNhbGxlcnMgY2FuIGludm9rZSBpdCBhZ2FpbiBpZiBuZWVkZWQuXG4rICpcbisgKiBSZXR1cm46XG4rICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyXG4rICogICB0aGFuIGEgcGFnZSBvciB0aGUgY2FsbGluZyB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltL2ZyZWVpbmdcbisgKiAgIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cbisgKi9cbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBzaXplKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFO1xuK1xuK1x0aWYgKCFucl9wYWdlcyB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuK1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsIE5VTEwpO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzcyAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGNncm91cCB3aXRoIGFuIGV4cGxpY2l0XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwcGluZXNzXG4rICogQG1lbWNnOiAgICAgIHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbisgKiBAc2l6ZTogICAgICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXNcbisgKiBAc3dhcHBpbmVzczogc3dhcHBpbmVzcyBvdmVycmlkZSBmb3IgdGhpcyByZWNsYWltIHBhc3NcbisgKlxuKyAqIFNhbWUgYXMgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGV4Y2VwdCB0aGF0IHRoZSBhbm9uL2ZpbGUgcmVjbGFpbVxuKyAqIGJhbGFuY2UgaXMgY29udHJvbGxlZCBieSBAc3dhcHBpbmVzcyBpbnN0ZWFkIG9mIHRoZSBjZ3JvdXAnc1xuKyAqIHN3YXBwaW5lc3Mgc2V0dGluZy4gVmFsaWQgdmFsdWVzIGFyZSBbTUlOX1NXQVBQSU5FU1MsIE1BWF9TV0FQUElORVNTXVxuKyAqIGFuZCBTV0FQUElORVNTX0FOT05fT05MWSwgd2hpY2ggcmVzdHJpY3RzIHJlY2xhaW0gdG8gYW5vbiBmb2xpb3MuXG4rICpcbisgKiBSZXR1cm46XG4rICogICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHJlY2xhaW1lZCwgb3IgMCBpZiBAc2l6ZSBpcyBzbWFsbGVyXG4rICogICB0aGFuIGEgcGFnZSwgQHN3YXBwaW5lc3MgaXMgb3V0IG9mIHJhbmdlLCBvciB0aGUgY2FsbGluZyB0YXNrIGlzXG4rICogICBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nIGNvbnRleHQgKFBGX01FTUFMTE9DKS5cbisgKi9cbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nXG4rYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBsb25nIHNpemUsXG4rXHRcdFx0XHQgaW50IHN3YXBwaW5lc3MpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgLyBQQUdFX1NJWkU7XG4rXG4rXHRpZiAoIW5yX3BhZ2VzIHx8IHN3YXBwaW5lc3MgXHUwMDNjIE1JTl9TV0FQUElORVNTIHx8XG4rXHQgICAgc3dhcHBpbmVzcyBcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkgfHxcbitcdCAgICB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuK1x0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4rXHRcdFx0XHRcdCAgICBcdTAwMjZzd2FwcGluZXNzKTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzIsNiArMjY0LDkgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MsIEtGX1NMRUVQQUJMRSlcbitcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42ZmFiODgyMDNlN2QzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMzgyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XG4rICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdGltZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJnc19zIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuKyNpbmNsdWRlIFwibWVtY2dfYXN5bmNfcmVjbGFpbS5za2VsLmhcIlxuK1xuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4rI2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NilcbisjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXG4rXG4rI2RlZmluZSBDR19ESVIgXCIvbWVtY2dfYXN5bmNfcmVjbGFpbVwiXG4rI2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgXCIvaGlnaFwiXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcIi9sb3dcIlxuK1xuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuK1xuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5zd2FwLm1heFwiLCBcIjBcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ISUdIX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0xPV19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmxvd19jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kO1xuK1x0ZG91YmxlIGVsYXBzZWQ7XG4rXHRGSUxFICpmcDtcbitcbitcdGlmICghQVNTRVJUX09LKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCksIFwiam9pbl9wYXJlbnRfY2dyb3VwXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRnZXR0aW1lb2ZkYXkoXHUwMDI2c3RhcnQsIE5VTEwpO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0sod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSwgXCJ3cml0ZV9maWxlXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcyksIFwicmVhZF9maWxlXCIpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRnZXR0aW1lb2ZkYXkoXHUwMDI2ZW5kLCBOVUxMKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X3VzZWMgLSBzdGFydC50dl91c2VjKSAvIDEwMDAwMDAuMDtcbitcdHByaW50ZihcIiUuNmZcXG5cIiwgZWxhcHNlZCk7XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwid1wiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW10gPSBcIi90bXAvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiO1xuK1x0Y2hhciBsb3dfZGF0YV9maWxlW10gPSBcIi90bXAvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXCI7XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW10gPSBcIi90bXAvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwiO1xuK1x0Y2hhciBsb3dfdGltZV9maWxlW10gPSBcIi90bXAvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYXCI7XG4rXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4rXHRpbnQgZmQsIHN0YXR1cztcbitcdGludCByZXQgPSAtMTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0bG93X3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwiZm9yayBsb3dcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChsb3dfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdGV4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxuK1x0XHRcdFx0XHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCksIDAsIFwibG93IHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXCJsb3cgZXhpdCBzdGF0dXNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmICghQVNTRVJUX0dUKHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCksIDAsIFwiaGlnaCB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImhpZ2ggZXhpdGVkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoIUFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcImhpZ2ggZXhpdCBzdGF0dXNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzX3MgYnBmX2FyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZicGZfYXJncyxcbitcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGJwZl9hcmdzKSk7XG4rXHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XG4rXG4rXHRza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcbitcbitcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwicHJvZ19pbml0IHJldHZhbFwiKSlcbitcdFx0Z290byBlcnJvcl9vdXQ7XG4rXG4rXHQqc2tlbF9wdHIgPSBza2VsO1xuK1x0cmV0dXJuIDA7XG4rXG4rZXJyb3Jfb3V0OlxuK1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rdm9pZCB0ZXN0X21lbWNnX3dxX2FzeW5jX3JlY2xhaW0odm9pZClcbit7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4rXHRpbnQgZXJyO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXHUwMDI2c2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZoaWdoX3RpbWUsIFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpXG4rXHRcdFBSSU5UX0ZBSUwoXCJoaWdoIGNncm91cCBub3QgaW1wcm92ZWQgd2l0aCBhc3luYyByZWNsYWltOiBoaWdoX3RpbWU9JWYgbG93X3RpbWU9JWZcIixcbitcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbitcbitvdXQ6XG4rXHRpZiAoc2tlbClcbitcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjJjMmJiN2UwMzdiNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSwxNjcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuK1xuKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXHQxXG4rI2RlZmluZSBQQUdFX1NJWkVcdFx0NDA5NlVMXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcdFx0KDMyICogUEFHRV9TSVpFKVxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlx0MzJcbitcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbitcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4rXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7XG4rfTtcbitcbitzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkO1xuK3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRjbS1cdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XG4rXHRpZiAoIWNtLVx1MDAzZWNncnApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4rXHRpZiAoIWNtLVx1MDAzZW1lbWNnKSB7XG4rXHRcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0YnBmX3B1dF9tZW1fY2dyb3VwKGNtLVx1MDAzZW1lbWNnKTtcbitcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuK3tcbitcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4rXHQqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIFJFQ0xBSU1fTUFYX0lURVI7IGkrKykge1xuK1x0XHRpZiAoIWJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgUkVDTEFJTV9TSVpFKSlcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0cnVjdCB3cV9lbGVtIHtcbitcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4rXHRzdHJ1Y3QgYnBmX3dxIHdvcms7XG4rXHR1NjQgcHJldl9ldmVudDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCBhc3luY19mcmVlKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4rXG4rXHRpZiAoc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4rXHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkge1xuK1x0XHRyZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkKTtcbitcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbit7XG4rXHRicGZfd3Ffc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCAwKTtcbitcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitTRUMoXCJzeXNjYWxsXCIpXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3NfcyAqY3R4KVxuK3tcbitcdHN0cnVjdCB3cV9lbGVtICplbGVtO1xuK1x0X191MzIga2V5ID0gMDtcbitcdGludCByZXQ7XG4rXG4rXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4rXHRpZiAoIWVsZW0pXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHJldCA9IGJwZl93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2d3FfbWFwLCAwKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNld29yaywgYXN5bmNfZnJlZSwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3RpbWVyX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4rXHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuK1xuK1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4rXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4rXG4rXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuK31cbitcbitjaGFyIExJQ0VOU0VbXSBTRUMoXCJsaWNlbnNlXCIpID0gXCJHUExcIjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE4OjQyLjQyMTM1OTk0MloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYyNzg0OTIwMDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgTmV3IEJQRiBNZW1vcnkgUmVjbGFtYXRpb24gS2Z1bmNzKipcblxuT2theSwgc28gd2UgaGF2ZSBhIHBhdGNoIGludHJvZHVjaW5nIHR3byBuZXcgQlBGIGtmdW5jczogYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AuIFRoZXkndmUgYmVlbiBhZGRlZCB0byBgbW0vYnBmX21lbWNvbnRyb2wuY2AsIHdoaWNoIHRlbGxzIG1lIHRoaXMgaXMgZGlyZWN0bHkgaW50ZXJhY3Rpbmcgd2l0aCBtZW1vcnkgY2dyb3VwIG1hbmFnZW1lbnQg4oCTIHRoYXQncyBkZWZpbml0ZWx5IGludGVyZXN0aW5nLiBUaGVzZSBmdW5jdGlvbnMgZXNzZW50aWFsbHkgYWxsb3cgQlBGIHByb2dyYW1zIHRvIHRyaWdnZXIgcHJvYWN0aXZlIG1lbW9yeSByZWNsYW1hdGlvbiB3aXRoaW4gYSBtZW1vcnkgY2dyb3VwLiBHaXZlbiB0aGVpciBuYW1lcywgYHN3YXBwaW5lc3NgIHN1Z2dlc3RzIHRoZXkgb2ZmZXIgc29tZSBjb250cm9sIG92ZXIgc3dhcCBiZWhhdmlvciwgd2hpY2ggaXMgYSBudWFuY2VkIGFkZGl0aW9uLlxuXG5UaGUgZmFjdCB0aGF0IHRoZXkncmUgbGV2ZXJhZ2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgdW5kZXIgdGhlIGhvb2QgZ2l2ZXMgbWUgYSBnb29kIGlkZWEgb2YgdGhlaXIgZnVuZGFtZW50YWwgb3BlcmF0aW9uLiBOb3csIGFzIGZvciB0aGVpciBleHBvc3VyZS4uLiB0aGV5J3JlIGV4cG9ydGVkIHVzaW5nIGBCVEZfSURfRkxBR1NgLCB3aGljaCB0ZWxscyBtZSB0aGV5IGFyZSBpbmRlZWQgc2xlZXBhYmxlIEJQRiBrZnVuY3MuIEV4Y2VsbGVudCDigJMgc2xlZXBhYmxlIGtmdW5jcyBvcGVuIHVwIGEgbG90IG9mIHBvdGVudGlhbCB1c2UgY2FzZXMsIGluY2x1ZGluZyBpbnRlZ3JhdGlvbiB3aXRoIGNvbXBsZXggbW9uaXRvcmluZyBvciBjb250cm9sIGxvZ2ljIHdpdGhpbiB0aGUgbWVtb3J5IGNncm91cC5cblxuVGhpcyBpcyBhIGNsZWFyLCBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUga2VybmVsLCBwcm92aWRpbmcgYSBuZXcgaW50ZXJmYWNlIGZvciBCUEYgcHJvZ3JhbXMgdG8gaW50ZXJhY3Qgd2l0aCBtZW1vcnkgcmVjbGFtYXRpb24uIEl0J3MgYSBzaWduaWZpY2FudCBlbm91Z2ggYWRkaXRpb24gdGhhdCBmdXp6aW5nIHRoZXNlIGZ1bmN0aW9ucyBpcyBhYnNvbHV0ZWx5IGVzc2VudGlhbC4gTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBTaW5jZSB0aGUgY29kZSByZXNpZGVzIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgbXkgbmV4dCBzdGVwIGlzIHRvIGV4YW1pbmUgYG1tL01ha2VmaWxlYCBhbmQgYG1tL0tjb25maWdgIHRvIGlkZW50aWZ5IHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9ucyB0byBlbmFibGUgYGJwZl9tZW1jb250cm9sLmNgLCBhbmQgY29uc2VxdWVudGx5LCB0aGVzZSBuZXcga2Z1bmNzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5Mjg1LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzA4LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTg6NDguNjk5ODU1MTMzWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI4NDQ5NjA5MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicGZfbWVtY29udHJvbC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDY9aWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgKz0gYnBmX21lbWNvbnRyb2wub1xcbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxODo0OC45ODQzNTYyOTRaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMTY3NTIxNzI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjpcblxuKipDb25maWd1cmluZyB0aGUgQlBGIE1lbWNnIEludGVncmF0aW9uKipcblxuUmlnaHQsIHNvIHdlJ3JlIGRpdmluZyBpbnRvIEJQRiBhbmQgbWVtb3J5IGNvbnRyb2wuIFRoZSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCB3ZSdsbCBuZWVkIGJvdGggYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kIGBDT05GSUdfTUVNQ0dgIGVuYWJsZWQg4oCTIG9idmlvdXNseSwgZ2l2ZW4gdGhlIGNvbnRleHQuIExldCdzIHNlZSBpZiB3ZSBtaXNzZWQgYW55dGhpbmcgb2J2aW91cyBpbiB0aGUgY29uZmlnLCBhbmQgd2hpbGUgd2UncmUgYXQgaXQsIEkgc2hvdWxkIHBva2UgYXJvdW5kIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gSG9wZWZ1bGx5LCBhbnkgcmVsYXRlZCBjb25maWdzIGFyZSBlYXNpbHkgaWRlbnRpZmllZCB0aGVyZS4gV2UgZG9uJ3Qgd2FudCBhbnkgc3VycHJpc2VzIGxhdGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDAzOCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE4OjUyLjE1MTg4MDg3M1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTI5MDk1NzYsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vYnBmX21lbWNvbnRyb2wuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTg6NTIuMjY0ODE1NjZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjc1OTE3NjQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipDaGVja2luZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgQXZhaWxhYmlsaXR5KipcblxuUmlnaHQsIGxldCdzIGp1c3QgY29uZmlybSBzb21ldGhpbmcgYmVmb3JlIEkgZ28gZnVydGhlciBkb3duIHRoaXMgcmFiYml0IGhvbGUuIEkgbmVlZCB0byBtYWtlIHN1cmUgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGlzIGFjdHVhbGx5IGFjY2Vzc2libGUuIEknbSBwcmV0dHkgc3VyZSBpdCdzICp0aGVyZSosIGJ1dCBJJ20gYmVpbmcgbWV0aWN1bG91cy4gUXVpY2sgY2hlY2suLi4geWVwLCBhY2NvcmRpbmcgdG8gbXkgbWVudGFsIG1hcCBvZiB0aGUga2VybmVsIHNvdXJjZSwgdGhhdCdzIGRlZmluZWQgaW4gYG1tL3Ztc2Nhbi5jYC4gR29vZCwgdGhhdCBjb25maXJtcyBpdC4gTm93IEkgY2FuIHByb2NlZWQgd2l0aCB0aGUgYXNzdW1wdGlvbnMgSSB3YXMgcGxhbm5pbmcgb24gbWFraW5nIGFib3V0IGl0cyBmdW5jdGlvbmFsaXR5IHdpdGhpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgZnJhbWV3b3JrLiBUaGF0IGFsc28gbWVhbnMgdGhlIHJlbGV2YW50IGluY2x1ZGVzIGFyZSBwcm9iYWJseSBhbHJlYWR5IGhhbmRsZWQgaGlnaGVyIHVwIGluIHRoZSBjYWxsIHN0YWNrLiBMZXQncyBzZWUgaG93IGl0J3MgYmVpbmcgdXNlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAyNTgsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxODo1NS41NDA3MzYyMzZaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTUyMzkwNjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vYnBmX21lbWNvbnRyb2wuYz0xNTg9X19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTE2My0vKlxcbm1tL2JwZl9tZW1jb250cm9sLmM6MTY0OiAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZS4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIHVuY29uZGl0aW9uYWxseVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTY1LSAqIG92ZXJ3cml0ZXMgY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZSBvbiBlbnRyeSBhbmQgcmVzZXRzIGl0IHRvIE5VTEwgb24gZXhpdC5cXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTY5LSAqIFRoZSBndWFyZCBpcyBQRl9NRU1BTExPQy4gRXZlcnkgcmVjbGFpbSBlbnRyeSBwb2ludCBtYXJrcyB0aGUgY3VycmVudFxcbm1tL2JwZl9tZW1jb250cm9sLmM6MTcwOiAqIHRhc2sgd2l0aCBpdCBmb3IgdGhlIHdob2xlIHJlY2xhaW0gd2luZG93OiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClcXG5tbS9icGZfbWVtY29udHJvbC5jLTE3MS0gKiBhbmQgX19wZXJmb3JtX3JlY2xhaW0oKSBkbyBzbyB2aWEgbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKSwgYW5kIGtzd2FwZFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0xNzctICpcXG5tbS9icGZfbWVtY29udHJvbC5jOjE3ODogKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMTc5LSAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRlxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYz0yMDY9X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yMTMtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyMTQ6XFx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjE1LVxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmM9MjM4PWJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNDctXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNDg6XFx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ5LVxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0xNDgxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTIxLVxcbm1tL21lbWNvbnRyb2wtdjEuYzoxNTIyOlxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcXG5tbS9tZW1jb250cm9sLXYxLmMtMTUyMy1cXHRcXHRcXHRcXHRtZW1zdyA/IDAgOiBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSkge1xcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTE1NDA9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYy0xNTUzLVxcbm1tL21lbWNvbnRyb2wtdjEuYzoxNTU0OlxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcXG5tbS9tZW1jb250cm9sLXYxLmMtMTU1NS1cXHRcXHRcXHRcXHRcXHRcXHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxcbi0tXFxubW0vbWVtY29udHJvbC5jPTIzMjg9c3RhdGljIHVuc2lnbmVkIGxvbmcgcmVjbGFpbV9oaWdoKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0yMzQzLVxcdFxcdHBzaV9tZW1zdGFsbF9lbnRlcihcXHUwMDI2cGZsYWdzKTtcXG5tbS9tZW1jb250cm9sLmM6MjM0NDpcXHRcXHRucl9yZWNsYWltZWQgKz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxubW0vbWVtY29udHJvbC5jLTIzNDUtXFx0XFx0XFx0XFx0XFx0XFx0XFx0Z2ZwX21hc2ssXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9MjU5NT1zdGF0aWMgaW50IHRyeV9jaGFyZ2VfbWVtY2coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBnZnBfdCBnZnBfbWFzayxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy0yNjU0LVxcdHBzaV9tZW1zdGFsbF9lbnRlcihcXHUwMDI2cGZsYWdzKTtcXG5tbS9tZW1jb250cm9sLmM6MjY1NTpcXHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbV9vdmVyX2xpbWl0LCBucl9wYWdlcyxcXG5tbS9tZW1jb250cm9sLmMtMjY1Ni1cXHRcXHRcXHRcXHRcXHRcXHQgICAgZ2ZwX21hc2ssIHJlY2xhaW1fb3B0aW9ucywgTlVMTCk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDc2OD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfaGlnaF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNDgwMi1cXG5tbS9tZW1jb250cm9sLmM6NDgwMzpcXHRcXHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXFxubW0vbWVtY29udHJvbC5jLTQ4MDQtXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XFxuLS1cXG5tbS9tZW1jb250cm9sLmM9NDgyMD1zdGF0aWMgc3NpemVfdCBtZW1vcnlfbWF4X3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00ODU0LVxcdFxcdGlmIChucl9yZWNsYWltcykge1xcbm1tL21lbWNvbnRyb2wuYzo0ODU1OlxcdFxcdFxcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMgLSBtYXgsXFxubW0vbWVtY29udHJvbC5jLTQ4NTYtXFx0XFx0XFx0XFx0XFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXFxuLS1cXG5tbS92bXNjYW4uYz02NzIyPXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS92bXNjYW4uYy02NzYxLVxcbm1tL3Ztc2Nhbi5jOjY3NjI6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5tbS92bXNjYW4uYy02NzYzLVxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS92bXNjYW4uYy02ODAyLSNlbHNlXFxubW0vdm1zY2FuLmM6NjgwMzp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTY4MDQtXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jPTc4NjY9aW50IHVzZXJfcHJvYWN0aXZlX3JlY2xhaW0oY2hhciAqYnVmLFxcbi0tXFxubW0vdm1zY2FuLmMtNzkzMy1cXHRcXHRcXHRcXHRcXHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xcbm1tL3Ztc2Nhbi5jOjc5MzQ6XFx0XFx0XFx0cmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZyxcXG5tbS92bXNjYW4uYy03OTM1LVxcdFxcdFxcdFxcdFxcdFxcdCBiYXRjaF9zaXplLCBnZnBfbWFzayxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTg6NTUuNjM1OTgwNjQzWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTYyODkwNTE2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbioqXG5cbk9rYXksIHNvIEkndmUgaWRlbnRpZmllZCBzb21lIHByb21pc2luZyB0YXJnZXRzIGZvciBmdXp6aW5nIHdpdGhpbiB0aGUgQlBGIHN1YnN5c3RlbS4gVGhlIGtleSBoZXJlIGlzIHRob3NlIG5ldyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCBmdW5jdGlvbnMuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoZXNlIGFyZSAqcmVhY2hhYmxlKiDigJMgbWVhbmluZyB0aGV5J3JlIGV4cG9zZWQgYW5kIGNhbGxhYmxlIGZyb20gd2l0aGluIEJQRiBwcm9ncmFtcywgd2hpY2ggaW1tZWRpYXRlbHkgcmFpc2VzIGEgZmxhZy5cblxuR2l2ZW4gdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIHRvdWNoaW5nIG1lbW9yeSByZWNsYWltLCB3aGljaCBpcyBjb3JlIGtlcm5lbCBsb2dpYyBhbmQgYWx3YXlzIGEgc291cmNlIG9mIGNvbXBsZXggaW50ZXJhY3Rpb25zLCBmdXp6aW5nIGlzIGRlZmluaXRlbHkgd2FycmFudGVkLiBUaGV5J3JlIHByaW1lIGNhbmRpZGF0ZXMgZm9yIHBvdGVudGlhbCBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy5cblxuSSd2ZSBjb25maXJtZWQgdGhlIHJlbGV2YW50IGNvbmZpZ3MgYXJlIGVuYWJsZWQ6IGBCUEZfU1lTQ0FMTGAgYW5kIGBNRU1DR2AuIFRob3NlIGFyZSBwcmV0dHkgc3RhbmRhcmQsIHRoYW5rZnVsbHksIHNvIG5vIHN1cnByaXNlcyB0aGVyZS4gTGV0IG1lIGp1c3QgZG91YmxlLWNoZWNrIHRoYXQgdGhlcmUgYXJlbid0IGFueSBvdGhlciwgbGVzcyBvYnZpb3VzLCBkZXBlbmRlbmNpZXMgSSBuZWVkIHRvIGFjY291bnQgZm9yLi4uIE5vcGUsIHRob3NlIHR3byBhcmUgdGhlIG9ubHkgb25lcy5cblxuQmFzZWQgb24gYWxsIG9mIHRoYXQsIEkgY2FuIGNvbmZpZGVudGx5IHJldHVybiBgV29ydGhGdXp6aW5nPXRydWVgLiBNeSBmb2N1cyB3aWxsIGJlIG9uIHRob3NlIHR3byBmdW5jdGlvbnMsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCBhbmQgSSdsbCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZnV6emVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQgd2l0aCBib3RoIGBCUEZfU1lTQ0FMTGAgYW5kIGBNRU1DR2AgZW5hYmxlZC4gSSdsbCBuZWVkIHRvIGRldmVsb3AgYXBwcm9wcmlhdGUgZnV6emluZyBoYXJuZXNzZXMgdG8gcmVhbGx5IHB1dCB0aGVzZSBuZXcgZnVuY3Rpb25zIHRocm91Z2ggdGhlaXIgcGFjZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMTYxLCJPdXRwdXRUb2tlbnMiOjE1MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxOTowMS4yNjQ4ODg1NTRaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjE0MzMxOTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiLFxuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2AsIHdoaWNoIGFsbG93IEJQRiBwcm9ncmFtcyB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5IGNncm91cC4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIG1vZGlmeSBjb3JlIGtlcm5lbCBsb2dpYyAobWVtb3J5IHJlY2xhaW0pLiBUaGV5IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIHRoZXkgZG8gbm90IGludHJvZHVjZSBidWdzIG9yIHZ1bG5lcmFiaWxpdGllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1cIixcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0d28gbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCB3aGljaCBhbGxvdyBCUEYgcHJvZ3JhbXMgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeSBjZ3JvdXAuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgKG1lbW9yeSByZWNsYWltKS4gVGhleSBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSB0aGV5IGRvIG5vdCBpbnRyb2R1Y2UgYnVncyBvciB2dWxuZXJhYmlsaXRpZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE5OjAxLjM4NjMyOTY1WiIsIlNlcSI6MTEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTE5NjYyODIyNSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE4VDA5OjE5OjAxLjM4NjkyMjI1WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjExMTk2MDMwMzY0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgYWN0IGFzIHdyYXBwZXJzIGFyb3VuZCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZXNlIGtmdW5jcyBhcmUgc2NhbGFyIHZhbHVlcyBhbmQgYSBwb2ludGVyIHRvIGEgYG1lbV9jZ3JvdXBgIHN0cnVjdHVyZSwgYWxsIG9mIHdoaWNoIGFyZSBmdWxseSBpbml0aWFsaXplZCBieSB0aGUgQlBGIHN1YnN5c3RlbSBiZWZvcmUgdGhlIGtmdW5jcyBhcmUgaW52b2tlZC4gVGhlIGxvY2FsIHZhcmlhYmxlIGBzd2FwcGluZXNzYCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYnV0IGl0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50LiBObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gbWVtb3J5IGNncm91cCByZWNsYWltIHdpbGwgYmUgY2F1Z2h0IGJ5IEtBU0FOLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGYwYzBiMmUzYTVhYzk5NzA4OTQ5YWNlNTYyYjhjMzMwODI0NWY3MzJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAxOCAwOToxODo0MCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jXG5pbmRleCA3MTZkZjQ5ZDc2NDc3Li45MjI3MmY5YTU4MjUxIDEwMDY0NFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xuKysrIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuQEAgLTYsNiArNiw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3dhcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG5AQCAtMTU5LDYgKzE2MCw5NyBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbiBcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xuIH1cbiBcbisvKlxuKyAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZS4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIHVuY29uZGl0aW9uYWxseVxuKyAqIG92ZXJ3cml0ZXMgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlIG9uIGVudHJ5IGFuZCByZXNldHMgaXQgdG8gTlVMTCBvbiBleGl0LlxuKyAqIFNvIGludm9raW5nIGl0IGZyb20gYW4gaW4tZmxpZ2h0IHJlY2xhaW0gd291bGQgY2xvYmJlciB0aGUgb3V0ZXIgcmVjbGFpbVxuKyAqIHN0YXRlIGFuZCBjb3JydXB0IGl0cyBhY2NvdW50aW5nLlxuKyAqXG4rICogVGhlIGd1YXJkIGlzIFBGX01FTUFMTE9DLiBFdmVyeSByZWNsYWltIGVudHJ5IHBvaW50IG1hcmtzIHRoZSBjdXJyZW50XG4rICogdGFzayB3aXRoIGl0IGZvciB0aGUgd2hvbGUgcmVjbGFpbSB3aW5kb3c6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKVxuKyAqIGFuZCBfX3BlcmZvcm1fcmVjbGFpbSgpIGRvIHNvIHZpYSBtZW1hbGxvY19ub3JlY2xhaW1fc2F2ZSgpLCBhbmQga3N3YXBkXG4rICoga2VlcHMgaXQgc2V0IGZvciBpdHMgZW50aXJlIGxpZmV0aW1lLiBBIGhvb2sgaW5zaWRlIHRoZSByZWNsYWltIHBhdGhcbisgKiAoc2hyaW5rX25vZGUsIHNocmlua19zbGFiLCAuLi4pIGV4ZWN1dGVzIGluIHRoZSBjb250ZXh0IG9mIHRoZVxuKyAqIHJlY2xhaW1pbmcgdGFzaywgd2hlcmUgY3VycmVudC1cdTAwM2VmbGFncyBhbHJlYWR5IGNhcnJpZXMgdGhlIGZsYWcuIFRoZSBwYWdlXG4rICogYWxsb2NhdG9yLCB0aGUgbWVtY2cgY2hhcmdpbmcgcGF0aCBhbmQgbm9kZV9yZWNsYWltKCkgcmVseSBvbiB0aGUgc2FtZVxuKyAqIGZsYWcgdG8gYXZvaWQgcmVjbGFpbSByZWN1cnNpb24uXG4rICpcbisgKiBJbiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCksIHJlY2xhaW1fc3RhdGUgaXMgc2V0IHNsaWdodGx5IGJlZm9yZVxuKyAqIFBGX01FTUFMTE9DLCB3aXRoIG9ubHkgYSB0cmFjZXBvaW50IGluIGJldHdlZW4sIHdoaWNoIGEgc2xlZXBhYmxlIEJQRlxuKyAqIHByb2dyYW0gY2Fubm90IGF0dGFjaCB0by5cbisgKiBBbHNvLCBQRl9NRU1BTExPQyBpcyBzZXQgaW4gc29tZSBub24tcmVjbGFpbSBjb250ZXh0cyAoZS5nLiBkaXJlY3QgY29tcGFjdGlvblxuKyAqIGFuZCB2bWFsbG9jKSwgd2hlcmUgdGhlIGtmdW5jIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZXMgdG8gcmVjbGFpbSBhcyB3ZWxsLlxuKyAqL1xuK3N0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcbit7XG4rXHRyZXR1cm4gY3VycmVudC1cdTAwM2VmbGFncyBcdTAwMjYgUEZfTUVNQUxMT0M7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXBcbisgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbisgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4rICpcbisgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvXG4rICogdGhlIG1lbW9yeS5yZWNsYWltIGNncm91cCBmaWxlOiBwYWdlcyBhcmUgcmVjbGFpbWVkIGFjY29yZGluZyB0byB0aGVcbisgKiBjZ3JvdXAncyBvd24gc3dhcHBpbmVzcyBzZXR0aW5nIGFuZCBzd2FwIGlzIGFsbG93ZWQuIE5vdGUgdGhhdCxcbisgKiB1bmxpa2UgbWVtb3J5LnJlY2xhaW0sIHRoaXMgZG9lcyBub3QgcmV0cnkgdW50aWwgQHNpemUgaXMgcmVhY2hlZDtcbisgKiBjYWxsZXJzIGNhbiBpbnZva2UgaXQgYWdhaW4gaWYgbmVlZGVkLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuKyAqICAgdGhhbiBhIHBhZ2Ugb3IgdGhlIGNhbGxpbmcgdGFzayBpcyBhbHJlYWR5IGluIGEgcmVjbGFpbS9mcmVlaW5nXG4rICogICBjb250ZXh0IChQRl9NRU1BTExPQykuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSAvIFBBR0VfU0laRTtcbitcbitcdGlmICghbnJfcGFnZXMgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLCBOVUxMKTtcbit9XG4rXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3MgLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGFcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBjZ3JvdXAgd2l0aCBhbiBleHBsaWNpdFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcHBpbmVzc1xuKyAqIEBtZW1jZzogICAgICB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICAgICAgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzXG4rICogQHN3YXBwaW5lc3M6IHN3YXBwaW5lc3Mgb3ZlcnJpZGUgZm9yIHRoaXMgcmVjbGFpbSBwYXNzXG4rICpcbisgKiBTYW1lIGFzIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBleGNlcHQgdGhhdCB0aGUgYW5vbi9maWxlIHJlY2xhaW1cbisgKiBiYWxhbmNlIGlzIGNvbnRyb2xsZWQgYnkgQHN3YXBwaW5lc3MgaW5zdGVhZCBvZiB0aGUgY2dyb3VwJ3NcbisgKiBzd2FwcGluZXNzIHNldHRpbmcuIFZhbGlkIHZhbHVlcyBhcmUgW01JTl9TV0FQUElORVNTLCBNQVhfU1dBUFBJTkVTU11cbisgKiBhbmQgU1dBUFBJTkVTU19BTk9OX09OTFksIHdoaWNoIHJlc3RyaWN0cyByZWNsYWltIHRvIGFub24gZm9saW9zLlxuKyAqXG4rICogUmV0dXJuOlxuKyAqICAgVGhlIG51bWJlciBvZiBwYWdlcyBhY3R1YWxseSByZWNsYWltZWQsIG9yIDAgaWYgQHNpemUgaXMgc21hbGxlclxuKyAqICAgdGhhbiBhIHBhZ2UsIEBzd2FwcGluZXNzIGlzIG91dCBvZiByYW5nZSwgb3IgdGhlIGNhbGxpbmcgdGFzayBpc1xuKyAqICAgYWxyZWFkeSBpbiBhIHJlY2xhaW0vZnJlZWluZyBjb250ZXh0IChQRl9NRU1BTExPQykuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZ1xuK2JwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHRcdFx0IGludCBzd2FwcGluZXNzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFO1xuK1xuK1x0aWYgKCFucl9wYWdlcyB8fCBzd2FwcGluZXNzIFx1MDAzYyBNSU5fU1dBUFBJTkVTUyB8fFxuK1x0ICAgIHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZIHx8XG4rXHQgICAgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRyZXR1cm4gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuK1x0XHRcdFx0XHQgICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4rfVxuK1xuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4gXG4gQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5AQCAtMTcyLDYgKzI2NCw5IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF91c2FnZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzLCBLRl9TTEVFUEFCTEUpXG4rXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNmZhYjg4MjAzZTdkM1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDM4MiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJjZ3JvdXBfaGVscGVycy5oXCJcbitcbitzdHJ1Y3QgYnBmX2FyZ3NfcyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuKyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbitcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfSElHSF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19MT1dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFudXA6XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbitzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuK1x0Y2hhciAqYnVmZmVyO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcIndiXCIpO1xuK1x0aWYgKCFmcClcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xuK1x0aWYgKCFidWZmZXIpXG4rXHRcdGdvdG8gY2xlYW51cF9mcDtcbitcbitcdG1lbXNldChidWZmZXIsICdBJywgQlVGRkVSX1NJWkUpO1xuK1xuK1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuK1x0XHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFx1MDAzYyBCVUZGRVJfU0laRSA/XG4rXHRcdFx0XHQgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTtcbitcbitcdFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0XHR3cml0dGVuICs9IHRvX3dyaXRlO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZnJlZShidWZmZXIpO1xuK2NsZWFudXBfZnA6XG4rXHRmY2xvc2UoZnApO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcbitcdGNoYXIgKm1hcDtcbitcdHNpemVfdCBpO1xuK1x0aW50IGZkO1xuK1x0c3RydWN0IHN0YXQgc2I7XG4rXG4rXHRmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTtcbitcdGlmIChmZCA9PSAtMSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoZnN0YXQoZmQsIFx1MDAyNnNiKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0aWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxuXCIsXG4rXHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1x0fVxuK1xuK1x0bWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTtcbitcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXHUwMDNjIGl0ZXJhdGlvbnM7IGl0ZXIrKykge1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBGSUxFX1NJWkU7IGkgKz0gcGFnZV9zaXplKSB7XG4rXHRcdFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cbitcdFx0XHR2b2xhdGlsZSBjaGFyIHYgPSBtYXBbaV07XG4rXHRcdFx0KHZvaWQpdjtcbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cF9mZDpcbitcdGNsb3NlKGZkKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuK1x0XHRcdFx0Y2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0c3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoIUFTU0VSVF9PSyhqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpLCBcImpvaW5fcGFyZW50X2Nncm91cFwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNnN0YXJ0LCBOVUxMKTtcbitcbitcdGlmICghQVNTRVJUX09LKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSksIFwid3JpdGVfZmlsZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0socmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpLCBcInJlYWRfZmlsZVwiKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNmVuZCwgTlVMTCk7XG4rXG4rXHRpZiAoIXRpbWVfZmlsZW5hbWUpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0ZWxhcHNlZCA9IChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSArXG4rXHRcdCAgKGVuZC50dl91c2VjIC0gc3RhcnQudHZfdXNlYykgLyAxMDAwMDAwLjA7XG4rXHRwcmludGYoXCIlLjZmXFxuXCIsIGVsYXBzZWQpO1xuK1xuK1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcIndcIik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwiZm9wZW5cIikpXG4rXHRcdHJldHVybiAtMTtcbitcdGZwcmludGYoZnAsIFwiJS42ZlwiLCBlbGFwc2VkKTtcbitcdGZjbG9zZShmcCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0RklMRSAqZnA7XG4rXHRjaGFyIGJ1Zls2NF07XG4rXG4rXHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwiclwiKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihmcCwgXCJmb3BlblwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcImZnZXRzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoc3NjYW5mKGJ1ZiwgXCIlbGZcIiwgdGltZSkgIT0gMSkge1xuK1x0XHRQUklOVF9GQUlMKFwic3NjYW5mICVzXCIsIGJ1Zik7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXG4re1xuK1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtdID0gXCIvdG1wL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcIjtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtdID0gXCIvdG1wL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwiO1xuK1x0Y2hhciBoaWdoX3RpbWVfZmlsZVtdID0gXCIvdG1wL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFhcIjtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtdID0gXCIvdG1wL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiO1xuK1x0cGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xO1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuK1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwibWtzdGVtcFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGxvd19waWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCBcImZvcmsgbG93XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAobG93X3BpZCA9PSAwKVxuK1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXG4rXHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0aGlnaF9waWQgPSBmb3JrKCk7XG4rXHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCJmb3JrIGhpZ2hcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChoaWdoX3BpZCA9PSAwKVxuK1x0XHRleGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0aWYgKCFBU1NFUlRfR1Qod2FpdHBpZChsb3dfcGlkLCBcdTAwMjZzdGF0dXMsIDApLCAwLCBcImxvdyB3YWl0cGlkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcImxvdyBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmICghQVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFwibG93IGV4aXQgc3RhdHVzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApLCAwLCBcImhpZ2ggd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJoaWdoIGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKCFBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgXCJoaWdoIGV4aXQgc3RhdHVzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IDA7XG4rXG4rY2xlYW51cDpcbitcdC8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovXG4rXHRpZiAocmV0KSB7XG4rXHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuK1x0XHRcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHRcdGlmIChsb3dfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbitcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuK1x0XHR9XG4rXHR9XG4rXHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xuK1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuK1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnRcbitzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbitcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbit7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbitcdHN0cnVjdCBicGZfYXJnc19zIGJwZl9hcmdzID0ge1xuK1x0XHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcbitcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuK1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuK1x0XHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXG4rXHR9O1xuK1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuK1x0XHQuY3R4X2luID0gXHUwMDI2YnBmX2FyZ3MsXG4rXHRcdC5jdHhfc2l6ZV9pbiA9IHNpemVvZihicGZfYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ193cV9hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0aW50IGVycjtcbitcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xuK1xuK1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2JwZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkIHdpdGggYXN5bmMgcmVjbGFpbTogaGlnaF90aW1lPSVmIGxvd190aW1lPSVmXCIsXG4rXHRcdFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4rXG4rb3V0OlxuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjYyYzJiYjdlMDM3YjZcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMTY3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbitcbisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRFx0MVxuKyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzX3Mge1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkO1xuK1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rc3RydWN0IGNncm91cF9tZW1jZyB7XG4rXHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuK1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuK307XG4rXG4rc3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcbitzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuK1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuK1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4rXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuK1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbitzdGF0aWMgaW50IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdGludCBpO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRUNMQUlNX01BWF9JVEVSOyBpKyspIHtcbitcdFx0aWYgKCFicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIFJFQ0xBSU1fU0laRSkpXG4rXHRcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xuK1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbitcdF9fdHlwZShrZXksIF9fdTMyKTtcbitcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xuK30gd3FfbWFwIFNFQyhcIi5tYXBzXCIpO1xuK1xuK3N0YXRpYyBpbnQgYXN5bmNfZnJlZSh2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbit7XG4rXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xuK1xuK1x0aWYgKHNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuK1x0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpIHtcbitcdFx0cmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCk7XG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzX3MgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcbitcdF9fdTMyIGtleSA9IDA7XG4rXHRpbnQgcmV0O1xuK1xuK1x0ZWxlbSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2d3FfbWFwLCBcdTAwMjZrZXkpO1xuK1x0aWYgKCFlbGVtKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIGFzeW5jX2ZyZWUsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBMSUNFTlNFW10gU0VDKFwibGljZW5zZVwiKSA9IFwiR1BMXCI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xOFQwOToxOTowMS4zODY5MjMwNloiLCJTZXEiOjEzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTE5NTk5Nzc2NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBvdGVudGlhbCBmb3IgVW5pbml0aWFsaXplZCBNZW1vcnkgRXhwb3N1cmUgaW4gTmV3IEJQRiBrZnVuY3MqKlxuXG5Pa2F5LCBzbyB3ZSd2ZSBnb3QgdGhlc2UgbmV3IEJQRiBrZnVuY3MsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGFuZCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltX3N3YXBwaW5lc3NgLCBkZXNpZ25lZCB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSB3aXRoaW4gYSBtZW1jZy4gVGhleSB0YWtlIGEgYHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZ2AsIGFuIGB1bnNpZ25lZCBsb25nIHNpemVgLCBhbmQsIG9wdGlvbmFsbHksIGFuIGBpbnQgc3dhcHBpbmVzc2AgdmFsdWUuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzLCBhcyBhbHdheXMsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IOKAkyB0aGF0J3MgYSBjbGFzc2ljIHNlY3VyaXR5IHZlY3Rvci5cblxuTG9va2luZyBhdCB0aGUgY29kZSwgYG1lbWNnYCBjb21lcyBmcm9tIGEgYGJwZl9nZXRfbWVtX2Nncm91cGAgY2FsbCAob3Igc2ltaWxhciksIHNvIGl0J3MgYSB2YWxpZCBwb2ludGVyLiBUaGUgYHNpemVgIGFuZCBgc3dhcHBpbmVzc2AgYXJndW1lbnRzIGFyZSBzY2FsYXIgdmFsdWVzIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgZnVuY3Rpb24uIEluc2lkZSB0aGUga2Z1bmMsIHRoZSBgc2l6ZWAgaXMgY29udmVydGVkIGludG8gcGFnZSBjb3VudHMgKGBucl9wYWdlc2ApLCBhbmQgdGhlIGNvZGUgY2hlY2tzIGZvciB6ZXJvIHBhZ2UgY291bnRzIG9yIGlmIHdlIGFyZSBpbiB0aGUgcmVjbGFpbSBjb250ZXh0LiBUaGUgaW1wb3J0YW50IHBhcnRzIGFyZSB0aGUgY2FsbHMgdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLlxuXG5UaGUgaW1wb3J0YW50IHBhcnRzIGFyZTpcblxuYGBgY1xuXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSAvIFBBR0VfU0laRTtcblxuXHRpZiAoIW5yX3BhZ2VzIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG5cdFx0cmV0dXJuIDA7XG5cblx0cmV0dXJuIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLCBHRlBfS0VSTkVMLFxuXHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcblx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsIE5VTEwpO1xuYGBgXG5cbmFuZFxuXG5gYGBjXG5cdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplIC8gUEFHRV9TSVpFO1xuXG5cdGlmICghbnJfcGFnZXMgfHwgc3dhcHBpbmVzcyBcdTAwM2MgTUlOX1NXQVBQSU5FU1MgfHxcblx0ICAgIHN3YXBwaW5lc3MgXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZIHx8XG5cdCAgICB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKVxuXHRcdHJldHVybiAwO1xuXG5cdHJldHVybiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcywgR0ZQX0tFUk5FTCxcblx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG5cdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuXHRcdFx0XHRcdCAgICBcdTAwMjZzd2FwcGluZXNzKTtcbmBgYFxuXG5UaGVyZSdzIG5vdGhpbmcgaGVyZSB0aGF0IGxvb2tzIGxpa2Ugd2UncmUgbGVha2luZyB1bmluaXRpYWxpemVkIG1lbW9yeSB0byB1c2Vyc3BhY2UuIE5vIG5ldyBzdHJ1Y3RzIGFyZSBiZWluZyBhbGxvY2F0ZWQgb3IgY29waWVkLiBUaGUgYHN3YXBwaW5lc3NgIGFyZ3VtZW50LCBhbHRob3VnaCBwYXNzZWQgYXMgYSBwb2ludGVyIHRvIHRoZSBjYWxsZWQgZnVuY3Rpb24sIGlzICppbml0aWFsaXplZCogbG9jYWxseSB3aXRoaW4gdGhlIEJQRiBrZnVuYy4gSXQncyBhIGxvY2FsIHZhcmlhYmxlLiBTbyB0aGVyZSBpcyBubyByaXNrIG9mIGV4cG9zaW5nIHVuaXRpYWxpemVkIG1lbW9yeSBpbiB0aGUgKmNhbGwqIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC5cblxuVG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluLCBJJ20gbm93IGRvdWJsZS1jaGVja2luZyB0aGUgZnVuY3Rpb24gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGl0c2VsZi4gV2UncmUgcGFzc2luZyBhIHZhbGlkLCBpbml0aWFsaXplZCBwb2ludGVyIGFuZCB2YWx1ZXMuIEkgY2FuIGNvbmZpcm0gdGhpcyBkb2Vzbid0IGludHJvZHVjZSBhbnkgbmV3IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2sgZWl0aGVyLiBTdGFuZGFyZCB0b29scyBsaWtlIEtBU0FOLCBldGMsIGFyZSBnb29kIGVub3VnaCBoZXJlLlxuXG5UaGVyZWZvcmUsIGdpdmVuIG15IGFuYWx5c2lzLCBJJ20gY29uZmlkZW50IHRoYXQgdGhlc2UgY2hhbmdlcyBkb24ndCBpbnRyb2R1Y2UgYSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlLiBJJ2xsIHNldCBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjkyODIsIk91dHB1dFRva2VucyI6MjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjU1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMThUMDk6MTk6MTIuNTgyOTI0NzI0WiIsIlNlcSI6MTQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjU5NDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHR3byBuZXcgQlBGIGtmdW5jcyAoYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgYW5kIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1fc3dhcHBpbmVzc2ApIHRoYXQgYWN0IGFzIHdyYXBwZXJzIGFyb3VuZCBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZXNlIGtmdW5jcyBhcmUgc2NhbGFyIHZhbHVlcyBhbmQgYSBwb2ludGVyIHRvIGEgYG1lbV9jZ3JvdXBgIHN0cnVjdHVyZSwgYWxsIG9mIHdoaWNoIGFyZSBmdWxseSBpbml0aWFsaXplZCBieSB0aGUgQlBGIHN1YnN5c3RlbSBiZWZvcmUgdGhlIGtmdW5jcyBhcmUgaW52b2tlZC4gVGhlIGxvY2FsIHZhcmlhYmxlIGBzd2FwcGluZXNzYCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYnV0IGl0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdGhlIGZ1bmN0aW9uIGFyZ3VtZW50LiBObyBuZXcgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgYW5kIG5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzIHJlbGF0ZWQgdG8gbWVtb3J5IGNncm91cCByZWNsYWltIHdpbGwgYmUgY2F1Z2h0IGJ5IEtBU0FOLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdHdvIG5ldyBCUEYga2Z1bmNzIChgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBhbmQgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbV9zd2FwcGluZXNzYCkgdGhhdCBhY3QgYXMgd3JhcHBlcnMgYXJvdW5kIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYC4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlc2Uga2Z1bmNzIGFyZSBzY2FsYXIgdmFsdWVzIGFuZCBhIHBvaW50ZXIgdG8gYSBgbWVtX2Nncm91cGAgc3RydWN0dXJlLCBhbGwgb2Ygd2hpY2ggYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJ5IHRoZSBCUEYgc3Vic3lzdGVtIGJlZm9yZSB0aGUga2Z1bmNzIGFyZSBpbnZva2VkLiBUaGUgbG9jYWwgdmFyaWFibGUgYHN3YXBwaW5lc3NgIGlzIHBhc3NlZCBieSByZWZlcmVuY2UgdG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLCBidXQgaXQgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgZnVuY3Rpb24gYXJndW1lbnQuIE5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLCBhbmQgbm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBtZW1vcnkgY29ycnVwdGlvbiwgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgcmVsYXRlZCB0byBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gd2lsbCBiZSBjYXVnaHQgYnkgS0FTQU4uIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[1] Phase: Succeeded StartedAt: 2026-08-18 09:19:23 +0000 UTC FinishedAt: 2026-08-18 09:19:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-18 09:19:23 +0000 UTC FinishedAt: 2026-08-18 09:19:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2] Phase: Succeeded StartedAt: 2026-08-18 09:19:23 +0000 UTC FinishedAt: 2026-08-18 13:02:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-18 09:19:23 +0000 UTC FinishedAt: 2026-08-18 13:02:56 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-18 09:19:23 +0000 UTC FinishedAt: 2026-08-18 09:19:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-18 09:19:23 +0000 UTC FinishedAt: 2026-08-18 09:19:30 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-convert-artifact-401655078/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-18 09:19:33 +0000 UTC FinishedAt: 2026-08-18 09:37:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-18 09:19:33 +0000 UTC FinishedAt: 2026-08-18 09:37:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*d16bc278-3442-4491-a4c7-65f4a0576da3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-convert-artifact-401655078/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "58b5a683-2496-4b46-a75e-b9824137294a", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-1236723132/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-18 09:19:33 +0000 UTC FinishedAt: 2026-08-18 09:37:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*d16bc278-3442-4491-a4c7-65f4a0576da3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-convert-artifact-401655078/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "58b5a683-2496-4b46-a75e-b9824137294a", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-1236723132/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-18 09:37:59 +0000 UTC FinishedAt: 2026-08-18 09:37:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-18 09:37:59 +0000 UTC FinishedAt: 2026-08-18 09:37:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-18 09:37:59 +0000 UTC FinishedAt: 2026-08-18 09:38:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-18 09:37:59 +0000 UTC FinishedAt: 2026-08-18 09:38:06 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-convert-artifact-1911486073/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-18 09:38:09 +0000 UTC FinishedAt: 2026-08-18 09:40:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-18 09:38:09 +0000 UTC FinishedAt: 2026-08-18 09:40:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*58b5a683-2496-4b46-a75e-b9824137294a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-1236723132/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-18 09:40:15 +0000 UTC FinishedAt: 2026-08-18 09:40:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-18 09:40:15 +0000 UTC FinishedAt: 2026-08-18 09:40:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-18 09:40:15 +0000 UTC FinishedAt: 2026-08-18 09:56:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-18 09:40:15 +0000 UTC FinishedAt: 2026-08-18 09:56:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*d16bc278-3442-4491-a4c7-65f4a0576da3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-convert-artifact-1911486073/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "fbd6e1ea-a9ea-4524-a5a9-0da45b5db5a5", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-894089301/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-18 09:40:15 +0000 UTC FinishedAt: 2026-08-18 09:56:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*d16bc278-3442-4491-a4c7-65f4a0576da3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-convert-artifact-1911486073/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "fbd6e1ea-a9ea-4524-a5a9-0da45b5db5a5", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-894089301/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-18 09:56:39 +0000 UTC FinishedAt: 2026-08-18 09:56:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-18 09:56:39 +0000 UTC FinishedAt: 2026-08-18 09:56:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-18 09:56:39 +0000 UTC FinishedAt: 2026-08-18 09:58:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-18 09:56:39 +0000 UTC FinishedAt: 2026-08-18 09:58:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*fbd6e1ea-a9ea-4524-a5a9-0da45b5db5a5,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-894089301/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-18 09:58:42 +0000 UTC FinishedAt: 2026-08-18 13:02:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-18 09:58:42 +0000 UTC FinishedAt: 2026-08-18 13:02:56 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*58b5a683-2496-4b46-a75e-b9824137294a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*fbd6e1ea-a9ea-4524-a5a9-0da45b5db5a5,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-1236723132/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-894089301/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-18 09:58:42 +0000 UTC FinishedAt: 2026-08-18 09:58:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-18 09:58:42 +0000 UTC FinishedAt: 2026-08-18 09:58:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-convert-artifact-1997912302/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-18 09:58:42 +0000 UTC FinishedAt: 2026-08-18 09:58:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-18 09:58:42 +0000 UTC FinishedAt: 2026-08-18 09:58:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-18 09:58:42 +0000 UTC FinishedAt: 2026-08-18 09:58:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-18 09:58:52 +0000 UTC FinishedAt: 2026-08-18 13:02:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqt74q[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim","bpf_proactive_reclaim_swappiness"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"f79066c784022fda83f5936559a1af414e41b603","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG"],"series_id":"4fee2344-54c0-46f8-8312-e6b13f7554d1","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-18 09:58:52 +0000 UTC FinishedAt: 2026-08-18 13:02:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*58b5a683-2496-4b46-a75e-b9824137294a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*fbd6e1ea-a9ea-4524-a5a9-0da45b5db5a5,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-1236723132/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-build-action-894089301/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowqt74q/series-workflowqt74q-convert-artifact-1997912302/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}